commit 6632080b8364965ad190a2135429404209acacb2 Author: ZF sun <34314687@qq.com> Date: Mon Oct 27 15:55:29 2025 +0800 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07fb17e --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/unpackage +/.hbuilderx +/.idea diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..061c99f --- /dev/null +++ b/App.vue @@ -0,0 +1,313 @@ + + \ No newline at end of file diff --git a/common/css/custom.ttf b/common/css/custom.ttf new file mode 100644 index 0000000..6483758 Binary files /dev/null and b/common/css/custom.ttf differ diff --git a/common/css/diy.scss b/common/css/diy.scss new file mode 100644 index 0000000..e83aaee --- /dev/null +++ b/common/css/diy.scss @@ -0,0 +1,234 @@ +.collectPopupWindow { + position: relative; + height: 113rpx; + width: 510rpx; + margin-left: calc(100% - 530rpx); + + image { + width: 100%; + height: 100%; + } + + text { + color: #ff4544 !important; + font-size: 24rpx !important; + position: absolute; + top: 48rpx; + right: 25rpx; + } +} +.zhezhao { + width: 100vw; + height: 100vh; + background-color: transparent; +} +image { + max-width: 100% !important; + max-height: 100% !important; +} +.diy-wrap { + /* #ifdef H5 */ + height: calc(100vh - 88rpx); + /* #endif */ + /* #ifdef MP-WEIXIN */ + height: 100vh; + /* #endif */ +} + +.page-img { + background-size: contain !important; + background-repeat: no-repeat !important; +} + +.page-header { + background-size: 100% !important; + background-repeat: no-repeat !important; + background-position: top center; + background-attachment: fixed; +} + +.bg-index { + width: 100%; + height: 100%; + box-sizing: border-box; + background-size: 100% !important; + background-repeat: no-repeat !important; +} + +.wap-floating { + text { + display: block; + font-size: 60rpx; + color: #ffffff; + text-align: center; + } +} + +.wap-floating-collect .uni-popup__mask { + background: transparent; +} + +::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; +} + +.popup-box { + width: 450rpx; + background: #ffffff; + border-radius: $border-radius; + overflow: hidden; + + .close_title { + width: 100%; + text-align: center; + height: 70rpx; + line-height: 70rpx; + font-size: $font-size-base; + } + + .close_content { + width: 100%; + max-height: 500rpx; + padding: $padding; + box-sizing: border-box; + } + + .close_content_box { + width: 100%; + max-height: 460rpx; + line-height: 1.3; + } +} + +.noStore-text { + color: #000000 !important; +} + +.isStore-top { + margin-bottom: 10rpx; +} +.keep-on-record { + text-align: center; + padding-bottom: 20rpx; + image { + width: 150rpx; + height: 60rpx; + } +} + +.padding-bottom { + padding-bottom: 40rpx !important; +} + +.choose-store { + /deep/ .uni-popup__wrapper{ + background: none!important; + } +} + +.choose-store-popup { + padding: 30rpx; + background-color: #fff; + .head-wrap { + font-weight: bold; + font-size: $font-size-toolbar; + text-align: center; + margin-bottom: 20rpx; + color: #202021; + } + .position-wrap { + display: flex; + color: #202021; + align-items: center; + margin-bottom: 20rpx; + .icon-dizhi { + font-weight: bold; + font-size: $font-size-tag; + margin-right: 10rpx; + } + .address { + font-weight: bold; + font-size: $font-size-tag; + margin-right: 10rpx; + flex: 1; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + } + .reposition { + display: flex; + align-items: center; + .iconfont { + font-size: $font-size-base; + margin-right: 6rpx; + } + text { + font-size: $font-size-tag; + color: #fd463e; + } + } + } + .store-wrap { + border: 1px solid $base-color; + border-radius: 16rpx; + padding: 20rpx 30rpx; + margin-bottom: 30rpx; + .tag { + background-color: #fee9ea; + color: #fd463e; + font-size: $font-size-activity-tag; + display: inline-block; + border-radius: 6rpx; + padding: 4rpx 12rpx; + // #ifdef H5 + transform: scale(0.8); + margin-left: -10rpx; + // #endif + } + .store-name { + margin: 10rpx 0; + font-weight: bold; + color: #202021; + font-size: $font-size-toolbar; + } + .address { + color: #5f6067; + font-size: $font-size-tag; + margin-bottom: 10rpx; + } + .distance { + display: flex; + align-items: center; + color: #5f6067; + font-size: $font-size-tag; + .iconfont { + font-size: $font-size-base; + margin-right: 10rpx; + } + } + } + + button { + border-radius: 40rpx; + } + + .other-store { + display: flex; + align-items: center; + color: #5e6066; + font-weight: bold; + justify-content: center; + margin-top: 20rpx; + margin-bottom: 20rpx; + .iconfont { + margin-left: 10rpx; + font-size: $font-size-tag; + } + } +} +.page-bottom { + margin-top: 20rpx; +} diff --git a/common/css/goods_detail.scss b/common/css/goods_detail.scss new file mode 100644 index 0000000..c1a25e1 --- /dev/null +++ b/common/css/goods_detail.scss @@ -0,0 +1,1562 @@ +.goods-detail { + height: 100%; + padding-bottom: 100rpx; + &.active { + padding-bottom: 170rpx; + } +} + +.goods-gression { + position: relative; + z-index: 2; + // margin-top: -60rpx; + margin-top: 24rpx; +} + +// 商品媒体信息 +.goods-media { + width: 100%; + position: relative; + overflow: hidden; + // &::before{ + // content: ""; + // position: absolute; + // left: 0; + // right: 0; + // bottom: 0; + // height: 70rpx; + // background-color: transparent; + // background-image: linear-gradient(transparent 35%, #f6f6f6); + // z-index: 2; + // } + .share { + z-index: 97; + position: absolute; + top: 30rpx; + width: calc(100% - 60rpx); + padding: 10rpx 30rpx; + display: flex; + align-items: center; + justify-content: space-between; + text { + display: inline-block; + width: 60rpx; + height: 60rpx; + color: #fff; + background: rgba(0, 0, 0, 0.42); + border-radius: 50%; + text-align: center; + font-size: $font-size-base; + line-height: 60rpx; + } + .share_right { + text { + margin-left: 30rpx; + } + } + } + &:after { + padding-top: 100%; + display: block; + content: ''; + } + + .goods-img, + .goods-video { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + transition-property: transform; + transition-timing-function: cubic-bezier(0, 0, 0.25, 1); + transition-duration: 350ms; + transform: translate3d(0, 0, 0); + } + + .goods-img { + transform: translateX(100%); + } + + .goods-video { + transform: translateX(-100%); + } + + .goods-img.show, + .goods-video.show { + transform: translateX(0); + } + + .goods-img .swiper { + width: 100%; + height: 100%; + + .item { + width: 100%; + height: 100%; + } + + image { + width: 100%; + height: 100%; + } + } + + .goods-img .img-indicator-dots { + position: absolute; + z-index: 5; + bottom: 30rpx; + right: 40rpx; + background: rgba(100, 100, 100, 0.4); + color: #fff; + font-size: $font-size-tag; + line-height: 40rpx; + border-radius: 20rpx; + padding: 0 20rpx; + } + + .goods-video video { + width: 100%; + height: 100%; + } + + .goods-video .uni-video-cover { + background: none; + } + + .media-mode { + position: absolute; + width: 100%; + z-index: 5; + bottom: 40rpx; + //#ifdef MP + bottom: 80rpx; + //#endif + text-align: center; + line-height: 50rpx; + + text { + background: rgba(100, 100, 100, 0.4); + color: #fff; + font-size: $font-size-tag; + line-height: 50rpx; + border-radius: 20rpx; + padding: 0 30rpx; + display: inline-block; + + &:last-child { + margin-left: 40rpx; + } + } + } +} + +// 营销活动 +.goods-promotion { + position: relative; + height: 108rpx; + overflow: hidden; + background-repeat: no-repeat; + background-size: 100% 100%; + padding: 0 30rpx; + margin: 0 24rpx 20rpx; + border-radius: 16rpx; + .price-info { + margin-right: 280rpx; + color: #fff; + height: inherit; + display: flex; + flex-direction: column; + justify-content: center; + .img-wrap { + width: 200rpx; + height: 60rpx; + display: inline-block; + vertical-align: text-top; + image { + width: 100%; + height: 100%; + } + } + .sale-num { + line-height: 1; + font-size: $font-size-tag; + white-space: nowrap; + overflow: hidden; + color: #fff; + text-overflow: ellipsis; + } + } + .countdown { + position: absolute; + right: 0; + top: 0; + width: 280rpx; + text-align: center; + height: 100%; + background-repeat: no-repeat; + background-size: 100% 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + .txt { + height: 32rpx; + text-align: center; + line-height: 32rpx; + font-size: $font-size-tag; + margin-top: 0; + color: #ff4644; + } + .clockrun { + margin-top: 6rpx; + height: 40rpx; + line-height: 40rpx; + text-align: center; + font-size: $font-size-tag; + color: #fff; + } + } +} + +.goods-tag-list { + margin-top: 10rpx; + display: flex; + flex-wrap: wrap; + align-items: center; + .tag-item { + margin-right: 10rpx; + padding: 6rpx 8rpx; + color: var(--goods-price); + border: 2rpx solid var(--goods-price); + border-radius: 4rpx; + line-height: 1; + font-size: $uni-font-size-sm; + } +} + +.group-wrap { + padding: 0 30rpx; + box-sizing: border-box; + background: #ffffff; + margin: 0 24rpx 20rpx; + border-radius: 16rpx; + + .goods-module-wrap { + position: relative; + padding-right: 110rpx; + + &.info { + padding: 20rpx 0 20rpx; + } + .price-symbol { + font-size: $font-size-toolbar; + position: relative; + top: 6rpx; + font-weight: bold; + margin-right: 4rpx; + color: var(--goods-price); + } + + .price { + font-size: 48rpx; + position: relative; + align-self: flex-end; + line-height: 1; + font-weight: bold; + vertical-align: sub; + color: var(--goods-price); + } + .member-vip-wrap { + width: 80rpx; + height: 30rpx; + font-size: $font-size-goods-tag; + display: inline-block; + margin-right: 10rpx; + position: relative; + top: 10rpx; + image { + width: 100%; + height: 100%; + } + } + .member-price-wrap { + display: inline-block; + font-weight: bold; + margin-left: 10rpx; + vertical-align: text-top; + > text { + color: #666; + } + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + } + .money { + font-size: $font-size-base; + } + .img-wrap { + width: 83rpx; + height: 34rpx; + font-size: $font-size-goods-tag; + border-radius: 6rpx; + display: inline-block; + vertical-align: text-top; + margin-right: 10rpx; + image { + width: 100%; + height: 100%; + } + } + } + .sku-name-wrap, + .introduction { + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + // -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + .sku-name-wrap { + font-weight: bold; + font-size: $font-size-toolbar; + line-height: 1.6; + } + .introduction { + margin: $margin-updown 0; + font-size: $font-size-base; + } + + .logistics-wrap { + display: flex; + margin-top: 10rpx; + text { + flex: 1; + font-size: $font-size-tag; + color: $color-tip; + text-align: center; + &:last-of-type { + text-align: right; + } + &:first-of-type { + text-align: left; + } + } + } + } + + .market-price-wrap { + margin-left: 20rpx; + color: $color-tip; + text-decoration: line-through; + display: inline-block; + vertical-align: sub; + line-height: initial; + .unit { + margin-right: 4rpx; + font-size: $font-size-tag; + } + .money { + font-size: $font-size-base; + } + } +} + +.follow-and-share { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + .iconfont { + font-weight: bold; + margin-right: 30rpx; + font-size: $font-size-toolbar; + vertical-align: middle; + line-height: 1; + &:first-child { + font-size: 36rpx; + // color: #28C445; + // font-weight: normal; + } + &:last-child { + margin-right: 0; + } + } + .fenxiao { + display: block; + position: absolute; + font-size: $font-size-tag; + font-weight: bold; + width: 140%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + left: -80rpx; + text-align: right; + } +} + +.goods-cell { + display: flex; + padding: 20rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + justify-content: space-between; + + .tit { + color: $color-tip; + font-size: $font-size-base; + margin-right: 20rpx; + width: 70rpx; + } + + .box { + width: 90%; + font-size: $font-size-base; + line-height: inherit; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} + +.goods-evaluate { + padding: 20rpx 0; + background: #fff; + + .tit { + display: flex; + align-items: center; + font-size: $font-size-tag; + &.active { + padding-bottom: 20rpx; + border-bottom: 1rpx solid $color-line; + } + + view { + flex: 1; + line-height: 40rpx; + text-align: left; + } + } + + .evaluate-item { + padding: 30rpx 0 0; + .evaluator { + display: flex; + align-items: center; + justify-content: space-between; + .evaluator-info { + display: flex; + align-items: center; + } + .evaluator-face { + width: 80rpx; + height: 80rpx; + border-radius: 50%; + overflow: hidden; + + image { + width: 100%; + height: 100%; + border-radius: 50%; + } + } + .evaluator-name-wrap { + margin-left: 20rpx; + line-height: 1; + } + .evaluator-name { + display: block; + width: 230rpx; + font-size: $font-size-base; + white-space: nowrap; + } + .time { + font-size: $font-size-goods-tag; + } + } + + .cont { + text-align: justify; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + -webkit-box-pack: center; + overflow: hidden; + word-break: break-all; + font-size: $font-size-tag; + } + + .evaluate-img { + display: inline-flex; + margin-top: 20rpx; + + .img-box { + width: 100rpx; + height: 100rpx; + overflow: hidden; + margin: 0 20rpx 20rpx 0; + border-radius: $border-radius; + + image { + width: 100%; + height: 100%; + } + } + } + } + .evaluate-item-empty { + float: right; + color: $color-tip; + text:first-child { + margin-right: 30rpx; + } + .iconfont { + margin-top: 2rpx; + } + } +} + +.goods-action-button { + flex: 1; + margin-left: 20rpx; +} +.goods-action-button:last-child { + margin-right: 20rpx; +} + +// 商家服务 +.goods-merchants-service-popup-layer { + height: 660rpx; + scroll-view { + position: absolute; + left: 0; + right: 0; + height: 65%; + .item { + padding: 0 30rpx; + border-bottom: 2rpx solid $color-line; + display: flex; + align-items: center; + &:last-child { + border-bottom: none; + } + .item-icon { + height: 100%; + display: flex; + align-items: flex-start; + padding-top: 4rpx; + box-sizing: border-box; + width: 60rpx; + &.empty-desc { + padding-top: 0; + align-items: center; + .icon-img { + margin-top: 0 !important; + } + .icon-box { + margin-top: 0 !important; + } + } + } + .iconfont { + display: inline-block; + margin-right: 20rpx; + font-size: 40rpx; + vertical-align: top; + height: 50rpx; + line-height: 50rpx; + } + .icon-img { + width: 35rpx; + height: 35rpx; + margin-right: 20rpx; + margin-top: 12rpx; + } + .icon-box { + width: 48rpx; + height: 48rpx; + text-align: center; + display: flex; + margin-right: 20rpx; + line-height: 1; + margin-top: 0; + font-size: 36rpx; + padding: 2rpx; + } + .info-wrap { + display: inline-block; + vertical-align: middle; + width: 90%; + + .title { + display: block; + font-size: $font-size-base; + } + .describe { + font-size: $font-size-tag; + color: $color-tip; + display: block; + padding-bottom: 10rpx; + line-height: 1.5; + } + } + &.empty-desc { + height: 100rpx; + .iconfont { + vertical-align: middle; + } + } + } + } +} + +// 门店列表 +.store-list-wrap { + scroll-view { + position: absolute; + left: 0; + right: 0; + height: 80%; + } + .store-list-content { + width: 100%; + background: #ffffff; + border-radius: 20rpx; + box-sizing: border-box; + overflow: hidden; + + .list-item { + width: 100%; + padding: 35rpx 24rpx; + box-sizing: border-box; + + .item-box { + width: 100%; + height: 100%; + display: flex; + background: #ffffff; + align-items: center; + + .item-image { + width: 88rpx; + height: 88rpx; + border-radius: 50%; + align-self: start; + + image { + width: 88rpx; + height: 88rpx; + border-radius: 50%; + } + } + + .item-info { + width: 520rpx; + height: 100%; + padding-left: 20rpx; + box-sizing: border-box; + display: flex; + flex-direction: column; + margin-right: 24rpx; + font-size: $font-size-tag; + + .item-title { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 10rpx; + + .title { + max-width: 240rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: $font-size-base; + color: $color-title; + } + + .distance { + font-size: $font-size-activity-tag; + } + } + + .item-time { + font-size: $font-size-activity-tag; + color: $color-tip; + margin-bottom: 10rpx; + } + + .item-address { + font-size: $font-size-tag; + color: $color-title; + line-height: 42rpx; + + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } + } + + .item-right { + flex-grow: 1; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + + .iconfont { + color: #acacac; + } + } + } + } + } +} + +// 商品属性 +.goods-attribute-popup-layer { + height: 660rpx; + + .goods-attribute-body { + position: absolute; + left: 0; + right: 0; + height: 60%; + .item { + padding: $padding 0; + margin: 0 30rpx; + border-bottom: 2rpx solid $color-line; + .attr-name { + color: $color-tip; + display: inline-block; + width: 150rpx; + overflow: hidden; + vertical-align: text-top; + } + .value-name { + margin-left: 20rpx; + vertical-align: text-top; + } + &:last-child { + border-bottom: none; + } + } + } +} + +.goods-attr { + margin: 0 24rpx 20rpx; + background-color: #fff; + border-radius: 16rpx; + overflow: hidden; + + .title { + height: 70rpx; + color: $color-sub; + line-height: 70rpx; + box-sizing: border-box; + font-size: 32rpx; + margin: 0 20rpx; + } + + .attr-action { + text-align: center; + line-height: 70rpx; + font-size: 24rpx; + } + + .attr-wrap { + margin: 20rpx; + border: 2rpx solid #f1f1f1; + border-radius: 16rpx; + overflow: hidden; + + .item { + display: flex; + border-bottom: 2rpx solid #f1f1f1; + + &:last-child { + border-bottom: 0; + } + + .attr-name { + width: 180rpx; + padding: 16rpx 20rpx; + background-color: #fbfafa; + white-space: pre-wrap; + border-right: 2rpx solid #f1f1f1; + line-height: 1.3; + font-size: 26rpx; + } + + .value-name { + padding: 10rpx 20rpx; + white-space: pre-wrap; + line-height: 1.5; + font-size: 26rpx; + flex: 1; + width: 0; + } + } + } +} + +// 详情 +.goods-detail-tab { + margin: 0 24rpx 20rpx; + background-color: #fff; + border-radius: 16rpx; + overflow: hidden; + .detail-tab { + display: flex; + align-items: center; + margin-top: 10rpx; + // width: 100%; + // display: flex; + // justify-content: center; + // align-items: center; + .tab-item { + height: 70rpx; + color: $color-sub; + line-height: 70rpx; + box-sizing: border-box; + font-size: 32rpx; + margin: 0 20rpx; + } + .tab-item.active { + // position: relative; + } + .tab-item.active::after { + // content: ''; + // display: inline-block; + // width: 100%; + // height: 4rpx; + // position: absolute; + // left: 0; + // bottom: 0; + // border-radius: 3rpx; + } + .tab-item:nth-child(1) { + // margin-right: 25%; + } + } + .detail-content { + border-radius: 30rpx; + width: 100%; + overflow: hidden; + margin-bottom: 100rpx; + } + .goods-details { + padding: 10rpx $padding $padding; + overflow: hidden; + * { + max-width: 100% !important; + } + } + .goods-details.active { + min-height: 150rpx; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + color: $color-tip; + } +} + +// 海报 +// .uni-popup__wrapper-box +.poster-layer { + /deep/ .uni-popup__wrapper.center { + width: 100vw!important; + height: 100vh!important; + background: none!important; + } + + /deep/ .uni-popup__wrapper.uni-custom.center .uni-popup__wrapper-box { + max-width: 100vw!important; + max-height: 100vh!important; + background: none!important; + width: 100vw; + height: 100vh; + } + + .poster-wrap { + display: flex; + align-items: center; + justify-content: center; + width: 100vw; + height: 100vh; + flex-direction: column; + } + + .generate-poster { + padding: 40rpx 0; + .iconfont { + font-size: 80rpx; + color: #07c160; + line-height: initial; + } + > view { + text-align: center; + &:last-child { + margin-top: 20rpx; + } + } + } + + .image-wrap { + width: 80%; + position: relative; + + image { + width: 100%; + line-height: 1; + border-radius: 10rpx; + overflow: hidden; + } + } + .msg { + padding: 40rpx; + } + .save-btn { + text-align: center; + height: 80rpx; + line-height: 80rpx; + background-color: $base-color; + border-radius: 10rpx; + width: 80%; + color: #fff; + margin-top: 30rpx; + } + .save-text { + color: #fff; + margin-top: 10rpx; + } + .close { + position: absolute; + top: 0; + right: 20rpx; + width: 40rpx; + height: 80rpx; + font-size: 50rpx; + color: #999; + } +} + +.share-popup, +.uni-popup__wrapper-box { + .share-title { + line-height: 60rpx; + font-size: $font-size-toolbar; + padding: 15rpx 0; + text-align: center; + } + + .share-content { + display: flex; + display: -webkit-flex; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + -ms-flex-wrap: wrap; + -o-flex-wrap: wrap; + flex-wrap: wrap; + padding: 80rpx 15rpx; + + .share-box { + flex: 1; + text-align: center; + + .share-btn { + margin: 0; + padding: 0; + border: none; + line-height: 1; + height: auto; + background: none; + + text { + margin-top: 20rpx; + font-size: $font-size-tag; + display: block; + color: $color-title; + } + } + + .iconfont { + font-size: 80rpx; + line-height: initial; + } + .icon-fuzhilianjie, + .icon-pengyouquan, + .icon-haowuquan, + .icon-share-friend { + color: #07c160; + } + } + } + + .share-footer { + height: 90rpx; + line-height: 90rpx; + border-top: 2rpx solid $color-line; + text-align: center; + } +} + +.newdetail { + padding: 0 30rpx; + background: #ffffff; + margin: 0 24rpx; + border-radius: 16rpx; + .item { + height: 74rpx; + display: flex; + align-items: center; + // border-bottom: 1rpx solid $color-line; + .label { + width: 70rpx; + color: $color-tip; + font-size: $font-size-base; + margin-right: 20rpx; + } + &:last-child { + border-bottom: none; + } + &.free { + .free-tip { + border: 0 solid; + padding: 2rpx 14rpx; + border-radius: $border-radius; + margin-right: 10rpx; + font-size: $font-size-tag; + font-weight: bold; + color: var(--main-color); + background-color: var(--main-color-shallow); + } + .value { + display: inline-block; + width: 70%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + &.service { + .list-wrap { + margin-right: 20rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + display: flex; + .item-wrap { + display: inline; + font-size: $font-size-base; + margin-right: 20rpx; + &:last-child { + margin-right: 0; + } + .item-wrap-box { + display: flex; + align-items: center; + font-size: 26rpx; + .item-wrap-icon { + display: flex; + align-items: center; + font-size: 34rpx; + padding: 2rpx; + } + .icon-dui { + font-size: $font-size-base; + margin-right: 6rpx; + line-height: 30rpx; + color: $base-color; + } + .icon-img { + width: 28rpx; + height: 28rpx; + margin-right: 6rpx; + } + .icon-box { + width: 32rpx; + height: 32rpx; + text-align: center; + display: flex; + margin-right: 6rpx; + line-height: 1; + padding: 2rpx; + } + text { + white-space: nowrap; + } + } + } + } + } + + &.selected-sku-spec { + .box { + flex: 1; + margin-right: 60rpx; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text { + margin-right: 10rpx; + &:last-child { + margin-right: 0; + } + } + } + } + + &.delivery-type { + .box { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + text { + padding-right: 30rpx; + position: relative; + + &:after { + content: ' '; + width: 6rpx; + height: 6rpx; + border-radius: 50%; + background: #000; + position: absolute; + top: 50%; + right: 0; + transform: translate(-12rpx, -50%); + } + + &:last-child:after { + content: ''; + display: none; + } + } + } + } + + &.goods-attribute { + .box { + flex: 1; + margin-right: 60rpx; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text { + margin-right: 20rpx; + &:last-child { + margin-right: 0; + } + } + } + } + + &.store-wrap { + height: auto; + .list-wrap { + padding: 10rpx 0 16rpx; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .name-wrap { + display: flex; + align-items: center; + line-height: 1; + .icondiy { + font-weight: bold; + font-size: $font-size-base; + } + .name { + margin-left: 10rpx; + font-size: $font-size-tag; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + } + } + .other-wrap { + display: flex; + align-items: center; + font-size: $font-size-tag; + line-height: 1; + margin-top: 12rpx; + .decorate { + position: relative; + top: -8rpx; + margin: 0 10rpx; + } + .address { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; + max-width: 400rpx; + line-height: 1; + font-size: $font-size-tag; + } + } + } + + .img-wrap { + width: 38rpx; + height: 38rpx; + position: absolute; + right: 30rpx; + image { + width: 100%; + height: 100%; + } + } + } +} + +.popup-layer { + background: #fff; + .head-wrap { + font-size: $font-size-toolbar; + line-height: 100rpx; + height: 100rpx; + display: block; + text-align: center; + .iconfont { + position: absolute; + float: right; + right: 44rpx; + font-size: $font-size-toolbar; + } + } + .button-box { + width: 100%; + position: absolute; + bottom: 0; + z-index: 1; + margin-bottom: 30rpx; + button { + height: 80rpx; + background-color: var(--goods-btn-color); + } + } +} + +.deliverytype-popup-layer { + .type-body { + padding: 30rpx; + box-sizing: border-box; + } + + .type-item { + display: flex; + margin-bottom: 40rpx; + + .iconfont { + margin-right: 30rpx; + color: $base-color; + } + + .title { + font-weight: bold; + margin-bottom: 20rpx; + } + .desc { + font-size: 24rpx; + } + + &.not-support { + .title, + .desc, + .iconfont { + color: #aaa; + } + } + } +} + +.icon-right { + color: $color-tip; + font-size: $font-size-base; + position: absolute; + right: 30rpx; +} + +.promotion-tag { + color: #fff; + font-size: $font-size-activity-tag; + border-top-left-radius: 30rpx; + border-bottom-left-radius: 30rpx; + padding: 4rpx 10rpx; + margin-right: 10rpx; + vertical-align: middle; + background-color: var(--promotion-tag); + display: none; +} + +//社群 +.detail-community { + background: #fff; + padding: 30rpx; + margin-bottom: 20rpx; + display: flex; + align-items: center; + justify-content: space-between; + + .community-box { + display: flex; + align-items: center; + + image { + width: 70rpx; + height: 70rpx; + border-radius: 10rpx; + margin-right: 20rpx; + } + .community-title { + font-family: PingFang-SC-Medium; + font-size: 28rpx; + // line-height: 36rpx; + color: #303133; + } + .community-txt { + font-family: PingFang-SC-Medium; + font-size: 24rpx; + color: #909399; + width: 450rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + .community-btn { + width: 100rpx; + height: 50rpx; + line-height: 50rpx; + background-color: #03bd04; + border-radius: 10rpx; + text-align: center; + font-family: PingFang-SC-Medium; + font-size: 24rpx; + color: #ffffff; + } +} + +.community-model { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100vh; + background: rgba(0, 0, 0, 0.4); + z-index: 9999; + + .community-model-content { + width: 500rpx; + height: 600rpx; + background-color: #ffffff; + border-radius: 10rpx; + margin: 35% auto 0; + position: relative; + overflow: hidden; + + .community-model-content-radius { + width: 600rpx; + height: 240rpx; + border-radius: 100%; + background: $base-color; + position: absolute; + left: -50rpx; + top: -60rpx; + + view { + margin-top: 120rpx; + text-align: center; + font-family: PingFang-SC-Bold; + font-size: 30rpx; + color: #ffffff; + } + } + + .community-model-content-draw { + width: 260rpx; + height: 260rpx; + margin: 214rpx auto 0; + + image { + width: 100%; + height: 100%; + } + } + .community-model-content-text { + font-family: PingFang-SC-Medium; + font-size: 24rpx; + color: #909399; + text-align: center; + margin-top: 20rpx; + } + } + .community-model-close { + width: 56rpx; + height: 56rpx; + border: 2rpx solid #fff; + border-radius: 50%; + margin: 50rpx auto 0; + text-align: center; + color: #fff; + } +} +.to-top { + position: fixed; + right: 50rpx; + bottom: 200rpx; + background-color: rgba(0, 0, 0, 0.5); + border-radius: 50%; + display: flex; + width: 80rpx; + height: 80rpx; + align-items: center; + justify-content: center; + z-index: 90; + color: #fff; +} + +// 活动步骤 +.diy-process-step { + padding: 30rpx 30rpx; + background-color: #fff; + margin-top: 20rpx; + border-radius: 16rpx; + margin: 0 24rpx 20rpx; + .goods-img-content { + font-size: 32rpx; + font-weight: 800; + color: $color-title; + line-height: 36rpx; + margin-right: 14rpx; + text-align: left; + margin-top: 20rpx; + } + .process-step-box { + display: flex; + flex-direction: column; + margin-top: 30rpx; + .process-step-item { + display: flex; + align-items: center; + .process-step-icon { + background-color: $base-color; + color: #fff; + width: 90rpx; + height: 90rpx; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-right: 20rpx; + line-height: 1; + .iconfont { + font-size: 48rpx; + } + } + .process-step-content { + view { + font-size: 30rpx; + &:last-child { + color: #999; + font-size: 24rpx; + margin-top: 10rpx; + } + } + } + } + .process-step-line { + width: 100%; + height: 60rpx; + display: flex; + align-items: center; + view { + width: 60rpx; + height: 50rpx; + border-left: 4rpx dotted $base-color; + margin-left: 45rpx; + border-left-image-width: 4rpx; + } + } + } +} + +// 卡项套餐 +.card-info { + padding-bottom: 30rpx; + .card-title { + padding: 20rpx 0 10rpx; + text-align: center; + font-weight: bold; + } + .card-desc { + padding-left: 10rpx; + margin-bottom: 20rpx; + font-size: $font-size-tag; + color: $color-sub; + } + .card-content { + overflow: hidden; + } + .card-item { + margin-bottom: 28rpx; + display: flex; + padding: 20rpx; + background-color: #fbf9fc; + border-radius: 12rpx; + &:last-of-type { + margin-bottom: 0; + } + image { + overflow: hidden; + margin-right: 24rpx; + width: 160rpx; + height: 160rpx; + border-radius: 10rpx; + } + .content { + position: relative; + flex: 1; + .name { + padding-right: 30rpx; + } + .price { + font-size: $font-size-tag; + color: $color-sub; + } + .num { + position: absolute; + top: 10rpx; + right: 4rpx; + font-size: $font-size-tag; + } + } + } + .card-off { + display: flex; + justify-content: center; + align-items: center; + margin-top: 20rpx; + line-height: 1; + text { + font-size: $font-size-tag; + &:last-of-type { + margin-left: 6rpx; + font-size: $font-size-tag; + } + } + } +} diff --git a/common/css/icon/extend.css b/common/css/icon/extend.css new file mode 100644 index 0000000..af8a948 --- /dev/null +++ b/common/css/icon/extend.css @@ -0,0 +1 @@ +/* 扩展图标库文件 */ \ No newline at end of file diff --git a/common/css/icondiy.css b/common/css/icondiy.css new file mode 100644 index 0000000..f374f3f --- /dev/null +++ b/common/css/icondiy.css @@ -0,0 +1,5731 @@ + + +@font-face { + font-family: "icondiy"; + src: url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.eot?t=6eb737a754b77f73d83eb51514ab63f9'); /* IE9 */ + src: url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.eot?t=6eb737a754b77f73d83eb51514ab63f9#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.woff?t=6eb737a754b77f73d83eb51514ab63f9') format('woff2'), + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.woff?t=6eb737a754b77f73d83eb51514ab63f9') format('woff'), /* chrome銆乫irefox */ + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.ttf?t=6eb737a754b77f73d83eb51514ab63f9') format('truetype'), /* chrome銆乫irefox銆乷pera銆丼afari, Android, iOS 4.2+*/ + url('https://cdn3.codesign.qq.com/icons/MQmlyZwl3GjWRA1/latest/iconfont.svg?t=6eb737a754b77f73d83eb51514ab63f9#icondiy') format('svg'); /* iOS 4.1- */ +} + +.icondiy { + font-family: "icondiy" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-system-daifahuo:before { + content: "\e00c"; +} +.icon-system-daifukuan:before { + content: "\e00d"; +} +.icon-system-daipingjie:before { + content: "\e010"; +} +.icon-system-shuhou:before { + content: "\e011"; +} +.icon-system-daishouhuo:before { + content: "\e012"; +} +.icon-system-my-selected:before { + content: "\e016"; +} +.icon-system-cart-selected:before { + content: "\e019"; +} +.icon-system-home-selected:before { + content: "\e01a"; +} +.icon-system-category-selected:before { + content: "\e01c"; +} +.icon-system-bargain-one:before { + content: "\e01d"; +} +.icon-system-search:before { + content: "\e01f"; +} +.icon-system-video:before { + content: "\e020"; +} +.icon-system-img-one:before { + content: "\e022"; +} +.icon-system-weizhi:before { + content: "\e023"; +} +.icon-system-yushou:before { + content: "\e024"; +} +.icon-system-fanlibaojia:before { + content: "\e025"; +} +.icon-system-tuwendaohang:before { + content: "\e026"; +} +.icon-system-youhuiquan:before { + content: "\e027"; +} +.icon-system-menu:before { + content: "\e028"; +} +.icon-system-live-one:before { + content: "\e029"; +} +.icon-system-mofang:before { + content: "\e02a"; +} +.icon-system-booking-management:before { + content: "\e02b"; +} +.icon-system-category-one:before { + content: "\e02c"; +} +.icon-system-agent:before { + content: "\e02d"; +} +.icon-system-fans-management:before { + content: "\e02e"; +} +.icon-system-edit:before { + content: "\e02f"; +} +.icon-system-cart-one:before { + content: "\e030"; +} +.icon-system-miaosha:before { + content: "\e031"; +} +.icon-system-qrcode:before { + content: "\e032"; +} +.icon-system-many-goods:before { + content: "\e033"; +} +.icon-system-manual-choose:before { + content: "\e034"; +} +.icon-system-servicer:before { + content: "\e035"; +} +.icon-system-share:before { + content: "\e036"; +} +.icon-system-download:before { + content: "\e037"; +} +.icon-system-piliangfahuo:before { + content: "\e038"; +} +.icon-system-exclusive-sales:before { + content: "\e039"; +} +.icon-system-quick-reply-set:before { + content: "\e03a"; +} +.icon-system-jiaoyi:before { + content: "\e03b"; +} +.icon-system-pintuan:before { + content: "\e03c"; +} +.icon-system-compass:before { + content: "\e03d"; +} +.icon-system-financial-management:before { + content: "\e03e"; +} +.icon-system-service-project:before { + content: "\e03f"; +} +.icon-system-notice:before { + content: "\e040"; +} +.icon-system-inventory-center:before { + content: "\e041"; +} +.icon-system-customer-service:before { + content: "\e042"; +} +.icon-system-gift:before { + content: "\e043"; +} +.icon-system-fast-delivery:before { + content: "\e044"; +} +.icon-system-picture:before { + content: "\e045"; +} +.icon-system-countdown:before { + content: "\e046"; +} +.icon-system-datab-oard:before { + content: "\e047"; +} +.icon-system-withdrawal:before { + content: "\e048"; +} +.icon-system-everybody:before { + content: "\e049"; +} +.icon-system-zhifupeizhi:before { + content: "\e04a"; +} +.icon-system-asset-management:before { + content: "\e04b"; +} +.icon-system-applet:before { + content: "\e04c"; +} +.icon-system-enterprise-set:before { + content: "\e04d"; +} +.icon-system-deal-set:before { + content: "\e04e"; +} +.icon-system-customer-stat:before { + content: "\e04f"; +} +.icon-system-set:before { + content: "\e050"; +} +.icon-system-shop:before { + content: "\e058"; +} +.icon-system-daifukuan2:before { + content: "\e059"; +} +.icon-system-shuhou2:before { + content: "\e05a"; +} +.icon-system-daifahuo2:before { + content: "\e05b"; +} +.icon-system-daipingjie2:before { + content: "\e05c"; +} +.icon-system-daishouhuo2:before { + content: "\e05d"; +} +.icon-system-huangguan:before { + content: "\e05e"; +} +.icon-system-tuijian:before { + content: "\e060"; +} +.icon-system-erweima:before { + content: "\e069"; +} +.icon-system-liwu:before { + content: "\e06b"; +} +.icon-system-coupon:before { + content: "\e06c"; +} +.icon-system-bargain:before { + content: "\e06d"; +} +.icon-system-miaosha-time:before { + content: "\e06e"; +} +.icon-system-fenxiao-center:before { + content: "\e06f"; +} +.icon-system-firend-coupon:before { + content: "\e070"; +} +.icon-system-liebian-red-envelope:before { + content: "\e071"; +} +.icon-system-pinqiufanli:before { + content: "\e072"; +} +.icon-system-gift-card:before { + content: "\e073"; +} +.icon-system-my-bargain:before { + content: "\e074"; +} +.icon-system-my-pintuan:before { + content: "\e075"; +} +.icon-system-my-footprint:before { + content: "\e076"; +} +.icon-system-idcard:before { + content: "\e077"; +} +.icon-system-my-focus:before { + content: "\e078"; +} +.icon-system-account-list:before { + content: "\e079"; +} +.icon-system-check-station:before { + content: "\e07a"; +} +.icon-system-my-presale:before { + content: "\e07b"; +} +.icon-system-delivery-address:before { + content: "\e07c"; +} +.icon-system-blind-box:before { + content: "\e07d"; +} +.icon-system-member-recommend:before { + content: "\e07e"; +} +.icon-system-signin:before { + content: "\e07f"; +} +.icon-system-seckill-time:before { + content: "\e082"; +} +.icon-system-help:before { + content: "\e083"; +} +.icon-system-pintuan-nav:before { + content: "\e084"; +} +.icon-system-get-coupon:before { + content: "\e085"; +} +.icon-system-groupbuy-nav:before { + content: "\e086"; +} +.icon-system-topic-nav:before { + content: "\e087"; +} +.icon-system-notice-nav:before { + content: "\e088"; +} +.icon-system-point-nav:before { + content: "\e089"; +} +.icon-system-bargain-nav:before { + content: "\e08a"; +} +.icon-system-live-nav:before { + content: "\e08b"; +} +.icon-emoji-chijing:before { + content: "\e0a3"; +} +.icon-emoji-bao:before { + content: "\e0a4"; +} +.icon-emoji-zhawen:before { + content: "\e0a6"; +} +.icon-emoji-kaixin:before { + content: "\e0a7"; +} +.icon-emoji-jingbao:before { + content: "\e0a8"; +} +.icon-emoji-kaixin1:before { + content: "\e0a9"; +} +.icon-emoji-chihuan:before { + content: "\e0ac"; +} +.icon-emoji-qifen:before { + content: "\e0ad"; +} +.icon-emoji-mamu:before { + content: "\e0ae"; +} +.icon-emoji-bishi:before { + content: "\e0af"; +} +.icon-emoji-zhouma:before { + content: "\e0b0"; +} +.icon-emoji-ganga:before { + content: "\e0b1"; +} +.icon-emoji-mogui:before { + content: "\e0b2"; +} +.icon-emoji-qifen1:before { + content: "\e0b3"; +} +.icon-emoji-guanghu:before { + content: "\e0b4"; +} +.icon-clothes-panshenqun:before { + content: "\e0b5"; +} +.icon-clothes-duanku2:before { + content: "\e0b7"; +} +.icon-clothes-paopao:before { + content: "\e0b8"; +} +.icon-clothes-duanku1:before { + content: "\e0bb"; +} +.icon-clothes-yifu1:before { + content: "\e0bc"; +} +.icon-clothes-wenjing1:before { + content: "\e0bd"; +} +.icon-clothes-duanxiu1:before { + content: "\e0be"; +} +.icon-clothes-kuzi:before { + content: "\e0bf"; +} +.icon-clothes-jiubei:before { + content: "\e0c0"; +} +.icon-clothes-duanku:before { + content: "\e0c1"; +} +.icon-clothes-lianyiqun:before { + content: "\e0c4"; +} +.icon-system-naozhong4:before { + content: "\e0c5"; +} +.icon-clothes-jiubei1:before { + content: "\e0c6"; +} +.icon-system-naozhong3:before { + content: "\e0c7"; +} +.icon-clothes-yijia:before { + content: "\e0c8"; +} +.icon-clothes-gongzhuangku:before { + content: "\e0c9"; +} +.icon-clothes-yifu2:before { + content: "\e0ca"; +} +.icon-clothes-niuziku:before { + content: "\e0cb"; +} +.icon-system-naozhong2:before { + content: "\e0cd"; +} +.icon-clothes-wenjing2:before { + content: "\e0ce"; +} +.icon-clothes-tuowa:before { + content: "\e0cf"; +} +.icon-clothes-wazi1:before { + content: "\e0d1"; +} +.icon-system-naozhong1:before { + content: "\e0d2"; +} +.icon-clothes-zhangxiu:before { + content: "\e0d4"; +} +.icon-clothes-yongyi:before { + content: "\e0d5"; +} +.icon-clothes-maozi1:before { + content: "\e0d6"; +} +.icon-clothes-maozi:before { + content: "\e0d7"; +} +.icon-clothes-duanxiu2:before { + content: "\e0d8"; +} +.icon-system-huangguan1:before { + content: "\e0d9"; +} +.icon-clothes-Txu:before { + content: "\e0da"; +} +.icon-clothes-weijin:before { + content: "\e0db"; +} +.icon-clothes-shangyi1:before { + content: "\e0dc"; +} +.icon-clothes-lianyiqun1:before { + content: "\e0dd"; +} +.icon-clothes-weiyi:before { + content: "\e0de"; +} +.icon-clothes-shangyi:before { + content: "\e0df"; +} +.icon-clothes-majia:before { + content: "\e0e0"; +} +.icon-clothes-wazi:before { + content: "\e0e1"; +} +.icon-clothes-hurongfu:before { + content: "\e0e2"; +} +.icon-clothes-duanxiu:before { + content: "\e0e3"; +} +.icon-system-huangguan2:before { + content: "\e0e4"; +} +.icon-edu-huihua:before { + content: "\e0e7"; +} +.icon-edu-jiankangchangshi:before { + content: "\e0e8"; +} +.icon-edu-lishi:before { + content: "\e0eb"; +} +.icon-edu-meishu:before { + content: "\e0ec"; +} +.icon-edu-shengwu:before { + content: "\e0ee"; +} +.icon-edu-shu:before { + content: "\e0ef"; +} +.icon-edu-shuxue:before { + content: "\e0f3"; +} +.icon-edu-benyu:before { + content: "\e0f4"; +} +.icon-edu-wuli:before { + content: "\e0f7"; +} +.icon-edu-xiangpi:before { + content: "\e0f8"; +} +.icon-edu-yingyu:before { + content: "\e0fb"; +} +.icon-edu-yuwen:before { + content: "\e0fc"; +} +.icon-edu-chezi:before { + content: "\e100"; +} +.icon-edu-deli:before { + content: "\e101"; +} +.icon-edu-zhengzhi:before { + content: "\e102"; +} +.icon-tourism-lvxingpao:before { + content: "\e106"; +} +.icon-tourism-guanguanglanche:before { + content: "\e107"; +} +.icon-tourism-lvxingxiang:before { + content: "\e108"; +} +.icon-tourism-suotanyi:before { + content: "\e109"; +} +.icon-sport-lanqiu1:before { + content: "\e168"; +} +.icon-sport-jutong:before { + content: "\e169"; +} +.icon-sport-kualan:before { + content: "\e16a"; +} +.icon-sport-lanqiu:before { + content: "\e16b"; +} +.icon-sport-motuo:before { + content: "\e16c"; +} +.icon-sport-baiqiu:before { + content: "\e16d"; +} +.icon-sport-humaoqiu:before { + content: "\e16e"; +} +.icon-sport-boku:before { + content: "\e16f"; +} +.icon-sport-shouqiu:before { + content: "\e170"; +} +.icon-sport-shejihuan:before { + content: "\e171"; +} +.icon-sport-siqiu:before { + content: "\e172"; +} +.icon-sport-baolingqiu:before { + content: "\e173"; +} +.icon-sport-juqiu:before { + content: "\e174"; +} +.icon-sport-bingqiu:before { + content: "\e175"; +} +.icon-sport-bangqiu:before { + content: "\e176"; +} +.icon-sport-bobu:before { + content: "\e177"; +} +.icon-sport-humaoqiubo:before { + content: "\e178"; +} +.icon-sport-wangqiu:before { + content: "\e179"; +} +.icon-sport-yaling:before { + content: "\e17a"; +} +.icon-sport-zixingche:before { + content: "\e17b"; +} +.icon-sport-wudao:before { + content: "\e17c"; +} +.icon-sport-qugunqiu:before { + content: "\e17d"; +} +.icon-sport-zixingche1:before { + content: "\e17e"; +} +.icon-sport-tiaosheng:before { + content: "\e17f"; +} +.icon-sport-xiangpu:before { + content: "\e180"; +} +.icon-sport-wangqiu1:before { + content: "\e181"; +} +.icon-sport-pingpangqiu:before { + content: "\e182"; +} +.icon-sport-chonglang:before { + content: "\e183"; +} +.icon-sport-chonglang1:before { + content: "\e184"; +} +.icon-weather-duoyun1:before { + content: "\e185"; +} +.icon-weather-duoyun2:before { + content: "\e186"; +} +.icon-weather-duoyun3:before { + content: "\e187"; +} +.icon-weather-feng:before { + content: "\e188"; +} +.icon-weather-shandian:before { + content: "\e189"; +} +.icon-weather-duoyun4:before { + content: "\e18a"; +} +.icon-weather-feng1:before { + content: "\e18b"; +} +.icon-weather-leiyujiaojia:before { + content: "\e18c"; +} +.icon-weather-wanshang:before { + content: "\e18d"; +} +.icon-weather-leidian:before { + content: "\e18e"; +} +.icon-weather-xiaoyu:before { + content: "\e18f"; +} +.icon-weather-mai:before { + content: "\e190"; +} +.icon-weather-wu:before { + content: "\e191"; +} +.icon-weather-xiaxiaoxue:before { + content: "\e192"; +} +.icon-weather-qing:before { + content: "\e193"; +} +.icon-weather-xiaoyu1:before { + content: "\e194"; +} +.icon-weather-tayang:before { + content: "\e195"; +} +.icon-weather-xuehua:before { + content: "\e196"; +} +.icon-weather-yugaxue:before { + content: "\e197"; +} +.icon-weather-yugaxue1:before { + content: "\e198"; +} +.icon-weather-yangchen:before { + content: "\e199"; +} +.icon-weather-ruliang:before { + content: "\e19a"; +} +.icon-weather-yun:before { + content: "\e19b"; +} +.icon-weather-zhongxue:before { + content: "\e19c"; +} +.icon-weather-zhongxue1:before { + content: "\e19d"; +} +.icon-weather-taixue1:before { + content: "\e19e"; +} +.icon-weather-taiyu:before { + content: "\e19f"; +} +.icon-weather-taixue:before { + content: "\e1a0"; +} +.icon-weather-zhongyu:before { + content: "\e1a1"; +} +.icon-weather-taiyu1:before { + content: "\e1a2"; +} +.icon-weather-duoyun:before { + content: "\e1a3"; +} +.icon-system-xiangzuojiantou:before { + content: "\e1a4"; +} +.icon-system-xiaoxi1:before { + content: "\e1a5"; +} +.icon-system-xiangzuo:before { + content: "\e1a6"; +} +.icon-system-xiaoxi2:before { + content: "\e1a7"; +} +.icon-system-yinle2:before { + content: "\e1a9"; +} +.icon-system-yinle1:before { + content: "\e1aa"; +} +.icon-system-liuhu1:before { + content: "\e1ab"; +} +.icon-system-youshang:before { + content: "\e1ac"; +} +.icon-system-youshangjiantou:before { + content: "\e1ad"; +} +.icon-system-liuhu2:before { + content: "\e1ae"; +} +.icon-system-youxiajiantou:before { + content: "\e1af"; +} +.icon-system-yunduanshangzhuan:before { + content: "\e1b0"; +} +.icon-system-yunduanxiazai:before { + content: "\e1b1"; +} +.icon-system-zhaopian2:before { + content: "\e1b2"; +} +.icon-system-zuoshangjiantou:before { + content: "\e1b3"; +} +.icon-system-zhaopian1:before { + content: "\e1b4"; +} +.icon-system-zuoxiajiantou:before { + content: "\e1b6"; +} +.icon-system-android:before { + content: "\e1b7"; +} +.icon-system-android-light:before { + content: "\e1b8"; +} +.icon-system-caishan1:before { + content: "\e1ba"; +} +.icon-system-bianji:before { + content: "\e1bb"; +} +.icon-system-caishan2:before { + content: "\e1bc"; +} +.icon-system-youxia:before { + content: "\e1bf"; +} +.icon-system-dianpu:before { + content: "\e1c0"; +} +.icon-system-dianpu1:before { + content: "\e1c1"; +} +.icon-system-guanbi:before { + content: "\e1c4"; +} +.icon-system-fangxiao:before { + content: "\e1c5"; +} +.icon-system-erweima-1:before { + content: "\e1c7"; +} +.icon-system-jiesuo:before { + content: "\e1c8"; +} +.icon-system-fangtai:before { + content: "\e1c9"; +} +.icon-system-fenlei1:before { + content: "\e1ca"; +} +.icon-system-fenlei2:before { + content: "\e1cb"; +} +.icon-system-guanbi1:before { + content: "\e1cc"; +} +.icon-system-guanzhu1:before { + content: "\e1cf"; +} +.icon-system-guanzhu2:before { + content: "\e1d0"; +} +.icon-system-jiantoushang:before { + content: "\e1d3"; +} +.icon-system-jiantouxia:before { + content: "\e1d4"; +} +.icon-system-jiantouyou:before { + content: "\e1d5"; +} +.icon-system-xiangji1:before { + content: "\e1d6"; +} +.icon-system-xiayibu:before { + content: "\e1d7"; +} +.icon-system-xiangshang:before { + content: "\e1d8"; +} +.icon-system-xiangji2:before { + content: "\e1da"; +} +.icon-system-qiafu1:before { + content: "\e1db"; +} +.icon-system-qiafu2:before { + content: "\e1dc"; +} +.icon-system-xiangxia:before { + content: "\e1dd"; +} +.icon-system-xiangxiajiantou:before { + content: "\e1de"; +} +.icon-system-xiangyoujiantou:before { + content: "\e1df"; +} +.icon-system-lajietong:before { + content: "\e1e0"; +} +.icon-system-lajietong1:before { + content: "\e1e1"; +} +.icon-system-liuyin2:before { + content: "\e1e2"; +} +.icon-system-libiao:before { + content: "\e1e3"; +} +.icon-system-liuyin1:before { + content: "\e1e4"; +} +.icon-system-piaoju1:before { + content: "\e1e5"; +} +.icon-system-laya2:before { + content: "\e1e6"; +} +.icon-system-pengluo:before { + content: "\e1e7"; +} +.icon-system-qianpao1:before { + content: "\e1e8"; +} +.icon-system-qianpao2:before { + content: "\e1ea"; +} +.icon-system-shanglajiantou:before { + content: "\e1ec"; +} +.icon-system-shouye1:before { + content: "\e1ee"; +} +.icon-system-shezhi2:before { + content: "\e1ef"; +} +.icon-system-shangyibu:before { + content: "\e1f0"; +} +.icon-system-piaoju:before { + content: "\e1f1"; +} +.icon-system-leimu:before { + content: "\e1f2"; +} +.icon-system-xiaosuo1:before { + content: "\e1f3"; +} +.icon-system-suoding:before { + content: "\e1f5"; +} +.icon-system-laya1:before { + content: "\e1f6"; +} +.icon-system-shouzang1:before { + content: "\e1f7"; +} +.icon-system-xiaosuo2:before { + content: "\e1f8"; +} +.icon-system-shouye2:before { + content: "\e1f9"; +} +.icon-system-tongzhi:before { + content: "\e1fa"; +} +.icon-system-tubiao1:before { + content: "\e1fb"; +} +.icon-system-tubiao2:before { + content: "\e1fc"; +} +.icon-system-tubiao6:before { + content: "\e1fd"; +} +.icon-system-tubiao9:before { + content: "\e1fe"; +} +.icon-system-tubiao7:before { + content: "\e1ff"; +} +.icon-system-tubiao5:before { + content: "\e201"; +} +.icon-system-tubiao11:before { + content: "\e202"; +} +.icon-system-tongzhi1:before { + content: "\e203"; +} +.icon-system-wodi1:before { + content: "\e204"; +} +.icon-system-tubiao10:before { + content: "\e205"; +} +.icon-system-tubiao8:before { + content: "\e206"; +} +.icon-system-wodi2:before { + content: "\e207"; +} +.icon-system-wodi4:before { + content: "\e208"; +} +.icon-system-xialajiantou:before { + content: "\e209"; +} +.icon-system-tubiao3:before { + content: "\e20b"; +} +.icon-system-shezhi3:before { + content: "\e20d"; +} +.icon-system-tubiao12:before { + content: "\e20e"; +} +.icon-system-shouzang:before { + content: "\e20f"; +} +.icon-system-tubiao4:before { + content: "\e210"; +} +.icon-system-wodi3:before { + content: "\e211"; +} +.icon-system-7days-return:before { + content: "\e212"; +} +.icon-system-lightning-refund:before { + content: "\e213"; +} +.icon-system-gongyi:before { + content: "\e214"; +} +.icon-system-cash-delivery:before { + content: "\e215"; +} +.icon-system-freight:before { + content: "\e216"; +} +.icon-system-add-fill:before { + content: "\e218"; +} +.icon-system-add-circle-line:before { + content: "\e219"; +} +.icon-system-add-line:before { + content: "\e21a"; +} +.icon-system-admin-fill:before { + content: "\e21b"; +} +.icon-system-advertisement-fill:before { + content: "\e21c"; +} +.icon-system-advertisement-line:before { + content: "\e21d"; +} +.icon-system-admin-line:before { + content: "\e21e"; +} +.icon-system-airplay-fill:before { + content: "\e21f"; +} +.icon-system-alarm-fill:before { + content: "\e220"; +} +.icon-system-alarm-line:before { + content: "\e221"; +} +.icon-system-airplay-line:before { + content: "\e222"; +} +.icon-system-alarm-warning-fill:before { + content: "\e223"; +} +.icon-system-album-fill:before { + content: "\e224"; +} +.icon-system-alarm-warning-line:before { + content: "\e225"; +} +.icon-system-album-line:before { + content: "\e226"; +} +.icon-system-alert-fill:before { + content: "\e227"; +} +.icon-system-alert-line:before { + content: "\e228"; +} +.icon-system-align-bottom:before { + content: "\e22b"; +} +.icon-system-align-justify:before { + content: "\e22c"; +} +.icon-system-align-left:before { + content: "\e22d"; +} +.icon-system-align-center:before { + content: "\e22e"; +} +.icon-system-align-right:before { + content: "\e22f"; +} +.icon-system-align-top:before { + content: "\e230"; +} +.icon-system-align-vertically:before { + content: "\e231"; +} +.icon-system-alipay-fill:before { + content: "\e232"; +} +.icon-system-alipay-line:before { + content: "\e233"; +} +.icon-system-ancient-pavilion-line:before { + content: "\e234"; +} +.icon-system-android-fill:before { + content: "\e235"; +} +.icon-system-24-hours-fill:before { + content: "\e236"; +} +.icon-system-24-hours-line:before { + content: "\e237"; +} +.icon-system-a-b:before { + content: "\e238"; +} +.icon-system-account-circle-fill:before { + content: "\e239"; +} +.icon-system-account-box-fill:before { + content: "\e23a"; +} +.icon-system-account-box-line:before { + content: "\e23b"; +} +.icon-system-amazon-fill:before { + content: "\e23c"; +} +.icon-system-amazon-line:before { + content: "\e23d"; +} +.icon-system-anchor-fill:before { + content: "\e23e"; +} +.icon-system-ancient-gate-fill:before { + content: "\e23f"; +} +.icon-system-anchor-line:before { + content: "\e240"; +} +.icon-system-ancient-gate-line:before { + content: "\e241"; +} +.icon-system-4k-fill:before { + content: "\e242"; +} +.icon-system-ancient-pavilion-fill:before { + content: "\e243"; +} +.icon-system-account-circle-line:before { + content: "\e244"; +} +.icon-system-android-line:before { + content: "\e245"; +} +.icon-system-angularjs-fill:before { + content: "\e246"; +} +.icon-system-account-pin-box-fill:before { + content: "\e247"; +} +.icon-system-4k-line:before { + content: "\e248"; +} +.icon-system-account-pin-box-line:before { + content: "\e249"; +} +.icon-system-account-pin-circle-fill:before { + content: "\e24a"; +} +.icon-system-add-box-fill:before { + content: "\e24b"; +} +.icon-system-account-pin-circle-line:before { + content: "\e24c"; +} +.icon-system-add-box-line:before { + content: "\e24d"; +} +.icon-system-add-circle-fill:before { + content: "\e24e"; +} +.icon-system-anticlockwise-fill:before { + content: "\e24f"; +} +.icon-system-anticlockwise-line:before { + content: "\e250"; +} +.icon-system-apple-line:before { + content: "\e251"; +} +.icon-system-apps-2-line:before { + content: "\e252"; +} +.icon-system-apps-2-fill:before { + content: "\e253"; +} +.icon-system-apple-fill:before { + content: "\e254"; +} +.icon-system-arrow-drop-up-fill:before { + content: "\e255"; +} +.icon-system-apps-line:before { + content: "\e256"; +} +.icon-system-apps-fill:before { + content: "\e257"; +} +.icon-system-arrow-drop-right-fill:before { + content: "\e258"; +} +.icon-system-app-store-fill:before { + content: "\e259"; +} +.icon-system-archive-line:before { + content: "\e25a"; +} +.icon-system-arrow-drop-down-fill:before { + content: "\e25b"; +} +.icon-system-arrow-down-circle-fill:before { + content: "\e25c"; +} +.icon-system-app-store-line:before { + content: "\e25d"; +} +.icon-system-archive-drawer-fill:before { + content: "\e25e"; +} +.icon-system-archive-drawer-line:before { + content: "\e25f"; +} +.icon-system-archive-fill:before { + content: "\e260"; +} +.icon-system-arrow-drop-left-line:before { + content: "\e261"; +} +.icon-system-arrow-down-circle-line:before { + content: "\e262"; +} +.icon-system-arrow-down-fill:before { + content: "\e263"; +} +.icon-system-arrow-go-back-fill:before { + content: "\e264"; +} +.icon-system-arrow-down-line:before { + content: "\e265"; +} +.icon-system-arrow-down-s-fill:before { + content: "\e266"; +} +.icon-system-arrow-drop-right-line:before { + content: "\e267"; +} +.icon-system-arrow-drop-down-line:before { + content: "\e268"; +} +.icon-system-arrow-drop-left-fill:before { + content: "\e269"; +} +.icon-system-arrow-down-s-line:before { + content: "\e26a"; +} +.icon-system-arrow-drop-up-line:before { + content: "\e26b"; +} +.icon-system-arrow-go-back-line:before { + content: "\e26c"; +} +.icon-system-arrow-left-circle-fill:before { + content: "\e26d"; +} +.icon-system-arrow-go-forward-line:before { + content: "\e26e"; +} +.icon-system-arrow-left-circle-line:before { + content: "\e26f"; +} +.icon-system-arrow-up-fill:before { + content: "\e270"; +} +.icon-system-arrow-left-down-fill:before { + content: "\e271"; +} +.icon-system-arrow-left-down-line:before { + content: "\e272"; +} +.icon-system-arrow-left-fill:before { + content: "\e273"; +} +.icon-system-arrow-left-line:before { + content: "\e274"; +} +.icon-system-arrow-go-forward-fill:before { + content: "\e275"; +} +.icon-system-arrow-left-right-line:before { + content: "\e276"; +} +.icon-system-artboard-2-fill:before { + content: "\e277"; +} +.icon-system-artboard-2-line:before { + content: "\e278"; +} +.icon-system-arrow-up-line:before { + content: "\e279"; +} +.icon-food-chenzi:before { + content: "\e130"; +} +.icon-food-hanpu:before { + content: "\e131"; +} +.icon-beauty-fangshaizhuang:before { + content: "\e133"; +} +.icon-beauty-fenshua:before { + content: "\e134"; +} +.icon-beauty-huazhuangjing:before { + content: "\e135"; +} +.icon-beauty-jimiantaozhuang:before { + content: "\e136"; +} +.icon-beauty-hufa:before { + content: "\e137"; +} +.icon-beauty-jinghua1:before { + content: "\e139"; +} +.icon-beauty-kougong:before { + content: "\e13c"; +} +.icon-beauty-meibi:before { + content: "\e13d"; +} +.icon-beauty-meitong:before { + content: "\e13e"; +} +.icon-beauty-mianmo:before { + content: "\e13f"; +} +.icon-beauty-wenying1:before { + content: "\e141"; +} +.icon-beauty-shuzhuangjing:before { + content: "\e145"; +} +.icon-tourism-reqiqiu:before { + content: "\e10a"; +} +.icon-tourism-zijialiu:before { + content: "\e10c"; +} +.icon-tourism-liulun:before { + content: "\e10d"; +} +.icon-tourism-daoyu:before { + content: "\e10e"; +} +.icon-tourism-fanchuan:before { + content: "\e10f"; +} +.icon-tourism-feiji:before { + content: "\e110"; +} +.icon-tourism-gaotie:before { + content: "\e111"; +} +.icon-food-lajiao:before { + content: "\e112"; +} +.icon-food-lamei:before { + content: "\e114"; +} +.icon-food-liulian:before { + content: "\e115"; +} +.icon-food-liqi:before { + content: "\e116"; +} +.icon-food-luobu:before { + content: "\e117"; +} +.icon-food-zhumeng:before { + content: "\e118"; +} +.icon-food-huangluo:before { + content: "\e119"; +} +.icon-food-niuyouluo:before { + content: "\e11a"; +} +.icon-food-pengluo:before { + content: "\e11b"; +} +.icon-food-pisa:before { + content: "\e11c"; +} +.icon-food-beitao:before { + content: "\e11d"; +} +.icon-food-jiazi:before { + content: "\e11f"; +} +.icon-food-regou:before { + content: "\e120"; +} +.icon-food-shanzhu:before { + content: "\e121"; +} +.icon-food-tiantianjuan:before { + content: "\e122"; +} +.icon-food-qiaokeli:before { + content: "\e123"; +} +.icon-food-zhaozi:before { + content: "\e124"; +} +.icon-food-yangzhao:before { + content: "\e125"; +} +.icon-food-xiangcong:before { + content: "\e126"; +} +.icon-food-xigua:before { + content: "\e127"; +} +.icon-food-yingzhao:before { + content: "\e128"; +} +.icon-food-xilahua:before { + content: "\e129"; +} +.icon-food-bomihua:before { + content: "\e12a"; +} +.icon-food-yezi:before { + content: "\e12b"; +} +.icon-food-boluo:before { + content: "\e12c"; +} +.icon-food-binggan:before { + content: "\e12d"; +} +.icon-food-caomei:before { + content: "\e12e"; +} +.icon-food-fanjia:before { + content: "\e12f"; +} +.icon-beauty-baoshizhuang:before { + content: "\e146"; +} +.icon-beauty-mianshuang:before { + content: "\e14a"; +} +.icon-beauty-zhencai:before { + content: "\e14b"; +} +.icon-sport-ganlanqiu1:before { + content: "\e15d"; +} +.icon-sport-ganlanqiu:before { + content: "\e15e"; +} +.icon-sport-deshan:before { + content: "\e15f"; +} +.icon-sport-gangling:before { + content: "\e160"; +} +.icon-sport-gaoerfu:before { + content: "\e161"; +} +.icon-sport-gaoerfuqiu:before { + content: "\e162"; +} +.icon-sport-gongjian:before { + content: "\e163"; +} +.icon-sport-huaban:before { + content: "\e164"; +} +.icon-sport-jijian:before { + content: "\e165"; +} +.icon-sport-huaban1:before { + content: "\e166"; +} +.icon-sport-jijian1:before { + content: "\e167"; +} +.icon-system-arrow-left-right-fill:before { + content: "\e27a"; +} +.icon-system-arrow-up-s-fill:before { + content: "\e27b"; +} +.icon-system-arrow-left-s-line:before { + content: "\e27c"; +} +.icon-system-arrow-up-s-line:before { + content: "\e27d"; +} +.icon-system-artboard-fill:before { + content: "\e27e"; +} +.icon-system-arrow-right-circle-fill:before { + content: "\e27f"; +} +.icon-system-artboard-line:before { + content: "\e280"; +} +.icon-system-arrow-right-circle-line:before { + content: "\e281"; +} +.icon-system-arrow-left-up-fill:before { + content: "\e282"; +} +.icon-system-arrow-left-s-fill:before { + content: "\e283"; +} +.icon-system-arrow-right-down-fill:before { + content: "\e284"; +} +.icon-system-arrow-left-up-line:before { + content: "\e285"; +} +.icon-system-arrow-right-down-line:before { + content: "\e286"; +} +.icon-system-arrow-right-line:before { + content: "\e287"; +} +.icon-system-arrow-right-fill:before { + content: "\e288"; +} +.icon-system-arrow-right-s-fill:before { + content: "\e289"; +} +.icon-system-arrow-right-s-line:before { + content: "\e28a"; +} +.icon-system-arrow-right-up-fill:before { + content: "\e28b"; +} +.icon-system-article-fill:before { + content: "\e28c"; +} +.icon-system-arrow-right-up-line:before { + content: "\e28d"; +} +.icon-system-arrow-up-circle-fill:before { + content: "\e28e"; +} +.icon-system-arrow-up-circle-line:before { + content: "\e28f"; +} +.icon-system-arrow-up-down-fill:before { + content: "\e290"; +} +.icon-system-arrow-up-down-line:before { + content: "\e291"; +} +.icon-system-article-line:before { + content: "\e292"; +} +.icon-system-asterisk:before { + content: "\e293"; +} +.icon-system-at-fill:before { + content: "\e294"; +} +.icon-system-aspect-ratio-line:before { + content: "\e295"; +} +.icon-system-aspect-ratio-fill:before { + content: "\e296"; +} +.icon-system-at-line:before { + content: "\e297"; +} +.icon-system-attachment-2:before { + content: "\e298"; +} +.icon-system-attachment-fill:before { + content: "\e299"; +} +.icon-system-auction-fill:before { + content: "\e29a"; +} +.icon-system-award-fill:before { + content: "\e29b"; +} +.icon-system-award-line:before { + content: "\e29c"; +} +.icon-system-attachment-line:before { + content: "\e29d"; +} +.icon-system-auction-line:before { + content: "\e29e"; +} +.icon-system-angularjs-line:before { + content: "\e2a0"; +} +.icon-system-anticlockwise-2-fill:before { + content: "\e2a2"; +} +.icon-system-anticlockwise-2-line:before { + content: "\e2a3"; +} +.icon-system-bank-card-2-fill:before { + content: "\e2a4"; +} +.icon-system-bank-card-2-line:before { + content: "\e2a5"; +} +.icon-system-bank-card-fill:before { + content: "\e2a6"; +} +.icon-system-bank-fill:before { + content: "\e2a7"; +} +.icon-system-bank-card-line:before { + content: "\e2a8"; +} +.icon-system-bank-line:before { + content: "\e2a9"; +} +.icon-system-bar-chart-box-fill:before { + content: "\e2aa"; +} +.icon-system-bar-chart-box-line:before { + content: "\e2ab"; +} +.icon-system-bar-chart-fill:before { + content: "\e2ac"; +} +.icon-system-bar-chart-grouped-fill:before { + content: "\e2ad"; +} +.icon-system-bar-chart-grouped-line:before { + content: "\e2ae"; +} +.icon-system-bar-chart-2-fill:before { + content: "\e2af"; +} +.icon-system-barcode-line:before { + content: "\e2b0"; +} +.icon-system-bar-chart-horizontal-fill:before { + content: "\e2b1"; +} +.icon-system-barcode-box-line:before { + content: "\e2b2"; +} +.icon-system-barcode-box-fill:before { + content: "\e2b3"; +} +.icon-system-barcode-fill:before { + content: "\e2b4"; +} +.icon-system-bar-chart-horizontal-line:before { + content: "\e2b5"; +} +.icon-system-bar-chart-line:before { + content: "\e2b6"; +} +.icon-system-barricade-fill:before { + content: "\e2b7"; +} +.icon-system-base-station-fill:before { + content: "\e2b8"; +} +.icon-system-barricade-line:before { + content: "\e2b9"; +} +.icon-system-bar-chart-2-line:before { + content: "\e2ba"; +} +.icon-system-base-station-line:before { + content: "\e2bb"; +} +.icon-system-battery-2-charge-line:before { + content: "\e2bc"; +} +.icon-system-battery-2-charge-fill:before { + content: "\e2bd"; +} +.icon-system-basketball-line:before { + content: "\e2be"; +} +.icon-system-basketball-fill:before { + content: "\e2bf"; +} +.icon-system-battery-2-fill:before { + content: "\e2c0"; +} +.icon-system-battery-charge-fill:before { + content: "\e2c1"; +} +.icon-system-battery-2-line:before { + content: "\e2c2"; +} +.icon-system-blur-off-fill:before { + content: "\e2c3"; +} +.icon-system-battery-saver-fill:before { + content: "\e2c4"; +} +.icon-system-battery-share-fill:before { + content: "\e2c5"; +} +.icon-system-battery-saver-line:before { + content: "\e2c6"; +} +.icon-system-bear-smile-fill:before { + content: "\e2c7"; +} +.icon-system-battery-share-line:before { + content: "\e2c8"; +} +.icon-system-bear-smile-line:before { + content: "\e2c9"; +} +.icon-system-battery-charge-line:before { + content: "\e2cb"; +} +.icon-system-battery-line:before { + content: "\e2cc"; +} +.icon-system-battery-fill:before { + content: "\e2cd"; +} +.icon-system-battery-low-line:before { + content: "\e2ce"; +} +.icon-system-bell-fill:before { + content: "\e2cf"; +} +.icon-system-battery-low-fill:before { + content: "\e2d1"; +} +.icon-tourism-bike-fill:before { + content: "\e2d2"; +} +.icon-system-bell-line:before { + content: "\e2d3"; +} +.icon-system-bilibili-fill:before { + content: "\e2d4"; +} +.icon-tourism-bike-line:before { + content: "\e2d5"; +} +.icon-system-bilibili-line:before { + content: "\e2d6"; +} +.icon-system-bill-fill:before { + content: "\e2d7"; +} +.icon-system-billiards-fill:before { + content: "\e2d8"; +} +.icon-system-billiards-line:before { + content: "\e2d9"; +} +.icon-system-bill-line:before { + content: "\e2da"; +} +.icon-system-bit-coin-fill:before { + content: "\e2db"; +} +.icon-system-bit-coin-line:before { + content: "\e2dc"; +} +.icon-system-bluetooth-connect-fill:before { + content: "\e2dd"; +} +.icon-system-bluetooth-connect-line:before { + content: "\e2de"; +} +.icon-system-bluetooth-fill:before { + content: "\e2df"; +} +.icon-system-blur-off-line:before { + content: "\e2e0"; +} +.icon-system-bluetooth-line:before { + content: "\e2e1"; +} +.icon-system-booklet-fill:before { + content: "\e2e2"; +} +.icon-system-body-scan-fill:before { + content: "\e2e3"; +} +.icon-system-booklet-line:before { + content: "\e2e4"; +} +.icon-system-body-scan-line:before { + content: "\e2e5"; +} +.icon-system-bold:before { + content: "\e2e6"; +} +.icon-system-book-2-fill:before { + content: "\e2e7"; +} +.icon-system-book-2-line:before { + content: "\e2e8"; +} +.icon-system-book-3-fill:before { + content: "\e2e9"; +} +.icon-system-book-3-line:before { + content: "\e2ea"; +} +.icon-system-brush-4-fill:before { + content: "\e2eb"; +} +.icon-system-book-fill:before { + content: "\e2ec"; +} +.icon-system-brush-4-line:before { + content: "\e2ed"; +} +.icon-system-brush-fill:before { + content: "\e2ee"; +} +.icon-system-book-line:before { + content: "\e2ef"; +} +.icon-system-brush-line:before { + content: "\e2f0"; +} +.icon-system-ball-pen-fill:before { + content: "\e2f1"; +} +.icon-system-bookmark-3-fill:before { + content: "\e2f2"; +} +.icon-system-bookmark-2-line:before { + content: "\e2f3"; +} +.icon-system-bookmark-2-fill:before { + content: "\e2f4"; +} +.icon-system-ball-pen-line:before { + content: "\e2f5"; +} +.icon-system-bookmark-3-line:before { + content: "\e2f6"; +} +.icon-system-bookmark-fill:before { + content: "\e2f7"; +} +.icon-system-book-mark-fill:before { + content: "\e2f8"; +} +.icon-system-book-mark-line:before { + content: "\e2f9"; +} +.icon-system-bookmark-line:before { + content: "\e2fa"; +} +.icon-system-book-open-fill:before { + content: "\e2fb"; +} +.icon-system-book-read-line:before { + content: "\e2fc"; +} +.icon-system-book-open-line:before { + content: "\e2fd"; +} +.icon-system-boxing-line:before { + content: "\e2ff"; +} +.icon-system-book-read-fill:before { + content: "\e300"; +} +.icon-system-boxing-fill:before { + content: "\e301"; +} +.icon-system-briefcase-2-line:before { + content: "\e302"; +} +.icon-system-briefcase-3-fill:before { + content: "\e303"; +} +.icon-system-briefcase-3-line:before { + content: "\e304"; +} +.icon-system-briefcase-4-line:before { + content: "\e305"; +} +.icon-system-briefcase-4-fill:before { + content: "\e306"; +} +.icon-system-briefcase-5-fill:before { + content: "\e307"; +} +.icon-system-briefcase-2-fill:before { + content: "\e308"; +} +.icon-system-briefcase-line:before { + content: "\e309"; +} +.icon-system-bring-forward:before { + content: "\e30a"; +} +.icon-system-bring-to-front:before { + content: "\e30b"; +} +.icon-system-broadcast-fill:before { + content: "\e30d"; +} +.icon-system-brush-2-fill:before { + content: "\e30f"; +} +.icon-system-briefcase-5-line:before { + content: "\e310"; +} +.icon-system-broadcast-line:before { + content: "\e311"; +} +.icon-system-briefcase-fill:before { + content: "\e312"; +} +.icon-system-brush-3-fill:before { + content: "\e314"; +} +.icon-system-brush-2-line:before { + content: "\e315"; +} +.icon-system-brush-3-line:before { + content: "\e316"; +} +.icon-system-calendar-2-fill:before { + content: "\e317"; +} +.icon-system-calendar-2-line:before { + content: "\e318"; +} +.icon-system-calendar-check-fill:before { + content: "\e319"; +} +.icon-system-calendar-check-line:before { + content: "\e31a"; +} +.icon-system-calendar-event-fill:before { + content: "\e31b"; +} +.icon-system-calendar-event-line:before { + content: "\e31c"; +} +.icon-system-calendar-line:before { + content: "\e31d"; +} +.icon-system-calendar-todo-fill:before { + content: "\e31e"; +} +.icon-system-calendar-todo-line:before { + content: "\e31f"; +} +.icon-system-calendar-fill:before { + content: "\e320"; +} +.icon-system-camera-3-fill:before { + content: "\e321"; +} +.icon-system-camera-3-line:before { + content: "\e322"; +} +.icon-system-camera-fill:before { + content: "\e323"; +} +.icon-system-camera-2-line:before { + content: "\e324"; +} +.icon-system-camera-lens-fill:before { + content: "\e325"; +} +.icon-system-camera-2-fill:before { + content: "\e326"; +} +.icon-system-camera-lens-line:before { + content: "\e327"; +} +.icon-system-camera-off-fill:before { + content: "\e328"; +} +.icon-system-camera-switch-fill:before { + content: "\e329"; +} +.icon-system-camera-switch-line:before { + content: "\e32a"; +} +.icon-system-capsule-fill:before { + content: "\e32b"; +} +.icon-tourism-caravan-fill:before { + content: "\e32c"; +} +.icon-tourism-caravan-line:before { + content: "\e32d"; +} +.icon-tourism-car-washing-fill:before { + content: "\e32e"; +} +.icon-tourism-car-washing-line:before { + content: "\e32f"; +} +.icon-system-cast-fill:before { + content: "\e330"; +} +.icon-system-cast-line:before { + content: "\e331"; +} +.icon-system-cellphone-fill:before { + content: "\e332"; +} +.icon-system-capsule-line:before { + content: "\e333"; +} +.icon-system-camera-line:before { + content: "\e334"; +} +.icon-system-camera-off-line:before { + content: "\e335"; +} +.icon-system-cellphone-line:before { + content: "\e336"; +} +.icon-system-centos-fill:before { + content: "\e337"; +} +.icon-system-car-fill:before { + content: "\e338"; +} +.icon-system-car-line:before { + content: "\e339"; +} +.icon-system-centos-line:before { + content: "\e33a"; +} +.icon-system-character-recognition-fill:before { + content: "\e33b"; +} +.icon-system-charging-pile-2-fill:before { + content: "\e33c"; +} +.icon-system-charging-pile-2-line:before { + content: "\e33d"; +} +.icon-system-chat-check-fill:before { + content: "\e33e"; +} +.icon-system-chat-delete-fill:before { + content: "\e33f"; +} +.icon-system-chat-check-line:before { + content: "\e340"; +} +.icon-system-bubble-chart-line:before { + content: "\e341"; +} +.icon-system-bug-line:before { + content: "\e342"; +} +.icon-system-building-2-fill:before { + content: "\e343"; +} +.icon-system-building-2-line:before { + content: "\e344"; +} +.icon-system-chat-delete-line:before { + content: "\e345"; +} +.icon-system-bubble-chart-fill:before { + content: "\e346"; +} +.icon-system-bug-2-fill:before { + content: "\e347"; +} +.icon-system-bug-fill:before { + content: "\e348"; +} +.icon-system-bug-2-line:before { + content: "\e349"; +} +.icon-system-building-3-fill:before { + content: "\e34a"; +} +.icon-system-building-3-line:before { + content: "\e34b"; +} +.icon-system-building-4-line:before { + content: "\e34c"; +} +.icon-system-building-4-fill:before { + content: "\e34d"; +} +.icon-system-building-fill:before { + content: "\e34e"; +} +.icon-system-building-line:before { + content: "\e34f"; +} +.icon-system-bus-2-fill:before { + content: "\e350"; +} +.icon-system-chat-1-line:before { + content: "\e351"; +} +.icon-system-chat-2-line:before { + content: "\e352"; +} +.icon-tourism-bus-wifi-fill:before { + content: "\e353"; +} +.icon-system-charging-pile-fill:before { + content: "\e354"; +} +.icon-tourism-bus-wifi-line:before { + content: "\e355"; +} +.icon-system-chat-4-line:before { + content: "\e356"; +} +.icon-system-chat-1-fill:before { + content: "\e357"; +} +.icon-system-bus-line:before { + content: "\e358"; +} +.icon-system-character-recognition-line:before { + content: "\e359"; +} +.icon-system-chat-download-fill:before { + content: "\e35a"; +} +.icon-system-charging-pile-line:before { + content: "\e35b"; +} +.icon-system-chat-4-fill:before { + content: "\e35c"; +} +.icon-system-cactus-fill:before { + content: "\e35d"; +} +.icon-system-cake-2-line:before { + content: "\e35e"; +} +.icon-system-cake-3-line:before { + content: "\e35f"; +} +.icon-system-chat-2-fill:before { + content: "\e360"; +} +.icon-system-cake-3-fill:before { + content: "\e361"; +} +.icon-system-cake-fill:before { + content: "\e362"; +} +.icon-system-cake-line:before { + content: "\e363"; +} +.icon-system-calculator-fill:before { + content: "\e364"; +} +.icon-system-chat-3-line:before { + content: "\e365"; +} +.icon-system-chat-3-fill:before { + content: "\e366"; +} +.icon-system-cake-2-fill:before { + content: "\e367"; +} +.icon-system-cactus-line:before { + content: "\e368"; +} +.icon-system-calculator-line:before { + content: "\e369"; +} +.icon-tourism-bus-2-line:before { + content: "\e36a"; +} +.icon-tourism-bus-fill:before { + content: "\e36b"; +} +.icon-system-chat-history-line:before { + content: "\e36c"; +} +.icon-system-chat-new-fill:before { + content: "\e36d"; +} +.icon-system-chat-off-fill:before { + content: "\e36e"; +} +.icon-system-chat-off-line:before { + content: "\e36f"; +} +.icon-system-chat-poll-fill:before { + content: "\e370"; +} +.icon-system-chat-poll-line:before { + content: "\e371"; +} +.icon-system-chat-private-fill:before { + content: "\e372"; +} +.icon-system-chat-new-line:before { + content: "\e373"; +} +.icon-system-chat-private-line:before { + content: "\e374"; +} +.icon-system-chat-quote-fill:before { + content: "\e375"; +} +.icon-system-chat-quote-line:before { + content: "\e376"; +} +.icon-system-chat-settings-line:before { + content: "\e377"; +} +.icon-system-chat-settings-fill:before { + content: "\e378"; +} +.icon-system-chat-smile-2-fill:before { + content: "\e379"; +} +.icon-system-chat-smile-2-line:before { + content: "\e37a"; +} +.icon-system-chat-upload-line:before { + content: "\e37b"; +} +.icon-system-chat-smile-3-line:before { + content: "\e37c"; +} +.icon-system-chat-smile-3-fill:before { + content: "\e37d"; +} +.icon-system-chat-smile-fill:before { + content: "\e37e"; +} +.icon-system-chat-upload-fill:before { + content: "\e37f"; +} +.icon-system-chat-smile-line:before { + content: "\e380"; +} +.icon-system-chat-voice-fill:before { + content: "\e381"; +} +.icon-system-chat-voice-line:before { + content: "\e382"; +} +.icon-system-checkbox-blank-circle-fill:before { + content: "\e383"; +} +.icon-system-checkbox-circle-fill:before { + content: "\e384"; +} +.icon-system-checkbox-blank-circle-line:before { + content: "\e385"; +} +.icon-system-checkbox-blank-fill:before { + content: "\e386"; +} +.icon-system-checkbox-blank-line:before { + content: "\e387"; +} +.icon-system-checkbox-circle-line:before { + content: "\e388"; +} +.icon-system-checkbox-indeterminate-fill:before { + content: "\e389"; +} +.icon-system-checkbox-fill:before { + content: "\e38a"; +} +.icon-system-checkbox-indeterminate-line:before { + content: "\e38b"; +} +.icon-system-checkbox-line:before { + content: "\e38c"; +} +.icon-system-checkbox-multiple-fill:before { + content: "\e38d"; +} +.icon-system-checkbox-multiple-blank-line:before { + content: "\e38e"; +} +.icon-system-checkbox-multiple-blank-fill:before { + content: "\e38f"; +} +.icon-system-checkbox-multiple-line:before { + content: "\e390"; +} +.icon-system-check-double-fill:before { + content: "\e391"; +} +.icon-system-close-circle-line:before { + content: "\e392"; +} +.icon-system-check-double-line:before { + content: "\e393"; +} +.icon-system-check-fill:before { + content: "\e394"; +} +.icon-system-closed-captioning-fill:before { + content: "\e395"; +} +.icon-system-check-line:before { + content: "\e396"; +} +.icon-system-china-railway-fill:before { + content: "\e397"; +} +.icon-system-closed-captioning-line:before { + content: "\e398"; +} +.icon-system-chrome-fill:before { + content: "\e399"; +} +.icon-system-close-fill:before { + content: "\e39a"; +} +.icon-system-clapperboard-fill:before { + content: "\e39b"; +} +.icon-system-china-railway-line:before { + content: "\e39c"; +} +.icon-system-clapperboard-line:before { + content: "\e39d"; +} +.icon-system-chrome-line:before { + content: "\e39e"; +} +.icon-system-clipboard-fill:before { + content: "\e39f"; +} +.icon-system-clipboard-line:before { + content: "\e3a0"; +} +.icon-system-clockwise-2-fill:before { + content: "\e3a1"; +} +.icon-system-close-line:before { + content: "\e3a2"; +} +.icon-system-clockwise-fill:before { + content: "\e3a3"; +} +.icon-system-cloud-fill:before { + content: "\e3a4"; +} +.icon-system-clockwise-line:before { + content: "\e3a5"; +} +.icon-system-clockwise-2-line:before { + content: "\e3a6"; +} +.icon-system-close-circle-fill:before { + content: "\e3a7"; +} +.icon-system-cloud-line:before { + content: "\e3a8"; +} +.icon-system-cloud-off-line:before { + content: "\e3a9"; +} +.icon-system-code-box-fill:before { + content: "\e3aa"; +} +.icon-system-cloud-off-fill:before { + content: "\e3ab"; +} +.icon-system-code-fill:before { + content: "\e3ac"; +} +.icon-system-code-line:before { + content: "\e3ad"; +} +.icon-system-code-box-line:before { + content: "\e3ae"; +} +.icon-system-chat-follow-up-fill:before { + content: "\e3af"; +} +.icon-system-chat-download-line:before { + content: "\e3b0"; +} +.icon-system-codepen-fill:before { + content: "\e3b1"; +} +.icon-system-chat-forward-fill:before { + content: "\e3b2"; +} +.icon-system-chat-follow-up-line:before { + content: "\e3b3"; +} +.icon-system-chat-forward-line:before { + content: "\e3b4"; +} +.icon-system-chat-heart-fill:before { + content: "\e3b5"; +} +.icon-system-chat-heart-line:before { + content: "\e3b6"; +} +.icon-system-chat-history-fill:before { + content: "\e3b7"; +} +.icon-system-contacts-book-line:before { + content: "\e3b8"; +} +.icon-system-compasses-line:before { + content: "\e3b9"; +} +.icon-system-computer-line:before { + content: "\e3ba"; +} +.icon-system-compass-fill:before { + content: "\e3bb"; +} +.icon-system-compass-line:before { + content: "\e3bc"; +} +.icon-system-contacts-book-2-line:before { + content: "\e3bd"; +} +.icon-system-compasses-2-line:before { + content: "\e3be"; +} +.icon-system-contacts-book-fill:before { + content: "\e3bf"; +} +.icon-system-contacts-book-upload-line:before { + content: "\e3c0"; +} +.icon-system-compasses-fill:before { + content: "\e3c1"; +} +.icon-system-computer-fill:before { + content: "\e3c2"; +} +.icon-system-contacts-book-2-fill:before { + content: "\e3c3"; +} +.icon-system-contacts-book-upload-fill:before { + content: "\e3c4"; +} +.icon-system-contrast-fill:before { + content: "\e3c5"; +} +.icon-system-contacts-fill:before { + content: "\e3c6"; +} +.icon-system-contrast-2-line:before { + content: "\e3c7"; +} +.icon-system-contrast-2-fill:before { + content: "\e3c8"; +} +.icon-system-contrast-drop-line:before { + content: "\e3c9"; +} +.icon-system-contrast-drop-2-fill:before { + content: "\e3ca"; +} +.icon-system-contacts-line:before { + content: "\e3cb"; +} +.icon-system-contrast-line:before { + content: "\e3cc"; +} +.icon-system-contrast-drop-2-line:before { + content: "\e3cd"; +} +.icon-system-contrast-drop-fill:before { + content: "\e3ce"; +} +.icon-system-copper-coin-fill:before { + content: "\e3cf"; +} +.icon-system-copper-diamond-line:before { + content: "\e3d0"; +} +.icon-system-copper-coin-line:before { + content: "\e3d1"; +} +.icon-system-copper-diamond-fill:before { + content: "\e3d2"; +} +.icon-system-copyleft-fill:before { + content: "\e3d3"; +} +.icon-system-copyright-fill:before { + content: "\e3d4"; +} +.icon-system-coreos-line:before { + content: "\e3d5"; +} +.icon-system-coreos-fill:before { + content: "\e3d6"; +} +.icon-system-coupon-2-fill:before { + content: "\e3d7"; +} +.icon-system-copyright-line:before { + content: "\e3d8"; +} +.icon-system-coupon-2-line:before { + content: "\e3d9"; +} +.icon-system-copyleft-line:before { + content: "\e3da"; +} +.icon-system-coupon-4-fill:before { + content: "\e3db"; +} +.icon-system-coupon-3-fill:before { + content: "\e3dc"; +} +.icon-system-coupon-3-line:before { + content: "\e3dd"; +} +.icon-system-cpu-fill:before { + content: "\e3de"; +} +.icon-system-creative-commons-by-line:before { + content: "\e3df"; +} +.icon-system-creative-commons-fill:before { + content: "\e3e0"; +} +.icon-system-coupon-5-line:before { + content: "\e3e1"; +} +.icon-system-creative-commons-line:before { + content: "\e3e3"; +} +.icon-system-creative-commons-nd-fill:before { + content: "\e3e4"; +} +.icon-system-cpu-line:before { + content: "\e3e5"; +} +.icon-system-creative-commons-nd-line:before { + content: "\e3e7"; +} +.icon-system-coupon-4-line:before { + content: "\e3e8"; +} +.icon-system-creative-commons-by-fill:before { + content: "\e3e9"; +} +.icon-system-coupon-fill:before { + content: "\e3ea"; +} +.icon-system-coupon-line:before { + content: "\e3eb"; +} +.icon-system-coupon-5-fill:before { + content: "\e3ec"; +} +.icon-system-creative-commons-sa-fill:before { + content: "\e3ed"; +} +.icon-system-creative-commons-zero-fill:before { + content: "\e3ee"; +} +.icon-system-creative-commons-zero-line:before { + content: "\e3ef"; +} +.icon-system-criminal-line:before { + content: "\e3f0"; +} +.icon-system-crop-2-fill:before { + content: "\e3f1"; +} +.icon-system-crop-2-line:before { + content: "\e3f2"; +} +.icon-system-creative-commons-sa-line:before { + content: "\e3f3"; +} +.icon-system-crop-fill:before { + content: "\e3f4"; +} +.icon-system-criminal-fill:before { + content: "\e3f5"; +} +.icon-system-cup-line:before { + content: "\e3f6"; +} +.icon-system-crop-line:before { + content: "\e3f7"; +} +.icon-system-css3-fill:before { + content: "\e3f8"; +} +.icon-system-cup-fill:before { + content: "\e3f9"; +} +.icon-system-css3-line:before { + content: "\e3fa"; +} +.icon-system-currency-fill:before { + content: "\e3fb"; +} +.icon-system-cursor-fill:before { + content: "\e3fc"; +} +.icon-system-currency-line:before { + content: "\e3fd"; +} +.icon-system-cursor-line:before { + content: "\e3fe"; +} +.icon-system-customer-service-2-line:before { + content: "\e3ff"; +} +.icon-system-dashboard-2-fill:before { + content: "\e400"; +} +.icon-system-dashboard-2-line:before { + content: "\e401"; +} +.icon-system-dashboard-3-fill:before { + content: "\e402"; +} +.icon-system-dashboard-3-line:before { + content: "\e403"; +} +.icon-system-dashboard-fill:before { + content: "\e404"; +} +.icon-system-database-2-fill:before { + content: "\e405"; +} +.icon-system-customer-service-fill:before { + content: "\e406"; +} +.icon-system-customer-service-2-fill:before { + content: "\e407"; +} +.icon-system-database-line:before { + content: "\e408"; +} +.icon-system-database-2-line:before { + content: "\e409"; +} +.icon-system-customer-service-line:before { + content: "\e40a"; +} +.icon-system-dashboard-line:before { + content: "\e40b"; +} +.icon-system-database-fill:before { + content: "\e40c"; +} +.icon-system-delete-back-fill:before { + content: "\e40d"; +} +.icon-system-delete-back-line:before { + content: "\e40e"; +} +.icon-system-delete-bin-2-fill:before { + content: "\e40f"; +} +.icon-system-delete-bin-3-fill:before { + content: "\e410"; +} +.icon-system-delete-bin-2-line:before { + content: "\e411"; +} +.icon-system-delete-bin-4-line:before { + content: "\e412"; +} +.icon-system-delete-bin-5-fill:before { + content: "\e413"; +} +.icon-system-delete-back-2-fill:before { + content: "\e414"; +} +.icon-system-delete-bin-6-fill:before { + content: "\e415"; +} +.icon-system-delete-bin-7-fill:before { + content: "\e416"; +} +.icon-system-delete-bin-3-line:before { + content: "\e417"; +} +.icon-system-delete-bin-5-line:before { + content: "\e418"; +} +.icon-system-delete-bin-7-line:before { + content: "\e419"; +} +.icon-system-delete-bin-4-fill:before { + content: "\e41a"; +} +.icon-system-delete-bin-6-line:before { + content: "\e41b"; +} +.icon-system-delete-bin-fill:before { + content: "\e41c"; +} +.icon-system-codepen-line:before { + content: "\e41f"; +} +.icon-system-coin-fill:before { + content: "\e423"; +} +.icon-system-coin-line:before { + content: "\e424"; +} +.icon-system-coins-fill:before { + content: "\e425"; +} +.icon-system-coins-line:before { + content: "\e426"; +} +.icon-system-collage-line:before { + content: "\e427"; +} +.icon-system-command-fill:before { + content: "\e428"; +} +.icon-system-community-fill:before { + content: "\e429"; +} +.icon-system-compass-2-fill:before { + content: "\e42a"; +} +.icon-system-compass-4-fill:before { + content: "\e42b"; +} +.icon-system-compass-4-line:before { + content: "\e42c"; +} +.icon-system-delete-back-2-line:before { + content: "\e42d"; +} +.icon-system-compass-3-line:before { + content: "\e42e"; +} +.icon-system-collage-fill:before { + content: "\e42f"; +} +.icon-system-command-line:before { + content: "\e430"; +} +.icon-system-community-line:before { + content: "\e431"; +} +.icon-system-compass-2-line:before { + content: "\e432"; +} +.icon-system-compass-3-fill:before { + content: "\e433"; +} +.icon-system-compass-discover-line:before { + content: "\e434"; +} +.icon-system-compass-discover-fill:before { + content: "\e435"; +} +.icon-system-compasses-2-fill:before { + content: "\e436"; +} +.icon-system-dingding-fill:before { + content: "\e438"; +} +.icon-system-dingding-line:before { + content: "\e439"; +} +.icon-system-direction-fill:before { + content: "\e43a"; +} +.icon-system-discord-line:before { + content: "\e43b"; +} +.icon-system-discord-fill:before { + content: "\e43c"; +} +.icon-system-disc-line:before { + content: "\e43d"; +} +.icon-system-discuss-fill:before { + content: "\e43e"; +} +.icon-system-discuss-line:before { + content: "\e43f"; +} +.icon-system-direction-line:before { + content: "\e440"; +} +.icon-system-dislike-fill:before { + content: "\e441"; +} +.icon-system-disqus-fill:before { + content: "\e442"; +} +.icon-system-dislike-line:before { + content: "\e443"; +} +.icon-system-disqus-line:before { + content: "\e444"; +} +.icon-system-donut-chart-line:before { + content: "\e447"; +} +.icon-system-donut-chart-fill:before { + content: "\e448"; +} +.icon-system-door-closed-fill:before { + content: "\e449"; +} +.icon-system-disc-fill:before { + content: "\e44a"; +} +.icon-system-drag-drop-line:before { + content: "\e44b"; +} +.icon-system-dribbble-fill:before { + content: "\e44d"; +} +.icon-system-door-fill:before { + content: "\e44e"; +} +.icon-system-door-closed-line:before { + content: "\e450"; +} +.icon-system-download-2-fill:before { + content: "\e451"; +} +.icon-system-download-2-line:before { + content: "\e453"; +} +.icon-system-door-lock-box-fill:before { + content: "\e454"; +} +.icon-system-door-lock-box-line:before { + content: "\e455"; +} +.icon-system-door-lock-fill:before { + content: "\e456"; +} +.icon-system-door-lock-line:before { + content: "\e457"; +} +.icon-system-door-open-fill:before { + content: "\e458"; +} +.icon-system-dv-line:before { + content: "\e459"; +} +.icon-system-download-cloud-2-fill:before { + content: "\e45a"; +} +.icon-system-download-cloud-fill:before { + content: "\e45b"; +} +.icon-system-download-line:before { + content: "\e45c"; +} +.icon-system-draft-line:before { + content: "\e45d"; +} +.icon-system-door-open-line:before { + content: "\e45e"; +} +.icon-system-dossier-fill:before { + content: "\e45f"; +} +.icon-system-dossier-line:before { + content: "\e460"; +} +.icon-system-download-cloud-2-line:before { + content: "\e462"; +} +.icon-system-dvd-fill:before { + content: "\e464"; +} +.icon-system-drive-fill:before { + content: "\e465"; +} +.icon-system-dribbble-line:before { + content: "\e466"; +} +.icon-system-door-line:before { + content: "\e467"; +} +.icon-system-dropbox-fill:before { + content: "\e468"; +} +.icon-system-drive-line:before { + content: "\e469"; +} +.icon-system-dropbox-line:before { + content: "\e46a"; +} +.icon-system-drop-fill:before { + content: "\e46b"; +} +.icon-system-download-cloud-line:before { + content: "\e46c"; +} +.icon-system-drop-line:before { + content: "\e46d"; +} +.icon-system-draft-fill:before { + content: "\e46e"; +} +.icon-system-download-fill:before { + content: "\e46f"; +} +.icon-system-drag-drop-fill:before { + content: "\e470"; +} +.icon-system-drag-move-2-fill:before { + content: "\e471"; +} +.icon-system-drag-move-2-line:before { + content: "\e472"; +} +.icon-system-drag-move-fill:before { + content: "\e473"; +} +.icon-system-e-bike-2-line:before { + content: "\e474"; +} +.icon-system-drag-move-line:before { + content: "\e475"; +} +.icon-tourism-e-bike-fill:before { + content: "\e476"; +} +.icon-tourism-e-bike-line:before { + content: "\e477"; +} +.icon-system-edit-2-fill:before { + content: "\e479"; +} +.icon-system-dvd-line:before { + content: "\e47a"; +} +.icon-system-dv-fill:before { + content: "\e47b"; +} +.icon-system-earth-fill:before { + content: "\e47c"; +} +.icon-system-earth-line:before { + content: "\e47e"; +} +.icon-system-e-bike-2-fill:before { + content: "\e47f"; +} +.icon-emoji-emotion-fill:before { + content: "\e482"; +} +.icon-emoji-emotion-happy-line:before { + content: "\e484"; +} +.icon-emoji-emotion-happy-fill:before { + content: "\e485"; +} +.icon-emoji-emotion-laugh-fill:before { + content: "\e486"; +} +.icon-emoji-emotion-laugh-line:before { + content: "\e487"; +} +.icon-emoji-emotion-line:before { + content: "\e488"; +} +.icon-emoji-emotion-normal-fill:before { + content: "\e489"; +} +.icon-emoji-emotion-normal-line:before { + content: "\e48a"; +} +.icon-system-edit-box-fill:before { + content: "\e48b"; +} +.icon-system-edit-box-line:before { + content: "\e48c"; +} +.icon-system-edit-2-line:before { + content: "\e48d"; +} +.icon-system-edit-circle-line:before { + content: "\e48e"; +} +.icon-system-edit-circle-fill:before { + content: "\e48f"; +} +.icon-system-edit-line:before { + content: "\e490"; +} +.icon-system-eject-fill:before { + content: "\e491"; +} +.icon-system-edit-fill:before { + content: "\e492"; +} +.icon-system-eject-line:before { + content: "\e493"; +} +.icon-system-emotion-2-fill:before { + content: "\e494"; +} +.icon-system-emotion-2-line:before { + content: "\e495"; +} +.icon-system-empathize-line:before { + content: "\e496"; +} +.icon-system-eye-line:before { + content: "\e497"; +} +.icon-system-eye-fill:before { + content: "\e498"; +} +.icon-system-emphasis:before { + content: "\e499"; +} +.icon-system-eye-close-fill:before { + content: "\e49a"; +} +.icon-system-eye-2-line:before { + content: "\e49b"; +} +.icon-system-eye-2-fill:before { + content: "\e49c"; +} +.icon-system-eye-close-line:before { + content: "\e49d"; +} +.icon-system-external-link-fill:before { + content: "\e49e"; +} +.icon-system-eye-off-fill:before { + content: "\e49f"; +} +.icon-system-eye-off-line:before { + content: "\e4a0"; +} +.icon-emoji-emotion-sad-fill:before { + content: "\e4a1"; +} +.icon-emoji-emotion-unhappy-line:before { + content: "\e4a2"; +} +.icon-emoji-emotion-unhappy-fill:before { + content: "\e4a3"; +} +.icon-emoji-emotion-sad-line:before { + content: "\e4a4"; +} +.icon-system-empathize-fill:before { + content: "\e4a5"; +} +.icon-system-exchange-box-line:before { + content: "\e4a8"; +} +.icon-system-exchange-box-fill:before { + content: "\e4a9"; +} +.icon-system-exchange-fill:before { + content: "\e4ad"; +} +.icon-system-exchange-cny-fill:before { + content: "\e4ae"; +} +.icon-system-exchange-funds-line:before { + content: "\e4af"; +} +.icon-system-exchange-line:before { + content: "\e4b0"; +} +.icon-system-exchange-funds-fill:before { + content: "\e4b1"; +} +.icon-system-external-link-line:before { + content: "\e4b2"; +} +.icon-system-facebook-box-fill:before { + content: "\e4b3"; +} +.icon-system-facebook-circle-line:before { + content: "\e4b4"; +} +.icon-system-facebook-box-line:before { + content: "\e4b5"; +} +.icon-system-facebook-circle-fill:before { + content: "\e4b6"; +} +.icon-system-feedback-fill:before { + content: "\e4b7"; +} +.icon-system-facebook-fill:before { + content: "\e4b8"; +} +.icon-system-facebook-line:before { + content: "\e4b9"; +} +.icon-system-feedback-line:before { + content: "\e4ba"; +} +.icon-system-file-2-fill:before { + content: "\e4bb"; +} +.icon-system-file-2-line:before { + content: "\e4bc"; +} +.icon-system-emphasis-cn:before { + content: "\e4bd"; +} +.icon-system-file-3-fill:before { + content: "\e4be"; +} +.icon-system-equalizer-fill:before { + content: "\e4bf"; +} +.icon-system-english-input:before { + content: "\e4c0"; +} +.icon-system-file-4-fill:before { + content: "\e4c1"; +} +.icon-system-file-4-line:before { + content: "\e4c2"; +} +.icon-system-file-3-line:before { + content: "\e4c3"; +} +.icon-system-file-add-line:before { + content: "\e4c4"; +} +.icon-system-file-add-fill:before { + content: "\e4c5"; +} +.icon-system-file-chart-2-fill:before { + content: "\e4c6"; +} +.icon-system-file-chart-fill:before { + content: "\e4c7"; +} +.icon-system-file-chart-2-line:before { + content: "\e4c8"; +} +.icon-system-delete-bin-line:before { + content: "\e4c9"; +} +.icon-system-device-fill:before { + content: "\e4ca"; +} +.icon-system-device-recover-fill:before { + content: "\e4cb"; +} +.icon-system-delete-row:before { + content: "\e4cc"; +} +.icon-system-delete-column:before { + content: "\e4cd"; +} +.icon-system-device-line:before { + content: "\e4ce"; +} +.icon-system-equalizer-line:before { + content: "\e4cf"; +} +.icon-system-eraser-fill:before { + content: "\e4d0"; +} +.icon-system-eraser-line:before { + content: "\e4d1"; +} +.icon-system-error-warning-fill:before { + content: "\e4d2"; +} +.icon-system-error-warning-line:before { + content: "\e4d3"; +} +.icon-system-file-list-3-fill:before { + content: "\e4fd"; +} +.icon-system-file-list-3-line:before { + content: "\e4fe"; +} +.icon-system-file-list-fill:before { + content: "\e4ff"; +} +.icon-system-file-list-2-line-1:before { + content: "\e500"; +} +.icon-system-file-pdf-fill-1:before { + content: "\e501"; +} +.icon-system-file-list-line:before { + content: "\e502"; +} +.icon-system-file-lock-fill:before { + content: "\e503"; +} +.icon-system-file-lock-line:before { + content: "\e504"; +} +.icon-system-file-copy-2-fill:before { + content: "\e505"; +} +.icon-system-file-mark-fill:before { + content: "\e506"; +} +.icon-system-file-paper-2-line:before { + content: "\e507"; +} +.icon-system-file-mark-line:before { + content: "\e508"; +} +.icon-system-file-music-line:before { + content: "\e509"; +} +.icon-system-file-reduce-fill:before { + content: "\e50a"; +} +.icon-system-file-ppt-2-line:before { + content: "\e50b"; +} +.icon-system-file-paper-fill:before { + content: "\e50c"; +} +.icon-system-file-paper-2-fill:before { + content: "\e50d"; +} +.icon-system-file-music-fill:before { + content: "\e50e"; +} +.icon-system-file-paper-line:before { + content: "\e50f"; +} +.icon-system-file-ppt-line-1:before { + content: "\e510"; +} +.icon-system-file-pdf-line-1:before { + content: "\e511"; +} +.icon-system-file-ppt-2-fill:before { + content: "\e512"; +} +.icon-system-file-chart-line:before { + content: "\e513"; +} +.icon-system-file-ppt-fill:before { + content: "\e514"; +} +.icon-system-file-code-fill:before { + content: "\e515"; +} +.icon-system-file-code-line:before { + content: "\e516"; +} +.icon-system-file-cloud-line:before { + content: "\e517"; +} +.icon-system-file-copy-fill:before { + content: "\e518"; +} +.icon-system-file-copy-2-line:before { + content: "\e519"; +} +.icon-system-file-cloud-fill:before { + content: "\e51a"; +} +.icon-system-file-edit-line:before { + content: "\e51b"; +} +.icon-system-file-excel-2-fill:before { + content: "\e51c"; +} +.icon-system-file-copy-line:before { + content: "\e51d"; +} +.icon-system-file-excel-2-line:before { + content: "\e51e"; +} +.icon-system-file-excel-fill:before { + content: "\e51f"; +} +.icon-system-file-excel-line:before { + content: "\e520"; +} +.icon-system-file-fill:before { + content: "\e521"; +} +.icon-system-file-forbid-fill:before { + content: "\e522"; +} +.icon-system-file-damage-line:before { + content: "\e523"; +} +.icon-system-file-history-line:before { + content: "\e524"; +} +.icon-system-file-hwp-fill:before { + content: "\e525"; +} +.icon-system-file-forbid-line:before { + content: "\e526"; +} +.icon-system-file-gif-fill:before { + content: "\e527"; +} +.icon-system-file-damage-fill:before { + content: "\e528"; +} +.icon-system-file-gif-line:before { + content: "\e529"; +} +.icon-system-file-download-fill:before { + content: "\e52a"; +} +.icon-system-file-download-line:before { + content: "\e52b"; +} +.icon-system-file-edit-fill:before { + content: "\e52c"; +} +.icon-system-file-history-fill:before { + content: "\e52d"; +} +.icon-system-file-line-1:before { + content: "\e52e"; +} +.icon-system-file-hwp-line:before { + content: "\e52f"; +} +.icon-system-file-info-line:before { + content: "\e530"; +} +.icon-system-file-info-fill:before { + content: "\e531"; +} +.icon-system-file-list-2-fill:before { + content: "\e532"; +} +.icon-system-ghost-2-line:before { + content: "\e533"; +} +.icon-system-ghost-fill:before { + content: "\e534"; +} +.icon-system-ghost-line:before { + content: "\e535"; +} +.icon-system-gift-2-fill:before { + content: "\e536"; +} +.icon-system-ghost-smile-line:before { + content: "\e537"; +} +.icon-system-ghost-smile-fill:before { + content: "\e538"; +} +.icon-system-gift-fill:before { + content: "\e539"; +} +.icon-system-gift-2-line:before { + content: "\e53a"; +} +.icon-system-gift-line:before { + content: "\e53b"; +} +.icon-system-git-commit-fill:before { + content: "\e53c"; +} +.icon-system-git-branch-fill:before { + content: "\e53d"; +} +.icon-system-git-branch-line:before { + content: "\e53e"; +} +.icon-system-git-commit-line:before { + content: "\e53f"; +} +.icon-system-git-merge-fill:before { + content: "\e544"; +} +.icon-system-git-merge-line:before { + content: "\e545"; +} +.icon-system-git-pull-request-fill:before { + content: "\e546"; +} +.icon-system-git-pull-request-line:before { + content: "\e547"; +} +.icon-system-folder-zip-fill:before { + content: "\e548"; +} +.icon-system-football-line:before { + content: "\e549"; +} +.icon-system-git-repository-commits-fill:before { + content: "\e54a"; +} +.icon-system-git-repository-commits-line:before { + content: "\e54b"; +} +.icon-system-git-repository-fill:before { + content: "\e54c"; +} +.icon-system-folder-upload-line:before { + content: "\e54d"; +} +.icon-system-folder-user-fill:before { + content: "\e54e"; +} +.icon-system-folder-warning-line:before { + content: "\e54f"; +} +.icon-system-folder-user-line:before { + content: "\e550"; +} +.icon-system-folder-warning-fill:before { + content: "\e551"; +} +.icon-system-folder-zip-line:before { + content: "\e552"; +} +.icon-system-font-color:before { + content: "\e553"; +} +.icon-system-font-size-2:before { + content: "\e554"; +} +.icon-system-font-size:before { + content: "\e555"; +} +.icon-system-football-fill:before { + content: "\e556"; +} +.icon-system-footprint-fill:before { + content: "\e557"; +} +.icon-system-funds-line:before { + content: "\e558"; +} +.icon-system-footprint-line:before { + content: "\e559"; +} +.icon-system-gallery-fill:before { + content: "\e55a"; +} +.icon-system-gallery-line:before { + content: "\e55b"; +} +.icon-system-gallery-upload-line:before { + content: "\e55c"; +} +.icon-system-game-line:before { + content: "\e55d"; +} +.icon-system-gamepad-fill:before { + content: "\e55e"; +} +.icon-system-gallery-upload-fill:before { + content: "\e55f"; +} +.icon-system-gamepad-line:before { + content: "\e560"; +} +.icon-system-gas-station-fill:before { + content: "\e561"; +} +.icon-system-game-fill:before { + content: "\e562"; +} +.icon-system-gas-station-line:before { + content: "\e563"; +} +.icon-system-forbid-2-line:before { + content: "\e564"; +} +.icon-system-forbid-fill:before { + content: "\e565"; +} +.icon-system-forbid-2-fill:before { + content: "\e566"; +} +.icon-system-forbid-line:before { + content: "\e567"; +} +.icon-system-fullscreen-fill:before { + content: "\e568"; +} +.icon-system-fullscreen-exit-line:before { + content: "\e569"; +} +.icon-system-function-fill:before { + content: "\e56b"; +} +.icon-system-function-line:before { + content: "\e56c"; +} +.icon-system-genderless-fill:before { + content: "\e56d"; +} +.icon-system-gatsby-fill:before { + content: "\e56e"; +} +.icon-system-gatsby-line:before { + content: "\e570"; +} +.icon-system-fridge-line:before { + content: "\e571"; +} +.icon-system-fullscreen-line:before { + content: "\e572"; +} +.icon-system-fridge-fill:before { + content: "\e573"; +} +.icon-system-ghost-2-fill:before { + content: "\e574"; +} +.icon-system-genderless-line:before { + content: "\e575"; +} +.icon-system-funds-box-line:before { + content: "\e576"; +} +.icon-system-funds-box-fill:before { + content: "\e577"; +} +.icon-system-functions:before { + content: "\e578"; +} +.icon-system-funds-fill:before { + content: "\e579"; +} +.icon-weather-drizzle-fill:before { + content: "\e57a"; +} +.icon-weather-cloudy-fill:before { + content: "\e57b"; +} +.icon-weather-fahrenheit-line:before { + content: "\e57c"; +} +.icon-weather-fire-fill:before { + content: "\e57d"; +} +.icon-weather-cloudy-2-line:before { + content: "\e57e"; +} +.icon-weather-drizzle-line:before { + content: "\e57f"; +} +.icon-weather-cloudy-line:before { + content: "\e580"; +} +.icon-weather-fire-line:before { + content: "\e581"; +} +.icon-weather-earthquake-fill:before { + content: "\e582"; +} +.icon-weather-earthquake-line:before { + content: "\e583"; +} +.icon-weather-fahrenheit-fill:before { + content: "\e584"; +} +.icon-weather-hail-line:before { + content: "\e585"; +} +.icon-weather-haze-2-line:before { + content: "\e586"; +} +.icon-weather-flood-line:before { + content: "\e587"; +} +.icon-weather-flood-fill:before { + content: "\e588"; +} +.icon-weather-haze-fill:before { + content: "\e589"; +} +.icon-weather-hail-fill:before { + content: "\e58a"; +} +.icon-weather-haze-2-fill:before { + content: "\e58b"; +} +.icon-weather-haze-line:before { + content: "\e58c"; +} +.icon-weather-flashlight-line:before { + content: "\e58d"; +} +.icon-weather-foggy-line:before { + content: "\e58e"; +} +.icon-weather-flashlight-fill:before { + content: "\e58f"; +} +.icon-weather-foggy-fill:before { + content: "\e590"; +} +.icon-weather-heavy-showers-fill:before { + content: "\e591"; +} +.icon-weather-heavy-showers-line:before { + content: "\e592"; +} +.icon-weather-meteor-fill:before { + content: "\e593"; +} +.icon-weather-meteor-line:before { + content: "\e594"; +} +.icon-weather-mist-fill:before { + content: "\e595"; +} +.icon-weather-mist-line:before { + content: "\e596"; +} +.icon-weather-moon-clear-fill:before { + content: "\e597"; +} +.icon-weather-moon-clear-line:before { + content: "\e598"; +} +.icon-weather-moon-cloudy-line:before { + content: "\e599"; +} +.icon-weather-moon-cloudy-fill:before { + content: "\e59a"; +} +.icon-weather-blaze-fill:before { + content: "\e59b"; +} +.icon-weather-blaze-line:before { + content: "\e59c"; +} +.icon-weather-celsius-fill:before { + content: "\e59d"; +} +.icon-weather-celsius-line:before { + content: "\e59e"; +} +.icon-weather-cloud-windy-fill:before { + content: "\e59f"; +} +.icon-weather-cloud-windy-line:before { + content: "\e5a0"; +} +.icon-weather-cloudy-2-fill:before { + content: "\e5a1"; +} +.icon-weather-sun-cloudy-fill:before { + content: "\e5a2"; +} +.icon-weather-sun-cloudy-line:before { + content: "\e5a3"; +} +.icon-weather-sun-foggy-fill:before { + content: "\e5a4"; +} +.icon-weather-sun-foggy-line:before { + content: "\e5a5"; +} +.icon-weather-sun-fill:before { + content: "\e5a6"; +} +.icon-weather-sun-line:before { + content: "\e5a7"; +} +.icon-weather-temp-cold-fill:before { + content: "\e5a8"; +} +.icon-weather-temp-hot-line:before { + content: "\e5a9"; +} +.icon-weather-temp-cold-line:before { + content: "\e5aa"; +} +.icon-weather-temp-hot-fill:before { + content: "\e5ab"; +} +.icon-weather-thunderstorms-fill:before { + content: "\e5ac"; +} +.icon-weather-tornado-fill:before { + content: "\e5ad"; +} +.icon-weather-thunderstorms-line:before { + content: "\e5ae"; +} +.icon-weather-tornado-line:before { + content: "\e5af"; +} +.icon-weather-typhoon-fill:before { + content: "\e5b0"; +} +.icon-weather-typhoon-line:before { + content: "\e5b1"; +} +.icon-weather-windy-fill:before { + content: "\e5b2"; +} +.icon-weather-windy-line:before { + content: "\e5b3"; +} +.icon-weather-moon-fill:before { + content: "\e5b4"; +} +.icon-weather-moon-foggy-fill:before { + content: "\e5b5"; +} +.icon-weather-moon-foggy-line:before { + content: "\e5b6"; +} +.icon-weather-rainbow-line:before { + content: "\e5b7"; +} +.icon-weather-moon-line:before { + content: "\e5b8"; +} +.icon-weather-rainbow-fill:before { + content: "\e5b9"; +} +.icon-weather-rainy-line:before { + content: "\e5ba"; +} +.icon-weather-rainy-fill:before { + content: "\e5bb"; +} +.icon-weather-showers-fill:before { + content: "\e5bc"; +} +.icon-weather-snowy-fill:before { + content: "\e5bd"; +} +.icon-weather-showers-line:before { + content: "\e5be"; +} +.icon-weather-snowy-line:before { + content: "\e5bf"; +} +.icon-system-google-fill:before { + content: "\e5c0"; +} +.icon-system-google-line:before { + content: "\e5c1"; +} +.icon-system-google-play-fill:before { + content: "\e5c2"; +} +.icon-system-government-fill:before { + content: "\e5c3"; +} +.icon-system-google-play-line:before { + content: "\e5c4"; +} +.icon-system-government-line:before { + content: "\e5c5"; +} +.icon-system-gps-fill:before { + content: "\e5c6"; +} +.icon-system-gps-line:before { + content: "\e5c7"; +} +.icon-system-gradienter-fill:before { + content: "\e5c8"; +} +.icon-system-gradienter-line:before { + content: "\e5c9"; +} +.icon-system-grid-fill:before { + content: "\e5ca"; +} +.icon-system-grid-line:before { + content: "\e5cb"; +} +.icon-system-group-2-fill:before { + content: "\e5cc"; +} +.icon-system-group-2-line:before { + content: "\e5cd"; +} +.icon-system-guide-line:before { + content: "\e5ce"; +} +.icon-system-group-fill:before { + content: "\e5d0"; +} +.icon-system-guide-fill:before { + content: "\e5d5"; +} +.icon-system-handbag-fill:before { + content: "\e5d7"; +} +.icon-system-group-line:before { + content: "\e5d8"; +} +.icon-system-hand-heart-line:before { + content: "\e5d9"; +} +.icon-system-hammer-fill:before { + content: "\e5da"; +} +.icon-system-hammer-line:before { + content: "\e5db"; +} +.icon-system-hand-sanitizer-fill:before { + content: "\e5dc"; +} +.icon-system-handbag-line:before { + content: "\e5dd"; +} +.icon-system-hand-coin-fill:before { + content: "\e5de"; +} +.icon-system-hand-heart-fill:before { + content: "\e5df"; +} +.icon-system-hard-drive-2-fill:before { + content: "\e5e0"; +} +.icon-system-hand-coin-line:before { + content: "\e5e1"; +} +.icon-system-hand-sanitizer-line:before { + content: "\e5e2"; +} +.icon-system-hard-drive-line:before { + content: "\e5e3"; +} +.icon-system-hard-drive-fill:before { + content: "\e5e4"; +} +.icon-system-history-line:before { + content: "\e5e5"; +} +.icon-system-hard-drive-2-line:before { + content: "\e5e6"; +} +.icon-system-home-2-line:before { + content: "\e5e7"; +} +.icon-system-home-2-fill:before { + content: "\e5e8"; +} +.icon-system-hashtag:before { + content: "\e5e9"; +} +.icon-system-git-repository-line:before { + content: "\e5ea"; +} +.icon-system-git-repository-private-fill:before { + content: "\e5eb"; +} +.icon-system-git-repository-private-line:before { + content: "\e5ec"; +} +.icon-system-global-fill:before { + content: "\e5ed"; +} +.icon-system-globe-line:before { + content: "\e5ee"; +} +.icon-system-globe-fill:before { + content: "\e5ef"; +} +.icon-system-hd-fill:before { + content: "\e5f0"; +} +.icon-system-goblet-fill:before { + content: "\e5f1"; +} +.icon-system-global-line:before { + content: "\e5f2"; +} +.icon-system-goblet-line:before { + content: "\e5f3"; +} +.icon-system-health-book-fill:before { + content: "\e5f4"; +} +.icon-system-headphone-line:before { + content: "\e5f5"; +} +.icon-system-heart-2-fill:before { + content: "\e5f6"; +} +.icon-system-headphone-fill:before { + content: "\e5f7"; +} +.icon-system-heading:before { + content: "\e5f8"; +} +.icon-system-hd-line:before { + content: "\e5f9"; +} +.icon-system-health-book-line:before { + content: "\e5fa"; +} +.icon-system-heart-3-fill:before { + content: "\e5fb"; +} +.icon-system-heart-3-line:before { + content: "\e5fc"; +} +.icon-system-heart-2-line:before { + content: "\e5fd"; +} +.icon-system-heart-fill:before { + content: "\e5fe"; +} +.icon-system-heart-add-fill:before { + content: "\e5ff"; +} +.icon-system-heart-pulse-fill:before { + content: "\e600"; +} +.icon-system-heart-line:before { + content: "\e601"; +} +.icon-system-heart-add-line:before { + content: "\e602"; +} +.icon-system-heart-pulse-line:before { + content: "\e603"; +} +.icon-system-hearts-line:before { + content: "\e604"; +} +.icon-system-hearts-fill:before { + content: "\e605"; +} +.icon-system-history-fill:before { + content: "\e606"; +} +.icon-system-home-6-fill:before { + content: "\e607"; +} +.icon-system-home-7-fill:before { + content: "\e608"; +} +.icon-system-home-7-line:before { + content: "\e609"; +} +.icon-system-home-6-line:before { + content: "\e60a"; +} +.icon-system-home-8-fill:before { + content: "\e60b"; +} +.icon-system-hq-line:before { + content: "\e60c"; +} +.icon-system-html5-fill:before { + content: "\e60d"; +} +.icon-system-image-2-line:before { + content: "\e60e"; +} +.icon-system-inbox-unarchive-line:before { + content: "\e60f"; +} +.icon-system-ie-fill:before { + content: "\e610"; +} +.icon-system-home-heart-line:before { + content: "\e611"; +} +.icon-system-image-2-fill:before { + content: "\e612"; +} +.icon-system-home-8-line:before { + content: "\e613"; +} +.icon-system-home-fill:before { + content: "\e614"; +} +.icon-system-home-gear-fill:before { + content: "\e615"; +} +.icon-system-home-gear-line:before { + content: "\e616"; +} +.icon-system-hotspot-fill:before { + content: "\e617"; +} +.icon-system-home-heart-fill:before { + content: "\e618"; +} +.icon-system-home-line:before { + content: "\e619"; +} +.icon-system-home-wifi-line:before { + content: "\e61a"; +} +.icon-system-honor-of-kings-fill:before { + content: "\e61b"; +} +.icon-system-home-smile-line:before { + content: "\e61c"; +} +.icon-system-inbox-fill:before { + content: "\e61d"; +} +.icon-system-home-smile-fill:before { + content: "\e61e"; +} +.icon-system-home-smile-2-line:before { + content: "\e61f"; +} +.icon-system-home-wifi-fill:before { + content: "\e620"; +} +.icon-system-honor-of-kings-line:before { + content: "\e621"; +} +.icon-system-home-smile-2-fill:before { + content: "\e622"; +} +.icon-system-honour-line:before { + content: "\e623"; +} +.icon-system-honour-fill:before { + content: "\e624"; +} +.icon-system-hotel-bed-fill:before { + content: "\e625"; +} +.icon-system-hotel-bed-line:before { + content: "\e626"; +} +.icon-system-hospital-line:before { + content: "\e627"; +} +.icon-system-hospital-fill:before { + content: "\e628"; +} +.icon-system-hotel-line:before { + content: "\e629"; +} +.icon-system-hotel-fill:before { + content: "\e62a"; +} +.icon-system-hotspot-line:before { + content: "\e62b"; +} +.icon-system-html5-line:before { + content: "\e62c"; +} +.icon-system-ie-line:before { + content: "\e62d"; +} +.icon-system-hq-fill:before { + content: "\e62e"; +} +.icon-system-image-add-fill:before { + content: "\e62f"; +} +.icon-system-image-edit-fill:before { + content: "\e630"; +} +.icon-system-image-add-line:before { + content: "\e631"; +} +.icon-system-image-edit-line:before { + content: "\e632"; +} +.icon-system-image-fill:before { + content: "\e633"; +} +.icon-system-image-line:before { + content: "\e634"; +} +.icon-system-increase-decrease-line:before { + content: "\e635"; +} +.icon-system-inbox-archive-line:before { + content: "\e636"; +} +.icon-system-increase-decrease-fill:before { + content: "\e637"; +} +.icon-system-inbox-archive-fill:before { + content: "\e638"; +} +.icon-system-inbox-line:before { + content: "\e639"; +} +.icon-system-inbox-unarchive-fill:before { + content: "\e63a"; +} +.icon-system-indent-decrease:before { + content: "\e63b"; +} +.icon-system-indent-increase:before { + content: "\e63c"; +} +.icon-system-indeterminate-circle-line:before { + content: "\e63d"; +} +.icon-system-information-fill:before { + content: "\e63e"; +} +.icon-system-information-line:before { + content: "\e63f"; +} +.icon-system-indeterminate-circle-fill:before { + content: "\e640"; +} +.icon-system-infrared-thermometer-fill:before { + content: "\e641"; +} +.icon-system-ink-bottle-fill:before { + content: "\e642"; +} +.icon-system-infrared-thermometer-line:before { + content: "\e643"; +} +.icon-system-ink-bottle-line:before { + content: "\e644"; +} +.icon-system-input-cursor-move:before { + content: "\e645"; +} +.icon-system-input-method-fill:before { + content: "\e646"; +} +.icon-system-input-method-line:before { + content: "\e647"; +} +.icon-system-home-3-fill:before { + content: "\e648"; +} +.icon-system-home-4-fill:before { + content: "\e649"; +} +.icon-system-home-3-line:before { + content: "\e64a"; +} +.icon-system-home-4-line:before { + content: "\e64b"; +} +.icon-system-home-5-line:before { + content: "\e64c"; +} +.icon-system-home-5-fill:before { + content: "\e64d"; +} +.icon-system-layout-right-2-fill:before { + content: "\e64e"; +} +.icon-system-layout-right-fill:before { + content: "\e64f"; +} +.icon-system-layout-right-2-line:before { + content: "\e650"; +} +.icon-system-layout-row-fill:before { + content: "\e651"; +} +.icon-system-layout-right-line:before { + content: "\e652"; +} +.icon-system-layout-row-line:before { + content: "\e653"; +} +.icon-system-layout-top-2-fill:before { + content: "\e654"; +} +.icon-system-layout-top-2-line:before { + content: "\e655"; +} +.icon-system-layout-top-fill:before { + content: "\e656"; +} +.icon-system-layout-top-line:before { + content: "\e657"; +} +.icon-system-leaf-fill:before { + content: "\e658"; +} +.icon-system-leaf-line:before { + content: "\e659"; +} +.icon-system-lifebuoy-fill:before { + content: "\e65a"; +} +.icon-system-lightbulb-fill:before { + content: "\e65b"; +} +.icon-system-lifebuoy-line:before { + content: "\e65c"; +} +.icon-system-lightbulb-flash-fill:before { + content: "\e65d"; +} +.icon-system-lightbulb-flash-line:before { + content: "\e65e"; +} +.icon-system-lightbulb-line:before { + content: "\e65f"; +} +.icon-system-line-chart-fill:before { + content: "\e660"; +} +.icon-system-line-chart-line:before { + content: "\e661"; +} +.icon-system-line-fill:before { + content: "\e662"; +} +.icon-system-line-height:before { + content: "\e663"; +} +.icon-system-link:before { + content: "\e664"; +} +.icon-system-line-line:before { + content: "\e665"; +} +.icon-system-linkedin-box-line:before { + content: "\e666"; +} +.icon-system-linkedin-box-fill:before { + content: "\e667"; +} +.icon-system-linkedin-line:before { + content: "\e668"; +} +.icon-system-linkedin-fill:before { + content: "\e669"; +} +.icon-system-link-m:before { + content: "\e66a"; +} +.icon-system-links-fill:before { + content: "\e66b"; +} +.icon-system-links-line:before { + content: "\e66c"; +} +.icon-system-list-ordered:before { + content: "\e66d"; +} +.icon-system-link-unlink:before { + content: "\e66e"; +} +.icon-system-link-unlink-m:before { + content: "\e66f"; +} +.icon-system-list-settings-fill:before { + content: "\e670"; +} +.icon-system-list-check-2:before { + content: "\e671"; +} +.icon-system-list-check:before { + content: "\e672"; +} +.icon-system-list-settings-line:before { + content: "\e673"; +} +.icon-system-live-fill:before { + content: "\e674"; +} +.icon-system-list-unordered:before { + content: "\e675"; +} +.icon-system-loader-3-fill:before { + content: "\e676"; +} +.icon-system-loader-2-fill:before { + content: "\e677"; +} +.icon-system-loader-2-line:before { + content: "\e678"; +} +.icon-system-live-line:before { + content: "\e679"; +} +.icon-system-loader-4-fill:before { + content: "\e67a"; +} +.icon-system-loader-3-line:before { + content: "\e67b"; +} +.icon-system-loader-4-line:before { + content: "\e67c"; +} +.icon-system-loader-fill:before { + content: "\e67f"; +} +.icon-system-loader-line:before { + content: "\e680"; +} +.icon-system-lock-2-line:before { + content: "\e681"; +} +.icon-system-lock-2-fill:before { + content: "\e682"; +} +.icon-system-lock-fill:before { + content: "\e683"; +} +.icon-system-lock-line:before { + content: "\e684"; +} +.icon-system-lock-password-fill:before { + content: "\e685"; +} +.icon-system-lock-password-line:before { + content: "\e686"; +} +.icon-system-lock-unlock-fill:before { + content: "\e687"; +} +.icon-system-lock-unlock-line:before { + content: "\e688"; +} +.icon-system-login-box-fill:before { + content: "\e689"; +} +.icon-system-login-box-line:before { + content: "\e68a"; +} +.icon-system-layout-fill:before { + content: "\e68b"; +} +.icon-system-layout-grid-fill:before { + content: "\e68c"; +} +.icon-system-layout-grid-line:before { + content: "\e68d"; +} +.icon-system-layout-left-2-fill:before { + content: "\e68e"; +} +.icon-system-layout-left-line:before { + content: "\e68f"; +} +.icon-system-layout-left-fill:before { + content: "\e690"; +} +.icon-system-layout-left-2-line:before { + content: "\e691"; +} +.icon-system-layout-line:before { + content: "\e692"; +} +.icon-system-layout-masonry-fill:before { + content: "\e693"; +} +.icon-system-layout-masonry-line:before { + content: "\e694"; +} +.icon-system-file-shield-2-line:before { + content: "\e695"; +} +.icon-system-file-shield-2-fill:before { + content: "\e696"; +} +.icon-system-file-shield-fill:before { + content: "\e697"; +} +.icon-system-file-shield-line:before { + content: "\e698"; +} +.icon-system-file-shred-fill:before { + content: "\e699"; +} +.icon-system-file-text-fill:before { + content: "\e69a"; +} +.icon-system-file-upload-fill:before { + content: "\e69b"; +} +.icon-system-file-transfer-fill:before { + content: "\e69c"; +} +.icon-system-file-upload-line:before { + content: "\e69d"; +} +.icon-system-file-user-fill:before { + content: "\e69e"; +} +.icon-system-file-user-line:before { + content: "\e69f"; +} +.icon-system-file-warning-fill:before { + content: "\e6a0"; +} +.icon-system-file-text-line:before { + content: "\e6a1"; +} +.icon-system-file-warning-line:before { + content: "\e6a2"; +} +.icon-system-file-shred-line:before { + content: "\e6a3"; +} +.icon-system-file-word-2-fill:before { + content: "\e6a4"; +} +.icon-system-file-word-2-line:before { + content: "\e6a5"; +} +.icon-system-file-word-fill:before { + content: "\e6a6"; +} +.icon-system-file-word-line:before { + content: "\e6a7"; +} +.icon-system-filter-3-line:before { + content: "\e6a8"; +} +.icon-system-file-unknow-fill:before { + content: "\e6a9"; +} +.icon-system-file-transfer-line:before { + content: "\e6aa"; +} +.icon-system-file-unknow-line:before { + content: "\e6ab"; +} +.icon-system-file-zip-fill:before { + content: "\e6ac"; +} +.icon-system-file-zip-line:before { + content: "\e6ad"; +} +.icon-system-film-fill:before { + content: "\e6ae"; +} +.icon-system-film-line:before { + content: "\e6af"; +} +.icon-system-filter-2-line:before { + content: "\e6b0"; +} +.icon-system-filter-2-fill:before { + content: "\e6b1"; +} +.icon-system-filter-3-fill:before { + content: "\e6b2"; +} +.icon-system-filter-line:before { + content: "\e6b3"; +} +.icon-system-filter-off-fill:before { + content: "\e6b4"; +} +.icon-system-filter-off-line:before { + content: "\e6b5"; +} +.icon-system-filter-fill:before { + content: "\e6b9"; +} +.icon-system-fingerprint-2-fill:before { + content: "\e6bb"; +} +.icon-system-fingerprint-fill:before { + content: "\e6bc"; +} +.icon-system-fingerprint-line:before { + content: "\e6be"; +} +.icon-system-first-aid-kit-fill:before { + content: "\e6c0"; +} +.icon-system-first-aid-kit-line:before { + content: "\e6c1"; +} +.icon-system-flag-2-fill:before { + content: "\e6c2"; +} +.icon-system-flag-line:before { + content: "\e6c3"; +} +.icon-system-fingerprint-2-line:before { + content: "\e6c4"; +} +.icon-system-flask-fill:before { + content: "\e6c5"; +} +.icon-system-flag-fill:before { + content: "\e6c6"; +} +.icon-tourism-flight-land-fill:before { + content: "\e6c7"; +} +.icon-system-flag-2-line:before { + content: "\e6c8"; +} +.icon-tourism-flight-takeoff-line:before { + content: "\e6c9"; +} +.icon-system-flask-line:before { + content: "\e6ca"; +} +.icon-tourism-flight-takeoff-fill:before { + content: "\e6cb"; +} +.icon-tourism-flight-land-line:before { + content: "\e6cc"; +} +.icon-system-flow-chart:before { + content: "\e6cd"; +} +.icon-system-file-search-fill:before { + content: "\e6ce"; +} +.icon-system-file-reduce-line:before { + content: "\e6cf"; +} +.icon-system-file-search-line:before { + content: "\e6d0"; +} +.icon-system-file-settings-fill:before { + content: "\e6d1"; +} +.icon-system-file-settings-line:before { + content: "\e6d2"; +} +.icon-system-folder-4-fill:before { + content: "\e6d3"; +} +.icon-system-folder-4-line:before { + content: "\e6d4"; +} +.icon-system-folder-5-fill:before { + content: "\e6d5"; +} +.icon-system-folder-5-line:before { + content: "\e6d6"; +} +.icon-system-folder-chart-2-line:before { + content: "\e6d7"; +} +.icon-system-folder-history-fill:before { + content: "\e6d8"; +} +.icon-system-folder-history-line:before { + content: "\e6d9"; +} +.icon-system-folder-chart-fill:before { + content: "\e6da"; +} +.icon-system-folder-chart-2-fill:before { + content: "\e6db"; +} +.icon-system-folder-chart-line:before { + content: "\e6dc"; +} +.icon-system-folder-add-fill:before { + content: "\e6dd"; +} +.icon-system-folder-add-line:before { + content: "\e6de"; +} +.icon-system-folder-download-fill:before { + content: "\e6df"; +} +.icon-system-folder-keyhole-line:before { + content: "\e6e0"; +} +.icon-system-folder-keyhole-fill:before { + content: "\e6e1"; +} +.icon-system-folder-info-line:before { + content: "\e6e2"; +} +.icon-system-folder-info-fill:before { + content: "\e6e3"; +} +.icon-system-folder-shield-line:before { + content: "\e6e4"; +} +.icon-system-folder-lock-fill:before { + content: "\e6e5"; +} +.icon-system-folder-line:before { + content: "\e6e6"; +} +.icon-system-folder-download-line:before { + content: "\e6e7"; +} +.icon-system-folder-forbid-line:before { + content: "\e6e8"; +} +.icon-system-folder-lock-line:before { + content: "\e6e9"; +} +.icon-system-folder-transfer-fill:before { + content: "\e6ea"; +} +.icon-system-folder-fill:before { + content: "\e6eb"; +} +.icon-system-folder-music-fill:before { + content: "\e6ec"; +} +.icon-system-folder-music-line:before { + content: "\e6ed"; +} +.icon-system-folder-open-line:before { + content: "\e6ee"; +} +.icon-system-folder-received-fill:before { + content: "\e6ef"; +} +.icon-system-folder-received-line:before { + content: "\e6f0"; +} +.icon-system-folder-reduce-fill:before { + content: "\e6f1"; +} +.icon-system-folder-reduce-line:before { + content: "\e6f2"; +} +.icon-system-folder-forbid-fill:before { + content: "\e6f3"; +} +.icon-system-folder-open-fill:before { + content: "\e6f4"; +} +.icon-system-folders-fill:before { + content: "\e6f5"; +} +.icon-system-login-circle-fill:before { + content: "\e6f7"; +} +.icon-system-login-circle-line:before { + content: "\e6f8"; +} +.icon-system-folder-upload-fill:before { + content: "\e6f9"; +} +.icon-system-folder-shared-line:before { + content: "\e6fd"; +} +.icon-system-folder-shared-fill:before { + content: "\e6fe"; +} +.icon-system-folder-shield-2-fill:before { + content: "\e6ff"; +} +.icon-system-folder-shield-2-line:before { + content: "\e700"; +} +.icon-system-folder-shield-fill:before { + content: "\e701"; +} +.icon-system-folders-line:before { + content: "\e702"; +} +.icon-system-folder-transfer-line:before { + content: "\e703"; +} +.icon-system-logout-box-fill:before { + content: "\e704"; +} +.icon-system-logout-box-r-fill:before { + content: "\e705"; +} +.icon-system-logout-box-line:before { + content: "\e706"; +} +.icon-system-logout-box-r-line:before { + content: "\e707"; +} +.icon-system-logout-circle-line:before { + content: "\e708"; +} +.icon-system-logout-circle-r-fill:before { + content: "\e709"; +} +.icon-system-logout-circle-fill:before { + content: "\e70a"; +} +.icon-system-logout-circle-r-line:before { + content: "\e70b"; +} +.icon-system-flutter-fill:before { + content: "\e70c"; +} +.icon-system-flutter-line:before { + content: "\e70d"; +} +.icon-system-luggage-cart-fill:before { + content: "\e70e"; +} +.icon-system-luggage-cart-line:before { + content: "\e70f"; +} +.icon-system-luggage-deposit-fill:before { + content: "\e710"; +} +.icon-system-focus-2-fill:before { + content: "\e711"; +} +.icon-system-focus-2-line:before { + content: "\e712"; +} +.icon-system-focus-fill:before { + content: "\e713"; +} +.icon-system-focus-3-line:before { + content: "\e714"; +} +.icon-system-focus-3-fill:before { + content: "\e715"; +} +.icon-system-focus-line:before { + content: "\e716"; +} +.icon-system-folder-2-line:before { + content: "\e717"; +} +.icon-system-folder-3-fill:before { + content: "\e718"; +} +.icon-system-folder-2-fill:before { + content: "\e719"; +} +.icon-system-folder-3-line:before { + content: "\e71a"; +} +.icon-system-mac-line:before { + content: "\e71b"; +} +.icon-system-magic-line:before { + content: "\e71c"; +} +.icon-system-mail-add-fill:before { + content: "\e71d"; +} +.icon-system-mail-add-line:before { + content: "\e71e"; +} +.icon-system-mail-check-fill:before { + content: "\e71f"; +} +.icon-system-mail-check-line:before { + content: "\e720"; +} +.icon-system-mail-close-fill:before { + content: "\e721"; +} +.icon-system-mail-close-line:before { + content: "\e722"; +} +.icon-system-magic-fill:before { + content: "\e723"; +} +.icon-system-mail-download-fill:before { + content: "\e724"; +} +.icon-system-mail-fill:before { + content: "\e725"; +} +.icon-system-mail-download-line:before { + content: "\e726"; +} +.icon-system-mail-forbid-fill:before { + content: "\e727"; +} +.icon-system-mail-forbid-line:before { + content: "\e728"; +} +.icon-system-mail-settings-line:before { + content: "\e729"; +} +.icon-system-notification-off-fill:before { + content: "\e72a"; +} +.icon-system-mail-send-line:before { + content: "\e72b"; +} +.icon-system-mail-star-fill:before { + content: "\e72c"; +} +.icon-system-mail-star-line:before { + content: "\e72d"; +} +.icon-system-mail-unread-line:before { + content: "\e72e"; +} +.icon-system-mail-unread-fill:before { + content: "\e72f"; +} +.icon-system-notification-line:before { + content: "\e730"; +} +.icon-system-notification-off-line:before { + content: "\e731"; +} +.icon-system-mail-line:before { + content: "\e732"; +} +.icon-system-mail-settings-fill:before { + content: "\e733"; +} +.icon-system-mail-lock-fill:before { + content: "\e734"; +} +.icon-system-mail-open-fill:before { + content: "\e735"; +} +.icon-system-mail-lock-line:before { + content: "\e736"; +} +.icon-system-mail-send-fill:before { + content: "\e737"; +} +.icon-system-mail-open-line:before { + content: "\e738"; +} +.icon-system-npmjs-fill:before { + content: "\e73b"; +} +.icon-system-npmjs-line:before { + content: "\e73e"; +} +.icon-system-numbers-fill:before { + content: "\e73f"; +} +.icon-system-numbers-line:before { + content: "\e740"; +} +.icon-system-oil-fill:before { + content: "\e741"; +} +.icon-system-phone-camera-line:before { + content: "\e743"; +} +.icon-system-phone-fill:before { + content: "\e744"; +} +.icon-system-phone-find-fill:before { + content: "\e745"; +} +.icon-system-phone-line:before { + content: "\e747"; +} +.icon-system-phone-lock-fill:before { + content: "\e748"; +} +.icon-system-percent-fill:before { + content: "\e749"; +} +.icon-system-nurse-line:before { + content: "\e74a"; +} +.icon-system-phone-find-line:before { + content: "\e74d"; +} +.icon-system-phone-camera-fill:before { + content: "\e750"; +} +.icon-system-phone-lock-line:before { + content: "\e752"; +} +.icon-system-luggage-deposit-line:before { + content: "\e753"; +} +.icon-system-nurse-fill:before { + content: "\e754"; +} +.icon-system-lungs-fill:before { + content: "\e755"; +} +.icon-system-lungs-line:before { + content: "\e756"; +} +.icon-system-macbook-fill:before { + content: "\e757"; +} +.icon-system-macbook-line:before { + content: "\e758"; +} +.icon-system-mac-fill:before { + content: "\e759"; +} +.icon-system-pie-chart-line:before { + content: "\e75a"; +} +.icon-system-pie-chart-fill:before { + content: "\e75b"; +} +.icon-system-pin-distance-fill:before { + content: "\e75c"; +} +.icon-system-pin-distance-line:before { + content: "\e75d"; +} +.icon-system-pixelfed-fill:before { + content: "\e75e"; +} +.icon-tourism-plane-line:before { + content: "\e75f"; +} +.icon-system-pinterest-line:before { + content: "\e760"; +} +.icon-system-pinterest-fill:before { + content: "\e761"; +} +.icon-system-pixelfed-line:before { + content: "\e762"; +} +.icon-tourism-plane-fill:before { + content: "\e763"; +} +.icon-system-pinyin-input:before { + content: "\e764"; +} +.icon-system-plant-fill:before { + content: "\e765"; +} +.icon-system-plant-line:before { + content: "\e766"; +} +.icon-system-play-circle-line:before { + content: "\e767"; +} +.icon-system-play-circle-fill:before { + content: "\e768"; +} +.icon-system-play-fill:before { + content: "\e769"; +} +.icon-system-play-line:before { + content: "\e76a"; +} +.icon-system-play-list-2-line:before { + content: "\e76b"; +} +.icon-system-picture-in-picture-exit-line:before { + content: "\e76c"; +} +.icon-system-play-list-add-fill:before { + content: "\e76d"; +} +.icon-system-picture-in-picture-line:before { + content: "\e76e"; +} +.icon-system-play-mini-line:before { + content: "\e76f"; +} +.icon-system-pie-chart-2-fill:before { + content: "\e770"; +} +.icon-system-plug-2-fill:before { + content: "\e771"; +} +.icon-system-pie-chart-2-line:before { + content: "\e772"; +} +.icon-system-play-list-2-fill:before { + content: "\e773"; +} +.icon-system-plug-fill:before { + content: "\e774"; +} +.icon-system-pie-chart-box-fill:before { + content: "\e775"; +} +.icon-system-plug-2-line:before { + content: "\e776"; +} +.icon-system-play-list-add-line:before { + content: "\e777"; +} +.icon-system-play-mini-fill:before { + content: "\e778"; +} +.icon-system-plug-line:before { + content: "\e779"; +} +.icon-system-polaroid-2-fill:before { + content: "\e77b"; +} +.icon-system-polaroid-2-line:before { + content: "\e77c"; +} +.icon-tourism-police-car-line:before { + content: "\e77f"; +} +.icon-system-price-tag-2-fill:before { + content: "\e780"; +} +.icon-tourism-police-car-fill:before { + content: "\e781"; +} +.icon-system-picture-in-picture-fill:before { + content: "\e785"; +} +.icon-system-order-play-line:before { + content: "\e786"; +} +.icon-system-organization-chart:before { + content: "\e787"; +} +.icon-system-outlet-2-fill:before { + content: "\e788"; +} +.icon-system-outlet-2-line:before { + content: "\e789"; +} +.icon-system-outlet-fill:before { + content: "\e78a"; +} +.icon-system-paint-brush-fill:before { + content: "\e78b"; +} +.icon-system-outlet-line:before { + content: "\e78c"; +} +.icon-system-page-separator:before { + content: "\e78d"; +} +.icon-system-paint-line:before { + content: "\e78e"; +} +.icon-system-palette-line:before { + content: "\e78f"; +} +.icon-system-palette-fill:before { + content: "\e790"; +} +.icon-system-pages-fill:before { + content: "\e791"; +} +.icon-system-pages-line:before { + content: "\e792"; +} +.icon-system-paint-brush-line:before { + content: "\e793"; +} +.icon-system-parent-fill:before { + content: "\e794"; +} +.icon-system-parking-box-fill:before { + content: "\e795"; +} +.icon-system-parking-box-line:before { + content: "\e796"; +} +.icon-system-passport-line:before { + content: "\e797"; +} +.icon-system-passport-fill:before { + content: "\e798"; +} +.icon-system-pause-circle-fill:before { + content: "\e79a"; +} +.icon-system-parent-line:before { + content: "\e79b"; +} +.icon-system-open-arm-fill:before { + content: "\e79c"; +} +.icon-system-open-arm-line:before { + content: "\e79d"; +} +.icon-system-open-source-fill:before { + content: "\e79e"; +} +.icon-system-paypal-line:before { + content: "\e79f"; +} +.icon-system-pencil-fill:before { + content: "\e7a0"; +} +.icon-system-pencil-ruler-2-fill:before { + content: "\e7a1"; +} +.icon-system-pencil-line:before { + content: "\e7a2"; +} +.icon-system-pencil-ruler-2-line:before { + content: "\e7a3"; +} +.icon-system-pencil-ruler-line:before { + content: "\e7a4"; +} +.icon-system-pen-nib-fill:before { + content: "\e7a5"; +} +.icon-system-pencil-ruler-fill:before { + content: "\e7a7"; +} +.icon-system-open-source-line:before { + content: "\e7a8"; +} +.icon-system-pen-nib-line:before { + content: "\e7a9"; +} +.icon-system-oil-line:before { + content: "\e7aa"; +} +.icon-system-order-play-fill:before { + content: "\e7ad"; +} +.icon-system-music-2-fill:before { + content: "\e7ae"; +} +.icon-system-music-line:before { + content: "\e7af"; +} +.icon-system-music-2-line:before { + content: "\e7b0"; +} +.icon-system-mv-fill:before { + content: "\e7b1"; +} +.icon-system-music-fill:before { + content: "\e7b2"; +} +.icon-system-mv-line:before { + content: "\e7b3"; +} +.icon-system-navigation-line:before { + content: "\e7b4"; +} +.icon-system-navigation-fill:before { + content: "\e7b7"; +} +.icon-system-notification-fill:before { + content: "\e7b8"; +} +.icon-system-map-fill:before { + content: "\e7bc"; +} +.icon-system-notification-4-fill:before { + content: "\e7bd"; +} +.icon-system-notification-3-line:before { + content: "\e7be"; +} +.icon-system-node-tree:before { + content: "\e7c0"; +} +.icon-system-notification-2-line:before { + content: "\e7c1"; +} +.icon-system-notification-2-fill:before { + content: "\e7c2"; +} +.icon-system-map-line:before { + content: "\e7c3"; +} +.icon-system-notification-badge-fill:before { + content: "\e7c4"; +} +.icon-system-notification-3-fill:before { + content: "\e7c5"; +} +.icon-system-notification-4-line:before { + content: "\e7c6"; +} +.icon-system-notification-badge-line:before { + content: "\e7c7"; +} +.icon-system-mail-volume-fill:before { + content: "\e7c8"; +} +.icon-system-map-2-line:before { + content: "\e7c9"; +} +.icon-system-map-2-fill:before { + content: "\e7ca"; +} +.icon-system-map-pin-5-fill:before { + content: "\e7cb"; +} +.icon-system-map-pin-5-line:before { + content: "\e7cc"; +} +.icon-system-map-pin-2-fill:before { + content: "\e7cd"; +} +.icon-system-map-pin-2-line:before { + content: "\e7ce"; +} +.icon-system-map-pin-add-fill:before { + content: "\e7cf"; +} +.icon-system-map-pin-4-fill:before { + content: "\e7d0"; +} +.icon-system-mark-pen-fill:before { + content: "\e7d1"; +} +.icon-system-markup-line:before { + content: "\e7d2"; +} +.icon-system-map-pin-fill:before { + content: "\e7d4"; +} +.icon-system-medal-2-fill:before { + content: "\e7d5"; +} +.icon-system-map-pin-add-line:before { + content: "\e7d6"; +} +.icon-system-map-pin-line:before { + content: "\e7d7"; +} +.icon-system-map-pin-range-line:before { + content: "\e7d8"; +} +.icon-system-map-pin-time-fill:before { + content: "\e7d9"; +} +.icon-system-map-pin-user-fill:before { + content: "\e7da"; +} +.icon-system-map-pin-range-fill:before { + content: "\e7db"; +} +.icon-system-map-pin-4-line:before { + content: "\e7dc"; +} +.icon-system-map-pin-time-line:before { + content: "\e7dd"; +} +.icon-system-map-pin-user-line:before { + content: "\e7de"; +} +.icon-system-medal-2-line:before { + content: "\e7df"; +} +.icon-system-markdown-fill:before { + content: "\e7e0"; +} +.icon-system-medal-fill:before { + content: "\e7e1"; +} +.icon-system-medium-line:before { + content: "\e7e2"; +} +.icon-system-markdown-line:before { + content: "\e7e3"; +} +.icon-system-medal-line:before { + content: "\e7e4"; +} +.icon-system-medium-fill:before { + content: "\e7e5"; +} +.icon-system-men-line:before { + content: "\e7e6"; +} +.icon-system-men-fill:before { + content: "\e7e7"; +} +.icon-system-menu-5-line:before { + content: "\e7e8"; +} +.icon-system-medicine-bottle-line:before { + content: "\e7e9"; +} +.icon-system-markup-fill:before { + content: "\e7ea"; +} +.icon-system-menu-add-fill:before { + content: "\e7eb"; +} +.icon-system-menu-add-line:before { + content: "\e7ed"; +} +.icon-system-menu-2-fill:before { + content: "\e7f0"; +} +.icon-system-mark-pen-line:before { + content: "\e7f1"; +} +.icon-system-menu-2-line:before { + content: "\e7f2"; +} +.icon-system-menu-fill:before { + content: "\e7f3"; +} +.icon-system-movie-line:before { + content: "\e7f4"; +} +.icon-system-menu-3-fill:before { + content: "\e7f5"; +} +.icon-system-menu-4-line:before { + content: "\e7f6"; +} +.icon-system-menu-3-line:before { + content: "\e7f7"; +} +.icon-system-menu-4-fill:before { + content: "\e7f8"; +} +.icon-system-menu-5-fill:before { + content: "\e7f9"; +} +.icon-system-message-3-line:before { + content: "\e7fa"; +} +.icon-system-message-fill:before { + content: "\e7fb"; +} +.icon-system-message-3-fill:before { + content: "\e7fc"; +} +.icon-system-messenger-line:before { + content: "\e7fd"; +} +.icon-system-mic-2-fill:before { + content: "\e7fe"; +} +.icon-system-message-line:before { + content: "\e7ff"; +} +.icon-system-mic-fill:before { + content: "\e800"; +} +.icon-system-messenger-fill:before { + content: "\e801"; +} +.icon-system-mic-2-line:before { + content: "\e804"; +} +.icon-system-mic-off-fill:before { + content: "\e805"; +} +.icon-system-mic-line:before { + content: "\e806"; +} +.icon-system-microsoft-fill:before { + content: "\e809"; +} +.icon-system-microsoft-line:before { + content: "\e80a"; +} +.icon-system-mind-map:before { + content: "\e80b"; +} +.icon-system-money-cny-box-line:before { + content: "\e80c"; +} +.icon-system-money-cny-circle-fill:before { + content: "\e80d"; +} +.icon-system-mini-program-line:before { + content: "\e80e"; +} +.icon-system-money-cny-box-fill:before { + content: "\e80f"; +} +.icon-system-mic-off-line:before { + content: "\e810"; +} +.icon-system-mini-program-fill:before { + content: "\e811"; +} +.icon-system-money-cny-circle-line:before { + content: "\e812"; +} +.icon-system-more-2-fill:before { + content: "\e813"; +} +.icon-system-more-fill:before { + content: "\e814"; +} +.icon-system-more-2-line:before { + content: "\e815"; +} +.icon-system-more-line:before { + content: "\e816"; +} +.icon-tourism-motorbike-line:before { + content: "\e817"; +} +.icon-tourism-motorbike-fill:before { + content: "\e818"; +} +.icon-system-mouse-line:before { + content: "\e819"; +} +.icon-system-mouse-fill:before { + content: "\e81a"; +} +.icon-system-movie-2-fill:before { + content: "\e81b"; +} +.icon-system-movie-2-line:before { + content: "\e81c"; +} +.icon-system-movie-fill:before { + content: "\e81d"; +} +.icon-system-message-2-fill:before { + content: "\e81e"; +} +.icon-system-fenleiweixuanzhongbeifen2:before { + content: "\e82f"; +} +.icon-system-fenleixuanzhongbeifen1:before { + content: "\e830"; +} +.icon-system-shouyexuanzhongbeifen2:before { + content: "\e831"; +} +.icon-system-shouyeweixuanzhongbeifen:before { + content: "\e832"; +} +.icon-system-article-nav:before { + content: "\e833"; +} +.icon-rili:before { + content: "\e834"; +} +.icon-shijian:before { + content: "\e835"; +} +.icon-xuanzhaijishi:before { + content: "\e836"; +} +.icon-qiafu:before { + content: "\e837"; +} +.icon-shouzang:before { + content: "\e838"; +} +.icon-shouye:before { + content: "\e839"; +} +.icon-fenxiang:before { + content: "\e83a"; +} +.icon-gongqi_gaoliang:before { + content: "\e83b"; +} +.icon-system-daishiyong:before { + content: "\e83e"; +} +.icon-system-daishiyong2:before { + content: "\e83f"; +} +.icon-daohang:before { + content: "\f686"; +} +.icon-system-tuihuoguanli:before { + content: "\f687"; +} +.icon-system-pingjia:before { + content: "\f688"; +} +.icon-system-beihuozhong:before { + content: "\f689"; +} +.icon-system-daizhifu:before { + content: "\f68a"; +} +.icon-system-paisongzhong:before { + content: "\f68b"; +} +.icon-system-my:before { + content: "\f68c"; +} +.icon-system-cart:before { + content: "\f68d"; +} +.icon-system-home:before { + content: "\f68e"; +} +.icon-system-category:before { + content: "\f68f"; +} +.icon-yuezhifu:before { + content: "\f690"; +} +/*新版人人字体*/ +@font-face {font-family: "iconfont-remix"; + src: url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'); +} +.iconfont-remix { + font-family: "iconfont-remix" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon-remix-shouye5:before { + content: "\e7af"; +} +.icon-remix-fenlei4:before { + content: "\e7a8"; +} +.icon-remix-gouwulan4:before { + content: "\e79e"; +} +.icon-remix-wode3:before { + content: "\e79b"; +} +.icon-remix-xiaoxi6:before { + content: "\e731"; +} +.icon-remix-wode6:before { + content: "\e79a"; +} + +/*原版人人字体*/ +@font-face {font-family: "icox"; + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'); +} + + .icox { + font-family:"icox" !important; + font-size:16px; + font-style:normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + .icox-close:before { content: "\e602"; } + + .icox-search:before { content: "\e611"; } + + .icox-likefill:before { content: "\e61c"; } + + .icox-like:before { content: "\e61d"; } + + .icox-shop:before { content: "\e627"; } + + .icox-footprint:before { content: "\e639"; } + + .icox-cart:before { content: "\e642"; } + + .icox-cartfill:before { content: "\e648"; } + + .icox-vip:before { content: "\e650"; } + + .icox-add:before { content: "\e662"; } + + .icox-service:before { content: "\e682"; } + + .icox-app:before { content: "\e6ef"; } + + .icox-notification:before { content: "\e721"; } + + .icox-toleft:before { content: "\e739"; } + + .icox-delete:before { content: "\e75b"; } + + .icox-edit:before { content: "\e75c"; } + + .icox-viewlist:before { content: "\e772"; } + + .icox-icon02:before { content: "\e80d"; } + + .icox-gifts:before { content: "\e788"; } + + .icox-icon049:before { content: "\e7f1"; } + + .icox-heilongjiangtubiao11:before { content: "\e81c"; } + + .icox-dingdan2:before { content: "\e80a"; } + + .icox-erweima1:before { content: "\e81d"; } + + .icox-huiyuan1:before { content: "\e820"; } + + .icox-gouwuche:before { content: "\e63f"; } + + .icox-gouwuchetianjia:before { content: "\e640"; } + + .icox-lajixiang:before { content: "\e645"; } + + .icox-naozhong:before { content: "\e64a"; } + + .icox-shezhi:before { content: "\e64b"; } + + .icox-shijian:before { content: "\e64d"; } + + .icox-shouhuodizhi:before { content: "\e64e"; } + + .icox-shouye:before { content: "\e64f"; } + + .icox-sousuo:before { content: "\e654"; } + + .icox-wodeyouhuiquan:before { content: "\e65a"; } + + .icox-yijianfankui:before { content: "\e664"; } + + .icox-lingcunwei:before { content: "\e666"; } + + .icox-focus1:before { content: "\e8cf"; } + + .icox-shouhuodizhi1:before { content: "\e64c"; } + + .icox-liwu:before { content: "\e685"; } + + .icox-haoping:before { content: "\e636"; } + + .icox-haoping1:before { content: "\e647"; } + + .icox-shouhuodizhi2:before { content: "\e641"; } + + .icox-fenlei:before { content: "\e6b0"; } + + .icox-xing:before { content: "\e7fa"; } + + .icox-dianpu1:before { content: "\e82c"; } + + .icox-fenlei1:before { content: "\e82b"; } + + .icox-kefu2:before { content: "\e655"; } + + .icox-qian:before { content: "\e80b"; } + + .icox-yinhangqia:before { content: "\e621"; } + + .icox-gonggao:before { content: "\e606"; } + + .icox-hongbao:before { content: "\e62d"; } + + .icox-dianhua:before { content: "\e834"; } + + .icox-tixian1:before { content: "\e81a"; } + + .icox-youhuiquan:before { content: "\e835"; } + + .icox-shouji:before { content: "\e643"; } + + .icox-shezhi1:before { content: "\e836"; } + + .icox-haoping2:before { content: "\e631"; } + + .icox-icon_huida_tianxiebtn:before { content: "\e837"; } + + .icox-star:before { content: "\e802"; } + + .icox-fenxiang:before { content: "\e605"; } + + .icox-dianpu:before { content: "\e68c"; } + + .icox-arrow-down:before { content: "\e838"; } + + .icox-huiyuan:before { content: "\e66b"; } + + .icox-fenxiao:before { content: "\e600"; } + + .icox-guanbi1:before { content: "\e83a"; } + + .icox-huiyuan2:before { content: "\e83d"; } + + .icox-kefu:before { content: "\e625"; } + + .icox-shoucang:before { content: "\e628"; } + + .icox-daifahuo1:before { content: "\e808"; } + + .icox-xiaofei:before { content: "\e817"; } + + .icox-bangzhuzhongxin:before { content: "\e7f2"; } + + .icox-dingwei1:before { content: "\e7f3"; } + + .icox-guanzhu:before { content: "\e7f4"; } + + .icox-gouwuche3:before { content: "\e7f5"; } + + .icox-zuji:before { content: "\e7f6"; } + + .icox-dingdan1:before { content: "\e7f7"; } + + .icox-lingquyouhuiquan1:before { content: "\e7f9"; } + + .icox-fenxiao2:before { content: "\e7fc"; } + + .icox-shouji1:before { content: "\e7fd"; } + + .icox-daituikuan2:before { content: "\e7fe"; } + + .icox-daishouhuo1:before { content: "\e800"; } + + .icox-daifukuan1:before { content: "\e801"; } + + .icox-tixian:before { content: "\e805"; } + + + @font-face { + font-family: "iconj"; /* Project id 1752049 */ + src: url('//at.alicdn.com/t/c/font_1752049_n0jw9cvfunm.woff2?t=1727498649486') format('woff2'), + url('//at.alicdn.com/t/c/font_1752049_n0jw9cvfunm.woff?t=1727498649486') format('woff'), + url('//at.alicdn.com/t/c/font_1752049_n0jw9cvfunm.ttf?t=1727498649486') format('truetype'); + } + + .iconj { + font-family: "iconj" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + + .icon-07zanting:before { + content: "\e6df"; + } + + .icon-bofang:before { + content: "\e6e0"; + } + + .icon-zanting1:before { + content: "\e6e1"; + } \ No newline at end of file diff --git a/common/css/iconfont.css b/common/css/iconfont.css new file mode 100644 index 0000000..67d57ff --- /dev/null +++ b/common/css/iconfont.css @@ -0,0 +1,463 @@ +/* ttf字体文件转换base64:https://transfonter.org */ + +@font-face { + font-family: "iconfont"; + /* #ifdef MP */ + src: url('data:font/ttf;charset=utf-8;base64,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ZQByAHMAaQBvAG4AIAAxAC4AMAAAVmVyc2lvbiAxLjAAAGkAYwBvAG4AZgBvAG4AdAAAaWNvbmZvbnQAAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AAEdlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC4AAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAGh0dHA6Ly9mb250ZWxsby5jb20AAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlQAAAAEAAgBbAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUAqwE2ATcBOAE5AToBOwE8AT0BPgE/AUABQQFCAUMBRAFFAUYBRwFIAUkBSgFLAUwBTQFOAU8BUAFRAVIBUwFUAVUBVgFXAVgBWQFaAVsBXAFdAV4BXwFgAWEBYgFjAWQBZQFmAWcBaAFpAWoBawFsAW0BbgFvAXABcQFyAXMBdAF1AXYBdwF4AXkBegF7AXwBfQF+AX8BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEFZnV0b3UJY2hlbmdnb25nCGRpbmdkYW40DGZ1eHVhbmt1YW5nMQlnYW50YW5oYW8MZnV4dWFua3VhbmcyBGtlZnUGa2FuamlhD2thbmppYWNoZW5nZ29uZwZxcmNvZGUHZ29uZ2dhbwhwaW50dWFuMghzaGFuZ3BpbgZyaWdodDEHc291c3VvMwh0dXRlY2hhbgd0dWFuZ291EnhpYW5nc2hhbmd6aGFuaGFuZw15YW9xaW5naGFveW91D2JpYW9xaW5nX25hbmd1bwlmZW54aWFuZzQEZm9sZApnYW50YW5oYW8xBGljb24HaHVpeXVhbgRqaWFuDHBpbnR1YW5mYW5saQNqaWEHc2Vja2lsbAx3b2RlLXR1YW5nb3UHc2h1YXhpbgp3b2RleXVzaG91C3lvdWh1aXF1YW4xDnpodWFudGlodW9kb25nB3ppeXVhbjEHeW9uZ2h1MwZjYWlkYW4HZXJ3ZWltYRFkYW54dWFuLXh1YW56aG9uZwhkaW5nZGFuMgdzYW5qaWFvCXNoYW5ncGluLQdzaG91eWUxEXNoYW5nc2Fuamlhby1jb3B5FXRlZGlhbnF1YW5jaGFuZ2Jhb3lvdQZ3ZW5oYW8Hd2VpeGluMQN5dWUGemhla291DWZhbmdrdWFpLWZpbGwLemhpYm9qaWVzaHUJZ291d3VjaGUyB2d1YW56aHUGamlmZW4tCGRpYW5odWEyB2hvbmdiYW8IcWlhbmRhbzEGamlmZW4yBmppZmVuMwxmdXpoaWxpYW5qaWUIamlhaGFvMDEEbGlrZQhsaWtlZmlsbARsaXN0BXJpZ2h0C3JvdW5kLWNsb3NlCnNoYW5nY2h1YW4GdHVwaWFuCXh1YW56aHVhbgRhZGQxBndlaXpoaQxjbG9zZS1ndWFuYmkEYXBwcwhiaWFvcWluZwZiaWFuamkHY2FydC1vbgVjbG9zZQ1jaGVja2JveGJsYW5rB2RpYW56YW4IZGluZ3dlaTENaWNvbmFuZ2xlZG93bgVkaXpoaQZzaG91amkFaWNvbjcSaWNvbmFuZ2xlZG93bi1jb3B5CnlvdWh1aXF1YW4Geml5dWFuC3poYW94aWFuZ2ppDXl1YW5fY2hlY2tib3gKYmFja19saWdodAx5dWFuX2NoZWNrZWQHYmFuZ3podQZkZWxldGUIZGlhbnphbjEGZGlhbnB1B21lbmRpYW4Ic2hhaXh1YW4Hc2hpamlhbghzaGlqaWFuMQZzb3VzdW8Gc2hlemhpB2RpYW5odWEDZHVpB3lhb3FpbmcMemhvbmdjaGFwaW5nCGZlbnhpYW5nBWZ1emhpBmhleGlhbwVzaGFyZQhoYW9waW5nMQhnb3V3dWNoZQxzaGFyZS1mcmllbmQKamlhbmctY29weQhsb2NhdGlvbghqaWFuc2hhbwZndWFuYmkCZ3oJaGFvd3VxdWFuBnNlYXJjaARqaWx1C3Blbmd5b3VxdWFuBXNhb21hB3Nob3VqaTEOc2h1cnV0aWFueGllYmkRdGlhb3hpbmdtYXNhb21pYW8Fc2h1cnUGdW5mb2xkCGRpYW5odWExBndlaXhpbgZ5b25naHUIYmFuZ3podTEOemhpZnViYW96aGlmdS0IYWRkLWZpbGwKemhpYm96aG9uZwR3YXJuB3N1b2RpbmcLYmFpeGluZ2JlbmcHZmVueGlhbw1odW9kb25ndHVpeWFuB2Rpbmd3ZWkIZnVrdWFubWEHc2FvbWFmdQV6aGlmdQdzaHVxaW5nAAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAJQAAQAEAAAAAgAAAAAAAAABAAAAAN4GKm4AAAAA4cFGQQAAAADhwUZB') format('truetype'); + /* #endif */ + /* #ifndef MP */ + src: url('https://cdn2.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.eot?t=d9b1a524c10b9f31f44c697cd856e6aa'); /* IE9 */ + src: url('https://cdn2.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.eot?t=d9b1a524c10b9f31f44c697cd856e6aa#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('https://cdn2.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.woff?t=d9b1a524c10b9f31f44c697cd856e6aa') format('woff2'), + url('https://cdn2.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.woff?t=d9b1a524c10b9f31f44c697cd856e6aa') format('woff'), /* chromeã€firefox */ + url('https://cdn2.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.ttf?t=d9b1a524c10b9f31f44c697cd856e6aa') format('truetype'), /* chromeã€firefoxã€operaã€Safari, Android, iOS 4.2+*/ + url('https://cdn2.codesign.qq.com/icons/1Yyg5Zpxm6Z2lKv/latest/iconfont.svg?t=d9b1a524c10b9f31f44c697cd856e6aa#iconfont') format('svg'); /* iOS 4.1- */ + /* #endif */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-futou:before { + content: "\e003"; +} +.icon-chenggong:before { + content: "\e004"; +} +.icon-dingdan4:before { + content: "\e005"; +} +.icon-fuxuankuang1:before { + content: "\e006"; +} +.icon-gantanhao:before { + content: "\e007"; +} +.icon-fuxuankuang2:before { + content: "\e008"; +} +.icon-kefu:before { + content: "\e009"; +} +.icon-kanjia:before { + content: "\e00a"; +} +.icon-kanjiachenggong:before { + content: "\e00b"; +} +.icon-qrcode:before { + content: "\e00c"; +} +.icon-gonggao:before { + content: "\e00d"; +} +.icon-pintuan2:before { + content: "\e00e"; +} +.icon-shangpin:before { + content: "\e00f"; +} +.icon-right1:before { + content: "\e010"; +} +.icon-sousuo3:before { + content: "\e011"; +} +.icon-tutechan:before { + content: "\e012"; +} +.icon-tuangou:before { + content: "\e013"; +} +.icon-xiangshangzhanhang:before { + content: "\e014"; +} +.icon-yaoqinghaoyou:before { + content: "\e015"; +} +.icon-biaoqing_nanguo:before { + content: "\e016"; +} +.icon-fenxiang4:before { + content: "\e017"; +} +.icon-fold:before { + content: "\e018"; +} +.icon-gantanhao1:before { + content: "\e019"; +} +.icon-icon:before { + content: "\e01a"; +} +.icon-huiyuan:before { + content: "\e01b"; +} +.icon-jian:before { + content: "\e01c"; +} +.icon-pintuanfanli:before { + content: "\e01d"; +} +.icon-jia:before { + content: "\e01e"; +} +.icon-seckill:before { + content: "\e01f"; +} +.icon-wode-tuangou:before { + content: "\e020"; +} +.icon-shuaxin:before { + content: "\e021"; +} +.icon-wodeyushou:before { + content: "\e022"; +} +.icon-youhuiquan1:before { + content: "\e023"; +} +.icon-zhuantihuodong:before { + content: "\e024"; +} +.icon-ziyuan1:before { + content: "\e025"; +} +.icon-yonghu3:before { + content: "\e026"; +} +.icon-caidan:before { + content: "\e027"; +} +.icon-erweima:before { + content: "\e028"; +} +.icon-danxuan-xuanzhong:before { + content: "\e029"; +} +.icon-dingdan2:before { + content: "\e02a"; +} +.icon-sanjiao:before { + content: "\e02b"; +} +.icon-shangpin-:before { + content: "\e02c"; +} +.icon-shouye1:before { + content: "\e02d"; +} +.icon-shangsanjiao-copy:before { + content: "\e02e"; +} +.icon-tedianquanchangbaoyou:before { + content: "\e02f"; +} +.icon-wenhao:before { + content: "\e030"; +} +.icon-weixin1:before { + content: "\e031"; +} +.icon-yue:before { + content: "\e032"; +} +.icon-zhekou:before { + content: "\e033"; +} +.icon-fangkuai-fill:before { + content: "\e034"; +} +.icon-zhibojieshu:before { + content: "\e035"; +} +.icon-gouwuche2:before { + content: "\e036"; +} +.icon-ellipsis:before { + content: "\e037"; +} +.icon-guanzhu:before { + content: "\e038"; +} +.icon-jifen-:before { + content: "\e039"; +} +.icon-dianhua2:before { + content: "\e03a"; +} +.icon-hongbao:before { + content: "\e03b"; +} +.icon-qiandao1:before { + content: "\e03c"; +} +.icon-jifen2:before { + content: "\e03d"; +} +.icon-jifen3:before { + content: "\e03e"; +} +.icon-fuzhilianjie:before { + content: "\e03f"; +} +.icon-jiahao01:before { + content: "\e040"; +} +.icon-like:before { + content: "\e041"; +} +.icon-likefill:before { + content: "\e042"; +} +.icon-list:before { + content: "\e043"; +} +.icon-right:before { + content: "\e044"; +} +.icon-round-close:before { + content: "\e045"; +} +.icon-shangchuan:before { + content: "\e046"; +} +.icon-tupian:before { + content: "\e047"; +} +.icon-xuanzhuan:before { + content: "\e048"; +} +.icon-add1:before { + content: "\e049"; +} +.icon-weizhi:before { + content: "\e04a"; +} +.icon-close-guanbi:before { + content: "\e04b"; +} +.icon-apps:before { + content: "\e04c"; +} +.icon-biaoqing:before { + content: "\e04d"; +} +.icon-bianji:before { + content: "\e04e"; +} +.icon-cart-on:before { + content: "\e04f"; +} +.icon-close:before { + content: "\e050"; +} +.icon-checkboxblank:before { + content: "\e051"; +} +.icon-dianzan:before { + content: "\e052"; +} +.icon-dingwei1:before { + content: "\e053"; +} +.icon-iconangledown:before { + content: "\e055"; +} +.icon-dizhi:before { + content: "\e056"; +} +.icon-shouji:before { + content: "\e058"; +} +.icon-icon7:before { + content: "\e059"; +} +.icon-iconangledown-copy:before { + content: "\e05a"; +} +.icon-youhuiquan:before { + content: "\e05c"; +} +.icon-ziyuan:before { + content: "\e05d"; +} +.icon-zhaoxiangji:before { + content: "\e05e"; +} +.icon-yuan_checkbox:before { + content: "\e05f"; +} +.icon-back_light:before { + content: "\e060"; +} +.icon-yuan_checked:before { + content: "\e061"; +} +.icon-bangzhu:before { + content: "\e062"; +} +.icon-delete:before { + content: "\e064"; +} +.icon-dianzan1:before { + content: "\e065"; +} +.icon-dianpu:before { + content: "\e066"; +} +.icon-mendian:before { + content: "\e067"; +} +.icon-shaixuan:before { + content: "\e069"; +} +.icon-shijian:before { + content: "\e06a"; +} +.icon-shijian1:before { + content: "\e06b"; +} +.icon-sousuo:before { + content: "\e06c"; +} +.icon-shezhi:before { + content: "\e06d"; +} +.icon-dianhua:before { + content: "\e06e"; +} +.icon-dui:before { + content: "\e06f"; +} +.icon-yaoqing:before { + content: "\e070"; +} +.icon-zhongchaping:before { + content: "\e071"; +} +.icon-fenxiang:before { + content: "\e072"; +} +.icon-fuzhi:before { + content: "\e073"; +} +.icon-hexiao:before { + content: "\e074"; +} +.icon-share:before { + content: "\e075"; +} +.icon-haoping1:before { + content: "\e076"; +} +.icon-gouwuche:before { + content: "\e077"; +} +.icon-share-friend:before { + content: "\e078"; +} +.icon-jiang-copy:before { + content: "\e079"; +} +.icon-location:before { + content: "\e07a"; +} +.icon-jianshao:before { + content: "\e07b"; +} +.icon-guanbi:before { + content: "\e07c"; +} +.icon-gz:before { + content: "\e07d"; +} +.icon-haowuquan:before { + content: "\e07e"; +} +.icon-search:before { + content: "\e07f"; +} +.icon-jilu:before { + content: "\e080"; +} +.icon-pengyouquan:before { + content: "\e081"; +} +.icon-saoma:before { + content: "\e083"; +} +.icon-shouji1:before { + content: "\e084"; +} +.icon-shurutianxiebi:before { + content: "\e085"; +} +.icon-tiaoxingmasaomiao:before { + content: "\e087"; +} +.icon-shuru:before { + content: "\e088"; +} +.icon-unfold:before { + content: "\e089"; +} +.icon-dianhua1:before { + content: "\e08a"; +} +.icon-weixin:before { + content: "\e08b"; +} +.icon-yonghu:before { + content: "\e08c"; +} +.icon-bangzhu1:before { + content: "\e08d"; +} +.icon-zhifubaozhifu-:before { + content: "\e08e"; +} +.icon-add-fill:before { + content: "\e08f"; +} +.icon-zhibozhong:before { + content: "\e090"; +} +.icon-warn:before { + content: "\e091"; +} +.icon-suoding:before { + content: "\e092"; +} +.icon-wenxiao:before { + content: "\e093"; +} +.icon-baixingbeng:before { + content: "\e094"; +} +.icon-fenxiao:before { + content: "\e095"; +} +.icon-huodongtuiyan:before { + content: "\e096"; +} +.icon-dingwei:before { + content: "\e097"; +} +.icon-fukuanma:before { + content: "\e098"; +} +.icon-saomafu:before { + content: "\e099"; +} +.icon-zhifu:before { + content: "\e09a"; +} +.icon-shuqing:before { + content: "\e09b"; +} \ No newline at end of file diff --git a/common/css/main.scss b/common/css/main.scss new file mode 100644 index 0000000..9f7542b --- /dev/null +++ b/common/css/main.scss @@ -0,0 +1,876 @@ +@font-face { + font-family: 'myFont'; + /* #ifdef MP */ + src: url('data:font/ttf;charset=utf-8;base64,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/+8ALP/LADH/7wAz/+8ANf/3ADYACgA3/8sAOAAKADkACgA6AAcAOwAKAED/3QBC/90AQ//dAET/3QBF//QARv/dAEz/6gBN/+oATv/dAE//6gBQ/90AUf/qAFL/3wBT//UAVP/sAFUACwBX//UAWP/1AFn/7wAPACMACAAl//IAKf/yADH/8gAz//IAQv/1AEP/9QBE//UARv/1AE7/9QBQ//UAVP/1AFX/8gBW//IAWP/yAAIAVf/3AFj/9wAEAFX/+gBX//gAWP/6AFn/+AACAFX/9QBY//kABQBC//MAQ//zAET/8wBG//MAUP/zAAYAQv/1AEP/9QBE//UARv/1AEj/9QBQ//UABABV//gAV//1AFj/+ABZ//cACgBA/+QAQv/kAEP/6gBE/+QARQALAEb/6gBO/+EAUP/qAFMAHABYAAoAAgBE//UATv/uAAgAQP/4AEL/+ABD//gARP/1AEUACABG//gATv/4AFD/+AAGAEL/9QBD//UARP/1AEb/9QBO/+oAUP/1AAgAQP/4AEL/+ABD//gARP/4AEUACABG//gATv/vAFD/+AAGAEL/9wBD//cARP/3AEb/9wBO//cAUP/3AAIACwAjACgAAAAqADQABgA2ADwAEQBAAEEAGABEAEUAGgBKAEoAHABOAE8AHQBRAFEAHwBTAFMAIABVAFUAIQBXAFkAIgAAAAAAAQAAAADVpCcIAAAAANbRI74AAAAA2D0KNg==') format('truetype'); + /* #endif */ + /* #ifndef MP */ + src: url('@/common/css/custom.ttf') format('truetype'); + /* #endif */ +} + +view { + line-height: 1.8; + font-family: 'PingFang SC', 'Roboto Medium'; + font-size: $font-size-base; + color: $color-title; +} + +page { + background-color: $color-bg; +} + +:root { + $base-color: #ff4544; + $base-help-color: #ffb644; //辅助颜色 + --tab-bar-height: 112rpx; +} + +.uni-input-input:-webkit-autofill { + -webkit-transition-delay: 111111s; + -webkit-transition: color 11111s ease-out, background-color 111111s ease-out; +} + +.color-base-text { + color: $base-color !important; +} + +//背景色 +.color-base-bg { + background-color: $base-color !important; +} + +.color-base-bg-before { + &::after, + &::before { + background: $base-color !important; + } +} + +.color-base-text-before { + &::after, + &::before { + color: $base-color !important; + } +} + +// 浅主色调背景 +.color-base-bg-light { + // background-color: lighten($base-color, 35%) !important; +} + +//边框 +.color-base-border { + border-color: $base-color !important; + &-top { + border-top-color: $base-color !important; + } + &-bottom { + border-bottom-color: $base-color !important; + } + &-right { + border-right-color: $base-color !important; + } + &-left { + border-left-color: $base-color !important; + } +} + +// ***************文字颜色*************** + +// 主标题 +.color-title { + color: $color-title !important; +} + +// 副标题 +.color-sub { + color: $color-sub !important; +} + +// 辅助提示色 +.color-tip { + color: $color-tip !important; +} + +// 灰背景色 +.color-bg { + background-color: $color-bg !important; +} + +// 分割线 +.color-line { + color: $color-line !important; +} + +// 分割线边框 +.color-line-border { + border-color: $color-line !important; +} + +// 禁用色 +.color-disabled { + color: $color-disabled !important; +} + +// ***************文字大小*************** +input { + max-height: unset; + min-height: unset; + font-size: $font-size-base; + background: unset; +} + +// 14px,正文文字 +.font-size-base { + font-size: $font-size-base !important; +} + +// 16px,用于标题、导航栏 +.font-size-toolbar { + font-size: $font-size-toolbar !important; +} + +// 13px,副标题 +.font-size-sub { + font-size: $font-size-sub !important; +} + +// 12px,辅助性文字/大标签 +.font-size-tag { + font-size: $font-size-tag !important; +} + +// 11px,商品列表角标 +.font-size-goods-tag { + font-size: $font-size-goods-tag !important; +} + +// 10px,活动角标(拼团等角标)/小标签文字 +.font-size-activity-tag { + font-size: $font-size-activity-tag !important; +} + +//内边距 +.padding { + padding: $padding !important; + &-top { + padding-top: $padding !important; + } + &-right { + padding-right: $padding !important; + } + &-bottom { + padding-bottom: $padding !important; + } + &-left { + padding-left: $padding !important; + } +} + +//外边距 +.margin { + margin: $margin-updown $margin-both !important; + &-top { + margin-top: $margin-updown !important; + } + &-right { + margin-right: $margin-both !important; + } + &-bottom { + margin-bottom: $margin-updown !important; + } + &-left { + margin-left: $margin-both !important; + } +} + +/** + * 按钮 + * size='mini' 小规格的 + * type='default' 普通的 + * type='primary' 主色背景+白色字 + * .button-border 主色边框+主色字 + * .shadow 主色阴影 + * .default 去除margin + * .disabled 禁止状态 + */ +button { + margin: 0 30rpx; + font-size: $font-size-base; + border-radius: 10rpx; + line-height: 2.8; + background-color: $base-color; + // #ifdef MP-ALIPAY + border: none; + // #endif + + &[type='primary'] { + background-color: $base-color; + color: var(--btn-text-color); + &[plain] { + background-color: transparent; + color: $base-color; + border-color: $base-color; + } + } + &[type='default'] { + background: #fff; + border: 2rpx solid $color-line; + } + &.mini, &[size='mini'] { + margin: 0 !important; + height: 60rpx; + line-height: 60rpx; + box-sizing: content-box; + font-size: $font-size-tag; + padding: 0 30rpx; + &[type='default'] { + background-color: #fff; + } + } + &.button-hover[type='primary'] { + background-color: $base-color; + } + &[type='primary'][plain], + &.button-hover[type='primary'][plain] { + color: $base-color; + border-color: $base-color; + } + &.button-hover[type='primary'] { + color: var(--btn-text-color); + } + + &[disabled], + &.disabled { + background: $color-line !important; + color: rgba(0, 0, 0, 0.3) !important; + border-color: $color-line !important; + } + &::after { + border: none !important; + } +} + +uni-button:after { + border: none !important; +} + +// 复选框 +uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked { + color: $base-color !important; +} + +uni-checkbox:not([disabled]) .uni-checkbox-input:hover { + border-color: $base-color !important; +} + +.form-component uni-checkbox .uni-checkbox-input.uni-checkbox-input-checked { + background-color: $base-color !important; + border-color: $base-color !important; +} + +// 开关 +uni-switch .uni-switch-input.uni-switch-input-checked { + background-color: $base-color !important; + border-color: $base-color !important; +} + +// 单选 +uni-radio .uni-radio-input-checked { + background-color: $base-color !important; + border-color: $base-color !important; +} + +// 滑块 +uni-slider .uni-slider-track { + background-color: $base-color !important; +} + +.uni-tag--primary { + color: #fff !important; + background-color: $base-color !important; + border-color: $base-color !important; +} + +.uni-tag--primary.uni-tag--inverted { + color: $base-color !important; + background-color: #fff !important; + border-color: $base-color !important; +} + +// 圆角 +.border-radius { + border-radius: $border-radius !important; +} + +.uni-tag--inverted { + border-color: $color-line !important; + color: $color-title !important; +} + +// ***************商品详情*************** +//商品详情,优惠券弹出层,项 +// .goods-coupon-popup-layer .coupon-body .item { +// background-color: lighten($base-color, 45%) !important; +// view { +// color: lighten($base-color, 10%) !important; +// } +// } + +// 商品详情加入购物车背景色 +.color-join-cart { + background-color: $base-help-color !important; +} + +// 商品详情,sku选中 +.sku-layer .body-item .sku-list-wrap { + .items { + // background-color: #f5f5f5 !important; + &.selected { + // background-color: lighten($base-color, 35%) !important; + // background-color: lighten($base-color, 45%) !important; + color: $base-color !important; + border-color: $base-color !important; + } + &.disabled { + color: $color-sub !important; + cursor: not-allowed !important; + pointer-events: none !important; + opacity: 0.5 !important; + box-shadow: none !important; + filter: grayscale(100%); + } + } +} + +.goods-detail .goods-coupon-popup-layer .coupon-info button { + // background: linear-gradient(to right, #ff4544, lighten(#ff4544, 10%)); + // background: linear-gradient(to right, $base-color, lighten($base-color, 10%)); +} + +// 秒杀商品详情 +.goods-detail .seckill-wrap { + // background: linear-gradient(to right, $base-color, lighten($base-color, 20%)) !important; +} + +.goods-detail .goods-module-wrap .original-price .seckill-save-price { + // background: lighten($base-color, 40%) !important; + color: $base-color !important; +} + +// 拼团商品详情 +.goods-detail .goods-pintuan { + background: rgba($base-color, 0.2); + .price-info { + // background: linear-gradient(to right, $base-color, lighten($base-color, 10%)) !important; + } +} + +// 预售商品详情 +.goods-detail .presale-rule { + .process-item .number { + background: rgba($base-color, 0.2); + } +} + +// 专题商品详情 +.goods-detail .topic-wrap .price-info { + // background: linear-gradient(to right, $base-color, #ff7877) !important; +} + +// 团购商品详情 +.goods-detail .goods-groupbuy { + background: rgba($base-color, 0.2); + .price-info { + // background: linear-gradient(to right, $base-color, lighten($base-color, 10%)) !important; + } +} + +// 商品详情优惠券 +.newdetail .coupon .coupon-item { + &::after, + &::before { + border-color: $base-color !important; + } +} + +// 商品详情,数量加减 +.sku-layer .body-item .number-wrap .number { + button, + input { + border-color: rgba(229, 229, 229, 0.5) !important; + background-color: rgba(229, 229, 229, 0.4) !important; + } +} + +// ***************订单*************** +// 订单列表按钮样式 +.order-box-btn { + &.order-pay { + background: $base-color; + } +} + +.ns-gradient-otherpages-fenxiao-apply-apply-bg { + // background: linear-gradient(to left, $base-color, lighten($base-color, 20%)); +} + +.ns-gradient-otherpages-member-widthdrawal-withdrawal { + // background: linear-gradient(to left, $base-color, lighten($base-color, 20%)); +} + +.ns-gradient-otherpages-member-balance-balance-rechange { + // background: linear-gradient(to bottom, $base-color, #fd7e4b); +} + +.ns-gradient-pages-member-index-index { + // background: linear-gradient(to left, lighten($base-color, 10%), darken($base-color, 1%)); +} + +.ns-gradient-promotionpages-pintuan-share-share { + // background-image: linear-gradient(to right, mix($base-color, #fff), $base-color); +} + +.ns-gradient-promotionpages-payment { + // background: linear-gradient(to right, mix($base-color, #fff), $base-color) !important; +} + +.ns-gradient-promotionpages-pintuan-payment { + background: rgba($base-color, 0.08) !important; +} + +.ns-gradient-diy-goods-list { + border-color: rgba($base-color, 0.2) !important; +} + +.ns-gradient-detail-coupons-right-border { + border-right-color: rgba($base-color, 0.2) !important; +} + +.ns-gradient-detail-coupons { + background-color: rgba($base-color, 0.8) !important; +} + +.ns-pages-goods-category-category { + // background-image: linear-gradient(135deg, $base-color, #ff7444) !important; +} + +.ns-gradient-pintuan-border-color { + border-color: rgba($base-color, 0.2) !important; +} + +.goods-list.single-column .pro-info button, +.goods-list.single-column .pro-info .buy-btn { + // background: linear-gradient(to right, mix($base-color, #fff), $base-color) !important; +} + +.goods-list.single-column .pintuan-info .pintuan-num { + // background: mix($base-color, #fff, 30%) !important; +} +.goods-list.single-column .pintuan-info .pinfan-num { + // background: mix($base-color, #fff, 10%) !important; +} + +.order-box-btn { + display: inline-block; + line-height: 56rpx; + padding: 0 30rpx; + font-size: 26rpx; + color: $color-title; + border: 1.5px solid #999; + box-sizing: border-box; + border-radius: 60rpx; + margin-left: $margin-both; + &.order-pay { + color: #fff; + border-color: #fff; + } + &.color-base-bg { + color: #fff; + } +} + +// ***************余额*************** +// 余额背景色渐变 +.balance-wrap { + // background: linear-gradient(to right, $base-color, mix($base-color, #fff, 70%)) !important; +} + +.color-base-text-light { + // color: mix($base-color, #fff, 50%) !important; +} +//瓜分红包规则背景 +.ns-rule-bg { + background: rgba(#fff, 0.1) !important; +} + +// 解决uni.showModal弹窗标题继承父级样式 +uni-modal .uni-modal__hd { + font-size: 36rpx; +} + +// 解决弹框的字体大小 +uni-toast { + .uni-simple-toast__text { + font-size: 26rpx; + padding: 20rpx 40rpx; + border-radius: 10rpx; + } + .uni-toast { + width: 200rpx; + } + .uni-icon_toast.uni-loading { + margin: 40rpx 0 0; + width: 76rpx; + height: 76rpx; + } + .uni-toast__content { + font-size: 28rpx; + margin: 0 0 30rpx; + } +} + +.iconfont { + font-size: 32rpx; +} + +/* 兼容苹果X以上的手机样式 */ +.iphone-x { + /* padding-bottom: 68rpx !important; */ + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); +} + +.iphone-x-fixed { + bottom: 68rpx !important; +} + +// ***************其他*************** +/* 隐藏滚动条 */ +::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; +} + +scroll-view ::-webkit-scrollbar { + width: 0; + height: 0; + background-color: transparent; +} + +/deep/::-webkit-scrollbar { + width: 0; + height: 0; + background-color: transparent; + display: none; +} + +/* 单行超出隐藏 */ +.using-hidden { + word-break: break-all; + text-overflow: ellipsis; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + white-space: break-spaces; +} +/* 多行超出隐藏 */ +.multi-hidden { + word-break: break-all; + text-overflow: ellipsis; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} + +// 价格样式 +.price-color{ + color: var(--price-color)!important; +} +.price-style{ + font-family: 'myFont','-apple-system', 'BlinkMacSystemFont', 'Helvetica Neue', 'Helvetica', 'Segoe UI', 'Arial', 'Roboto', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei','sans-serif'; + // font-family: 'PingFang SC', 'Roboto Medium'; + color: var(--price-color)!important; + font-weight: 500!important; + &.large{ + font-size: 32rpx!important; + } + &.small{ + font-size: 24rpx!important; + } +} + +.price-font{ + font-family: 'myFont','-apple-system', 'BlinkMacSystemFont', 'Helvetica Neue', 'Helvetica', 'Segoe UI', 'Arial', 'Roboto', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft Yahei','sans-serif'; + // font-family: 'PingFang SC', 'Roboto Medium'; + font-weight: 500!important; +} + +/deep/ .reward-popup .uni-popup__wrapper-box { + background: none !important; + max-width: unset !important; + max-height: unset !important; + overflow: unset !important; +} + +// #ifdef H5 +// 下拉加载动画【页面】 +/deep/ body uni-page-refresh div{ + width: 14rpx !important; + height: 14rpx !important; + background-color: #ccc; + box-shadow: inherit !important; + clip: rect(-152rpx, 90rpx, 90rpx, -30rpx) !important; + animation:.6s backgroundChange linear infinite; +} +/deep/ body uni-page-refresh div::after{ + content: ""; + position: absolute; + left: -22rpx; + width: 14rpx !important; + height: 14rpx !important; + border-radius: 50%; + background-color: #ccc; + animation:.5s backgroundChange linear infinite; +} +/deep/ body uni-page-refresh div::before{ + content: ""; + position: absolute; + right: -22rpx; + width: 14rpx !important; + height: 14rpx !important; + border-radius: 50%; + background-color: #ccc; + animation:.7s backgroundChange linear infinite; +} +/deep/ body uni-page-refresh > div > div{ + display: none !important; +} + +// 下拉加载动画【scroll-view】 +/deep/ body .uni-scroll-view-refresher{ + background-color: transparent !important; +} +/deep/ body .uni-scroll-view-refresher div{ + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + width: 14rpx !important; + height: 14rpx !important; + background-color: #ccc; + box-shadow: inherit !important; + border-radius: 50%; + clip: rect(-152rpx, 90rpx, 90rpx, -30rpx) !important; + animation:.6s backgroundChange linear infinite; +} +/deep/ body .uni-scroll-view-refresher div::after{ + content: ""; + position: absolute; + left: -22rpx; + width: 14rpx !important; + height: 14rpx !important; + border-radius: 50%; + background-color: #ccc; + animation:.5s backgroundChange linear infinite; +} +/deep/ body .uni-scroll-view-refresher div::before{ + content: ""; + position: absolute; + right: -22rpx; + width: 14rpx !important; + height: 14rpx !important; + border-radius: 50%; + background-color: #ccc; + animation:.7s backgroundChange linear infinite; +} +/deep/ body .uni-scroll-view-refresher > div > div{ + display: none !important; +} +@keyframes backgroundChange { + from { + background-color: #ccc; + } + to { + background-color: #999; + } +} +// #endif + +.border-0 { + border: none; +} + + +/*-------------*/ +.fui-list-group { + background-color: #fff; + position: relative; + margin-top: 20rpx; + .fui-list { + position: relative; + display: flex; + padding: 16rpx 24rpx; + transition-duration: 300ms; + align-items: center; + overflow: hidden; + .fui-list-media { + display: flex; + flex-shrink: 0; + flex-wrap: nowrap; + box-sizing: border-box; + align-items: center; + margin-right: 20rpx; + color: #000; + position: relative; + image { + width: 100rpx; + height: 100rpx; + } + } + .fui-list-inner { + position: relative; + flex: 1; + overflow: hidden; + box-sizing: border-box; + display: block; + .title { + position: relative; + font-size: 28rpx; + color: #000; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + height: 40rpx; + line-height: 40rpx; + } + } + } + +} +.fui-cell-group { + margin-top: 0rpx; + background-color: #fff; + line-height: 1.4; + font-size: 32rpx; + overflow: hidden; + position: relative; + .fui-cell { + position: relative; + padding: 24rpx; + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + transition-duration: 300ms; + transition-property: background-color; + .fui-cell-label { + position: relative; + display: block; + width: 160rpx; + padding: 0; + font-size: 28rpx; + color: #666; + } + .fui-cell-info { + flex: 1; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + font-size: 28rpx; + color: #000; + input { + width: 100%; + border: 0; + outline: 0; + background-color: transparent; + font-size: inherit; + color: inherit; + height: 1.41176471em; + line-height: 1.41176471; + } + } + .fui-cell-text { + flex: 1; + color: #000; + font-size: 28rpx; + } + .fui-cell-remark { + color: #888; + text-align: right; + font-size: 30rpx; + margin-right: 8rpx; + } + } + .fui-cell-remark:after { + content: " "; + display: inline-block; + transform: rotate(45deg); + height: 16rpx; + width: 16rpx; + border-width: 1px 1px 0 0; + border-color: #C8C8CD; + border-style: solid; + position: relative; + top: 0; + margin-left: .3em; + } + .fui-cell:before { + content: " "; + position: absolute; + left: 20rpx; + right: 20rpx; + top: 0; + height: 1px; + border-top: 1px solid #ebebeb; + color: #D9D9D9; + transform-origin: 0 0; + transform: scaleY(0.5); + } + .fui-cell-icon{ + margin-top: 10rpx; + margin-right: 16rpx; + } + +} +.fui-btn.mtop { + margin-top: 1rem; +} +.fui-btn.btn-danger { + background: #4390FF; + color: #fff; + border: 1px solid #4390FF; +} +.fui-btn.block { + display: block; +} + +.fui-btn { + -moz-appearance: none; + background: rgba(0,0,0,0) none repeat scroll 0 0; + border-radius: 10rpx; + box-sizing: border-box; + cursor: pointer; + font-family: inherit; + font-size: 30rpx; + height: 80rpx; + line-height: 76rpx; + padding: 0 20rpx; + position: relative; + text-align: center; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; + border: 1px solid #f90; + margin: 0.5em; + user-select: none; + transition-duration: 300ms; + transition-property: background-color; + display: inline-block; + z-index: 100; +} \ No newline at end of file diff --git a/common/css/order_parment.scss b/common/css/order_parment.scss new file mode 100644 index 0000000..0f1bc27 --- /dev/null +++ b/common/css/order_parment.scss @@ -0,0 +1,1452 @@ +@mixin wrap { + margin: 20rpx 24rpx 0; + background: #fff; + padding: 30rpx 24rpx; + border-radius: 16rpx; +} + +$margin-both: 24rpx; + +input, +view { + font-size: $font-size-tag; +} + +.font-bold { + font-weight: bold; +} + +.order-container { + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + background: linear-gradient(180deg, $base-color 10%, $color-bg 100%); + background-size: 100% 260rpx; + background-repeat: no-repeat; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .order-scroll-container { + width: 100%; + height: 0; + flex: 1; + } + + // #ifdef H5 + .payment-navbar-block { + height: 60rpx; + } + // #endif +} + +.payment-navbar { + width: 100vw; + padding-bottom: 20rpx; + position: fixed; + left: 0; + top: 0; + z-index: 100; + background: linear-gradient(180deg, $base-color 10%, $color-bg 100%); + background-size: 100% 260rpx; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .nav-wrap { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + box-sizing: border-box; + position: relative; + } + + .navbar-title { + color: #fff; + font-size: 32rpx; + } + + .icon-back_light { + color: #fff; + position: absolute; + left: 24rpx; + font-size: 40rpx; + } +} + +.payment-navbar-block { + padding-bottom: 20rpx; +} + +.mobile-wrap { + @include wrap; + .tips { + font-size: $font-size-goods-tag; + margin-bottom: 30rpx; + background: var(--main-color-shallow); + border-radius: $border-radius; + padding: 20rpx 30rpx; + line-height: 1; + display: flex; + align-items: center; + .iconfont{ + margin-right: 5rpx; + } + } + &.local-mobile{ + border-bottom: 2rpx solid #F4F4F6; + margin: 0; + } + &.store-mobile{ + border-top: 2rpx solid #F4F4F6; + margin: 20rpx 0 0 0; + padding: 20rpx 0; + border-radius: 0; + } + .form-group { + display: flex; + align-items: center; + width: 100%; + .iconfont { + margin-right: 26rpx; + font-size: $font-size-toolbar; + } + .text { + display: inline-block; + line-height: 50rpx; + padding-right: 10rpx; + font-size: $font-size-base; + font-weight: bold; + } + + .placeholder { + line-height: 50rpx; + } + + .input { + flex: 1; + height: 50rpx; + line-height: 50rpx; + text-align: right; + font-size: $font-size-base; + } + } +} + +.order-cell { + display: flex; + margin: 0 0 30rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + position: relative; + + &.clear-flex { + display: block; + } + &.textarea-box{ + display: flex; + align-items: baseline; + font-size: 28rpx; + + } + text { + font-size: 28rpx; + } + .tit { + text-align: left; + font-size: $font-size-base; + min-width: 160rpx; + color: #000; + font-weight: bold; + text { + font-size: $font-size-base; + } + .tit-content{ + max-width: 540rpx; + font-size: 24rpx; + line-height: 35rpx; + margin-bottom: 10rpx; + } + } + + .box { + flex: 1; + padding: 0 10rpx; + line-height: inherit; + text-align: right; + &.text-overflow { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + .money { + overflow: hidden; + max-width: 40%; + display: inline-block; + text-overflow: ellipsis; + vertical-align: top; + + } + } + + .icon-right{ + color: #303133; + margin-left: 20rpx; + } + .operator { + font-size: $font-size-tag; + margin-right: 6rpx; + font-weight: bold; + color: var(--price-color); + } + textarea{ + width: auto; + height: 88rpx; + font-size: 28rpx; + } + } + + .iconfont { + color: $color-tip; + line-height: initial; + font-size: $font-size-tag; + } + + .unit { + margin-right: 4rpx; + font-weight: bold; + font-size: 28rpx !important; + margin-left: 4rpx; + color: var(--price-color); + } + .money { + font-size: 28rpx !important; + font-weight: bold; + color: var(--price-color); + } +} + +.site-wrap { + @include wrap; + padding: 40rpx 0; + .site-header { + margin: 0 $margin-both $margin-updown; + display: flex; + align-items: center; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: 30rpx; + } + } + &.order-goods{ + padding: 20rpx 0 0 0; + } + .site-body { + margin: 0 $margin-both; + .goods-item { + border-bottom: 2rpx solid #F4F4F6; + &:last-child { + border-bottom: 0; + } + + .error-tips { + color: #ff443f; + padding: 10rpx 20rpx; + display: inline-flex; + align-items: center; + line-height: 1; + background: #ffecec; + margin-top: 20rpx; + border-radius: 12rpx; + width: auto; + + .iconfont { + margin-right: 10rpx; + } + } + } + .goods-wrap { + display: flex; + position: relative; + padding: 0rpx 0 10rpx 0; + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + border-radius: $border-radius; + overflow: hidden; + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + width: 0; + margin-top: -4rpx; + display: flex; + flex-direction: column; + justify-content: space-between; + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + font-weight: bold; + } + + .sku { + display: flex; + line-height: 1; + margin-top: 8rpx; + + .goods-spec { + color: $color-tip; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + display: flex; + view{ + background-color: #F4F4F4; + color: #666666; + padding: 6rpx 10rpx; + margin-right: 12rpx; + line-height: 1; + } + } + } + + .goods-sub-section { + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + font-weight: bold; + color: var(--price-color); + } + + .goods-price { + font-weight: bold; + font-size: $font-size-toolbar; + color: var(--price-color); + } + + view { + &:first-of-type { + width: 80%; + overflow: hidden; + text-overflow: ellipsis; + } + + &:last-of-type { + text-align: right; + position: absolute; + right: 0; + bottom: 0; + font-weight: bold; + } + } + } + } + } + } + + .site-footer { + margin: 0 $margin-both 0; + .order-cell { + &:last-of-type { + margin-bottom: 0; + } + } + } +} + +/deep/ .goods-form { + display: flex; + align-items: center; + position: relative; + + ns-form { + display: flex; + width: 100%; + } + + .shade { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + z-index: 5; + } + + .cell-more { + margin-left: 50rpx; + float: right; + color: #909399; + font-size: 24rpx; + } + + .form-wrap { + flex: 1; + width: 0; + + .icon-right { + display: none; + } + } + .form-wrap > view, .form-wrap > picker { + display: none; + } + .form-wrap > view:first-child, .form-wrap > picker:first-child { + display: block; + border-bottom: none; + + .required { + display: none; + } + } + .order-cell .name { + width: auto; + } + .order-cell .tit { + font-weight: bold; + } + .order-cell .tit:after { + content: ":"; + } +} + +.member-goods-card { + margin-bottom: 0; + padding-bottom: 30rpx; + + .text { + margin-right: 10rpx; + color: #999; + } + + .price-font { + color: var(--price-color); + } +} + +.order-money { + @include wrap; + .order-cell:last-child { + margin-bottom: 0; + } +} +.error-message{ + position: fixed; + z-index: 5; + left: 0; + bottom: 100rpx; + width: 100vw; + background: #f6f6cb; + text-align: left; + padding: 10rpx 20rpx; + color: #FF0000; +} +.order-submit { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + text-align: right; + display: flex; + align-items: center; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + + .order-settlement-info { + flex: 1; + height: 100rpx; + line-height: 100rpx; + display: flex; + padding-left: 30rpx; + align-items: baseline; + .unit { + font-weight: bold; + font-size: $font-size-tag; + margin-right: 4rpx; + color: var(--price-color); + } + .money { + font-weight: bold; + font-size: $font-size-toolbar; + color: var(--price-color); + } + } + + .submit-btn { + height: 80rpx; + margin: 0 30rpx; + display: flex; + justify-content: center; + align-items: center; + button { + line-height: 70rpx; + width: 180rpx; + height: 70rpx; + padding: 0; + font-size: $font-size-base; + font-weight: bold; + } + .no-submit{ + width: unset; + background-color: rgb(204, 204, 204); + color: #FFFFFF; + padding: 0 20rpx; + font-size: $font-size-base; + } + } +} +.order-submit-block { + height: 120rpx; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + border-bottom: 2rpx solid $color-line; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + height: calc(100% - 250rpx); + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } + + .popup-footer { + height: 120rpx; + + .confirm-btn { + height: 80rpx; + line-height: 80rpx; + color: #fff; + text-align: center; + margin: 20rpx 32rpx 40rpx; + border-radius: $border-radius; + font-size: $font-size-base; + &.color-base-bg{ + color: var(--btn-text-color); + } + } + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + } +} + +.invoice-popup { + height: 83vh; + padding: 18rpx 0; + box-sizing: border-box; + position: relative; + + .invoice-close { + position: absolute; + line-height: 1; + top: 48rpx; + right: 48rpx; + font-size: $font-size-toolbar; + z-index: 9; + } + .popup-body { + .invoice-cell { + padding: 30rpx 0; + border-top: 2rpx solid $color-line; + margin: 0 48rpx; + + &:first-of-type { + border-top: none; + } + + .tit { + font-size: $font-size-base; + } + + .option-grpup { + padding-top: 20rpx; + + .option-item { + height: 54rpx; + line-height: 54rpx; + display: inline-block; + font-size: $font-size-goods-tag; + padding: 0 36rpx; + background: $color-bg; + border: 2rpx solid $color-line; + border-radius: $border-radius; + margin-right: 30rpx; + + &.active { + color: var(--btn-text-color); + } + &.content { + margin-bottom: 20rpx; + &:last-child { + margin-bottom: 0; + } + } + } + } + + .invoice-form-group { + input { + background: $color-bg; + border-radius: 10rpx; + height: 66rpx; + margin-top: 22rpx; + padding: 0 32rpx; + font-size: $font-size-tag; + } + } + } + .invoice-tops { + font-size: $font-size-activity-tag; + margin: 0 48rpx; + color: $color-tip; + } + } +} + + +.buyermessag-popup { + box-sizing: border-box; + position: relative; + + .buyermessag-close { + position: absolute; + line-height: 1; + top: 48rpx; + right: 48rpx; + font-size: $font-size-toolbar; + z-index: 9; + } + .popup-body { + .buyermessag-cell { + padding: 30rpx 0; + border-top: 2rpx solid $color-line; + margin: 0 32rpx; + + &:first-of-type { + border-top: none; + } + .buyermessag-form-group{ + textarea{ + display: flex; + align-items: baseline; + font-size: 28rpx; + width: 100%; + background-color: $color-bg; + padding: 20rpx; + box-sizing: border-box; + border-radius: 10rpx; + } + } + + } + + } +} + +.coupon-popup { + height: 65vh; + + .popup-body { + background: #fff; + } + .coupon-empty{ + display: flex; + align-items: center; + justify-content: center; + height: 100%; + color: #909399 !important; + } + .coupon-item { + @include wrap; + margin: $margin-updown 32rpx 0; + padding: 0; + position: relative; + background-color: #fff2f0; + &:before, + &:after { + position: absolute; + content: ''; + background-color: #fff; + top: 50%; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + &:before { + left: 0; + transform: translate(-50%, -50%); + } + &:after { + right: 0; + transform: translate(50%, -50%); + } + + .coupon-info { + height: 190rpx; + display: flex; + width: 100%; + position: relative; + + .info-wrap { + width: 220rpx; + height: 190rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + background-repeat: no-repeat; + background-size: 100% 100%; + position: relative; + background: linear-gradient(to left, var(--bg-color), var(--bg-color-shallow)); + .coupon-line{ + position: absolute; + right: 0; + top: 0; + height: 100%; + } + .coupon-money { + color: #fff; + text-align: center; + line-height: 1; + .unit { + font-size: 30rpx; + } + .money { + font-size: 60rpx; + } + } + .at-least { + font-size: $font-size-tag; + color: #fff; + text-align: center; + margin-top: 20rpx; + } + } + + .desc-wrap { + flex: 1; + max-width: calc(100% - 360rpx); + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .coupon-name { + margin-top: 10rpx; + margin-bottom: 4rpx; + font-size: $font-size-base; + } + .limit { + font-size: $font-size-activity-tag; + } + .time { + border-top: 2rpx dashed $color-disabled; + position: absolute; + bottom: 30rpx; + color: $color-tip; + padding-top: 10rpx; + line-height: 1.5; + font-size: $font-size-activity-tag; + } + } + + .iconfont { + font-size: 44rpx; + position: absolute; + top: 50%; + right: 20rpx; + transform: translate(-50%, -50%); + } + .icon-yuan_checkbox { + color: $color-tip; + } + } + } +} + +.promotion-popup { + height: 40vh; + + .order-cell { + margin: 30rpx 30rpx; + + .tit { + width: auto; + min-width: unset; + } + + .promotion-mark { + padding: 4rpx 10rpx; + line-height: 1; + border-radius: $border-radius; + font-size: $font-size-tag; + margin-right: 10rpx; + color: var(--main-color); + background-color: var(--main-color-shallow); + } + } +} + +.delivery-popup { + height: 80vh; + box-sizing: border-box; + + .delivery-content { + height: 100%; + overflow-y: scroll; + padding: 30rpx 0; + box-sizing: border-box; + + .item-wrap { + padding: 20rpx 0; + box-sizing: border-box; + border-top: 2rpx solid $color-line; + display: flex; + justify-content: space-between; + align-items: center; + margin: 0 48rpx; + .detail { + width: 90%; + .name { + display: flex; + text { + font-size: $font-size-base; + } + } + .info { + line-height: 1.2; + view { + font-size: $font-size-tag; + } + } + } + + .icon { + flex: 1; + text-align: right; + max-height: 50rpx; + .iconfont { + line-height: 1; + font-size: 44rpx; + } + } + + &:first-of-type { + padding-top: 0; + border-top: none; + } + } + .empty { + text-align: center; + font-size: $font-size-tag; + } + } +} + +.balance-switch { + transform: scale(0.8); +} + +// 收货地址 +.address-box { + margin: 0 24rpx 0; + background-color: #fff; + position: relative; + overflow: hidden; + border-bottom-left-radius: 16rpx; + border-bottom-right-radius: 16rpx; + padding: 30rpx 24rpx; + + &.not-delivery-type { + border-radius: 16rpx; + } + + .address-line{ + position: absolute; + bottom: 0rpx; + left: 0; + width: 100%; + height: 6rpx; + } + .info-wrap { + display: flex; + align-items: center; + + &.local { + padding-bottom: 20rpx; + } + .content { + flex: 1; + .name { + margin-right: 10rpx; + font-weight: bold; + font-size: 28rpx; + } + .mobile { + font-weight: bold; + font-size: 28rpx; + } + } + .desc-wrap { + word-break: break-word; + font-size: 26rpx; + color: #666; + } + } + .icon-wrap { + width: 24rpx; + height: 42rpx; + position: relative; + margin-right: 26rpx; + align-self: flex-start; + padding-top: 6rpx; + &.empty{ + padding-top: 0; + } + .iconfont { + font-size: $font-size-toolbar; + display: inline-block; + vertical-align: middle; + } + } + .empty-wrap { + height: 80rpx; + line-height: 80rpx; + display: flex; + align-items: center; + + .info { + flex: 1; + font-size: $font-size-base; + } + } + .cell-more { + margin-left: 50rpx; + float: right; + color: $color-tip; + font-size: $font-size-tag; + .iconfont{ + color: $color-tip; + } + } + .local-delivery-store { + display: flex; + align-items: center; + padding-bottom: 20rpx; + margin-bottom: 20rpx; + border-bottom: 2rpx solid #eeeeee; + + .info { + flex: 1; + width: 0; + font-size: 28rpx; + } + .store-name { + color: $base-color; + margin: 0 10rpx; + } + .cell-more { + font-size: 28rpx; + display: flex; + align-items: center; + } + .icon-right { + float: right; + color: #909399; + font-size: 24rpx + } + } +} + +// 外卖配送 +.local-box { + border-top: 2rpx solid $color-line; + .order-cell { + padding-top: 30rpx; + margin-bottom: 0; + + .box { + padding: 0; + } + } + .pick-block { + padding-top: 20rpx; + display: flex; + align-items: center; + + > view { + flex: 1; + } + .title { + font-weight: bold; + } + + .time-picker { + display: flex; + align-items: center; + justify-content: flex-end; + .cell-more { + float: right; + margin-left: 10rpx; + color: $color-tip; + font-size: $font-size-tag; + .iconfont{ + color: $color-tip; + } + } + text { + white-space: nowrap; + } + } + } +} + +// 配送方式 +.delivery-mode { + margin: 0 24rpx; + overflow: hidden; + border-top-left-radius: 16rpx; + border-top-right-radius: 16rpx; + background-color: $base-color; + + .action { + display: flex; + background: var(--base-color-light-7); + + > view { + flex: 1; + text-align: center; + height: 76rpx; + line-height: 76rpx; + font-size: 30rpx; + color: #000; + position: relative; + + &:nth-child(2), &:nth-child(3) { + &.active { + border-top-left-radius: 16rpx; + } + } + + .out-radio:after,.out-radio:before { + position: absolute; + content: ""; + width: 20rpx; + height: 20rpx; + background-color: #fff; + bottom: 0px; + display: none; + } + + .out-radio:after { + transform: translateX(100%); + right: 0; + } + .out-radio:before { + left: 0; + transform: translateX(-100%); + } + } + + .active { + background: #fff; + color: $base-color; + border-top-right-radius: 16rpx; + + &:after, &:before { + position: absolute; + content: ""; + width: 40rpx; + height: 40rpx; + background-color: var(--base-color-light-7); + bottom: 0px; + transform: translateX(100%); + border-radius: 50%; + z-index: 5; + } + &:after{ + transform: translateX(100%); + right: 0; + } + &:before { + left: 0; + transform: translateX(-100%); + } + .out-radio:after,.out-radio:before { + display: block; + } + } + } +} + +// 门店自提 +.store-box { + position: relative; + padding: 30rpx 24rpx; + margin: 0 24rpx 0; + background-color: #fff; + border-bottom-left-radius: 16rpx; + border-bottom-right-radius: 16rpx; + overflow: hidden; + + &.not-delivery-type { + border-radius: 16rpx; + } + + .address-line{ + position: absolute; + bottom: 0px; + left: 0; + width: 100%; + height: 6rpx; + } + .store-info { + display: flex; + align-items: baseline; + .icon { + position: relative; + margin-right: 12rpx; + align-self: flex-start; + margin-top: -2rpx; + &.img { + background-color: unset; + margin-right: 8rpx; + width: 46rpx; + height: 46rpx; + border-radius: 50%; + margin-top: 12rpx; + image { + width: 100%; + height: 100%; + } + } + .iconfont { + font-size: $font-size-toolbar; + } + } + .store-address-info{ + width: 100%; + display: flex; + align-items: center; + .info-wrap { + flex: 1; + width: 0; + .title { + margin-bottom: 10rpx; + font-size: $font-size-base; + font-weight: bold; + .cell-more { + float: right; + margin-left: 50rpx; + color: $color-tip; + font-size: 24rpx; + font-weight: 500; + } + } + .store-detail view { + word-break: break-word; + font-size: 26rpx; + } + .store-detail{ + .address{ + color: $color-sub; + width: 100%; + overflow:hidden; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow:ellipsis; + } + } + } + .cell-more{ + color: $color-tip; + } + } + + } + + .empty { + text-align: center; + } + .store-time{ + border-top:2rpx solid #F4F4F6; + display: flex; + align-items: center; + justify-content: space-between; + padding: 20rpx 0 0; + box-sizing: border-box; + view{ + font-size: 28rpx; + } + .left { + font-weight: bold; + } + .right{ + display: flex; + align-items: center; + line-height: 1; + font-size: 24rpx; + .iconfont{ + font-size: 24rpx; + margin-left: 14rpx; + color: #909399; + } + } + } +} + +.buyer-message { + padding: 30rpx 24rpx; + + .order-cell { + margin-bottom: 0; + } +} + +.member-card-wrap { + background-color: #FFFBF4; + padding: 0 30rpx!important; + + .head { + display: flex; + align-items: center; + height: 80rpx; + } + + .icon-yuan_checked,.icon-yuan_checkbox { + font-size: 32rpx; + } + + .icon-huiyuan { + margin-right: 10rpx; + line-height: 1; + font-size: 36rpx; + background-image:linear-gradient(156deg, #814635 0%, #3A221B 100%); + -webkit-background-clip:text; + -webkit-text-fill-color:transparent; + } + + .info{ + text-align: left; + flex: 1; + color: #e5ce75; + font-size: $font-size-tag; + color: #333; + } + + .body { + display: flex; + overflow-x: scroll; + padding: 10rpx 0 20rpx 0; + + .item { + padding: 20rpx 0 30rpx 0; + width: calc((100% - 60rpx) / 4); + text-align: center; + background: #fff; + margin-right: 20rpx; + border: 4rpx solid #fff; + border-radius: 10rpx; + position: relative; + overflow: hidden; + + .icon-icon { + position: absolute; + right: 0; + bottom: 0; + font-size: 32rpx; + display: none; + line-height: 1; + } + &:last-child{ + margin-right: 0; + } + + .title { + margin-top: 20rpx; + font-weight: bold; + } + + .price { + margin-top: 10rpx; + } + } + + .active .icon-icon { + display: block; + } + } +} + +.system-form-wrap { + @include wrap; + padding: 0; + overflow: hidden; + + .order-cell { + padding: 30rpx 24rpx; + margin-bottom: 0; + border-bottom: 2rpx solid #F4F4F6; + } + + /deep/ .form-wrap { + margin: 0 24rpx; + + .icon-right { + color: #909399; + font-size: 24rpx; + } + } +} + +.agreement { + margin: 20rpx $margin-both 0; + + text { + color: $base-color; + } +} + +.agreement-conten-box { + background: #fff; + padding:30rpx 30rpx; + + .title { + text-align: center; + margin-bottom: 20rpx; + font-weight: bolder; + } + .close { + position: absolute; + right: 30rpx; + top: 10rpx; + } + .con { + height: 60vh; + } +} +.icon{ + line-height: 1; + margin-right: 14rpx; + max-height: 50rpx; +} +.icon image{ + width: 38rpx; + margin: -6rpx auto; + max-height: 50rpx; +} + +.form-popup { + height: 60vh!important; + .popup-body { + padding: 20rpx 30rpx; + box-sizing: border-box; + } +} + +.member-card-popup { + height: 60vh; + + .popup-body { + .card-item { + display: flex; + padding: 30rpx; + background: var(--base-color-light-9); + margin: 24rpx 20rpx; + border-radius: 18rpx; + + .content { + flex: 1; + width: 0; + margin-right: 30rpx; + + .title { + line-height: 40rpx; + font-size: 28rpx; + font-weight: 600; + } + + .info text { + line-height: 1; + font-size: 24rpx; + color: #666666; + margin-top: 20rpx; + margin-right: 8rpx; + display: inline-block; + } + } + + .iconfont { + font-size: 44rpx; + } + .icon-yuan_checkbox { + color: $color-tip; + } + } + } +} \ No newline at end of file diff --git a/common/js/auth.js b/common/js/auth.js new file mode 100644 index 0000000..b73f8d6 --- /dev/null +++ b/common/js/auth.js @@ -0,0 +1,103 @@ +export default { + data() { + return { + authInfo: {} + } + }, + methods: { + /** + * 获取用户登录凭证code + */ + getCode(callback) { + // 微信小程序 + // #ifdef MP-WEIXIN + uni.login({ + provider: 'weixin', + timeout: 3000, + success: res => { + if (res.code) { + this.$api.sendRequest({ + url: '/weapp/api/weapp/authcodetoopenid', + data: { + code: res.code + }, + success: res => { + if (res.code >= 0) { + if (res.data.openid) this.authInfo.weapp_openid = res.data + .openid; + if (res.data.unionid) this.authInfo.wx_unionid = res.data + .unionid; + typeof callback == 'function' && callback(this.authInfo); + } else { + this.$util.showToast({ + title: res.message ? res.message : '小程序配置错误' + }); + } + } + }) + } + }, + fail: (res) => { + // #ifdef MP-WEIXIN + let scene = wx.getLaunchOptionsSync().scene; + if ([1154, 1155].indexOf(scene) == -1) { + this.$util.showToast({ + title: res.errMsg + }); + } + // #endif + } + }) + // #endif + + // #ifdef MP-ALIPAY + uni.login({ + timeout: 3000, + success: res => { + if (res.code) { + this.$api.sendRequest({ + url: '/aliapp/api/aliapp/authcodetouserid', + data: { + code: res.code + }, + success: res => { + if (res.code >= 0) { + if (res.data.user_id) this.authInfo.ali_openid = res.data + .user_id; + typeof callback == 'function' && callback(this.authInfo); + } else { + this.$util.showToast({ + title: res.message ? res.message : '小程序配置错误' + }); + } + } + }) + } + }, + fail: (err) => { + this.$util.showToast({ + title: res.errMsg + }); + } + }) + // #endif + + // #ifdef H5 + if (this.$util.isWeiXin()) { + this.$api.sendRequest({ + url: '/wechat/api/wechat/authcode', + data: { + redirect_url: location.href, + scopes: 'snsapi_userinfo' + }, + success: res => { + if (res.code >= 0) { + location.href = res.data; + } + } + }); + } + // #endif + } + } +} \ No newline at end of file diff --git a/common/js/config.js b/common/js/config.js new file mode 100644 index 0000000..1072062 --- /dev/null +++ b/common/js/config.js @@ -0,0 +1,50 @@ +var config = { + + // baseUrl: site.baseUrl, + // imgDomain: site.baseUrl, + // h5Domain: site.baseUrl, + + //api请求地址 + baseUrl: 'https://xcx30.5g-quickapp.com/', + + // 图片域名 + imgDomain: 'https://xcx30.5g-quickapp.com/', + + // H5端域名 + h5Domain: 'https://xcx30.5g-quickapp.com/', + + // // api请求地址 + // baseUrl: 'https://tsaas.liveplatform.cn/', + + // // 图片域名 + // imgDomain: 'https://tsaas.liveplatform.cn/', + + // // H5端域名 + // h5Domain: 'https://tsaas.liveplatform.cn/', + + // api请求地址 + // baseUrl: 'http://saas.cn/', + + // // 图片域名 + // imgDomain: 'http://saas.cn/', + + // // H5端域名 + // h5Domain: 'http://saas.cn/', + + + // 腾讯地图key + mpKey: 'TUHBZ-CNWKU-UHAVP-GZQ26-HNZFO-3YBF4', + + //客服地址 + webSocket: '{{$webSocket}}', + + //本地端主动给服务器ping的时间, 0 则不开启 , 单位秒 + pingInterval: 1500, + uniacid:305,//825 + // uniacid:site.uniacid,//825 + // 版本号 + version: '1.0' + +}; + +export default config; \ No newline at end of file diff --git a/common/js/diy.js b/common/js/diy.js new file mode 100644 index 0000000..f30445f --- /dev/null +++ b/common/js/diy.js @@ -0,0 +1,611 @@ +import WxMap from 'common/js/map-wx-jssdk.js'; +import Config from '@/common/js/config.js'; + +let systemInfo = uni.getSystemInfoSync(); +export default { + data() { + return { + diyData: { + global: { + title: '', + popWindow: { + imageUrl: '', + count: -1, + link: {}, + imgWidth: '', + imgHeight: '' + } + } + }, + id: 0, + name: '', + + topIndexValue: null, + statusBarHeight: systemInfo.statusBarHeight, + collectTop: 44, + showTip: false, + mpCollect: false, + mpShareData: null, //小程序分享数据 + scrollTop: 0, // 滚动位置 + paddingTop: (44 + systemInfo.statusBarHeight) + 'px', + marginTop: -(44 + systemInfo.statusBarHeight) + 'px', + followOfficialAccount: null, // 关注公众号组件 + + latitude: null, // 纬度 + longitude: null, // 经度 + currentPosition: '', // 当前位置 + nearestStore: null, // 离自己最近的门店 + + storeTimeOut: null, // 没有获取到定位,则获取默认门店 + locationModule: '', // 模式,locationPicker H5选择地图 + + diyRoute: '', // 页面路由 + openBottomNav: false, + isShowCopyRight: false, + + //启动广告 + adv:{}, + + }; + }, + onLoad(option) { + uni.hideTabBar(); + + if (option.source_member) uni.setStorageSync('source_member', option.source_member); + + // 小程序扫码进入 + if (option.scene) { + var sceneParams = decodeURIComponent(option.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + }); + } + } + + // #ifdef H5 + // H5地图选择位置回调数据 + if (option.module && option.module == 'locationPicker') { + option.name = ''; // 清空地址 + this.locationModule = option.module; + this.latitude = option.latng.split(',')[0]; + this.longitude = option.latng.split(',')[1]; + } + // #endif + + this.id = option.id || 0; + this.name = option.name || ''; + + uni.removeStorageSync('manual_store_info'); // 清除手动切换门店缓存 + uni.removeStorageSync('manual_change_store'); // 清楚手动切换门店标识 + + // H5才会执行 + if (this.locationModule == 'locationPicker') { + + // H5地图选址后的回调 + this.getNearestStore(); + this.getCurrentLocation(); + + } else if (this.mapConfig.wap_is_open == 1) { + + // 每次都要定位,获取当前位置 + /*this.$util.getLocation({ + fail: (res) => { + // 拒绝定位,进入默认总店 + this.enterDefaultStore(); + } + });*/ + + // 如果3秒没有获取到定位,则获取默认门店,H5使用 + // #ifdef H5 + this.storeTimeOut = setTimeout(() => { + this.enterDefaultStore(); + }, 1000 * 3); + // #endif + + } else { + // 关闭定位 + this.enterDefaultStore(); + } + + }, + onShow() { + + this.init(); + }, + onHide() { + if (this.storeTimeOut) { + clearTimeout(this.storeTimeOut); + } + + // 跳转页面要关闭门店弹出框 + this.closeChooseStorePopup(); + + // 清除限时秒杀定时器 + this.$store.commit('setDiySeckillInterval', 0); + }, + computed: { + bgColor() { + let str = ''; + if (this.diyData && this.diyData.global) { + str = this.diyData.global.pageBgColor; + } + return str; + }, + bgImg() { + let str = ''; + if (this.diyData && this.diyData.global) { + str = this.diyData.global.topNavBg ? 'url(' + this.$util.img(this.diyData.global.bgUrl) + ')' : this.diyData.global.pageBgColor; + } + return str; + }, + bgUrl() { + let str = ''; + if (this.diyData && this.diyData.global) { + str = this.diyData.global.topNavBg ? 'transparent' : this.diyData.global.bgUrl; + } + return str; + }, + backgroundUrl() { + var str = this.diyData.global.bgUrl && this.diyData.global.bgUrl != 'transparent' ? 'url(' + this.$util.img(this.diyData.global.bgUrl) + ') ' : ''; + return str; + }, + textNavColor() { + if (this.diyData && this.diyData.global && this.diyData.global.textNavColor) { + return this.diyData.global.textNavColor; + } else { + return '#ffffff'; + } + }, + //计算首页弹框的显示宽高 + popWindowStyle() { + // 做大展示宽高 + let max_width = 290; + let max_height = 410; + // 参照宽高 + let refer_width = 290; + let refer_height = 290; + + let scale = this.diyData.global.popWindow.imgHeight / this.diyData.global.popWindow.imgWidth; + let width, height; + if (scale < refer_height / refer_width) { + width = max_width; + height = width * scale; + } else { + height = max_height; + width = height / scale; + } + + let obj = ''; + if (this.diyData.global.popWindow && this.diyData.global.popWindow.count != -1 && this.diyData.global.popWindow.imageUrl) { + obj += 'height:' + (height * 2) + 'rpx;'; + obj += 'width:' + (width * 2) + 'rpx;'; + } + return obj; + } + }, + watch: { + location: function (nVal) { + if (nVal) { + this.latitude = nVal.latitude; + this.longitude = nVal.longitude; + this.getNearestStore(); + this.getCurrentLocation(); + } + } + }, + methods: { + play(){ + console.log(123) + }, + async init() { + + // 定位信息过期后,重新获取定位 + if(this.mapConfig.wap_is_open == 1 && this.locationStorage && this.locationStorage.is_expired) { + this.$util.getLocation({ + fail: (res) => { + // 拒绝定位,进入默认总店 + this.enterDefaultStore(); + } + }); + } + + if (this.storeToken) { + //记录分享关系 + if (uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + } + + await this.getDiyInfo(); + //获取启动广告 + await this.getDiyAdv(); + + this.$store.commit('setDiySeckillInterval', 1); + + //小程序分享 + // #ifdef MP-WEIXIN + this.$util.getMpShare().then(res => { + this.mpShareData = res; + }); + // #endif + + let manualChangeStore = uni.getStorageSync('manual_change_store'); // 手动切换门店 + if (manualChangeStore) { + uni.removeStorageSync('manual_change_store'); + + // 滚动至顶部 + uni.pageScrollTo({ + duration: 200, + scrollTop: 0 + }); + } + }, + callback() { + if (this.$refs.indexPage) { + this.$refs.indexPage.initPageIndex(); + } + }, + //计算高度 + getHeight() { + // #ifdef H5 + if (this.diyData && this.diyData.global && this.diyData.global.navBarSwitch) { + // H5端,导航栏样式1 2 3不显示,要减去高度 + if ([1, 2, 3].indexOf(parseInt(this.diyData.global.navStyle)) != -1) { + this.paddingTop = 0; + this.marginTop = 0; + } + } + // #endif + + // #ifdef MP || APP-PLUS + let time = setInterval(() => { + this.$nextTick(() => { + const query = uni.createSelectorQuery().in(this); + query.select('.page-header').boundingClientRect(data => { + if (data && data.height) { + // 从状态栏高度开始算 + this.paddingTop = data.height + 'px'; + this.marginTop = -data.height + 'px'; + clearInterval(time); + } + }).exec(); + }); + }, 50); + // #endif + }, + async getDiyAdv(){ + //启动广告 + let res = await this.$api.sendRequest({ + url: '/api/diyview/getstartadv', + data: {}, + async: false + }); + this.adv = res.value + // 弹框形式,首次弹出 1,每次弹出 0 + if(this.adv.advshow == 1){ + setTimeout(() => { + if (res.value.advtype == 1) { + var popwindow_count = uni.getStorageSync(this.id + this.name + '_popwindow_count'); + if ((this.$refs.uniPopupWindow && popwindow_count == '') || ( + this.$refs.uniPopupWindow && popwindow_count == 1)) { + + this.$refs.uniPopupWindow.open(); + uni.setStorageSync(this.id + this.name + '_popwindow_count', 1); + } + } else if (res.value.advtype == 0) { + this.$refs.uniPopupWindow.open(); + uni.setStorageSync(this.id + this.name + '_popwindow_count', 0); + } + }, 500); + } + + }, + async getDiyInfo() { + let res = await this.$api.sendRequest({ + url: '/api/diyview/info', + data: { + id: this.id, + name: this.name, + en_type:uni.getStorageSync("lang"),//获取语言底部 + }, + async: false + }); + if (res.code != 0 || !res.data) { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + + if (res.code == -3) { + this.$util.showToast({ + title: res.message + }); + this.diyData = {}; + return; + } + + this.$util.showToast({ + title: '未配置自定义页面数据' + }); + this.diyData = {}; + return; + } + + let diyDataValue = res.data; + if (diyDataValue.value) { + this.diyData = JSON.parse(diyDataValue.value); + this.$langConfig.title(this.diyData.global.title); + this.mpCollect = this.diyData.global.mpCollect; + this.setPublicShare(); + /* if (this.diyData.global.popWindow && this.diyData.global.popWindow.imageUrl) { + // 弹框形式,首次弹出 1,每次弹出 0 + setTimeout(() => { + if (this.diyData.global.popWindow.count == 1) { + var popwindow_count = uni.getStorageSync(this.id + this.name + '_popwindow_count'); + if ((this.$refs.uniPopupWindow && popwindow_count == '') || ( + this.$refs.uniPopupWindow && popwindow_count == 1)) { + this.$refs.uniPopupWindow.open(); + uni.setStorageSync(this.id + this.name + '_popwindow_count', 1); + } + } else if (this.diyData.global.popWindow.count == 0) { + this.$refs.uniPopupWindow.open(); + uni.setStorageSync(this.id + this.name + '_popwindow_count', 0); + } + }, 500); + }*/ + + // 修改diy数据结构排序 + let searchIndex = -1; + let topCategoryIndex = -1; + this.diyData.value.forEach((item, index) => { + if (item.componentName == 'Search') { + if (item.positionWay == 'fixed') { + searchIndex = index; + } + } + if (item.componentName == 'TopCategory') { + topCategoryIndex = index; + } + }) + if (searchIndex != -1 && topCategoryIndex != -1) { + let searchData = this.diyData.value.slice(searchIndex, searchIndex + 1); + let topCategoryData = this.diyData.value.slice(topCategoryIndex, topCategoryIndex + 1); + this.diyData.value.splice(searchIndex, 1); + if (searchIndex > topCategoryIndex) { + this.diyData.value.splice(topCategoryIndex, 1); + this.diyData.value.splice(0, 0, ...topCategoryData); + this.diyData.value.splice(1, 0, ...searchData); + } else + this.diyData.value.splice(0, 0, ...searchData); + } else if (searchIndex != -1 && topCategoryIndex == -1) { + let searchData = this.diyData.value.slice(searchIndex, searchIndex + 1); + this.diyData.value.splice(searchIndex, 1); + this.diyData.value.splice(0, 0, ...searchData); + } + + for (var i = 0; i < this.diyData.value.length; i++) { + // 分类导航组件 + if (this.diyData.value[i].componentName == 'TopCategory') { + this.topIndexValue = this.diyData.value[i]; + this.topIndexValue.moduleIndex = i; //设置定位索引,根据此来确定定位顺序 + this.diyData.value.splice(i, 1); + continue; + } + + // 关注公众号组件 + if (this.diyData.value[i].componentName == 'FollowOfficialAccount') { + this.followOfficialAccount = this.diyData.value[i]; + // #ifdef H5 + this.diyData.value.splice(i, 1); + // #endif + continue; + } + + } + + // #ifdef MP + //小程序收藏 + if (!uni.getStorageSync('isCollect') && this.diyData.global.mpCollect) { + this.$refs.collectPopupWindow.open(); + this.showTip = true; + } + // #endif + + this.getHeight(); + if (this.diyData && this.diyData.global) { + this.openBottomNav = this.diyData.global.openBottomNav; + } + this.isShowCopyRight = true; + } + }, + closePopupWindow() { + this.$refs.uniPopupWindow.close(); + uni.setStorageSync(this.id + this.name + '_popwindow_count', -1); + }, + closeCollectPopupWindow() { + this.$refs.collectPopupWindow.close(); + uni.setStorageSync('isCollect', true); + }, + uniPopupWindowFn() { + this.$util.diyRedirectTo(this.diyData.global.popWindow.link); + this.closePopupWindow(); + }, + openChooseStorePopup() { + if (this.globalStoreConfig && this.globalStoreConfig.confirm_popup_control == 1) { + let storeInfo = this.globalStoreInfo; + + // 首次进入门店,没有门店信息 || 当前位置的门店和缓存门店不一致要弹框 + if (!storeInfo || storeInfo && this.nearestStore && storeInfo.store_id != this.nearestStore.store_id) { + if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.open(); + } + } + + let manualStoreInfo = uni.getStorageSync('manual_store_info'); // 手动选择门店 + if (manualStoreInfo) { + this.nearestStore = manualStoreInfo; + } + this.changeStore(this.nearestStore); // 切换门店数据 + }, + closeChooseStorePopup() { + if (this.$refs.chooseStorePopup) this.$refs.chooseStorePopup.close(); + }, + // 确认进入门店 + enterStore() { + this.closeChooseStorePopup(); + }, + // 选择其他门店 + chooseOtherStore() { + this.$util.redirectTo('/pages_tool/store/list'); + this.closeChooseStorePopup(); + }, + // 打开地图重新选择位置 + reposition() { + // #ifdef MP + /*uni.chooseLocation({ + success: res => { + this.latitude = res.latitude; + this.longitude = res.longitude; + this.currentPosition = res.name; + this.getNearestStore(); + this.getCurrentLocation(); + }, + fail(res) { + uni.getSetting({ + success: function (res) { + var statu = res.authSetting; + if (!statu['scope.userLocation']) { + uni.showModal({ + title: '是否授权当前位置', + content: '需要获取您的地理位置,请确认授权,否则地图功能将无法使用', + success(tip) { + if (tip.confirm) { + uni.openSetting({ + success: function (data) { + if (data.authSetting['scope.userLocation'] === true) { + this.$util.showToast({ + title: '授权成功' + }); + //授权成功之后,再调用chooseLocation选择地方 + setTimeout(function () { + uni.chooseLocation({ + success: data => { + this.latitude = res.latitude; + this.longitude = res.longitude; + this.currentPosition = res.name; + this.getNearestStore(); + this.getCurrentLocation(); + } + }); + }, 1000); + } + } + }); + } else { + this.$util.showToast({ + title: '授权失败' + }); + } + } + }); + } + } + }); + } + });*/ + // #endif + + // #ifdef H5 + let backurl = Config.h5Domain; // 地图选择位置后的回调页面路径 + window.location.href = 'https://apis.map.qq.com/tools/locpicker?search=1&type=0&backurl=' + + encodeURIComponent(backurl) + '&key=' + Config.mpKey + '&referer=myapp'; + // #endif + }, + // 获取离自己最近的一个门店 + getNearestStore() { + let data = {}; + if (this.latitude && this.longitude) { + data.latitude = this.latitude; + data.longitude = this.longitude; + } + this.$api.sendRequest({ + url: '/api/store/nearestStore', + data: data, + success: res => { + if (res.code == 0 && res.data) { + this.nearestStore = res.data; + this.nearestStore.show_address = this.nearestStore.full_address.replace(/,/g, ' ') + ' ' + this.nearestStore.address; + this.openChooseStorePopup(); + } + } + }); + }, + // 根据经纬度获取位置 + getCurrentLocation() { + var _this = this; + let data = {}; + if (this.latitude && this.longitude) { + data.latitude = this.latitude; + data.longitude = this.longitude; + } + + this.$api.sendRequest({ + url: '/api/store/getLocation', + data: data, + success: res => { + if (res.code == 0 && res.data) { + this.currentPosition = res.data.formatted_addresses.recommend; // 结合知名地点形成的描述性地址,更具人性化特点 + } else { + this.currentPosition = '未获取到定位'; + } + } + }); + }, + // 定位失败,进入默认门店 + enterDefaultStore() { + if (this.defaultStoreInfo) { + if (!this.nearestStore) { + this.nearestStore = this.defaultStoreInfo; + this.nearestStore.show_address = this.nearestStore.full_address.replace(/,/g, ' ') + ' ' + this.nearestStore.address; + } + if (this.currentPosition == '') this.currentPosition = '未获取到定位'; + this.openChooseStorePopup(); + } + }, + // 设置公众号分享 + setPublicShare() { + let shareUrl = this.$config.h5Domain + this.diyRoute; + if (this.id) shareUrl += '?id=' + this.id; + else if (this.name) shareUrl += '?name=' + this.name; + this.$util.setPublicShare({ + title: this.diyData.global.title, + desc: '', + link: shareUrl, + imgUrl: this.siteInfo ? this.$util.img(this.siteInfo.logo_square) : '' + }); + } + }, + onPageScroll(e) { + this.scrollTop = e.scrollTop; + if (this.$refs.topNav) { + if (e.scrollTop >= 20) { + this.$refs.topNav.navTopBg(); + } else { + this.$refs.topNav.unSetnavTopBg(); + } + } + }, + // 下拉刷新 + onPullDownRefresh() { + this.$store.commit('setComponentRefresh'); + setTimeout(() => { + uni.stopPullDownRefresh(); + }, 50); + }, + // 分享给好友 + onShareAppMessage() { + return this.mpShareData.appMessage; + }, + // 分享到朋友圈 + onShareTimeline() { + return this.mpShareData.timeLine; + } +} \ No newline at end of file diff --git a/common/js/emjoy.js b/common/js/emjoy.js new file mode 100644 index 0000000..c0116e6 --- /dev/null +++ b/common/js/emjoy.js @@ -0,0 +1,55 @@ +export default { + emjoyList: { + "[emjoy_01]": 'public/static/img/emjoy/emjoy_01.gif', + "[emjoy_02]": 'public/static/img/emjoy/emjoy_02.gif', + "[emjoy_03]": 'public/static/img/emjoy/emjoy_03.gif', + "[emjoy_04]": 'public/static/img/emjoy/emjoy_04.gif', + "[emjoy_05]": 'public/static/img/emjoy/emjoy_05.gif', + "[emjoy_06]": 'public/static/img/emjoy/emjoy_06.gif', + "[emjoy_07]": 'public/static/img/emjoy/emjoy_07.gif', + "[emjoy_08]": 'public/static/img/emjoy/emjoy_08.gif', + "[emjoy_09]": 'public/static/img/emjoy/emjoy_09.gif', + + "[emjoy_10]": 'public/static/img/emjoy/emjoy_10.gif', + "[emjoy_11]": 'public/static/img/emjoy/emjoy_11.gif', + "[emjoy_12]": 'public/static/img/emjoy/emjoy_12.gif', + "[emjoy_13]": 'public/static/img/emjoy/emjoy_13.gif', + "[emjoy_14]": 'public/static/img/emjoy/emjoy_14.gif', + "[emjoy_15]": 'public/static/img/emjoy/emjoy_15.gif', + "[emjoy_16]": 'public/static/img/emjoy/emjoy_16.gif', + "[emjoy_17]": 'public/static/img/emjoy/emjoy_17.gif', + "[emjoy_18]": 'public/static/img/emjoy/emjoy_18.gif', + "[emjoy_19]": 'public/static/img/emjoy/emjoy_19.gif', + + "[emjoy_20]": 'public/static/img/emjoy/emjoy_20.gif', + "[emjoy_21]": 'public/static/img/emjoy/emjoy_21.gif', + "[emjoy_22]": 'public/static/img/emjoy/emjoy_22.gif', + "[emjoy_23]": 'public/static/img/emjoy/emjoy_23.gif', + "[emjoy_24]": 'public/static/img/emjoy/emjoy_24.gif', + "[emjoy_25]": 'public/static/img/emjoy/emjoy_25.gif', + "[emjoy_26]": 'public/static/img/emjoy/emjoy_26.gif', + "[emjoy_27]": 'public/static/img/emjoy/emjoy_27.gif', + "[emjoy_28]": 'public/static/img/emjoy/emjoy_28.gif', + "[emjoy_29]": 'public/static/img/emjoy/emjoy_29.gif', + + "[emjoy_30]": 'public/static/img/emjoy/emjoy_30.gif', + "[emjoy_31]": 'public/static/img/emjoy/emjoy_31.gif', + "[emjoy_32]": 'public/static/img/emjoy/emjoy_32.gif', + "[emjoy_33]": 'public/static/img/emjoy/emjoy_33.gif', + "[emjoy_34]": 'public/static/img/emjoy/emjoy_34.gif', + "[emjoy_35]": 'public/static/img/emjoy/emjoy_35.gif', + "[emjoy_36]": 'public/static/img/emjoy/emjoy_36.gif', + "[emjoy_37]": 'public/static/img/emjoy/emjoy_37.gif', + "[emjoy_38]": 'public/static/img/emjoy/emjoy_38.gif', + "[emjoy_39]": 'public/static/img/emjoy/emjoy_39.gif', + + "[emjoy_40]": 'public/static/img/emjoy/emjoy_40.gif', + "[emjoy_41]": 'public/static/img/emjoy/emjoy_41.gif', + "[emjoy_42]": 'public/static/img/emjoy/emjoy_42.gif', + "[emjoy_43]": 'public/static/img/emjoy/emjoy_43.gif', + "[emjoy_44]": 'public/static/img/emjoy/emjoy_44.gif', + "[emjoy_45]": 'public/static/img/emjoy/emjoy_45.gif', + "[emjoy_46]": 'public/static/img/emjoy/emjoy_46.gif', + "[emjoy_47]": 'public/static/img/emjoy/emjoy_47.gif', + } +} diff --git a/common/js/fenxiao-words.js b/common/js/fenxiao-words.js new file mode 100644 index 0000000..69bf003 --- /dev/null +++ b/common/js/fenxiao-words.js @@ -0,0 +1,24 @@ +export default { + data() { + return { + fenxiaoWords: {} + } + }, + methods: { + getFenxiaoWrods() { + this.$api.sendRequest({ + url: '/fenxiao/api/config/words', + success: res => { + if (res.code >= 0 && res.data) { + this.fenxiaoWords = res.data; + uni.setStorageSync('fenxiaoWords', res.data); + } + } + }) + } + }, + onShow() { + if (uni.getStorageSync('fenxiaoWords')) this.fenxiaoWords = uni.getStorageSync('fenxiaoWords'); + this.getFenxiaoWrods(); + } +} diff --git a/common/js/golbalConfig.js b/common/js/golbalConfig.js new file mode 100644 index 0000000..73f39c6 --- /dev/null +++ b/common/js/golbalConfig.js @@ -0,0 +1,186 @@ +export default { + data() { + return { + // 页面样式,动态设置主色调 + themeColor: '' //''--base-color:#fa5d14;--base-help-color:#ff7e00;' + } + }, + onLoad() {}, + onShow() { + // 刷新多语言 + this.$langConfig.refresh(); + let time = setInterval(() => { + let theme = this.themeStyle; + if (theme && theme.main_color) { + this.themeColorSet(); + clearInterval(time); + } + }, 50); + }, + computed: { + themeStyle() { + return this.$store.state.themeStyle; + }, + // 插件是否存在 + addonIsExist() { + return this.$store.state.addonIsExist; + }, + tabBarList() { + return this.$store.state.tabBarList; + }, + siteInfo() { + return this.$store.state.siteInfo; + }, + memberInfo() { + return this.$store.state.memberInfo; + }, + storeToken() { + return this.$store.state.token; + }, + bottomNavHidden() { + return this.$store.state.bottomNavHidden; + }, + globalStoreConfig() { + return this.$store.state.globalStoreConfig; + }, + globalStoreInfo() { + return this.$store.state.globalStoreInfo; + }, + // 定位信息 + location() { + return this.$store.state.location; + }, + // 定位信息(缓存) + locationStorage() { + let data = uni.getStorageSync('location'); + if (data) { + var date = new Date(); + if (this.mapConfig.wap_valid_time > 0) { + data.is_expired = (date.getTime() / 1000) > data.valid_time; // 是否过期 + } else { + data.is_expired = false; + } + } + return data; + }, + // 默认总店(定位失败后使用) + defaultStoreInfo() { + return this.$store.state.defaultStoreInfo; + }, + // 组件刷新计数 + componentRefresh() { + return this.$store.state.componentRefresh; + }, + // 客服配置 + servicerConfig() { + return this.$store.state.servicerConfig; + }, + diySeckillInterval() { + return this.$store.state.diySeckillInterval; + }, + tabBarHeight() { + return this.$store.state.tabBarHeight; + }, + mapConfig() { + return this.$store.state.mapConfig; + }, + copyright() { + let copyright = this.$store.state.copyright; + // 判断是否授权 + if (copyright && !copyright.auth) { + copyright.logo = ''; + copyright.copyright_link = ''; + } + return copyright; + }, + cartList() { + return this.$store.state.cartList; + }, + cartIds() { + return this.$store.state.cartIds; + }, + cartNumber() { + return this.$store.state.cartNumber; + }, + cartMoney() { + return this.$store.state.cartMoney; + } + }, + methods: { + themeColorSet() { + let theme = this.themeStyle; + this.themeColor = `--base-color:${theme.main_color};--base-help-color:${theme.aux_color};`; + if (this.tabBarHeight != '56px') this.themeColor += `--tab-bar-height:${this.tabBarHeight};` + Object.keys(theme).forEach(key => { + let data = theme[key]; + if (typeof(data) == "object") { + Object.keys(data).forEach(k => { + this.themeColor += '--' + k.replace(/_/g, "-") + ':' + data[k] + ';'; + }); + } else if (typeof(key) == "string" && key) { + this.themeColor += '--' + key.replace(/_/g, "-") + ':' + data + ';'; + } + }); + for (let i = 9; i >= 5; i--) { + let color = this.$util.colourBlend(theme.main_color, '#ffffff', (i / 10)); + this.themeColor += `--base-color-light-${i}:${color};`; + } + }, + // 颜色变浅(>0)、变深函数(<0) + lightenDarkenColor(color, amount) { + + var usePound = false; + + if (color[0] == "#") { + color = color.slice(1); + usePound = true; + } + + var num = parseInt(color, 16); + + var r = (num >> 16) + amount; + + if (r > 255) r = 255; + else if (r < 0) r = 0; + + var b = ((num >> 8) & 0x00FF) + amount; + + if (b > 255) b = 255; + else if (b < 0) b = 0; + + var g = (num & 0x0000FF) + amount; + + if (g > 255) g = 255; + else if (g < 0) g = 0; + + return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16); + + }, + /** + * 切换门店 + * @param {Object} info 门店信息 + * @param {Object} isJump 是否跳转到首页 + */ + changeStore(info, isJump) { + if (info) { + this.$store.commit('setGlobalStoreInfo', info); + } + let route = this.$util.getCurrRoute(); + if (isJump && route != 'pages/index/index') { + uni.setStorageSync('manual_change_store', true); // 手动切换门店 + this.$store.dispatch('getCartNumber'); //重新获取购物车数据 + this.$util.redirectTo('/pages/index/index'); + } + } + }, + filters: { + /** + * 金额格式化输出 + * @param {Object} money + */ + moneyFormat(money) { + if (isNaN(parseFloat(money))) return money; + return parseFloat(money).toFixed(2); + } + } +} \ No newline at end of file diff --git a/common/js/goods_detail_base.js b/common/js/goods_detail_base.js new file mode 100644 index 0000000..53ef66e --- /dev/null +++ b/common/js/goods_detail_base.js @@ -0,0 +1,371 @@ +// 商品详情业务 +import htmlParser from '@/common/js/html-parser'; + +export default { + data() { + return { + skuId: 0, + goodsId: 0, + // 商品详情 + goodsSkuDetail: { + goods_id: 0, + goods_service: [] + }, + preview: 0, //是否开启预览,0:不开启,1:开启 + //评价 + contactData: { + title: '', + path: '', + img: '' + }, + + shareQuery: '', // 分享参数 + shareUrl: '', // 分享链接 + + source_member: 0, //分享人的id + chatRoomParams: {}, // 联系客服参数 + isIphoneX: false, //判断手机是否是iphoneX以上 + whetherCollection: 0, + posterParams: {}, //海报所需参数 + shareImg: '', + navbarData: { + title: '', + topNavColor: "#ffffff", + topNavBg: false, + navBarSwitch: true, // 导航栏是否显示 + textNavColor: "#333333", + moreLink: { + name: "" + }, + navStyle: 1, + bgUrl: '', + textImgPosLink: 'left' + }, + } + }, + onLoad(data) { + //刷新多语言 + this.$langConfig.refresh(); + // #ifdef MP-ALIPAY + let options = my.getLaunchOptionsSync(); + options.query && Object.assign(data, options.query); + // #endif + + this.preview = data.preview || 0; + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + if (data.source_member) { + uni.setStorageSync('source_member', data.source_member); + this.source_member = data.source_member; + } + //记录分享关系 + if (this.storeToken && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1); + }); + } + } + }, + onShow() { + }, + methods: { + // 处理商品详情数据 + handleGoodsSkuData() { + // this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name; + //设置标题 + // this.$langConfig.title(this.navbarData.title); + if (this.goodsSkuDetail.config) { + this.navbarData.navBarSwitch = this.goodsSkuDetail.config.nav_bar_switch; + } + + this.whetherCollection = this.goodsSkuDetail.is_collect; // 用户关注商品状态 + + this.modifyGoodsInfo(); + + // 初始化商品详情视图数据 + if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({ + sku_id: this.skuId, + goods_id: this.goodsSkuDetail.goods_id, + preview: this.preview, + source_member: this.source_member, + posterParams: this.posterParams, + posterApi: this.posterApi, + shareUrl: this.shareUrl, + goodsRoute: this.goodsRoute, + isVirtual: this.goodsSkuDetail.is_virtual, + deliveryType: this.goodsSkuDetail.express_type, + whetherCollection: this.goodsSkuDetail.is_collect, + evaluateConfig: this.goodsSkuDetail.evaluate_config, + evaluateList: this.goodsSkuDetail.evaluate_list, + evaluateCount: this.goodsSkuDetail.evaluate_count + }); + + //媒体 + if (this.goodsSkuDetail.video_url) this.switchMedia = "video"; + + if (!Array.isArray(this.goodsSkuDetail.sku_images)) { + if (this.goodsSkuDetail.sku_images) this.goodsSkuDetail.sku_images = this.goodsSkuDetail.sku_images.split(","); + else this.goodsSkuDetail.sku_images = []; + } + + // 多规格时合并主图 + if (this.goodsSkuDetail.goods_spec_format && this.goodsSkuDetail.goods_image) { + + if (!Array.isArray(this.goodsSkuDetail.goods_image)) this.goodsSkuDetail.goods_image = this.goodsSkuDetail.goods_image.split(","); + + this.goodsSkuDetail.sku_images = this.goodsSkuDetail.goods_image.concat(this.goodsSkuDetail.sku_images); + } + + let maxHeight = ''; + let systemInfo = uni.getSystemInfoSync(); + this.goodsSkuDetail.goods_image_list.forEach((item, index) => { + if (typeof item.pic_spec == "string") + item.pic_spec = item.pic_spec.split('*'); + + let ratio = item.pic_spec[0] / systemInfo.windowWidth; + item.pic_spec[0] = item.pic_spec[0] / ratio; + item.pic_spec[1] = item.pic_spec[1] / ratio; + + if (!maxHeight || maxHeight > item.pic_spec[1]) { + maxHeight = item.pic_spec[1]; + } + }); + this.goodsSkuDetail.swiperHeight = maxHeight + 'px'; + + this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件"; + + // 当前商品SKU规格 + if (this.goodsSkuDetail.sku_spec_format) this.goodsSkuDetail.sku_spec_format = JSON.parse(this.goodsSkuDetail.sku_spec_format); + + // 商品属性 + if (this.goodsSkuDetail.goods_attr_format) { + let goods_attr_format = JSON.parse(this.goodsSkuDetail.goods_attr_format); + this.goodsSkuDetail.goods_attr_format = this.$util.unique(goods_attr_format, "attr_id"); + for (var i = 0; i < this.goodsSkuDetail.goods_attr_format.length; i++) { + for (var j = 0; j < goods_attr_format.length; j++) { + if (this.goodsSkuDetail.goods_attr_format[i].attr_id == goods_attr_format[j].attr_id && this.goodsSkuDetail.goods_attr_format[i].attr_value_id != goods_attr_format[j].attr_value_id) { + this.goodsSkuDetail.goods_attr_format[i].attr_value_name += "、" + goods_attr_format[j].attr_value_name; + } + } + } + } + + // 商品SKU格式 + if (this.goodsSkuDetail.goods_spec_format) this.goodsSkuDetail.goods_spec_format = JSON.parse(this.goodsSkuDetail.goods_spec_format); + + // 商品详情 + if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = (this.goodsSkuDetail.goods_content); + console.log(this.goodsSkuDetail.goods_content) + // if (this.goodsSkuDetail.goods_content) this.goodsSkuDetail.goods_content = htmlParser(this.goodsSkuDetail.goods_content); + + //商品服务 + if (this.goodsSkuDetail.goods_service) { + for (let i in this.goodsSkuDetail.goods_service) { + this.goodsSkuDetail.goods_service[i]['icon'] = this.goodsSkuDetail.goods_service[i]['icon'] ? JSON.parse(this.goodsSkuDetail.goods_service[i]['icon']) : ''; + } + } + + this.contactData = { + title: this.goodsSkuDetail.sku_name, + path: this.shareUrl, + img: this.$util.img(this.goodsSkuDetail.sku_image, { + size: 'big' + }) + }; + if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion); + + if (this.goodsRoute != '/pages/goods/detail') this.setPublicShare(); + + // this.getBarrageData(); + if (this.addonIsExist.form) { + this.getGoodsForm(); + } + }, + /** + * 刷新商品详情数据 + * @param {Object} data + */ + refreshGoodsSkuDetail(data) { + this.goodsSkuDetail = Object.assign({}, this.goodsSkuDetail, data); + if (this.$refs.goodsPromotion) this.$refs.goodsPromotion.refresh(this.goodsSkuDetail.goods_promotion); + if (this.$refs.goodsDetailView) { + + // 初始化商品详情视图数据 + this.goodsSkuDetail.unit = this.goodsSkuDetail.unit || "件"; + + // 解决轮播图数量不一致时,切换到第一个 + if (this.swiperCurrent > this.goodsSkuDetail.sku_images.length) { + this.swiperAutoplay = true; + this.swiperCurrent = 1; + setTimeout(() => { + this.swiperAutoplay = false; + }, 40); + } + + } + this.navbarData.title = this.goodsSkuDetail.goods_name.length > 9 ? this.goodsSkuDetail.goods_name.substr(0, 9) + "..." : this.goodsSkuDetail.goods_name; + this.$langConfig.title(this.navbarData.title); + + if (this.goodsSkuDetail.membercard) { + this.membercard = this.goodsSkuDetail.membercard; + } + }, + goodsDetailViewInit() { + // 初始化商品详情视图数据 + if (this.$refs.goodsDetailView) this.$refs.goodsDetailView.init({ + sku_id: this.skuId, + goods_id: this.goodsSkuDetail.goods_id, + preview: this.preview, + source_member: this.source_member, + posterParams: this.posterParams, + posterApi: this.posterApi, + shareUrl: this.shareUrl, + goodsRoute: this.goodsRoute, + isVirtual: this.goodsSkuDetail.is_virtual, + deliveryType: this.goodsSkuDetail.express_type, + whetherCollection: this.goodsSkuDetail.is_collect, + evaluateConfig: this.goodsSkuDetail.evaluate_config, + evaluateList: this.goodsSkuDetail.evaluate_list, + evaluateCount: this.goodsSkuDetail.evaluate_count + }); + }, + goHome() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + this.$util.redirectTo('/pages/index/index'); + }, + goCart() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + this.$util.redirectTo('/pages/goods/cart'); + }, + //-------------------------------------关注------------------------------------- + //更新商品信息 + modifyGoodsInfo() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + //更新商品点击量 + this.$api.sendRequest({ + url: "/api/goods/modifyclicks", + data: { + sku_id: this.skuId + }, + success: res => { + } + }); + + //添加足迹 + this.$api.sendRequest({ + url: "/api/goodsbrowse/add", + data: { + goods_id: this.goodsSkuDetail.goods_id, + sku_id: this.skuId + }, + success: res => { + } + }); + }, + //-------------------------------------关注------------------------------------- + async editCollection() { + if (this.$refs.goodsDetailView) { + this.whetherCollection = await this.$refs.goodsDetailView.collection(); + } + }, + openSharePopup() { + if (this.$refs.goodsDetailView) { + this.$refs.goodsDetailView.openSharePopup(); + } + }, + //弹幕 + getBarrageData() { + this.$api.sendRequest({ + url: '/api/goods/goodsbarrage', + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code == 0 && res.data) { + let barrageData = []; + for (let i in res.data.list) { + if (res.data.list[i]['title']) { + let title = res.data.list[i]['title'].substr(0, 1) + '*' + res.data.list[i]['title'].substr(res.data.list[i]['title'].length - 1, 1) + barrageData.push({ + img: res.data.list[i]['img'] ? res.data.list[i]['img'] : this.$util.getDefaultImage().head, + title: title + '已下单' + }); + } + } + this.goodsSkuDetail.barrageData = barrageData; + } + } + }); + }, + /** + * 设置公众号分享 + */ + setPublicShare() { + let shareUrl = this.$config.h5Domain + this.shareUrl; + if (this.memberInfo && this.memberInfo.member_id) shareUrl += '&source_member=' + this.memberInfo.member_id; + + this.$util.setPublicShare({ + title: this.goodsSkuDetail.goods_name, + desc: '', + link: shareUrl, + imgUrl: typeof this.goodsSkuDetail.goods_image == 'object' ? this.goodsSkuDetail.goods_image[0] : this.goodsSkuDetail.goods_image.split(',')[0] + }) + }, + /** + * 获取商品表单 + */ + getGoodsForm() { + this.$api.sendRequest({ + url: "/form/api/form/goodsform", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code == 0 && res.data) this.$set(this.goodsSkuDetail, 'goods_form', res.data); + } + }); + } + }, + /** + * 自定义分享内容 + * @param {Object} res + */ + onShareAppMessage(res) { + var path = this.shareUrl; + if (this.memberInfo && this.memberInfo.member_id) path += '&source_member=' + this.memberInfo.member_id; + return { + title: this.goodsSkuDetail.sku_name, + imageUrl: this.shareImg ? this.$util.img(this.shareImg) : this.$util.img(this.goodsSkuDetail.sku_image, { + size: 'big' + }), + path: path, + success: res => { + }, + fail: res => { + } + }; + }, + // 分享到微信朋友圈 + // #ifdef MP-WEIXIN + onShareTimeline() { + let query = this.shareQuery; + if (this.memberInfo && this.memberInfo.member_id) query += '&source_member=' + this.memberInfo.member_id; + return { + title: this.goodsSkuDetail.sku_name, + query: query, + imageUrl: this.$util.img(this.goodsSkuDetail.sku_image, { + size: 'big' + }) + }; + } + // #endif +} \ No newline at end of file diff --git a/common/js/html-parser.js b/common/js/html-parser.js new file mode 100644 index 0000000..5360f81 --- /dev/null +++ b/common/js/html-parser.js @@ -0,0 +1,440 @@ +import util from './util.js' +/* + * HTML5 Parser By Sam Blowes + * + * Designed for HTML5 documents + * + * Original code by John Resig (ejohn.org) + * http://ejohn.org/blog/pure-javascript-html-parser/ + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * + * ---------------------------------------------------------------------------- + * License + * ---------------------------------------------------------------------------- + * + * This code is triple licensed using Apache Software License 2.0, + * Mozilla Public License or GNU Public License + * + * //////////////////////////////////////////////////////////////////////////// + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy + * of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * //////////////////////////////////////////////////////////////////////////// + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is Simple HTML Parser. + * + * The Initial Developer of the Original Code is Erik Arvidsson. + * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights + * Reserved. + * + * //////////////////////////////////////////////////////////////////////////// + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * ---------------------------------------------------------------------------- + * Usage + * ---------------------------------------------------------------------------- + * + * // Use like so: + * HTMLParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * // or to get an XML string: + * HTMLtoXML(htmlString); + * + * // or to get an XML DOM Document + * HTMLtoDOM(htmlString); + * + * // or to inject into an existing document/DOM node + * HTMLtoDOM(htmlString, document); + * HTMLtoDOM(htmlString, document.body); + * + */ +// Regular Expressions for parsing tags and attributes +var startTag = + /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; +var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/; +var attr = +/([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5 + +var empty = makeMap( + 'area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr' + ); // Block Elements - HTML 5 +// fixed by xxx 将 ins 标签从块级名单中移除 + +var block = makeMap( + 'a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video' +); // Inline Elements - HTML 5 + +var inline = makeMap( + 'abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var' +); // Elements that you can, intentionally, leave open +// (and which close themselves) + +var closeSelf = makeMap( +'colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled" + +var fillAttrs = makeMap( + 'checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected' + ); // Special Elements (can contain anything) + +var special = makeMap('script,style'); + +function HTMLParser(html, handler) { + var index; + var chars; + var match; + var stack = []; + var last = html; + + stack.last = function() { + return this[this.length - 1]; + }; + + while (html) { + chars = true; // Make sure we're not in a script or style element + if (!stack.last() || !special[stack.last()]) { + // Comment + if (html.indexOf(''); + + if (index >= 0) { + if (handler.comment) { + handler.comment(html.substring(4, index)); + } + + html = html.substring(index + 3); + chars = false; + } // end tag + + } else if (html.indexOf('') == 0) { + match = html.match(endTag); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(endTag, parseEndTag); + chars = false; + } // start tag + + } else if (html.indexOf('<') == 0) { + match = html.match(startTag); + + if (match) { + html = html.substring(match[0].length); + match[0].replace(startTag, parseStartTag); + chars = false; + } + } + + if (chars) { + index = html.indexOf('<'); + var text = index < 0 ? html : html.substring(0, index); + html = index < 0 ? '' : html.substring(index); + + if (handler.chars) { + handler.chars(text); + } + } + } else { + html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function(all, text) { + text = text.replace(/|/g, '$1$2'); + + if (handler.chars) { + handler.chars(text); + } + + return ''; + }); + parseEndTag('', stack.last()); + } + + + if (html == last) { + throw 'Parse Error: ' + html; + } + + last = html; + } // Clean up any remaining tags + + + parseEndTag(); + + function parseStartTag(tag, tagName, rest, unary) { + tagName = tagName.toLowerCase(); + + if (block[tagName]) { + while (stack.last() && inline[stack.last()]) { + parseEndTag('', stack.last()); + } + } + + if (closeSelf[tagName] && stack.last() == tagName) { + parseEndTag('', tagName); + } + + unary = empty[tagName] || !!unary; + + if (!unary) { + stack.push(tagName); + } + + if (handler.start) { + var attrs = []; + rest.replace(attr, function(match, name) { + var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? + arguments[4] : fillAttrs[ + name] ? name : ''; + attrs.push({ + name: name, + value: value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // " + + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + } + } + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + if (!tagName) { + var pos = 0; + } // Find the closest opened tag of the same type + else { + for (var pos = stack.length - 1; pos >= 0; pos--) { + if (stack[pos] == tagName) { + break; + } + } + } + + if (pos >= 0) { + // Close all the open elements, up the stack + for (var i = stack.length - 1; i >= pos; i--) { + if (handler.end) { + handler.end(stack[i]); + } + } // Remove the open elements from the stack + + + stack.length = pos; + } + } +} + +function makeMap(str) { + var obj = {}; + var items = str.split(','); + + for (var i = 0; i < items.length; i++) { + obj[items[i]] = true; + } + + return obj; +} + +function removeDOCTYPE(html) { + return html.replace(/<\?xml.*\?>\n/, '').replace(/\n/, '').replace(/\n/, ''); +} + +/** + * 忽略注释 + * @param {Object} html + */ +function replaceAnnotation(html) { + var html = html.replace(//gi, ''); + return html; +} + +/** + * 替换图片 + * @param {Object} html + */ +function replaceImage(html) { + + // #ifdef MP + let info = uni.getSystemInfoSync(); + var screenWidth = info.windowWidth; + screenWidth -= 20; + screenWidth += 'px'; + // #endif + + // #ifdef H5 + var screenWidth = '100%'; + // #endif + + let rep = `]*src=['"]([^'"]+)[^>]*>/gi, (match, capture) => { + return rep + ' src="' + util.img(capture) + '"/>'; + }); + return html; +} +function replaceVideo(html){ + // #ifdef MP + let info = uni.getSystemInfoSync(); + var screenWidth = info.windowWidth; + screenWidth -= 20; + screenWidth += 'px'; + // #endif + + // #ifdef H5 + var screenWidth = '100%'; + // #endif + + let rep = `]*src=['"]([^'"]+)[^>]*>/gi, (match, capture) => { + return rep + ' src="' + util.img(capture) + '"/>'; + }); + // console.log(html) + return html; +} + +/** + * 将style属性中的双引号改为单引号 + * @param {Object} html + */ +function replaceStyleQuotes(html) { + var html = html.replace(/style\s*=\s*["][^>]*;[^"]?/gi, (match, capture) => { + match = match.replace(/[:](\s?)[\s\S]*/gi, (a, b) => { + return a.replace(/"/g, "'"); + }); + return match; + }); + return html; +} + +function parseAttrs(attrs) { + return attrs.reduce(function(pre, attr) { + var value = attr.value; + var name = attr.name; + + if (pre[name]) { + pre[name] = pre[name] + " " + value; + } else { + pre[name] = value; + } + + return pre; + }, {}); +} + +function parseHtml(html) { + html = removeDOCTYPE(html); + html = replaceAnnotation(html); //忽略注释 + html = replaceImage(html); //替换图片 + html = replaceStyleQuotes(html); //将style属性中的双引号改为单引号 + + html = replaceVideo(html); //替换视频链接 + var stacks = []; + var results = { + node: 'root', + children: [] + }; + HTMLParser(html, { + start: function start(tag, attrs, unary) { + var node = { + name: tag + }; + + if (attrs.length !== 0) { + node.attrs = parseAttrs(attrs); + } + + if (unary) { + var parent = stacks[0] || results; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } else { + stacks.unshift(node); + } + }, + end: function end(tag) { + var node = stacks.shift(); + if (node.name !== tag) console.error('invalid state: mismatch end tag'); + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + chars: function chars(text) { + var node = { + type: 'text', + text: text + }; + + if (stacks.length === 0) { + results.children.push(node); + } else { + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }, + comment: function comment(text) { + var node = { + node: 'comment', + text: text + }; + var parent = stacks[0]; + + if (!parent.children) { + parent.children = []; + } + + parent.children.push(node); + } + }); + return results.children; +} + +export default parseHtml; \ No newline at end of file diff --git a/common/js/http.js b/common/js/http.js new file mode 100644 index 0000000..9ee01c6 --- /dev/null +++ b/common/js/http.js @@ -0,0 +1,255 @@ +import Config from './config.js' +import Util from './util.js' +import store from '@/store/index.js' + +// #ifdef H5 +const app_type = Util.isWeiXin() ? 'wechat' : 'h5'; +const app_type_name = Util.isWeiXin() ? '微信公众号' : 'H5'; +// #endif + +// #ifdef MP-WEIXIN +const app_type = 'weapp'; +const app_type_name = '微信小程序'; +// #endif + +// #ifdef MP-ALIPAY +const app_type = 'aliapp'; +const app_type_name = '支付宝小程序'; +// #endif + +// #ifdef MP-BAIDU +const app_type = 'baiduapp'; +const app_type_name = '百度小程序'; +// #endif + +// #ifdef MP-TOUTIAO +const app_type = 'MP-TOUTIAO'; +const app_type_name = '头条小程序'; +// #endif + +// #ifdef MP-QQ +const app_type = 'MP-QQ'; +const app_type_name = 'QQ小程序'; +// #endif + +// #ifdef APP-PLUS +const app_type = 'app'; +const app_type_name = 'APP'; +// #endif + +export default { + sendRequest(params) { + if (!Config.baseUrl) { + uni.showToast({ + title: '未配置请求域名', + 'icon': 'none', + duration: 10000 + }); + return; + } + + var method = params.data != undefined ? 'POST' : 'GET', // 请求方式 + url = Config.baseUrl + params.url, // 请求路径 + data = { + app_type, + app_type_name + }; + + // token + data.token = store.state.token || ''; + data.uniacid = Config.uniacid + // 门店id + var default_store_info = store.state.defaultStoreInfo; + if (default_store_info) { + data.store_id = default_store_info.store_id; + } + + var store_info = store.state.globalStoreInfo; + + if (store_info) data.store_id = store_info.store_id; + + // 参数 + if (params.data != undefined) Object.assign(data, params.data); + + if (params.async === false) { + //同步 + return new Promise((resolve, reject) => { + uni.request({ + url: url, + method: method, + data: data, + header: params.header || { + // 'Accept': 'application/json', + 'content-type': 'application/x-www-form-urlencoded;application/json' + }, + dataType: params.dataType || 'json', + responseType: params.responseType || 'text', + success: (res) => { + // try { + // res.data = JSON.parse(res.data); + // } catch (e) { + // //TODO handle the exception + // console.log('api error:', e); + // } + if (res.data.code == -3 && store.state.siteState > 0) { + store.commit('setSiteState', -3); + Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch'); + return; + } + if (res.data.refreshtoken) { + store.commit('setToken', res.data.refreshtoken); + } + if (res.data.code == -10009 || res.data.code == -10010) { + store.commit('setToken', ''); + store.commit('setMemberInfo', ''); + } + resolve(res.data); + }, + fail: (res) => { + if (res.errMsg && res.errMsg == 'request:fail url not in domain list') { + uni.showToast({ + title: Config.baseUrl + '不在request 合法域名列表中', + 'icon': 'none', + duration: 10000 + }); + return; + } + reject(res); + }, + complete: (res) => { + if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) { + uni.showToast({ + title: Config.baseUrl + '请求失败', + 'icon': 'none', + duration: 10000 + }); + return; + } + reject(res.data); + } + }); + }); + } else { + //异步 + uni.request({ + url: url, + method: method, + data: data, + header: params.header || { + // 'Accept': 'application/json', + 'content-type': 'application/x-www-form-urlencoded;application/json' + }, + dataType: params.dataType || 'json', + responseType: params.responseType || 'text', + success: (res) => { + // try { + // res.data = JSON.parse(res.data); + // } catch (e) { + // //TODO handle the exception + // console.log('api error:', e); + // } + if (res.data.code == -3 && store.state.siteState > 0) { + store.commit('setSiteState', -3); + Util.redirectTo('/pages_tool/storeclose/storeclose', {}, 'reLaunch'); + return; + } + if (res.data.refreshtoken) { + store.commit('setToken', res.data.refreshtoken); + } + if (res.data.code == -10009 || res.data.code == -10010) { + store.commit('setToken', ''); + store.commit('setMemberInfo', ''); + } + typeof params.success == 'function' && params.success(res.data); + }, + fail: (res) => { + if (res.errMsg && res.errMsg == 'request:fail url not in domain list') { + uni.showToast({ + title: Config.baseUrl + '不在request 合法域名列表中', + 'icon': 'none', + duration: 10000 + }); + return; + } + typeof params.fail == 'function' && params.fail(res); + }, + complete: (res) => { + if ((res.errMsg && res.errMsg != "request:ok") || (res.statusCode && [200, 500].indexOf(res.statusCode) == -1)) { + uni.showToast({ + title: Config.baseUrl + '请求失败', + 'icon': 'none', + duration: 10000 + }); + return; + } + typeof params.complete == 'function' && params.complete(res.data); + } + }); + } + }, + uploadBase64(params) { + uni.request({ + url: Config.baseUrl + '/api/upload/headimgBase64', + method: 'POST', + header: { + 'content-type': 'application/x-www-form-urlencoded;application/json' + }, + data: { + app_type, + app_type_name, + images: params.base64 + }, + dataType: 'json', + responseType: 'text', + success: res => { + typeof params.success == 'function' && params.success(res.data); + }, + fail: () => { + typeof params.fail == 'function' && params.fail(res); + } + }); + }, + pullImage(params) { + uni.request({ + url: Config.baseUrl + '/api/upload/headimgPull', + method: 'POST', + header: { + 'content-type': 'application/x-www-form-urlencoded;application/json' + }, + data: { + app_type, + app_type_name, + path: params.path + }, + dataType: 'json', + responseType: 'text', + success: res => { + typeof params.success == 'function' && params.success(res.data); + }, + fail: () => { + typeof params.fail == 'function' && params.fail(res); + } + }); + }, + upload(params) { + uni.uploadFile({ + url: Config.baseUrl + params.url, + filePath: params.filePath, + name: params.name || 'file', + fileType: params.fileType || 'image', + formData: { + app_type, + app_type_name, + }, + header: { + 'content-type': 'application/x-www-form-urlencoded;application/json' + }, + success: (res) => { + typeof params.success == 'function' && params.success(JSON.parse(res.data)); + }, + fail: (res) => { + typeof params.fail == 'function' && params.fail(res); + } + }); + } +} \ No newline at end of file diff --git a/common/js/lang.js b/common/js/lang.js new file mode 100644 index 0000000..9a4eff7 --- /dev/null +++ b/common/js/lang.js @@ -0,0 +1,129 @@ +const langList = ['zh-cn', 'en-us']; + +var locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 + +export default { + langList: ['zh-cn', 'en-us'], + /** + * * 解析多语言 + * @param {Object} field + */ + lang(field) { + let _this = getCurrentPages()[getCurrentPages().length - 1]; + if (!_this) return; + + var value = ''; + let newRoute; + try { + //公共语言包 + var lang = require('../../lang/' + locale + '/common.js').lang; + + //当前页面语言包 + let route = _this.route.split("/"); + newRoute = route.slice(1, route.length); + let currentPageLang = require('../../lang/' + locale + '/' + newRoute.join("/") + '.js').lang; + + for (let f in currentPageLang) { + lang[f] = currentPageLang[f]; + } + + var arr = field.split("."); + if (arr.length > 1) { + for (let i in arr) { + var next = parseInt(i) + 1; + if (next < arr.length) { + value = lang[arr[i]][arr[next]]; + } + } + + } else { + value = lang[field]; + } + + } catch (e) { + if (field.indexOf("common.") != -1 || field.indexOf("tabBar.") != -1) { + value = lang[field]; + } else { + value = field; + } + + } + + if (arguments.length > 1) { + //有参数,需要替换 + for (var i = 1; i < arguments.length; i++) { + value = value.replace("{" + (i - 1) + "}", arguments[i]); + } + } + if (value == undefined || (value == 'title' && field == 'title')) value = ''; // field + return value; + }, + //切换语言 + change(value) { + let _this = getCurrentPages()[getCurrentPages().length - 1]; + if (!_this) return; + + uni.setStorageSync("lang", value); + locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 + + this.refresh(); + + uni.reLaunch({ + url: '/pages/member/index' + }); + }, + //刷新标题、tabbar + refresh() { + let _this = getCurrentPages()[getCurrentPages().length - 1]; + if (!_this) return; + locale = uni.getStorageSync('lang') || "zh-cn"; //设置语言 + + this.title(this.lang("title")); + + //设置tabbar的文字语言 + // uni.setTabBarItem({ + // index: 0, + // text: this.lang("tabBar.home") + // }); + // uni.setTabBarItem({ + // index: 1, + // text: this.lang("tabBar.category") + // }); + // uni.setTabBarItem({ + // index: 2, + // text: this.lang("tabBar.cart") + // }); + // uni.setTabBarItem({ + // index: 3, + // text: this.lang("tabBar.member") + // }); + }, + title(str) { + if (str) { + uni.setNavigationBarTitle({ + title: str, + success: function (res) { + }, + fail: function (err) { + } + }); + } + }, + // 获取语言包列表 + list() { + var list = []; + try { + //公共语言包 + for (var i = 0; i < langList.length; i++) { + let item = require('../../lang/' + langList[i] + '/common.js').lang; + list.push({ + name: item.common.name, + value: langList[i] + }); + } + } catch (e) { + // "没有找到语言包:", '../../lang/' + locale + '/common.js' + } + return list; + } +} diff --git a/common/js/map-wx-jssdk.js b/common/js/map-wx-jssdk.js new file mode 100644 index 0000000..d26dc2b --- /dev/null +++ b/common/js/map-wx-jssdk.js @@ -0,0 +1,1125 @@ +/** + * 微信小程序JavaScriptSDK + * + * @version 1.2 + * @date 2019-03-06 + * @author v_ylyue@tencent.com + */ + +import Util from './util.js' + +var ERROR_CONF = { + KEY_ERR: 311, + KEY_ERR_MSG: 'key格式错误', + PARAM_ERR: 310, + PARAM_ERR_MSG: '请求参数信息有误', + SYSTEM_ERR: 600, + SYSTEM_ERR_MSG: '系统错误', + WX_ERR_CODE: 1000, + WX_OK_CODE: 200 +}; +var BASE_URL = 'https://apis.map.qq.com/ws/'; +var URL_SEARCH = BASE_URL + 'place/v1/search'; +var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion'; +var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/'; +var URL_CITY_LIST = BASE_URL + 'district/v1/list'; +var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren'; +var URL_DISTANCE = BASE_URL + 'distance/v1/'; +var URL_DIRECTION = BASE_URL + 'direction/v1/'; +var MODE = { + driving: 'driving', + transit: 'transit' +}; +var EARTH_RADIUS = 6378136.49; +var Utils = { + /** + * md5加密方法 + * 版权所有©2011 Sebastian Tschan,https://blueimp.net + */ + safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xffff); + }, + bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); + }, + md5cmn(q, a, b, x, s, t) { + return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b); + }, + md5ff(a, b, c, d, x, s, t) { + return this.md5cmn((b & c) | (~b & d), a, b, x, s, t); + }, + md5gg(a, b, c, d, x, s, t) { + return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t); + }, + md5hh(a, b, c, d, x, s, t) { + return this.md5cmn(b ^ c ^ d, a, b, x, s, t); + }, + md5ii(a, b, c, d, x, s, t) { + return this.md5cmn(c ^ (b | ~d), a, b, x, s, t); + }, + binlMD5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << (len % 32); + x[((len + 64) >>> 9 << 4) + 14] = len; + + var i; + var olda; + var oldb; + var oldc; + var oldd; + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + + a = this.md5ff(a, b, c, d, x[i], 7, -680876936); + d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586); + c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819); + b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897); + d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983); + a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063); + b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101); + c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510); + d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713); + b = this.md5gg(b, c, d, a, x[i], 20, -373897302); + a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691); + d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083); + c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335); + b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848); + a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438); + d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961); + b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784); + c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558); + d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556); + a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632); + b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174); + d = this.md5hh(d, a, b, c, x[i], 11, -358537222); + c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979); + b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189); + a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487); + d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835); + c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520); + b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = this.md5ii(a, b, c, d, x[i], 6, -198630844); + d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055); + a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523); + b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744); + c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070); + d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259); + b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = this.safeAdd(a, olda); + b = this.safeAdd(b, oldb); + c = this.safeAdd(c, oldc); + d = this.safeAdd(d, oldd); + } + return [a, b, c, d]; + }, + binl2rstr(input) { + var i; + var output = ''; + var length32 = input.length * 32; + for (i = 0; i < length32; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff); + } + return output; + }, + rstr2binl(input) { + var i; + var output = []; + output[(input.length >> 2) - 1] = undefined; + for (i = 0; i < output.length; i += 1) { + output[i] = 0; + } + var length8 = input.length * 8; + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32); + } + return output; + }, + rstrMD5(s) { + return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8)); + }, + rstrHMACMD5(key, data) { + var i; + var bkey = this.rstr2binl(key); + var ipad = []; + var opad = []; + var hash; + ipad[15] = opad[15] = undefined; + if (bkey.length > 16) { + bkey = this.binlMD5(bkey, key.length * 8); + } + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5c5c5c5c; + } + hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8); + return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128)); + }, + rstr2hex(input) { + var hexTab = '0123456789abcdef'; + var output = ''; + var x; + var i; + for (i = 0; i < input.length; i += 1) { + x = input.charCodeAt(i); + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f); + } + return output; + }, + str2rstrUTF8(input) { + return unescape(encodeURIComponent(input)); + }, + rawMD5(s) { + return this.rstrMD5(this.str2rstrUTF8(s)); + }, + hexMD5(s) { + return this.rstr2hex(this.rawMD5(s)); + }, + rawHMACMD5(k, d) { + return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d)); + }, + hexHMACMD5(k, d) { + return this.rstr2hex(this.rawHMACMD5(k, d)); + }, + + md5(string, key, raw) { + if (!key) { + if (!raw) { + return this.hexMD5(string); + } + return this.rawMD5(string); + } + if (!raw) { + return this.hexHMACMD5(key, string); + } + return this.rawHMACMD5(key, string); + }, + /** + * 得到md5加密后的sig参数 + * @param {Object} requestParam 接口参数 + * @param {String} sk签名字符串 + * @param {String} featrue 方法名 + * @return 返回加密后的sig参数 + */ + getSig(requestParam, sk, feature, mode) { + var sig = null; + var requestArr = []; + Object.keys(requestParam).sort().forEach(function(key){ + requestArr.push(key + '=' + requestParam[key]); + }); + if (feature == 'search') { + sig = '/ws/place/v1/search?' + requestArr.join('&') + sk; + } + if (feature == 'suggest') { + sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk; + } + if (feature == 'reverseGeocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'geocoder') { + sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'getCityList') { + sig = '/ws/district/v1/list?' + requestArr.join('&') + sk; + } + if (feature == 'getDistrictByCityId') { + sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk; + } + if (feature == 'calculateDistance') { + sig = '/ws/distance/v1/?' + requestArr.join('&') + sk; + } + if (feature == 'direction') { + sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk; + } + sig = this.md5(sig); + return sig; + }, + /** + * 得到终点query字符串 + * @param {Array|String} 检索数据 + */ + location2query(data) { + if (typeof data == 'string') { + return data; + } + var query = ''; + for (var i = 0; i < data.length; i++) { + var d = data[i]; + if (!!query) { + query += ';'; + } + if (d.location) { + query = query + d.location.lat + ',' + d.location.lng; + } + if (d.latitude && d.longitude) { + query = query + d.latitude + ',' + d.longitude; + } + } + return query; + }, + + /** + * 计算角度 + */ + rad(d) { + return d * Math.PI / 180.0; + }, + /** + * 处理终点location数组 + * @return 返回终点数组 + */ + getEndLocation(location){ + var to = location.split(';'); + var endLocation = []; + for (var i = 0; i < to.length; i++) { + endLocation.push({ + lat: parseFloat(to[i].split(',')[0]), + lng: parseFloat(to[i].split(',')[1]) + }) + } + return endLocation; + }, + + /** + * 计算两点间直线距离 + * @param a 表示纬度差 + * @param b 表示经度差 + * @return 返回的是距离,单位m + */ + getDistance(latFrom, lngFrom, latTo, lngTo) { + var radLatFrom = this.rad(latFrom); + var radLatTo = this.rad(latTo); + var a = radLatFrom - radLatTo; + var b = this.rad(lngFrom) - this.rad(lngTo); + var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2))); + distance = distance * EARTH_RADIUS; + distance = Math.round(distance * 10000) / 10000; + return parseFloat(distance.toFixed(0)); + }, + /** + * 使用微信接口进行定位 + */ + getWXLocation(success, fail, complete) { + Util.getLocation({ + type: 'gcj02', + success: success, + fail: fail, + complete: complete + }) + }, + + /** + * 获取location参数 + */ + getLocationParam(location) { + if (typeof location == 'string') { + var locationArr = location.split(','); + if (locationArr.length === 2) { + location = { + latitude: location.split(',')[0], + longitude: location.split(',')[1] + }; + } else { + location = {}; + } + } + return location; + }, + + /** + * 回调函数默认处理 + */ + polyfillParam(param) { + param.success = param.success || function () { }; + param.fail = param.fail || function () { }; + param.complete = param.complete || function () { }; + }, + + /** + * 验证param对应的key值是否为空 + * + * @param {Object} param 接口参数 + * @param {String} key 对应参数的key + */ + checkParamKeyEmpty(param, key) { + if (!param[key]) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return true; + } + return false; + }, + + /** + * 验证参数中是否存在检索词keyword + * + * @param {Object} param 接口参数 + */ + checkKeyword(param){ + return !this.checkParamKeyEmpty(param, 'keyword'); + }, + + /** + * 验证location值 + * + * @param {Object} param 接口参数 + */ + checkLocation(param) { + var location = this.getLocationParam(param.location); + if (!location || !location.latitude || !location.longitude) { + var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误'); + param.fail(errconf); + param.complete(errconf); + return false; + } + return true; + }, + + /** + * 构造错误数据结构 + * @param {Number} errCode 错误码 + * @param {Number} errMsg 错误描述 + */ + buildErrorConfig(errCode, errMsg) { + return { + status: errCode, + message: errMsg + }; + }, + + /** + * + * 数据处理函数 + * 根据传入参数不同处理不同数据 + * @param {String} feature 功能名称 + * search 地点搜索 + * suggest关键词提示 + * reverseGeocoder逆地址解析 + * geocoder地址解析 + * getCityList获取城市列表:父集 + * getDistrictByCityId获取区县列表:子集 + * calculateDistance距离计算 + * @param {Object} param 接口参数 + * @param {Object} data 数据 + */ + handleData(param,data,feature){ + if (feature == 'search') { + var searchResult = data.data; + var searchSimplify = []; + for (var i = 0; i < searchResult.length; i++) { + searchSimplify.push({ + id: searchResult[i].id || null, + title: searchResult[i].title || null, + latitude: searchResult[i].location && searchResult[i].location.lat || null, + longitude: searchResult[i].location && searchResult[i].location.lng || null, + address: searchResult[i].address || null, + category: searchResult[i].category || null, + tel: searchResult[i].tel || null, + adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null, + city: searchResult[i].ad_info && searchResult[i].ad_info.city || null, + district: searchResult[i].ad_info && searchResult[i].ad_info.district || null, + province: searchResult[i].ad_info && searchResult[i].ad_info.province || null + }) + } + param.success(data, { + searchResult: searchResult, + searchSimplify: searchSimplify + }) + } else if (feature == 'suggest') { + var suggestResult = data.data; + var suggestSimplify = []; + for (var i = 0; i < suggestResult.length; i++) { + suggestSimplify.push({ + adcode: suggestResult[i].adcode || null, + address: suggestResult[i].address || null, + category: suggestResult[i].category || null, + city: suggestResult[i].city || null, + district: suggestResult[i].district || null, + id: suggestResult[i].id || null, + latitude: suggestResult[i].location && suggestResult[i].location.lat || null, + longitude: suggestResult[i].location && suggestResult[i].location.lng || null, + province: suggestResult[i].province || null, + title: suggestResult[i].title || null, + type: suggestResult[i].type || null + }) + } + param.success(data, { + suggestResult: suggestResult, + suggestSimplify: suggestSimplify + }) + } else if (feature == 'reverseGeocoder') { + var reverseGeocoderResult = data.result; + var reverseGeocoderSimplify = { + address: reverseGeocoderResult.address || null, + latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null, + longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null, + adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null, + city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null, + district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null, + nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null, + province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null, + street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null, + street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null, + recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null, + rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null + }; + if (reverseGeocoderResult.pois) {//判断是否返回周边poi + var pois = reverseGeocoderResult.pois; + var poisSimplify = []; + for (var i = 0;i < pois.length;i++) { + poisSimplify.push({ + id: pois[i].id || null, + title: pois[i].title || null, + latitude: pois[i].location && pois[i].location.lat || null, + longitude: pois[i].location && pois[i].location.lng || null, + address: pois[i].address || null, + category: pois[i].category || null, + adcode: pois[i].ad_info && pois[i].ad_info.adcode || null, + city: pois[i].ad_info && pois[i].ad_info.city || null, + district: pois[i].ad_info && pois[i].ad_info.district || null, + province: pois[i].ad_info && pois[i].ad_info.province || null + }) + } + param.success(data,{ + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify, + pois: pois, + poisSimplify: poisSimplify + }) + } else { + param.success(data, { + reverseGeocoderResult: reverseGeocoderResult, + reverseGeocoderSimplify: reverseGeocoderSimplify + }) + } + } else if (feature == 'geocoder') { + var geocoderResult = data.result; + var geocoderSimplify = { + title: geocoderResult.title || null, + latitude: geocoderResult.location && geocoderResult.location.lat || null, + longitude: geocoderResult.location && geocoderResult.location.lng || null, + adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null, + province: geocoderResult.address_components && geocoderResult.address_components.province || null, + city: geocoderResult.address_components && geocoderResult.address_components.city || null, + district: geocoderResult.address_components && geocoderResult.address_components.district || null, + street: geocoderResult.address_components && geocoderResult.address_components.street || null, + street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null, + level: geocoderResult.level || null + }; + param.success(data,{ + geocoderResult: geocoderResult, + geocoderSimplify: geocoderSimplify + }); + } else if (feature == 'getCityList') { + var provinceResult = data.result[0]; + var cityResult = data.result[1]; + var districtResult = data.result[2]; + param.success(data,{ + provinceResult: provinceResult, + cityResult: cityResult, + districtResult: districtResult + }); + } else if (feature == 'getDistrictByCityId') { + var districtByCity = data.result[0]; + param.success(data, districtByCity); + } else if (feature == 'calculateDistance') { + var calculateDistanceResult = data.result.elements; + var distance = []; + for (var i = 0; i < calculateDistanceResult.length; i++){ + distance.push(calculateDistanceResult[i].distance); + } + param.success(data, { + calculateDistanceResult: calculateDistanceResult, + distance: distance + }); + } else if (feature == 'direction') { + var direction = data.result.routes; + param.success(data,direction); + } else { + param.success(data); + } + }, + + /** + * 构造微信请求参数,公共属性处理 + * + * @param {Object} param 接口参数 + * @param {Object} param 配置项 + * @param {String} feature 方法名 + */ + buildWxRequestConfig(param, options, feature) { + var that = this; + options.header = { "content-type": "application/json" }; + options.method = 'GET'; + options.success = function (res) { + var data = res.data; + if (data.status === 0) { + that.handleData(param, data, feature); + } else { + param.fail(data); + } + }; + options.fail = function (res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + options.complete = function (res) { + var statusCode = +res.statusCode; + switch(statusCode) { + case ERROR_CONF.WX_ERR_CODE: { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + break; + } + case ERROR_CONF.WX_OK_CODE: { + var data = res.data; + if (data.status === 0) { + param.complete(data); + } else { + param.complete(that.buildErrorConfig(data.status, data.message)); + } + break; + } + default:{ + param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG)); + } + + } + }; + return options; + }, + + /** + * 处理用户参数是否传入坐标进行不同的处理 + */ + locationProcess(param, locationsuccess, locationfail, locationcomplete) { + var that = this; + locationfail = locationfail || function (res) { + res.statusCode = ERROR_CONF.WX_ERR_CODE; + param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + }; + locationcomplete = locationcomplete || function (res) { + if (res.statusCode == ERROR_CONF.WX_ERR_CODE) { + param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg)); + } + }; + if (!param.location) { + that.getWXLocation(locationsuccess, locationfail, locationcomplete); + } else if (that.checkLocation(param)) { + var location = Utils.getLocationParam(param.location); + locationsuccess(location); + } + } +}; + + +class QQMapWX { + + /** + * 构造函数 + * + * @param {Object} options 接口参数,key 为必选参数 + */ + constructor(options) { + if (!options.key) { + throw Error('key值不能为空'); + } + this.key = options.key; + }; + + /** + * POI周边检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * @see http://lbs.qq.com/webservice_v1/guide-search.html + */ + search(options) { + var that = this; + options = options || {}; + + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + orderby: options.orderby || '_distance', + page_size: options.page_size || 10, + page_index: options.page_index || 1, + output: 'json', + key: that.key + }; + + if (options.address_format) { + requestParam.address_format = options.address_format; + } + + if (options.filter) { + requestParam.filter = options.filter; + } + + var distance = options.distance || "1000"; + var auto_extend = options.auto_extend || 1; + var region = null; + var rectangle = null; + + //判断城市限定参数 + if (options.region) { + region = options.region; + } + + //矩形限定坐标(暂时只支持字符串格式) + if (options.rectangle) { + rectangle = options.rectangle; + } + + var locationsuccess = function (result) { + if (region && !rectangle) { + //城市限定参数拼接 + requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else if (rectangle && !region) { + //矩形搜索 + requestParam.boundary = "rectangle(" + rectangle + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } else { + requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")"; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'search'); + } + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SEARCH, + data: requestParam + }, 'search')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * sug模糊检索 + * + * @param {Object} options 接口参数对象 + * + * 参数对象结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-suggestion.html + */ + getSuggestion(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (!Utils.checkKeyword(options)) { + return; + } + + var requestParam = { + keyword: options.keyword, + region: options.region || '全国', + region_fix: options.region_fix || 0, + policy: options.policy || 0, + page_size: options.page_size || 10,//控制显示条数 + page_index: options.page_index || 1,//控制页数 + get_subpois : options.get_subpois || 0,//返回子地点 + output: 'json', + key: that.key + }; + //长地址 + if (options.address_format) { + requestParam.address_format = options.address_format; + } + //过滤 + if (options.filter) { + requestParam.filter = options.filter; + } + //排序 + if (options.location) { + var locationsuccess = function (result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + }; + Utils.locationProcess(options, locationsuccess); + } else { + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_SUGGESTION, + data: requestParam + }, "suggest")); + } + }; + + /** + * 逆地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-gcoder.html + */ + reverseGeocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + coord_type: options.coord_type || 5, + get_poi: options.get_poi || 0, + output: 'json', + key: that.key + }; + if (options.poi_options) { + requestParam.poi_options = options.poi_options + } + + var locationsuccess = function (result) { + requestParam.location = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + }, 'reverseGeocoder')); + }; + Utils.locationProcess(options, locationsuccess); + }; + + /** + * 地址解析 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-geocoder.html + */ + geocoder(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'address')) { + return; + } + + var requestParam = { + address: options.address, + output: 'json', + key: that.key + }; + + //城市限定 + if (options.region) { + requestParam.region = options.region; + } + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_GET_GEOCODER, + data: requestParam + },'geocoder')); + }; + + + /** + * 获取城市列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getCityList(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + var requestParam = { + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_CITY_LIST, + data: requestParam + },'getCityList')); + }; + + /** + * 获取对应城市ID的区县列表 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-region.html + */ + getDistrictByCityId(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'id')) { + return; + } + + var requestParam = { + id: options.id || '', + output: 'json', + key: that.key + }; + + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId'); + } + + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_AREA_LIST, + data: requestParam + },'getDistrictByCityId')); + }; + + /** + * 用于单起点到多终点的路线距离(非直线距离)计算: + * 支持两种距离计算方式:步行和驾车。 + * 起点到终点最大限制直线距离10公里。 + * + * 新增直线距离计算。 + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * http://lbs.qq.com/webservice_v1/guide-distance.html + */ + calculateDistance(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + mode: options.mode || 'walking', + to: Utils.location2query(options.to), + output: 'json', + key: that.key + }; + + if (options.from) { + options.location = options.from; + } + + //计算直线距离 + if(requestParam.mode == 'straight'){ + var locationsuccess = function (result) { + var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标 + var data = { + message:"query ok", + result:{ + elements:[] + }, + status:0 + }; + for (var i = 0; i < locationTo.length; i++) { + data.result.elements.push({//将坐标存入 + distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng), + duration:0, + from:{ + lat: result.latitude, + lng:result.longitude + }, + to:{ + lat: locationTo[i].lat, + lng: locationTo[i].lng + } + }); + } + var calculateResult = data.result.elements; + var distanceResult = []; + for (var i = 0; i < calculateResult.length; i++) { + distanceResult.push(calculateResult[i].distance); + } + return options.success(data,{ + calculateResult: calculateResult, + distanceResult: distanceResult + }); + }; + + Utils.locationProcess(options, locationsuccess); + } else { + var locationsuccess = function (result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance'); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: URL_DISTANCE, + data: requestParam + },'calculateDistance')); + }; + + Utils.locationProcess(options, locationsuccess); + } + }; + + /** + * 路线规划: + * + * @param {Object} options 接口参数对象 + * + * 请求参数结构可以参考 + * https://lbs.qq.com/webservice_v1/guide-road.html + */ + direction(options) { + var that = this; + options = options || {}; + Utils.polyfillParam(options); + + if (Utils.checkParamKeyEmpty(options, 'to')) { + return; + } + + var requestParam = { + output: 'json', + key: that.key + }; + + //to格式处理 + if (typeof options.to == 'string') { + requestParam.to = options.to; + } else { + requestParam.to = options.to.latitude + ',' + options.to.longitude; + } + //初始化局部请求域名 + var SET_URL_DIRECTION = null; + //设置默认mode属性 + options.mode = options.mode || MODE.driving; + + //设置请求域名 + SET_URL_DIRECTION = URL_DIRECTION + options.mode; + + if (options.from) { + options.location = options.from; + } + + if (options.mode == MODE.driving) { + if (options.from_poi) { + requestParam.from_poi = options.from_poi; + } + if (options.heading) { + requestParam.heading = options.heading; + } + if (options.speed) { + requestParam.speed = options.speed; + } + if (options.accuracy) { + requestParam.accuracy = options.accuracy; + } + if (options.road_type) { + requestParam.road_type = options.road_type; + } + if (options.to_poi) { + requestParam.to_poi = options.to_poi; + } + if (options.from_track) { + requestParam.from_track = options.from_track; + } + if (options.waypoints) { + requestParam.waypoints = options.waypoints; + } + if (options.policy) { + requestParam.policy = options.policy; + } + if (options.plate_number) { + requestParam.plate_number = options.plate_number; + } + } + + if (options.mode == MODE.transit) { + if (options.departure_time) { + requestParam.departure_time = options.departure_time; + } + if (options.policy) { + requestParam.policy = options.policy; + } + } + + var locationsuccess = function (result) { + requestParam.from = result.latitude + ',' + result.longitude; + if (options.sig) { + requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction',options.mode); + } + wx.request(Utils.buildWxRequestConfig(options, { + url: SET_URL_DIRECTION, + data: requestParam + }, 'direction')); + }; + + Utils.locationProcess(options, locationsuccess); + } +}; + +module.exports = QQMapWX; \ No newline at end of file diff --git a/common/js/map/openMap.js b/common/js/map/openMap.js new file mode 100644 index 0000000..9333ec7 --- /dev/null +++ b/common/js/map/openMap.js @@ -0,0 +1,107 @@ +import TransformCoordinate from './transformCoordinate.js' + +function openMapByDefault(latitude, longitude, name) { + uni.openLocation({ + latitude: latitude, + longitude: longitude, + name: name, + fail: (e) => { + uni.showModal({ + content: '打开地图失败,请稍后重试' + }) + }, + }) +} + +function openMapByAndroid(latitude, longitude, name) { + let url = ''; // 回调地址 + let identity = ''; // 程序名称 + if (plus.runtime.isApplicationExist({ + pname: 'com.baidu.BaiduMap' + })) { + url = + `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&coord_type=gcj02&src=andr.baidu.openAPIdemo` + identity = 'com.baidu.BaiduMap' + openURL(url, identity) + } else if (plus.runtime.isApplicationExist({ + pname: 'com.autonavi.minimap' + })) { // 高德 + url = `androidamap://viewMap?sourceApplication=appname&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0` + identity = 'com.autonavi.minimap' + openURL(url, identity) + } else { + openMapByDefault(latitude, longitude, name) + } +} + +function openMapByIos(latitude, longitude, name) { + let url = ''; // 回调地址 + let errorCB = ''; // url失败的回调地址 + let identity = ''; // 程序名称 + + if (plus.runtime.isApplicationExist({ + action: 'baidumap://' + })) { + url = + `baidumap://map/marker?location=${latitude},${longitude}&title=${name}&content=${name}&src=ios.baidu.openAPIdemo&coord_type=gcj02`; + openURL(url, identity) + } else if (plus.runtime.isApplicationExist({ + action: 'iosamap://' + })) { // 高德 + url = `iosamap://viewMap?sourceApplication=applicationName&poiname=${name}&lat=${latitude}&lon=${longitude}&dev=0` + openURL(url, identity) + } else { + openMapByDefault(latitude, longitude, name) + } +} + +function openURL(url, identity) { + let newurl = encodeURI(url); + plus.runtime.openURL(newurl, function(res) { + uni.showModal({ + content: res.message + }) + }, identity); +} + +function getCoordByType(longitude, latitude, coord_type) { + switch (coord_type) { + case 'gcj02': + return [longitude, latitude] + break; + case 'bd09': + return TransformCoordinate.bd09togcj02(longitude, latitude) + break; + case 'wgs84': + return TransformCoordinate.wgs84togcj02(longitude, latitude) + break; + default: + return [longitude, latitude] + break; + } +} +export default { + /* 打开地图 */ + openMap(latitude, longitude, name, coord_type = 'gcj02') { + let arr = getCoordByType(longitude, latitude, coord_type) + // #ifdef APP-PLUS + switch (uni.getSystemInfoSync().platform) { + case 'android': + console.log('运行Android上') + openMapByAndroid(arr[1], arr[0], name) + break; + case 'ios': + console.log('运行iOS上') + openMapByIos(arr[1], arr[0], name) + break; + default: + openMapByDefault(arr[1], arr[0], name) + console.log('运行在开发者工具上') + break; + } + // #endif + // #ifndef APP-PLUS + openMapByDefault(arr[1], arr[0], name) + // #endif + } +} diff --git a/common/js/map/transformCoordinate.js b/common/js/map/transformCoordinate.js new file mode 100644 index 0000000..0dec3d4 --- /dev/null +++ b/common/js/map/transformCoordinate.js @@ -0,0 +1,124 @@ +/** + * Created by Wandergis on 2015/7/8. + * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换 + */ + +//定义一些常量 +var x_PI = 3.14159265358979324 * 3000.0 / 180.0; +var PI = 3.1415926535897932384626; +var a = 6378245.0; +var ee = 0.00669342162296594323; + +/** + * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + * 即 百度 转 谷歌、高德 + * @param bd_lon + * @param bd_lat + * @returns {*[]} + */ +function bd09togcj02(bd_lon, bd_lat) { + var x_pi = 3.14159265358979324 * 3000.0 / 180.0; + var x = bd_lon - 0.0065; + var y = bd_lat - 0.006; + var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi); + var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi); + var gg_lng = z * Math.cos(theta); + var gg_lat = z * Math.sin(theta); + return [gg_lng, gg_lat] +} + +/** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + * 即谷歌、高德 转 百度 + * @param lng + * @param lat + * @returns {*[]} + */ +function gcj02tobd09(lng, lat) { + var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); + var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); + var bd_lng = z * Math.cos(theta) + 0.0065; + var bd_lat = z * Math.sin(theta) + 0.006; + return [bd_lng, bd_lat] +} + +/** + * WGS84转GCj02 + * @param lng + * @param lat + * @returns {*[]} + */ +function wgs84togcj02(lng, lat) { + if (out_of_china(lng, lat)) { + return [lng, lat] + } else { + var dlat = transformlat(lng - 105.0, lat - 35.0); + var dlng = transformlng(lng - 105.0, lat - 35.0); + var radlat = lat / 180.0 * PI; + var magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + var sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + var mglat = lat + dlat; + var mglng = lng + dlng; + return [mglng, mglat] + } +} + +/** + * GCJ02 转换为 WGS84 + * @param lng + * @param lat + * @returns {*[]} + */ +function gcj02towgs84(lng, lat) { + if (out_of_china(lng, lat)) { + return [lng, lat] + } else { + var dlat = transformlat(lng - 105.0, lat - 35.0); + var dlng = transformlng(lng - 105.0, lat - 35.0); + var radlat = lat / 180.0 * PI; + var magic = Math.sin(radlat); + magic = 1 - ee * magic * magic; + var sqrtmagic = Math.sqrt(magic); + dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); + dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); + mglat = lat + dlat; + mglng = lng + dlng; + return [lng * 2 - mglng, lat * 2 - mglat] + } +} + +function transformlat(lng, lat) { + var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; + return ret +} + +function transformlng(lng, lat) { + var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); + ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; + return ret +} + +/** + * 判断是否在国内,不在国内则不做偏移 + * @param lng + * @param lat + * @returns {boolean} + */ +function out_of_china(lng, lat) { + return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); +} + +export default { + bd09togcj02: bd09togcj02, // 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 + gcj02tobd09: gcj02tobd09, // 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 + wgs84togcj02: wgs84togcj02, // + gcj02towgs84: gcj02towgs84, +} diff --git a/common/js/pc.js b/common/js/pc.js new file mode 100644 index 0000000..9e08408 --- /dev/null +++ b/common/js/pc.js @@ -0,0 +1,10 @@ +(function() { + var u = navigator.userAgent, + w = window.innerWidth; + if (w >= 960) { + window.innerWidth = 960; + window.onload = function() { + window.innerWidth = 960; + } + } +})(); diff --git a/common/js/scroll-view.js b/common/js/scroll-view.js new file mode 100644 index 0000000..431e278 --- /dev/null +++ b/common/js/scroll-view.js @@ -0,0 +1,28 @@ +export default { + data() { + return { + showTop: false, + scrollTop: 0, + oldLocation: 0 + } + }, + methods: { + scrollToTopNative() { + uni.pageScrollTo({ + duration: 200, + scrollTop: 0 + }); + } + }, + onReachBottom() { + if(this.$refs.goodrecommend) this.$refs.goodrecommend.getLikeList(10) + }, + onPageScroll(e) { + this.oldLocation = e.scrollTop; + if (e.scrollTop > 400) { + this.showTop = true; + } else { + this.showTop = false; + } + } +} diff --git a/common/js/socketTest.js b/common/js/socketTest.js new file mode 100644 index 0000000..29a18d1 --- /dev/null +++ b/common/js/socketTest.js @@ -0,0 +1,207 @@ +import config from './config.js' + +export default { + data() { + return { + timeoutObj: null, //ping定时器 + servicer_id: null, //绑定 + pingInterval: config.pingInterval //本地端主动给服务器ping的时间, 0 则不开启 + } + }, + onLoad() { + let that = this; + // 因为图片上传,所以不能onhide关闭长链接,但是每次打开客服都会有重复请求,所以优先关闭再去打开长链接 + uni.closeSocket(); + // .判断是否已连接 + that.checkOpenSocket(); + // uni.onSocketClose(function(res) { + // console.log('WebSocket 已关闭!'); + // }); + }, + methods: { + // 判断是否已连接 + checkOpenSocket() { + console.log('判断是否已连接'); + // alert('判断是否已连接') + let self = this; + uni.sendSocketMessage({ + data: 'ping', + success: (res) => { + console.log('连接成功,检查'); + // alert('连接成功,检查') + // self.getChatList(); + }, + fail: (err) => { // 未连接打开websocket连接 + console.log('连接失败'); + // alert('连接失败') + self.openConnection(); + } + }); + }, + openConnection() { // 打开连接 + console.log('打开连接'); + // alert('打开连接') + // uni.closeSocket(); // 确保已经关闭后再重新打开 + uni.connectSocket({ + url: config.webSocket, + method: 'POST', + success(res) { + console.log('连接成功 connectSocket=', res); + // alert('连接成功 connectSocket=', res); + }, + fail(err) { + console.log('连接失败 connectSocket=', err); + } + }); + // uni.onSocketOpen((res) => { + // console.log('连接成功', res); + // }); + this.onSocketMessage(); // 打开成功监听服务器返回的消息 + }, + // 打开成功监听服务器返回的消息 + onSocketMessage() { // 消息 + console.log("开始监听"); + + let that = this; + this.pingInterval = config.pingInterval; + this.timeoutObj = null; + uni.onSocketMessage((res) => { //type:init,connect,close,string,order,goods + let msg = JSON.parse(res.data); + console.log("监听该服务器消息", res); + if (msg.type == 'close') { + clearInterval(that.timeoutObj); + that.timeoutObj = null; + uni.closeSocket(); + return; + } + this.reset(); + this.getSocketMsg(res.data); // 监听到有新服务器消息 + }); + }, + // 监听到有新服务器消息 + getSocketMsg(reData) { // 监听到服务器消息 + let that = this; + // console.log(reData) + let giveMsg = JSON.parse(reData); + let data = { + isItMe: false, + }; + data.contentType = giveMsg.type; + // alert(data.contentType) + if (giveMsg.type == 'init') { + // alert(123) + that.$api.sendRequest({ + url: '/servicer/api/chat/bind', + data: { + client_id: giveMsg.data.client_id, + site_id: that.siteId + }, + success(res) { + if (res.code == 0) { + that.servicer_id = res.data.servicer_id; + } else { + that.servicer_id = 0; + } + that.getChatList(); + } + }) + } else if (giveMsg.type == 'connect') { + // that.servicer_id = giveMsg.data.servicer_id; + // let NewArr = that.messageList; + // let index = null; + // for (let i = 0; i < NewArr.length; i++) { + // if (NewArr[i].contentType == 'online' || NewArr[i].contentType == 'noline') { + // index = i; + // } + // } + // NewArr.splice(index, 1) + // that.messageList = NewArr; + // let obj = {} + // if (that.servicer_id > 0) { + // obj.contentType = 'online'; + // } else if (that.servicer_id == 0) { + // obj.contentType = 'noline'; + // } + // that.messageList.push(obj); + return false; + } else if (giveMsg.type == 'string') { + data.content = giveMsg.data.servicer_say; + } else if (giveMsg.type == 'image') { + data.image = giveMsg.data.servicer_say; + } else if (giveMsg.type == 'order') { + data.order_id = giveMsg.data.order_id; + } else if (giveMsg.type == 'goodssku') { + data.sku_id = giveMsg.data.goods_sku_id; + } + if (giveMsg.type == 'init') return; + that.messageList.push(data); + that.$nextTick(() => { + that.setPageScrollTo() + }) + }, + // 检测心跳reset + reset() { + console.log("检测心跳"); + clearInterval(this.timeoutObj); + this.start(); // 启动心跳 + }, + // 启动心跳 start + start() { + console.log("启动心跳"); + let self = this; + this.timeoutObj = setInterval(function () { + uni.sendSocketMessage({ + data: 'ping', + success: (res) => { + console.log('连接中....'); + }, + fail: (err) => { + console.log('连接失败重新连接....'); + self.openConnection(); + } + }); + }, this.pingInterval); + } + }, + // onHide() { + // // alert("关闭") + // // 改之前的 + // // console.log("我出发了") + // // this.checkOpenSocket(); + // clearInterval(this.timeoutObj); + // this.timeoutObj = null; + // this.$api.sendRequest({ + // url: '/servicer/api/chat/bye', + // data: { + // servicer_id: this.servicer_id, + // site_id: this.siteId + // }, + // success(res) { + // uni.closeSocket(); + // }, + // fail: (err) => { + // uni.closeSocket(); + // } + // }); + // }, + onUnload() { + // alert("关闭") + clearInterval(this.timeoutObj); + this.timeoutObj = null; + this.$api.sendRequest({ + url: '/servicer/api/chat/bye', + data: { + servicer_id: this.servicer_id, + site_id: this.siteId + }, + success(res) { + // alert("关闭1") + uni.closeSocket(); + }, + fail: (err) => { + // alert("关闭2") + uni.closeSocket(); + } + }); + } +} diff --git a/common/js/storage.js b/common/js/storage.js new file mode 100644 index 0000000..5e9bc7c --- /dev/null +++ b/common/js/storage.js @@ -0,0 +1,51 @@ +import Config from './config.js' + +const prefix = Config.baseUrl.replace(/(http:\/\/)|(https:\/\/)/g, ''); +var oldPrefix = uni.getStorageSync('prefix'); + +// 域名不一致,清空 +if (oldPrefix != prefix) { + uni.clearStorageSync(); +} +uni.setStorageSync('prefix', prefix); + +const handleKey = (key) => { + const storageKey = (prefix ? `${prefix}_` : '') + key; + return storageKey; +}; + +export function uniStorage() { + const setStorageSync = uni.setStorageSync; + const setStorage = uni.setStorage; + const getStorage = uni.getStorage; + const getStorageSync = uni.getStorageSync; + const removeStorage = uni.removeStorage; + const removeStorageSync = uni.removeStorageSync; + + uni.setStorage = (options) => { + options.key = handleKey(options.key); + setStorage(options) + }; + + uni.setStorageSync = (key, data) => { + setStorageSync(handleKey(key), data) + }; + + uni.getStorage = (options) => { + options.key = handleKey(options.key); + getStorage(options) + }; + + uni.getStorageSync = (key) => { + return getStorageSync(handleKey(key)) + }; + + uni.removeStorage = (options) => { + options.key = handleKey(options.key); + removeStorage(options) + }; + + uni.removeStorageSync = (key) => { + return removeStorageSync(handleKey(key)) + } +} \ No newline at end of file diff --git a/common/js/style_color.js b/common/js/style_color.js new file mode 100644 index 0000000..67de27c --- /dev/null +++ b/common/js/style_color.js @@ -0,0 +1,419 @@ +export default { + 'default': { + //红色 + name: 'default', + main_color: '#F4391c', + aux_color: '#F7B500', + bg_color: '#FF4646',//主题背景 + bg_color_shallow: '#FF4646',//主题背景渐变浅色 + promotion_color: '#FF4646',//活动背景 + promotion_aux_color: '#F7B500',//活动背景辅色 + main_color_shallow: '#FFF4F4',//淡背景 + price_color: 'rgb(252,82,39)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail: { + goods_price: 'rgb(252,82,39,1)',//价格 + promotion_tag: '#FF4646', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#FC5227', + goods_cart_num_corner: '#FC5227',//购物车数量角标 + goods_btn_color: '#FF4646',//按钮颜色 + goods_btn_color_shallow: '#F7B500',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'green': { + name: 'green', + main_color: '#19C650', + aux_color: '#FA6400', + bg_color: '#19C650', + bg_color_shallow: '#19C650', + promotion_color: '#19C650', + promotion_aux_color: '#FA6400', + main_color_shallow: '#F0FFF5',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail: { + goods_price: 'rgba(252,82,39,1)',//价格 + promotion_tag: '#19C650', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#FC5227', + goods_cart_num_corner: '#FC5227',//购物车数量角标 + goods_btn_color: '#19C650',//按钮颜色 + goods_btn_color_shallow: '#FA6400',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'blue': { + name: 'blue', + main_color: '#36ABFF', + aux_color: '#FA6400', + bg_color: '#36ABFF', + bg_color_shallow: '#36ABFF', + promotion_color: '#36ABFF ', + promotion_aux_color: '#FA6400', + main_color_shallow: '#E2F3FF', + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail: { + goods_price: 'rgba(252,82,39,1)',//价格 + promotion_tag: '#36ABFF', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#FC5227', + goods_cart_num_corner: '#FC5227',//购物车数量角标 + goods_btn_color: '#36ABFF',//按钮颜色 + goods_btn_color_shallow: '#FA6400',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'pink': { + name: 'pink', + main_color: '#FF407E', + aux_color: '#F7B500', + bg_color: '#FF407E',//主题背景 + bg_color_shallow: '#FF407E',//主题背景渐变浅色 + promotion_color: '#FF407E',//活动背景 + promotion_aux_color: '#F7B500',//活动背景辅色 + main_color_shallow: '#FFF5F8',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail: { + goods_price: 'rgba(252,82,39,1)',//价格 + promotion_tag: '#FF407E', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#FC5227', + goods_cart_num_corner: '#FC5227',//购物车数量角标 + goods_btn_color: '#FF407E',//按钮颜色 + goods_btn_color_shallow: '#F7B500',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'gold': { + name: 'gold', + main_color: '#CFAF70', + aux_color: '#444444', + bg_color: '#CFAF70',//主题背景 + bg_color_shallow: '#CFAF70',//主题背景渐变浅色 + promotion_color: '#CFAF70',//活动背景 + promotion_aux_color: '#444444',//活动背景辅色 + main_color_shallow: '#FFFAF1',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail: { + goods_price: 'rgba(252,82,39,1)',//价格 + promotion_tag: '#CFAF70', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#FC5227', + goods_cart_num_corner: '#FC5227',//购物车数量角标 + goods_btn_color: '#CFAF70',//按钮颜色 + goods_btn_color_shallow: '#444444',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'purple': { + name: 'purple', + main_color: '#A253FF', + aux_color: '#222222', + bg_color: '#A253FF',//主题背景 + bg_color_shallow: '#A253FF',//主题背景渐变浅色 + promotion_color: '#A253FF',//活动背景 + promotion_aux_color: '#222222',//活动背景辅色 + main_color_shallow: '#F8F3FF',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail: { + goods_price: 'rgba(252,82,39,1)',//价格 + promotion_tag: '#A253FF', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#FC5227', + goods_cart_num_corner: '#FC5227',//购物车数量角标 + goods_btn_color: '#A253FF',//按钮颜色 + goods_btn_color_shallow: '#222222',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'yellow': { + name: 'yellow', + main_color: '#FFD009', + aux_color: '#1D262E', + bg_color: '#FFD009',//主题背景 + bg_color_shallow: '#FFD009',//主题背景渐变浅色 + promotion_color: '#FFD009',//活动背景 + promotion_aux_color: '#1D262E',//活动背景辅色 + main_color_shallow: '#FFFBEF',//淡背景 + price_color: 'rgba(252,82,39,1)',//价格颜色 + btn_text_color: '#303133',//按钮文字颜色 + goods_detail: { + goods_price: 'rgba(252,82,39,1)',//价格 + promotion_tag: '#FFD009', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#FC5227', + goods_cart_num_corner: '#FC5227',//购物车数量角标 + goods_btn_color: '#FFD009',//按钮颜色 + goods_btn_color_shallow: '#1D262E',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#7c7878', + super_member_end_bg: '#201a18', + super_member_start_text_color: '#FFDBA6', + super_member_end_text_color: '#FFEBCA', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + }, + 'black': { + name: 'black', + main_color: '#222222', + aux_color: '#FFFFFF', + bg_color: '#222222',//主题背景 + bg_color_shallow: '#333333',//主题背景渐变浅色 + promotion_color: '#222222',//活动背景 + promotion_aux_color: '#FA8B00',//活动背景辅色 + main_color_shallow: '#efefef',//淡背景 + price_color: 'rgba(255,0,0,1)',//价格颜色 + btn_text_color: '#FFFFFF',//按钮文字颜色 + goods_detail: { + goods_price: 'rgba(255,0,0,1)',//价格 + promotion_tag: '#222222', + goods_card_bg: '#201A18',//会员卡背景 + goods_card_bg_shallow: '#7C7878',//会员卡背景浅色 + goods_card_color: '#FFD792', + goods_coupon: '#222222', + goods_cart_num_corner: '#FF0000',//购物车数量角标 + goods_btn_color: '#222222',//按钮颜色 + goods_btn_color_shallow: '#FA8B00',//副按钮颜色 + }, + pintuan: { + pintuan_label_bg: '#F7B500', + pintuan_label_color: '#FFFFFF', + pintuan_color: '#FA6400', + pintuan_promotion_color: '#FA3A1D',//活动背景 + pintuan_promotion_aux_color: '#FD9A01',//活动背景辅色 + }, + super_member: { + super_member_start_bg: '#fadcb5', + super_member_end_bg: '#f6bd74', + super_member_start_text_color: '#ab6126', + super_member_end_text_color: '#d19336', + }, + bargain: { + bargain_promotion_color: '#F0353E',//活动背景 + bargain_promotion_aux_color: '#FD9A01',//活动辅色 + }, + seckill: { + seckill_promotion_color: '#F83530',//活动背景 + seckill_promotion_aux_color: '#FD9A01',//活动辅色 + }, + giftcard: { + giftcard_promotion_color: '#FF3369',//活动背景 + giftcard_promotion_aux_color: '#F7B500',//活动辅色 + }, + groupby: { + groupby_promotion_color: '#E64136',//活动背景 + groupby_promotion_aux_color: '#F7B500',//活动辅色 + }, + } +} diff --git a/common/js/util.js b/common/js/util.js new file mode 100644 index 0000000..cbe0f01 --- /dev/null +++ b/common/js/util.js @@ -0,0 +1,990 @@ +import Config from './config.js' +import store from '@/store/index.js' +import Http from './http.js' +import { + Weixin +} from 'common/js/wx-jssdk.js'; + +export default { + /** + * 页面跳转 + * @param {string} to 跳转链接 /pages/idnex/index + * @param {Object} param 参数 {key : value, ...} + * @param {string} mode 模式 + */ + redirectTo(to, param, mode) { + let url = to; + let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/vr/index', '/pages/contact/contact', '/pages/member/index']; + if (param != undefined) { + Object.keys(param).forEach(function (key) { + if (url.indexOf('?') != -1) { + url += "&" + key + "=" + param[key]; + } else { + url += "?" + key + "=" + param[key]; + } + }); + } + for (let i = 0; i < tabbarList.length; i++) { + if (url.indexOf(tabbarList[i]) == 0) { + uni.switchTab({ + url + }); + return; + } + } + switch (mode) { + case 'tabbar': + // 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。 + uni.switchTab({ + url + }); + break; + case 'redirectTo': + // 关闭当前页面,跳转到应用内的某个页面。 + uni.redirectTo({ + url + }); + break; + case 'reLaunch': + // 关闭所有页面,打开到应用内的某个页面。 + uni.reLaunch({ + url + }); + break; + default: + // 保留当前页面,跳转到应用内的某个页面 + uni.navigateTo({ + url + }); + } + }, + /** + * 图片路径转换 + * @param {String} img_path 图片地址 + * @param {Object} params 参数,针对商品、相册里面的图片区分大中小,size: big、mid、small + */ + img(img_path, params) { + + + var path = ""; + if (img_path != undefined && img_path != "") { + if (img_path.split(',').length > 1) { + img_path = img_path.split(',')[0]; + } + if (params && img_path != this.getDefaultImage().goods) { + // 过滤默认图 + let arr = img_path.split("."); + let suffix = arr[arr.length - 1]; + arr.pop(); + arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size.toUpperCase(); + arr.push(suffix); + // if(img_path.indexOf('attachment') == -1){ + // img_path = arr.join("."); + // } + + } + if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) { + path = Config.imgDomain + "/" + img_path; + } else { + // console.log(img_path) + path = img_path; + } + } + + // path += '?t=' + parseInt(new Date().getTime() / 1000); + return path; + }, + /** + * 时间戳转日期格式 + * @param {Object} timeStamp + */ + timeStampTurnTime(timeStamp, type = "") { + if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) { + var date = new Date(); + date.setTime(timeStamp * 1000); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + m = m < 10 ? ('0' + m) : m; + var d = date.getDate(); + d = d < 10 ? ('0' + d) : d; + var h = date.getHours(); + h = h < 10 ? ('0' + h) : h; + var minute = date.getMinutes(); + var second = date.getSeconds(); + minute = minute < 10 ? ('0' + minute) : minute; + second = second < 10 ? ('0' + second) : second; + if (type) { + if (type == 'yearMonthDay') { + return y + '年' + m + '月' + d + '日'; + } + return y + '-' + m + '-' + d; + } else { + return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second; + } + } else { + return ""; + } + }, + /** + * 日期格式转时间戳 + * @param {Object} string + */ + timeTurnTimeStamp(string) { + var f = string.split(' ', 2); + var d = (f[0] ? f[0] : '').split('-', 3); + var t = (f[1] ? f[1] : '').split(':', 3); + return (new Date( + parseInt(d[0], 10) || null, + (parseInt(d[1], 10) || 1) - 1, + parseInt(d[2], 10) || null, + parseInt(t[0], 10) || null, + parseInt(t[1], 10) || null, + parseInt(t[2], 10) || null + )).getTime() / 1000; + }, + /** + * 倒计时 + * @param {Object} seconds 秒 + */ + countDown(seconds) { + let [day, hour, minute, second] = [0, 0, 0, 0] + if (seconds > 0) { + day = Math.floor(seconds / (60 * 60 * 24)) + hour = Math.floor(seconds / (60 * 60)) - (day * 24) + minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60) + second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60) + } + if (day < 10) { + day = '0' + day + } + if (hour < 10) { + hour = '0' + hour + } + if (minute < 10) { + minute = '0' + minute + } + if (second < 10) { + second = '0' + second + } + return { + d: day, + h: hour, + i: minute, + s: second + }; + }, + /** + * 数值去重 + * @param {Array} arr 数组 + * @param {string} field 字段 + */ + unique(arr, field) { + const res = new Map(); + return arr.filter((a) => !res.has(a[field]) && res.set(a[field], 1)); + }, + /** + * 判断值是否在数组中 + * @param {Object} elem + * @param {Object} arr + */ + inArray: function (elem, arr) { + return arr == null ? -1 : arr.indexOf(elem); + }, + /** + * 获取某天日期 + * @param {Object} day + */ + getDay: function (day) { + var today = new Date(); + var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day; + today.setTime(targetday_milliseconds); + + const doHandleMonth = function (month) { + var m = month; + if (month.toString().length == 1) { + m = "0" + month; + } + return m + } + + var tYear = today.getFullYear(); + var tMonth = today.getMonth(); + var tDate = today.getDate(); + var tWeek = today.getDay(); + var time = parseInt(today.getTime() / 1000); + tMonth = doHandleMonth(tMonth + 1); + tDate = doHandleMonth(tDate); + + const week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] + return { + 't': time, + 'y': tYear, + 'm': tMonth, + 'd': tDate, + 'w': week[tWeek] + }; + }, + /** + * 图片选择加上传 + * @param num + * @param params + * @param callback + * @param url + */ + upload: function (num, params, callback, url) { + // #ifdef H5 + var app_type = this.isWeiXin() ? 'wechat' : 'h5'; + var app_type_name = this.isWeiXin() ? '微信公众号' : 'H5'; + // #endif + + // #ifdef MP-WEIXIN + var app_type = 'weapp'; + var app_type_name = '微信小程序'; + // #endif + + // #ifdef MP-ALIPAY + var app_type = 'aliapp'; + var app_type_name = '支付宝小程序'; + // #endif + + // #ifdef MP-BAIDU + var app_type = 'baiduapp'; + var app_type_name = '百度小程序'; + // #endif + + // #ifdef MP-TOUTIAO + var app_type = 'MP-TOUTIAO'; + var app_type_name = '头条小程序'; + // #endif + + // #ifdef MP-QQ + var app_type = 'MP-QQ'; + var app_type_name = 'QQ小程序'; + // #endif + var data = { + token: store.state.token, + app_type: app_type, + app_type_name: app_type_name + } + data = Object.assign(data, params); + + var imgs_num = num; + var _self = this; + + uni.chooseImage({ + count: imgs_num, + sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有 + sourceType: ['album', 'camera'], //从相册或者拍照 + success: async function (res) { + const tempFilePaths = res.tempFilePaths; + var _data = data; + var imgs = []; + uni.showLoading({ + title: '图片上传中' + }) + for (var i = 0; i < tempFilePaths.length; i++) { + var path = await _self.upload_file_server(tempFilePaths[i], _data, params.path, + url); + imgs.push(path); + if (imgs.length == tempFilePaths.length) { + uni.hideLoading() + uni.showToast({ + title: '上传成功', + icon: 'none' + }) + typeof callback == 'function' && callback(imgs); + } + } + }, + fail: err => { + uni.hideLoading() + uni.showToast({ + title: '上传失败', + icon: 'none' + }) + } + }); + }, + //上传 + upload_file_server(tempFilePath, data, path, url = "", callback) { + if (url) { + var uploadUrl = Config.baseUrl + url + } else { + var uploadUrl = Config.baseUrl + '/api/upload/' + path + } + return new Promise((resolve, reject) => { + uni.uploadFile({ + url: uploadUrl, + filePath: tempFilePath, + name: 'file', + fileType: data.fileType || 'image', + formData: data, + success: function (res) { + var path_str = JSON.parse(res.data); + if (path_str.code >= 0) { + resolve(path_str.data.pic_path); + typeof callback == 'function' && callback(path_str.data.pic_path); + } else { + reject("error"); + } + } + }); + + }); + + }, + /** + * 复制 + * @param {Object} value + * @param {Object} callback + */ + copy(value, callback) { + // #ifdef H5 + var oInput = document.createElement('input'); //创建一个隐藏input(重要!) + oInput.value = value; //赋值 + oInput.setAttribute("readonly", "readonly"); + document.body.appendChild(oInput); + oInput.select(); // 选择对象 + document.execCommand("Copy"); // 执行浏览器复制命令 + oInput.className = 'oInput'; + oInput.style.display = 'none'; + uni.hideKeyboard(); + this.showToast({ + title: '复制成功' + }); + + typeof callback == 'function' && callback(); + // #endif + + // #ifdef MP || APP-PLUS + uni.setClipboardData({ + data: value, + success: () => { + typeof callback == 'function' && callback(); + } + }); + // #endif + }, + /** + * 是否是微信浏览器 + */ + isWeiXin() { + // #ifndef H5 + return false; + // #endif + var ua = navigator.userAgent.toLowerCase(); + if (ua.match(/MicroMessenger/i) == "micromessenger") { + return true; + } else { + return false; + } + }, + /** + * 显示消息提示框 + * @param {Object} params 参数 + */ + showToast(params = {}) { + params.title = params.title || ""; + params.icon = params.icon || "none"; + // params.position = params.position || 'bottom'; + params.duration = params.duration || 1500; + uni.showToast(params); + if (params.success) params.success(); + }, + /** + * 检测苹果X以上的手机 + */ + isIPhoneX() { + let res = uni.getSystemInfoSync(); + if (res.model.search('iPhone X') != -1) { + return true; + } + return false; + }, + //判断安卓还是iOS + isAndroid() { + let platform = uni.getSystemInfoSync().platform + if (platform == 'ios') { + return false; + } else if (platform == 'android') { + return true; + } + }, + /** + * 深度拷贝对象 + * @param {Object} obj + */ + deepClone(obj) { + const isObject = function (obj) { + return typeof obj == 'object'; + } + + if (!isObject(obj)) { + throw new Error('obj 不是一个对象!') + } + //判断传进来的是对象还是数组 + let isArray = Array.isArray(obj) + let cloneObj = isArray ? [] : {} + //通过for...in来拷贝 + for (let key in obj) { + cloneObj[key] = isObject(obj[key]) ? this.deepClone(obj[key]) : obj[key] + } + return cloneObj + }, + /** + * 自定义模板的跳转链接 + * @param {Object} link + */ + diyRedirectTo(link) { + + //if (link == null || Object.keys(link).length == 1) return; + + // 外部链接 + if (link.wap_url && link.wap_url.indexOf('http') != -1 || link.wap_url && link.wap_url.indexOf('http') != -1) { + // #ifdef H5 + window.location.href = link.wap_url; + // #endif + + // #ifdef MP + this.redirectTo('/pages_tool/webview/webview', { + src: encodeURIComponent(link.wap_url) + }); + // #endif + + } else if (link.appid) { + // 跳转其他小程序 + + uni.navigateToMiniProgram({ + appId: link.appid, + path: link.page + }) + + } else if (link.name == 'MOBILE' && !link.wap_url) { + // 拨打电话 + + uni.makePhoneCall({ + phoneNumber: link.mobile, + success: (res) => { + }, + fail: (res) => { + } + }); + + } else if (link.name == 'MEMBER_CONTACT') { + // 客服 + let servicerConfig = store.state.servicerConfig + let config = { + type: 'none' + }; + + // #ifdef H5 + config = servicerConfig.h5; + // #endif + + // #ifdef MP-WEIXIN + config = servicerConfig.weapp; + // #endif + + switch (config.type) { + case 'wxwork': + // 企业微信客服 + + // #ifdef H5 + window.location.href = config.wxwork_url; + // #endif + + // #ifdef MP-WEIXIN + wx.openCustomerServiceChat({ + extInfo: { + url: config.wxwork_url + }, + corpId: config.corpid, + showMessageCard: true, + sendMessageTitle: 'this.sendMessageTitle', + sendMessagePath: 'this.sendMessagePath', + sendMessageImg: 'this.sendMessageImg' + }); + // #endif + break; + case 'third': + // 第三方客服 + window.location.href = config.third_url; + break; + case 'niushop': + // Niushop客服 + this.redirectTo('/pages_tool/chat/room'); + break; + case 'weapp': + // 微信小程序,由于需要手动点击按钮触发,所以要跳转到中间页 + this.redirectTo(link.wap_url); + break; + default: + // 拨打客服电话 + let siteInfo = store.state.siteInfo; + if (siteInfo && siteInfo.site_tel) { + uni.makePhoneCall({ + phoneNumber: siteInfo.site_tel + }); + } else { + this.showToast({ + title: '抱歉,商家暂无客服,请线下联系', + }) + } + } + + } else if (link.wap_url) { + this.redirectTo(link.wap_url); + } + }, + /** + * 获取默认图 + */ + getDefaultImage() { + let defaultImg = store.state.defaultImg; + defaultImg.goods = this.img(defaultImg.goods); + defaultImg.head = this.img(defaultImg.head); + defaultImg.store = this.img(defaultImg.store); + defaultImg.article = this.img(defaultImg.article); + defaultImg.kefu = this.img(defaultImg.kefu); + defaultImg.phone = this.img(defaultImg.phone); + return defaultImg; + }, + /** + * 判断手机是否为iphoneX系列 + */ + uniappIsIPhoneX() { + let isIphoneX = false; + let systemInfo = uni.getSystemInfoSync(); + // #ifdef MP + if (systemInfo.model.search('iPhone X') != -1 || systemInfo.model.search('iPhone 11') != -1 || systemInfo.model.search('iPhone 12') != -1 || systemInfo.model.search('iPhone 13') != -1) { + isIphoneX = true; + } + // #endif + + // #ifdef H5 + var u = navigator.userAgent; + var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 + if (isIOS) { + if (systemInfo.screenWidth == 375 && systemInfo.screenHeight == 812 && systemInfo.pixelRatio == 3) { + isIphoneX = true; + } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 3) { + isIphoneX = true; + } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 2) { + isIphoneX = true; + } + } + // #endif + return isIphoneX; + }, + /** + * 判断手机是否为iphone11系列 + */ + uniappIsIPhone11() { + let isIphone11 = false; + let systemInfo = uni.getSystemInfoSync(); + // #ifdef MP + if (systemInfo.model.search('iPhone 11') != -1) { + isIphone11 = true; + } + // #endif + return isIphone11; + }, + // #ifdef H5 + //判断该浏览器是否为safaria浏览器 + isSafari() { + let res = uni.getSystemInfoSync(); + var ua = navigator.userAgent.toLowerCase(); + if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 && + ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 && + ua.indexOf('ios') === -1 && ua.indexOf('browser') === -1) { + return true; + } else { + return false; + } + }, + // #endif + numberFixed(e, f) { + if (!f) { + f = 0; + } + return Number(e).toFixed(f); + }, + /** + * 获取url参数 + */ + getUrlCode(callback) { + var url = location.search; + var theRequest = new Object(); + if (url.indexOf('?') != -1) { + var str = url.substr(1); + var strs = str.split('&'); + for (var i = 0; i < strs.length; i++) { + theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1]; + } + } + typeof callback == 'function' && callback(theRequest); + }, + /** + * 获取当前页面路由 + */ + getCurrRoute() { + let routes = getCurrentPages(); // 获取当前打开过的页面路由数组 + return routes.length ? routes[routes.length - 1].route : ''; + }, + goBack(backUrl = '/pages/index/index') { + if (getCurrentPages().length == 1) { + this.redirectTo(backUrl); + } else { + uni.navigateBack(); + } + }, + /** + * + * @param val 转化时间字符串 (转化时分秒) + * @returns {string} + */ + getTimeStr(val) { + var h = parseInt(val / 3600).toString(); + var m = parseInt((val % 3600) / 60).toString(); + if (m.length == 1) { + m = '0' + m; + } + if (h.length == 1) { + h = '0' + h; + } + return h + ':' + m; + }, + /** + * 获取定位信息 + */ + getLocation(param = {}) { + /*uni.getLocation({ + type: param.type ?? 'gcj02', + success: res => { + store.commit('setLocation', res); + typeof param.success == 'function' && param.success(res); + }, + fail: res => { + typeof param.fail == 'function' && param.fail(res); + }, + complete: res => { + typeof param.complete == 'function' && param.complete(res); + } + });*/ + }, + // 计算两个经纬度之间的距离 + getDistance(lat1, lng1, lat2, lng2) { + var radLat1 = lat1 * Math.PI / 180.0; + var radLat2 = lat2 * Math.PI / 180.0; + var a = radLat1 - radLat2; + var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0; + var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); + s = s * 6378.137; // EARTH_RADIUS; + s = Math.round(s * 10000) / 10000; + return s; + }, + //记录分享人 + onSourceMember(source_member) { + Http.sendRequest({ + url: '/api/Member/alterShareRelation', + data: { + share_member: source_member, + }, + success: res => { + if (res.code >= 0) { + uni.removeStorage({ + key: 'source_member', + success: res => { + console.log('删除成功', res) + } + }) + } + } + }) + }, + /** + * 微信订阅消息 + */ + subscribeMessage(keywords) { + // #ifdef MP-WEIXIN + let url = '/weapp/api/weapp/messagetmplids'; + // #endif + // #ifdef MP-ALIPAY + let url = '/aliapp/api/aliapp/messagetmplids'; + // #endif + Http.sendRequest({ + url, + data: { + keywords: keywords + }, + success: res => { + if (res.data.length) { + // #ifdef MP-WEIXIN + uni.requestSubscribeMessage({ + tmplIds: res.data, + success: (res) => { + console.log("res", res) + }, + fail: (res) => { + console.log('fail', res) + } + }) + // #endif + + // #ifdef MP-ALIPAY + my.requestSubscribeMessage({ + entityIds: res.data, + success: res => { + console.log("res", res) + }, + fail: res => { + console.log('fail', res) + } + }); + // #endif + } + } + }) + }, + /** + * 获取小程序分享内容数据 + */ + getMpShare(path) { + //如果没有特别指定 则获取当前页面的路由 + if (!path) { + let route = this.getCurrentRoute(); + path = route.path; + if (path == '/pages/member/index') { + return new Promise((resolve, reject) => { + resolve({}) + }); + } + } + return new Promise((resolve, reject) => { + Http.sendRequest({ + url: "/weapp/api/weapp/share", + data: { + path: path + }, + success: res => { + if (res.code >= 0) { + let shareConfig = res.data.data; + if (shareConfig) { + //分享给好友 + let appMessageData = { + title: shareConfig.title, + path: shareConfig.path, + imageUrl: shareConfig.imageUrl, + success: res => { + }, + fail: res => { + } + } + //分享到朋友圈 + let query = ''; + if (shareConfig.path.indexOf('?') > 0) { + query = shareConfig.path.split('?')[1]; + } + let timeLineData = { + title: shareConfig.title, + query: shareConfig.path, + imageUrl: shareConfig.imageUrl, + } + resolve({ + appMessage: appMessageData, + timeLine: timeLineData, + }) + } else { + reject(res.data); + } + } else { + reject(res.data) + } + } + }); + }) + }, + /** + * 设置公众号分享 + * @param shareData + * @param callback + */ + setPublicShare(shareData, callback) { + if (!this.isWeiXin()) return; + Http.sendRequest({ + url: '/wechat/api/wechat/jssdkconfig', + data: { + url: uni.getSystemInfoSync().platform == 'ios' ? uni.getStorageSync('initUrl') : window.location + .href + }, + success: res => { + if (res.code == 0) { + var wxJS = new Weixin(); + wxJS.init(res.data); + wxJS.weixin.showOptionMenu(); + + wxJS.setShareData({ + title: shareData.title ?? '', + desc: shareData.desc ?? '', + link: shareData.link ?? location.href, + imgUrl: shareData.imgUrl ? this.img(shareData.imgUrl) : '' + }, (res) => { + typeof callback == 'function' && callback(res); + }) + } + } + }) + }, + //获取当前路由 + getCurrentRoute() { + let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组 + let currentRoute = currentRoutes[currentRoutes.length - 1].route //获取当前页面路由 + let currentParam = currentRoutes[currentRoutes.length - 1].options; //获取路由参数 + // 拼接参数 + let param = []; + for (let key in currentParam) { + param.push(key + '=' + currentParam[key]) + } + let currentPath = '/' + currentRoute; + let currentQuery = param.join('&'); + if (currentQuery) currentPath += '?' + currentQuery; + + return { + path: currentPath, + query: currentQuery, + } + }, + //获取分享路由 + getCurrentShareRoute(member_id) { + let route = this.getCurrentRoute(); + //去掉原来的分享人数据 + route.path = route.path.replace(/[?|&]source_member=\d+/, ''); + if (member_id) { + //路径的处理 + if (route.path.indexOf('?') > 0) { + route.path += '&'; + } else { + route.path += '?'; + } + route.path += 'source_member=' + member_id; + //参数的处理 + if (route.query) { + route.query += '&'; + } + route.query += 'source_member=' + member_id; + } + return route; + }, + /** + * 对象转style字符串 + * @param {Object} obj + */ + objToStyle(obj) { + let s = []; + for (let i in obj) { + s.push(i + ':' + obj[i]); + } + return s.join(';') + }, + /** + * 颜色减值 + * @param {Object} c1 + * @param {Object} c2 + * @param {Object} ratio + */ + colourBlend(c1, c2, ratio) { + ratio = Math.max(Math.min(Number(ratio), 1), 0) + let r1 = parseInt(c1.substring(1, 3), 16) + let g1 = parseInt(c1.substring(3, 5), 16) + let b1 = parseInt(c1.substring(5, 7), 16) + let r2 = parseInt(c2.substring(1, 3), 16) + let g2 = parseInt(c2.substring(3, 5), 16) + let b2 = parseInt(c2.substring(5, 7), 16) + let r = Math.round(r1 * (1 - ratio) + r2 * ratio) + let g = Math.round(g1 * (1 - ratio) + g2 * ratio) + let b = Math.round(b1 * (1 - ratio) + b2 * ratio) + r = ('0' + (r || 0).toString(16)).slice(-2) + g = ('0' + (g || 0).toString(16)).slice(-2) + b = ('0' + (b || 0).toString(16)).slice(-2) + return '#' + r + g + b + }, + /** + * 生成贝塞尔曲线轨迹 + * @param {Object} points + * @param {Object} times + */ + bezier(points, times) { + var bezier_points = []; + var points_D = []; + var points_E = []; + const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0][ + 'y' + ], 2)); + // 邻控制BC点间距 + const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1][ + 'y' + ], 2)); + // D每次在AB方向上移动的距离 + if (points[0]['x'] > points[2]['x']) { + var EACH_MOVE_AD = -(DIST_AB / times); + // E每次在BC方向上移动的距离 + var EACH_MOVE_BE = -(DIST_BC / times); + } else { + var EACH_MOVE_AD = +(DIST_AB / times); + // E每次在BC方向上移动的距离 + var EACH_MOVE_BE = +(DIST_BC / times); + } + // 点AB的正切 + const TAN_AB = (points[1]['y'] - points[0]['y']) / (points[1]['x'] - points[0]['x']); + // 点BC的正切 + const TAN_BC = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x']); + // 点AB的弧度值 + const RADIUS_AB = Math.atan(TAN_AB); + // 点BC的弧度值 + const RADIUS_BC = Math.atan(TAN_BC); + // 每次执行 + for (var i = 1; i <= times; i++) { + // AD的距离 + var dist_AD = EACH_MOVE_AD * i; + // BE的距离 + var dist_BE = EACH_MOVE_BE * i; + // D点的坐标 + var point_D = {}; + point_D['x'] = dist_AD * Math.cos(RADIUS_AB) + points[0]['x']; + point_D['y'] = dist_AD * Math.sin(RADIUS_AB) + points[0]['y']; + points_D.push(point_D); + // E点的坐标 + var point_E = {}; + point_E['x'] = dist_BE * Math.cos(RADIUS_BC) + points[1]['x']; + point_E['y'] = dist_BE * Math.sin(RADIUS_BC) + points[1]['y']; + points_E.push(point_E); + // 此时线段DE的正切值 + var tan_DE = (point_E['y'] - point_D['y']) / (point_E['x'] - point_D['x']); + // tan_DE的弧度值 + var radius_DE = Math.atan(tan_DE); + // 地市DE的间距 + var dist_DE = Math.sqrt(Math.pow((point_E['x'] - point_D['x']), 2) + Math.pow((point_E['y'] - point_D['y']), + 2)); + // 此时DF的距离 + var dist_DF = (dist_AD / DIST_AB) * dist_DE; + // 此时DF点的坐标 + var point_F = {}; + point_F['x'] = dist_DF * Math.cos(radius_DE) + point_D['x']; + point_F['y'] = dist_DF * Math.sin(radius_DE) + point_D['y']; + bezier_points.push(point_F); + } + return { + 'bezier_points': bezier_points + }; + }, + /** + * 验证手机号 + * @param {string} mobile 被验证的mobile + * @return {object} 验证后的结果 + **/ + verifyMobile(mobile) { + var parse = /^\d{11}$/.test(mobile); + return parse; + } +} \ No newline at end of file diff --git a/common/js/validate.js b/common/js/validate.js new file mode 100644 index 0000000..f47d1fe --- /dev/null +++ b/common/js/validate.js @@ -0,0 +1,165 @@ +/** + * 数据验证(表单验证) + */ +module.exports = { + error: '', + check: function (data, rule) { + for (var i = 0; i < rule.length; i++) { + if (!rule[i].checkType) { + return true; + } + if (!rule[i].name) { + return true; + } + if (!rule[i].errorMsg) { + return true; + } + if (!data[rule[i].name]) { + this.error = rule[i].errorMsg; + return false; + } + switch (rule[i].checkType) { + case 'custom': + if (typeof rule[i].validate == 'function') { + if (!rule[i].validate(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + } + break; + case 'required': + var reg = new RegExp('/[\S]+/'); + if (reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'string': + var reg = new RegExp('^.{' + rule[i].checkRule + '}$'); + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'int': + var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + rule[i].checkRule + '}$'); + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'between': + if (!this.isNumber(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + var minMax = rule[i].checkRule.split(','); + minMax[0] = Number(minMax[0]); + minMax[1] = Number(minMax[1]); + if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'betweenD': + var reg = /^-?[1-9][0-9]?$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + var minMax = rule[i].checkRule.split(','); + minMax[0] = Number(minMax[0]); + minMax[1] = Number(minMax[1]); + if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'betweenF': + var reg = /^-?[0-9][0-9]?.+[0-9]+$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + var minMax = rule[i].checkRule.split(','); + minMax[0] = Number(minMax[0]); + minMax[1] = Number(minMax[1]); + if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'same': + if (data[rule[i].name] != rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'notsame': + if (data[rule[i].name] == rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'email': + var reg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'phoneno': + var reg = /^\d{11}$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'zipcode': + var reg = /^[0-9]{6}$/; + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'reg': + var reg = new RegExp(rule[i].checkRule); + if (!reg.test(data[rule[i].name])) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'in': + if (rule[i].checkRule.indexOf(data[rule[i].name]) == -1) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'notnull': + if (data[rule[i].name] == 0 || data[rule[i].name] == undefined || data[rule[i].name] == null || data[rule[i].name] + .length < 1) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'lengthMin': + if (data[rule[i].name].length < rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + case 'lengthMax': + if (data[rule[i].name].length > rule[i].checkRule) { + this.error = rule[i].errorMsg; + return false; + } + break; + } + } + return true; + }, + isNumber: function (checkVal) { + var reg = /^-?[1-9][0-9]?.?[0-9]*$/; + return reg.test(checkVal); + } +} diff --git a/common/js/wx-jssdk.js b/common/js/wx-jssdk.js new file mode 100644 index 0000000..420b125 --- /dev/null +++ b/common/js/wx-jssdk.js @@ -0,0 +1,119 @@ +/** + * 微信jssdk调用 + */ +let Weixin = function () { + var wx = require('jweixin-module'); + + this.weixin = wx; + + this.init = function (params) { + wx.config({ + debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 + appId: params.appId, // 必填,公众号的唯一标识 + timestamp: params.timestamp, // 必填,生成签名的时间戳 + nonceStr: params.nonceStr, // 必填,生成签名的随机串 + signature: params.signature, // 必填,签名 + jsApiList: ['chooseWXPay', 'openAddress', 'updateAppMessageShareData', + 'updateTimelineShareData', 'scanQRCode', 'hideMenuItems' + ] // 必填,需要使用的JS接口列表 + }); + } + + /** + * 发起支付 + * @param jsApiParame + * @param callback + * @param cancel + */ + this.pay = function (jsApiParame, callback, cancel) { + wx.ready(function () { + wx.chooseWXPay({ + timestamp: jsApiParame + .timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 + nonceStr: jsApiParame.nonceStr, // 支付签名随机串,不长于 32 位 + package: jsApiParame.package, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) + signType: jsApiParame.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' + paySign: jsApiParame.paySign, // 支付签名 + success: function (res) { + typeof callback == 'function' && callback(res); + }, + cancel: function (res) { + typeof cancel == 'function' && cancel(res); + } + }); + }) + } + + /** + * 获取收货地址 + * @param {Object} callback + */ + this.openAddress = function (callback) { + wx.ready(function () { + wx.openAddress({ + success: function (res) { + typeof callback == 'function' && callback(res); + }, + fail: (res) => { + console.log('获取收货地址 fail',res); + alert(JSON.stringify(res)) + } + }); + }) + } + + /** + * 分享给好友 + * @param {Object} params + * @param {Object} callback + */ + this.setShareData = function (params, callback) { + + wx.ready(function () { + // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容 + wx.updateAppMessageShareData({ + title: params.title || '', // 分享标题 + desc: params.desc || '', // 分享描述 + link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 + imgUrl: params.imgUrl || '', // 分享图标 + success: function (res) { + typeof callback == 'function' && callback(res); + }, + fail: function (err) { + } + }) + + // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容 + wx.updateTimelineShareData({ + title: params.title || '', // 分享标题 + link: params.link || '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 + imgUrl: params.imgUrl || '', // 分享图标 + success: function (res) { + typeof callback == 'function' && callback(res); + } + }) + + }); + } + + /** + * 扫一扫 + * @param {Object} callback + */ + this.scanQRCode = function (callback) { + wx.ready(function () { + wx.scanQRCode({ + needResult: 1, + scanType: ["qrCode"], + success: function (res) { + typeof callback == 'function' && callback(res); + } + }); + }) + } + +} + +export { + Weixin +} \ No newline at end of file diff --git a/components/common-payment/common-payment - 副本.vue b/components/common-payment/common-payment - 副本.vue new file mode 100644 index 0000000..4db3da0 --- /dev/null +++ b/components/common-payment/common-payment - 副本.vue @@ -0,0 +1,638 @@ + + + + + + + 确认订单 + + + + + + + + + + + + + + 购买虚拟类商品需填写手机号,方便商家与您联系 + + + + + + 手机号码 + + + + + + + + + + {{ item.title }} + + + + + + + + + + {{ memberAddress.name ? memberAddress.name : '' }} + {{ memberAddress.mobile ? memberAddress.mobile : '' }} + + {{ memberAddress.full_address ? memberAddress.full_address : '' }} + {{ memberAddress.address ? memberAddress.address : '' }} + + + + + + 请设置收货地址 + + + + + + + + + + + + + 由 + {{ storeInfo.store_name }} + 提供配送 + + + 点击切换 + + + + + + 您的附近没有可配送的门店,请选择其他配送方式 + + + + + + {{ localMemberAddress.name ? localMemberAddress.name : '' }} + + {{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }} + + + {{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }} + {{ localMemberAddress.address ? localMemberAddress.address : '' }} + + + + + + + 送达时间 + + {{ deliveryTime ? deliveryTime : '请选择送达时间' }} + + + + + + + 请设置收货地址 + + + + + + + + + + + + + + + + {{ storeInfo.store_name }} + + + 营业时间:{{ storeInfo.open_date }} + {{ storeInfo.full_address }} {{ storeInfo.address }} + + + + + + + + + 姓名 + + + + + + 预留手机 + + + + + 提货时间 + + {{ deliveryTime }} + + + + + 当前无自提门店,请选择其它配送方式 + + + + + + + + + 门店 + + + + + + + + + + + {{ goodsItem.sku_name }} + + + + {{ x.spec_value_name }} + + + + + + + 该商品不支持{{ orderCreateData.delivery.delivery_type_name }} + + + + + {{ goodsItem.error.message }} + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsItem.price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsItem.price).toFixed(2).split('.')[1] }} + + + x + {{ goodsItem.num }} + + + + + + 次卡抵扣 + + + 次卡抵扣{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}张/{{ calculateGoodsData.goods_list[goodsIndex].card_use_num }}次 + -¥{{ calculateGoodsData.goods_list[goodsIndex].card_promotion_money | moneyFormat }} + + 请选择次卡 + + + + + + + + + + + + + + + 买家留言 + + {{ orderCreateData.buyer_message }} + 无留言 + + + + + + + + {{ paymentData.system_form.form_name }} + + + + + + + + 优惠券 + + + 已使用优惠券,优惠 + {{ $lang('common.currencySymbol') }} + {{ (calculateData && calculateData.coupon_money ? calculateData.coupon_money : 0) | moneyFormat }} + + 不使用优惠券 + + + + + 活动优惠 + + {{ promotionInfo.title }} + + + + + + 使用{{ parseInt(calculateGoodsData.max_usable_point) }}积分可抵扣 + {{ $lang('common.currencySymbol') }} + {{ calculateData.point_money | moneyFormat }} + + + + + + 发票 + + {{ orderCreateData.invoice_type == 1 ? '纸质' : '电子' }}发票({{ orderCreateData.invoice_content }}) + 无需发票 + + + + + + + + + + + 开通{{ paymentData.recommend_member_card.level_name }} + 本单预计可省 + {{ paymentData.recommend_member_card.discount_money | moneyFormat }} + 元 + + + + + + {{ item.title }} + {{ $lang('common.currencySymbol') }}{{ parseFloat(item.value) }}/{{ item.unit }} + + + + + + + + + + 商品金额 + + {{ $lang('common.currencySymbol') }} + {{ calculateData.goods_money | moneyFormat }} + + + + 运费 + + + + {{ $lang('common.currencySymbol') }} + {{ calculateData.delivery_money | moneyFormat }} + + + + + 税费 + ({{ goodsData.invoice.invoice_rate }}%) + + + + + {{ $lang('common.currencySymbol') }} + {{ calculateData.invoice_money | moneyFormat }} + + + + 发票邮寄费 + + + + {{ $lang('common.currencySymbol') }} + {{ calculateData.invoice_delivery_money | moneyFormat }} + + + + 优惠 + + - + {{ $lang('common.currencySymbol') }} + {{ calculateData.promotion_money | moneyFormat }} + + + + 优惠券 + + - + {{ $lang('common.currencySymbol') }} + {{ calculateData.coupon_money | moneyFormat }} + + + + 积分抵扣 + + - + {{ $lang('common.currencySymbol') }} + {{ calculateData.point_money | moneyFormat }} + + + + 会员卡 + + + + {{ $lang('common.currencySymbol') }} + {{ calculateData.member_card_money | moneyFormat }} + + + + + + 购买前请先阅读《{{ transactionAgreement.title }}》,下单即代表同意该协议 + + + + 共{{ calculateData.goods_num }}件 + 合计: + {{ $lang('common.currencySymbol') }} + {{ parseFloat(calculateData.pay_money).toFixed(2).split('.')[0] }} + .{{ parseFloat(calculateData.pay_money).toFixed(2).split('.')[1] }} + + + 提交订单 + 差{{ surplusStartMoney() | moneyFormat }}起送 + + + + + + + + + + + + + 活动优惠 + + + + + + {{ promotionInfo.title }} + + + + + + + + + 确定 + + + + + + + + + 已为您甄选出附近所有相关门店 + + + + + + + + + + + + {{ item.store_name }} + ({{ item.distance }}km) + + + 营业时间:{{ item.open_date }} + 地址:{{ item.full_address }}{{ item.address }} + + + + + + + + + + + + + + + + + + + + + + + + 买家留言 + + + + + + + + + + + + + 确定 + + + + + + + + + 优惠券 + + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(couponItem.money) }} + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(couponItem.money) }} + + + {{ parseFloat(couponItem.discount) }} + 折 + + + + 满{{ couponItem.at_least }}可用 + + + 无门槛 + + + + + + {{ couponItem.coupon_name }} + 最多可抵¥{{ couponItem.discount_limit }} + 有效期:{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : '长期有效' }} + + + + + + 暂无可用的优惠券 + + + + 确定 + + + + + + + + + + + + {{ transactionAgreement.title }} + + + + + + + + + + + + + + 买家信息 + + + + + + + 确定 + + + + + + + + 选择次卡 + + + + + + {{ item.goods_name }} + + 不限次数 + 剩余{{ item.num - item.use_num }}次 + 剩余{{ item.total_num - item.total_use_num }}次 + | + {{ item.end_time ? $util.timeStampTurnTime(item.end_time) : '长期有效' }} + + + + + + + 确定 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/common-payment/common-payment.vue b/components/common-payment/common-payment.vue new file mode 100644 index 0000000..ff86c64 --- /dev/null +++ b/components/common-payment/common-payment.vue @@ -0,0 +1,658 @@ + + + + + + + 确认订单 + + + + + + + + + + + + + + 购买虚拟类商品需填写手机号,方便商家与您联系 + + + + + + 手机号码 + + + + + + + + + + {{ item.title }} + + + + + + + + + + {{ memberAddress.name ? memberAddress.name : '' }} + {{ memberAddress.mobile ? memberAddress.mobile : '' }} + + {{ memberAddress.full_address ? memberAddress.full_address : '' }} + {{ memberAddress.address ? memberAddress.address : '' }} + + + + + + 请设置收货地址 + + + + + + + + + + + + + 由 + {{ storeInfo.store_name }} + 提供配送 + + + 点击切换 + + + + + + 您的附近没有可配送的门店,请选择其他配送方式 + + + + + + {{ localMemberAddress.name ? localMemberAddress.name : '' }} + + {{ localMemberAddress.mobile ? localMemberAddress.mobile : '' }} + + + {{ localMemberAddress.full_address ? localMemberAddress.full_address : '' }} + {{ localMemberAddress.address ? localMemberAddress.address : '' }} + + + + + + + 送达时间 + + {{ deliveryTime ? deliveryTime : '请选择送达时间' }} + + + + + + + 请设置收货地址 + + + + + + + + + + + + + + + + {{ storeInfo.store_name }} + + + 营业时间:{{ storeInfo.open_date }} + {{ storeInfo.full_address }} {{ storeInfo.address }} + + + + + + + + + 姓名 + + + + + + 预留手机 + + + + + 提货时间 + + {{ deliveryTime }} + + + + + 当前无自提门店,请选择其它配送方式 + + + + + + + + + + {{calculateGoodsData.site_name}} + + + + + + + + + + + {{ goodsItem.sku_name }} + + + + {{ x.spec_value_name }} + + + + + + + 该商品不支持{{ orderCreateData.delivery.delivery_type_name }} + + + + + {{ goodsItem.error.message }} + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsItem.price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsItem.price).toFixed(2).split('.')[1] }} + + + x + {{ goodsItem.num }} + + + + + + + + + + + + + + + + + + + 买家留言 + + {{ orderCreateData.buyer_message[calculateGoodsData.merch_id] }} + 无留言 + + + + + 优惠券 + + + 已选择1张优惠券 + + + 不使用优惠券 + + + + + + + + 共{{ calculateGoodsData.goods_num }}件 + 小计: + {{ $lang('common.currencySymbol') }} + {{ calculateGoodsData.goods_money | moneyFormat }} + + + + + + + + + + + + {{ paymentData.system_form.form_name }} + + + + + + + + + + + 开通{{ paymentData.recommend_member_card.level_name }} + 本单预计可省 + {{ paymentData.recommend_member_card.discount_money | moneyFormat }} + 元 + + + + + + {{ item.title }} + {{ $lang('common.currencySymbol') }}{{ parseFloat(item.value) }}/{{ item.unit }} + + + + + + + + + + 商品金额 + + {{ $lang('common.currencySymbol') }} + {{ calculateData.goods_money | moneyFormat }} + + + + 运费 + + + + {{ $lang('common.currencySymbol') }} + {{ calculateData.delivery_money | moneyFormat }} + + + + + + 优惠 + + - + {{ $lang('common.currencySymbol') }} + {{ calculateData.promotion_money | moneyFormat }} + + + + 优惠券 + + - + {{ $lang('common.currencySymbol') }} + {{ calculateData.coupon_money | moneyFormat }} + + + + 积分抵扣 + + - + {{ $lang('common.currencySymbol') }} + {{ calculateData.point_money | moneyFormat }} + + + + + + 购买前请先阅读《{{ transactionAgreement.title }}》,下单即代表同意该协议 + + + + 共{{ calculateData.goods_num }}件 + 合计: + {{ $lang('common.currencySymbol') }} + {{ parseFloat(calculateData.pay_money).toFixed(2).split('.')[0] }} + .{{ parseFloat(calculateData.pay_money).toFixed(2).split('.')[1] }} + + + 提交订单 + + + + + + + + + + + + + + 活动优惠 + + + + + + {{ promotionInfo.title }} + + + + + + + + + 确定 + + + + + + + + + 已为您甄选出附近所有相关门店 + + + + + + + + + + + + {{ item.store_name }} + ({{ item.distance }}km) + + + 营业时间:{{ item.open_date }} + 地址:{{ item.full_address }}{{ item.address }} + + + + + + + + + + + + + + + + + + + + + + + + 买家留言 + + + + + + + + + + + + + 确定 + + + + + + + + + 优惠券 + + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(couponItem.money) }} + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(couponItem.money) }} + + + {{ parseFloat(couponItem.discount) }} + 折 + + + + 满{{ couponItem.at_least }}可用 + + + 无门槛 + + + + + + {{ couponItem.coupon_name }} + 最多可抵¥{{ couponItem.discount_limit }} + 有效期:{{ couponItem.end_time ? $util.timeStampTurnTime(couponItem.end_time) : '长期有效' }} + + + + + + 暂无可用的优惠券 + + + + 确定 + + + + + + + + + + + + {{ transactionAgreement.title }} + + + + + + + + + + + + + + 买家信息 + + + + + + + 确定 + + + + + + + + 选择次卡 + + + + + + {{ item.goods_name }} + + 不限次数 + 剩余{{ item.num - item.use_num }}次 + 剩余{{ item.total_num - item.total_use_num }}次 + | + {{ item.end_time ? $util.timeStampTurnTime(item.end_time) : '长期有效' }} + + + + + + + 确定 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/common-payment/payment.js b/components/common-payment/payment.js new file mode 100644 index 0000000..eb91860 --- /dev/null +++ b/components/common-payment/payment.js @@ -0,0 +1,1078 @@ +import htmlParser from '@/common/js/html-parser'; + +export default { + options: { + styleIsolation: 'shared' + }, + data() { + return { + outTradeNo: '', + isIphoneX: false, + orderCreateData: { + is_balance: 0, + is_point: 1, + is_invoice: 0, // 是否需要发票 0 无发票 1 有发票 + invoice_type: 0, // 发票类型 1 纸质 2 电子 + invoice_title_type: 1, // 抬头类型 1 个人 2 企业 + is_tax_invoice: 0, // 是否需要增值税专用发票 0 不需要 1 需要 + /*coupon: { + coupon_id: 0 + },*/ + coupon: [], + delivery: {}, + member_goods_card: {}, // 会员次卡 + order_key: '', + buyer_message: '' + }, + paymentData: null, + calculateData: null, + tempData: null, + storeId: 0, + deliveryTime: '', // 提货时间 + memberAddress: null, // 会员收货地址 + localMemberAddress: null, // 会员本地配送收货地址 + isRepeat: false, + promotionInfo: null, + transactionAgreement: {}, // 购买须知 + tempFormData: null, + menuButtonBounding: {}, // 小程序胶囊属性 + storeConfig: null, + localConfig: null, + selectGoodsCard: { + skuId: 0, + itemId: 0, + cardList: {} + }, // 当前选择的次卡 + storeData: [], + latitude: '', + longitude: '', + coupon_list: [], + modules: [], + + //商户 + shop_goods_list:[], + merchCoupon: { + merch_id: 0, + data: [] + }, + selectCouponId:0 + } + }, + inject: ['promotion'], + created() { + // #ifdef MP + this.menuButtonBounding = uni.getMenuButtonBoundingClientRect(); + // #endif + this.isIphoneX = this.$util.uniappIsIPhoneX() + if (this.storeToken) { + Object.assign(this.orderCreateData, uni.getStorageSync(this.createDataKey)) + if (this.location) { + this.orderCreateData.latitude = this.location.latitude; + this.orderCreateData.longitude = this.location.longitude; + this.latitude = this.location.latitude; + this.longitude = this.location.longitude; + } + this.payment(); + } else { + this.$nextTick(() => { + this.$refs.loadingCover.hide(); + this.$refs.login.open(this.$util.getCurrentRoute().path) + }) + } + this.getTransactionAgreement(); + }, + computed: { + goodsData() { + if (this.paymentData) { + this.paymentData.goods_list.forEach(item => { + if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format); + }) + return this.paymentData; + } + }, + calculateGoodsData() { + if (this.calculateData) { + this.calculateData.goods_list.forEach(item => { + if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format); + }) + return this.calculateData; + } + }, + // 余额可抵扣金额 + balanceDeduct() { + if (this.calculateData) { + if (this.calculateData.member_account && this.calculateData.member_account.balance_total <= parseFloat(this.calculateData.order_money).toFixed(2)) { + return parseFloat(this.calculateData.member_account.balance_total).toFixed(2); + } else { + return parseFloat(this.calculateData.order_money).toFixed(2); + } + } + }, + // 门店列表 + storeList() { + return this.getStoreList(); + }, + // 门店信息 + storeInfo() { + let storeList = this.getStoreList(); + if (storeList && this.orderCreateData.delivery && this.orderCreateData.delivery.delivery_type != 'express' && this.storeId) { + return storeList[this.orderCreateData.delivery.store_id]; + } + return null; + }, + // 会员卡购买周期 + cardChargeType() { + if (this.paymentData && this.paymentData.recommend_member_card && Object.keys(this.paymentData.recommend_member_card).length > 0) { + let charge_rule_arr = []; + let charge_rule = this.paymentData.recommend_member_card.charge_rule; + Object.keys(charge_rule).forEach((key, index) => { + switch (key) { + case 'week': + charge_rule_arr.push({ + 'key': key, + 'value': charge_rule[key], + 'title': '周卡', + unit: '周' + }); + break; + case 'month': + charge_rule_arr.push({ + 'key': key, + 'value': charge_rule[key], + 'title': '月卡', + unit: '月' + }); + break; + case 'quarter': + charge_rule_arr.push({ + 'key': key, + 'value': charge_rule[key], + 'title': '季卡', + unit: '季' + }); + break; + case 'year': + charge_rule_arr.push({ + 'key': key, + 'value': charge_rule[key], + 'title': '年卡', + unit: '年' + }); + break; + } + }) + return charge_rule_arr; + } + } + }, + watch: { + storeToken: function (nVal, oVal) { + this.payment(); + }, + deliveryTime: function (nVal) { + if (!nVal) this.$refs.timePopup.refresh(); + }, + location: function (nVal) { + if (nVal) { + this.orderCreateData.latitude = nVal.latitude; + this.orderCreateData.longitude = nVal.longitude; + this.latitude = nVal.latitude; + this.longitude = nVal.longitude; + this.payment(); + } + }, + calculateGoodsData(nVal) { + if (nVal && nVal.local_config && nVal.local_config.info.time_is_open && !this.deliveryTime) this.localtime('no'); + } + }, + methods: { + //多商户商品分类 + goodsSpecFormat(goods_list){ + goods_list.forEach(item => { + if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format); + }) + return goods_list + }, + /** + * 父级页面onShow调用 + */ + pageShow() { + if (uni.getStorageSync('addressBack')) { + uni.removeStorageSync('addressBack'); + this.payment(); + } + }, + /** + * 获取订单结算数据 + */ + payment() { + this.$api.sendRequest({ + url: this.api.payment, + data: this.handleCreateData(), + success: res => { + if (res.code == 0 && res.data) { + let data = res.data; + + // #ifdef MP-WEIXIN + var scene = uni.getStorageSync('is_test') ? 1175 : wx.getLaunchOptionsSync().scene; + if ([1175, 1176, 1177, 1191, 1195].indexOf(scene) != -1 && data.delivery.express_type) { + data.delivery.express_type = data.delivery.express_type.filter(item => item.name == 'express'); + } + // #endif + + if (data) { + // 配送方式 + if (data.delivery.express_type && data.delivery.express_type.length) { + let deliveryStorage = uni.getStorageSync('delivery'); + let delivery = data.delivery.express_type[0]; + data.delivery.express_type.forEach(item => { + if (deliveryStorage && item.name == deliveryStorage.delivery_type) { + delivery = item; + } + if (item.name == 'local') this.localConfig = item; + if (item.name == 'store') this.storeConfig = item; + }) + this.selectDeliveryType(delivery, false, data.member_account); + } + } + + // 地址、手机号 + if (data.is_virtual) { + this.orderCreateData.member_address = { + mobile: data.member_account.mobile ? data.member_account.mobile : '' + } + } + + //记录订单key + this.orderCreateData.order_key = data.order_key; + + this.modules = data.modules; + + //记录多商户优惠券 + this.orderCreateData.coupon = data.coupon + + //查询优惠券 + this.getCouponList(); + + // 处理表单数据 + data = this.handleGoodsFormData(data); + + // 该方法在父级组件中 + this.promotionInfo = this.promotion(data); + + this.paymentData = data; + + this.$forceUpdate(); + this.calculate(); + } else { + this.$util.showToast({ + title: res.message + }); + + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1000) + } + } + }) + }, + //查询优惠券 + getCouponList() { + //查询优惠券 + if (this.modules.indexOf('coupon') != -1) { + this.$api.sendRequest({ + url: '/api/ordercreate/getcouponlist', + data: this.orderCreateData, + success: res => { + if (res.code == 0 && res.data) { + let data = res.data; + this.coupon_list = data; + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + + // this.orderCreateData.coupon.coupon_id = 0; + } + + }, + /** + * 处理商品表单数据 + * @param {Object} data + */ + handleGoodsFormData(data) { + let goodsFormData = uni.getStorageSync('goodFormData'); + data.goods_list.forEach(item => { + if (item.goods_form) { + let formData = {}; + if (item.form_data) { + item.form_data.map(formIem => { + formData[formIem.id] = formIem; + }) + } else if (goodsFormData && goodsFormData.goods_id == item.goods_id) { + goodsFormData.form_data.map(formIem => { + formData[formIem.id] = formIem; + }) + } + if (Object.keys(formData).length) { + item.goods_form.json_data.forEach(formIem => { + if (formData[formIem.id]) { + formIem.val = formData[formIem.id].val; + } + }) + } + } + }); + return data; + }, + /** + * 订单创建 + */ + calculate() { + this.$api.sendRequest({ + url: this.api.calculate, + data: this.handleCreateData(), + success: res => { + if (this.$refs.loadingCover && this.$refs.loadingCover.isShow) this.$refs.loadingCover.hide(); + if (res.code == 0 && res.data) { + + // 处理表单数据 + this.calculateData = this.handleGoodsFormData(res.data); + + //多商户商品 + this.shop_goods_list = res.data.shop_goods_list + //--------- + this.calculateData.coupon_list = this.coupon_list; + if (res.data.delivery) { + if (res.data.delivery.delivery_type == 'express') this.memberAddress = res.data.delivery.member_address; + if (res.data.delivery.delivery_type == 'local') { + this.localMemberAddress = res.data.delivery.member_address; + } + } + // 次卡 + res.data.goods_list.forEach(item => { + if (item.member_card_list) { + if (this.orderCreateData.member_goods_card[item.sku_id]) { + let itemId = this.orderCreateData.member_goods_card[item.sku_id]; + if (!item.member_card_list[itemId]) delete this.orderCreateData.member_goods_card[item.sku_id]; + } + } else if (this.orderCreateData.member_goods_card[item.sku_id]) { + delete this.orderCreateData.member_goods_card[item.sku_id]; + } + }); + //多商户 + this.orderCreateData.coupon = res.data.coupon + // if (!res.data.coupon_id) this.orderCreateData.coupon.coupon_id = 0; + // else this.orderCreateData.coupon.coupon_id = res.data.coupon_id; + + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }) + }, + /** + * 提交订单 + */ + create() { + if (!this.verify() || this.isRepeat) return; + this.isRepeat = true; + uni.showLoading({ + title: '' + }); + this.$api.sendRequest({ + url: this.api.create, + data: this.handleCreateData(), + success: res => { + uni.hideLoading(); + if (res.code == 0) { + this.outTradeNo = res.data; + uni.removeStorageSync('deliveryTime'); + uni.removeStorageSync('goodFormData'); + uni.setStorageSync('paySource', ''); + if (this.calculateData.pay_money == 0) { + // #ifdef MP + if (this.paymentData.is_virtual || this.orderCreateData.delivery.delivery_type == 'store') { + this.$util.subscribeMessage('ORDER_VERIFY_OUT_TIME,VERIFY_CODE_EXPIRE,VERIFY'); + } + // #endif + this.$util.redirectTo('/pages_tool/pay/result', { + code: res.data + }, 'redirectTo'); + } else { + this.openChoosePayment(); + } + // 更新购物车数量 + this.$store.dispatch('getCartNumber'); + } else { + this.$util.showToast({ + title: res.message + }); + this.isRepeat = false; + } + } + }) + }, + /** + * 处理订单计算、创建传参 + */ + handleCreateData() { + let data = this.$util.deepClone(this.orderCreateData); + // 订单表单 + if (this.$refs.form) { + data.form_data = { + form_id: this.paymentData.system_form.id, + form_data: this.$util.deepClone(this.$refs.form.formData) + }; + } + // 商品表单 + if (this.$refs.goodsForm) { + if (!data.form_data) data.form_data = {}; + data.form_data.goods_form = {}; + this.$refs.goodsForm.forEach(item => { + data.form_data.goods_form[item._props.customAttr.sku_id] = { + form_id: item._props.customAttr.form_id, + form_data: this.$util.deepClone(item.formData) + } + }) + } + Object.keys(data).forEach((key) => { + let item = data[key]; + if (typeof item == 'object') data[key] = JSON.stringify(item); + }) + + if (this.paymentData && this.orderCreateData.is_virtual == 0) { + if (data.member_address && this.orderCreateData.delivery && this.orderCreateData.delivery.delivery_type != 'store') { + delete data.member_address; + } + } + + return data; + }, + /** + * 打开支付弹窗 + */ + openChoosePayment() { + // #ifdef MP + if (this.paymentData.is_virtual) { + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY'); + } else { + switch (this.orderCreateData.delivery.delivery_type) { + case 'express': //物流配送 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY,ORDER_DELIVERY'); + break; + case 'store': //门店自提 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY'); + break; + case 'local': //同城配送 + this.$util.subscribeMessage('ORDER_URGE_PAYMENT,ORDER_PAY,ORDER_DELIVERY'); + break; + } + } + // #endif + + this.$refs.choosePaymentPopup.getPayInfo(this.outTradeNo); + }, + verify() { + if (this.paymentData.is_virtual == 1) { + if (!this.orderCreateData.member_address.mobile) { + this.$util.showToast({ + title: '请输入预留手机' + }); + return false; + } + if (!this.$util.verifyMobile(this.orderCreateData.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的手机号' + }); + return false; + } + } else { + if (!this.orderCreateData.delivery || !this.orderCreateData.delivery.delivery_type) { + this.$util.showToast({ + title: '商家未设置配送方式' + }); + return false; + } + if ( + (this.orderCreateData.delivery.delivery_type == 'express' && !this.memberAddress) || + (this.orderCreateData.delivery.delivery_type == 'local' && !this.localMemberAddress) + ) { + this.$util.showToast({ + title: '请先选择您的收货地址' + }); + return false; + } + + if (this.orderCreateData.delivery.delivery_type == 'store') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可提货的门店,请选择其他配送方式' + }); + return false; + } + if (!this.orderCreateData.member_address.mobile) { + this.$util.showToast({ + title: '请输入预留手机' + }); + return false; + } + if (!this.$util.verifyMobile(this.orderCreateData.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的手机号' + }); + return false; + } + if (!this.deliveryTime) { + this.$util.showToast({ + title: '请选择提货时间' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'local') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可配送的门店,请选择其他配送方式' + }); + return false; + } + if (this.calculateGoodsData.config.local.is_use && this.calculateGoodsData.delivery.local.info.time_is_open == 1 && !this.deliveryTime) { + this.$util.showToast({ + title: '请选择送达时间' + }); + return false; + } + } + } + + if (this.$refs.goodsForm) { + let formVerify = true; + for (let i = 0; i < this.$refs.goodsForm.length; i++) { + let item = this.$refs.goodsForm[i]; + formVerify = item.verify(); + if (!formVerify) { + break; + } + } + if (!formVerify) return false; + } + if (this.paymentData.system_form) { + let formVerify = this.$refs.form.verify(); + if (!formVerify) return false; + } + return true; + }, + /** + * 选择收货地址 + */ + selectAddress() { + var params = { + back: this.$util.getCurrentRoute().path, + local: 0, + type: 1 + } + // 外卖配送需要定位地址 + if (this.orderCreateData.delivery.delivery_type == 'local') { + params.local = 1; + params.type = 2; + } + this.$util.redirectTo('/pages_tool/member/address', params); + }, + /** + * 选择配送方式 + * @param data + * @param calculate + * @param member_account + */ + selectDeliveryType(data, calculate = true, member_account = null) { + if (this.orderCreateData.delivery && this.orderCreateData.delivery.delivery_type == data.name) return; + + this.orderCreateData.delivery.buyer_ask_delivery_time = { + start_date: '', + end_date: '' + }; + this.deliveryTime = ''; + + let delivery = { + delivery_type: data.name, + delivery_type_name: data.title + } + // 如果是门店配送 + if (data.name == 'store' || data.name == 'local') { + if (data.store_list[0]) { + delivery.store_id = data.store_list[0].store_id; + } + this.storeId = delivery.store_id ? delivery.store_id : 0; + + if (!this.orderCreateData.member_address) { + if (this.paymentData) { + this.orderCreateData.member_address = { + name: this.paymentData.member_account.nickname, + mobile: this.paymentData.member_account.mobile + }; + } else if (member_account) { + this.orderCreateData.member_address = { + name: member_account.nickname, + mobile: member_account.mobile + }; + + } + } + } + + this.$set(this.orderCreateData, 'delivery', delivery); + uni.setStorageSync('delivery', delivery); + + // 配送方式不为门店配送时 + if (this.orderCreateData.delivery.delivery_type != 'express' && !this.location) this.$util.getLocation(); + if (calculate) this.payment(); + + if (data.name == 'store') this.storetime('no'); + if (data.name == 'local') this.localtime('no'); + }, + /** + * 图片错误 + * @param {Object} index + */ + imageError(index) { + this.paymentData.goods_list[index].sku_image = this.$util.getDefaultImage().goods; + this.calculateData.goods_list[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + /** + * 选择门店 + * @param {Object} data + */ + selectPickupPoint(data) { + if (data.store_id != this.storeId) { + this.storeId = data.store_id; + this.orderCreateData.delivery.store_id = data.store_id; + this.payment(); + this.resetDeliveryTime(); + // 存储所选门店 + let delivery = uni.getStorageSync('delivery'); + delivery.store_id = data.store_id; + uni.setStorageSync('delivery', delivery) + } + this.$refs.deliveryPopup.close(); + }, + /** + * 重置提货时间 + */ + resetDeliveryTime() { + this.orderCreateData.delivery.buyer_ask_delivery_time = { + start_date: '', + end_date: '' + }; + this.deliveryTime = ''; + uni.removeStorageSync('deliveryTime'); + }, + /** + * 门店 + */ + storetime(type = '') { + if (this.storeInfo) { + let data = this.$util.deepClone(this.storeInfo); + data.delivery_time = typeof data.delivery_time == 'string' && data.delivery_time ? JSON.parse(data.delivery_time) : data.delivery_time; + if (!data.delivery_time || data.delivery_time.length == undefined && !data.delivery_time.length) { + data.delivery_time = [{ + start_time: data.start_time, + end_time: data.end_time + }] + } + let obj = { + delivery: this.orderCreateData.delivery, + dataTime: data + } + this.$refs.timePopup.open(obj, type); + this.$forceUpdate(); + } + }, + /** + * 选择自提时间 + * @param {Object} data + */ + selectPickupTime(data) { + this.deliveryTime = data.data.month + '(' + data.data.time + ')'; + + this.orderCreateData.delivery.buyer_ask_delivery_time = { + start_date:data.data.start_date, + end_date:data.data.end_date + }; + + //将时间缓存,避免切换地址时重置 + uni.setStorageSync('deliveryTime', { + 'deliveryTime': this.deliveryTime, + 'buyer_ask_delivery_time': this.orderCreateData.delivery.buyer_ask_delivery_time, + 'delivery_type': this.orderCreateData.delivery.delivery_type + }); + + }, + storeImgError() { + this.storeInfo.store_image = this.$util.getDefaultImage().store; + }, + openPopup(ref) { + if (ref == 'deliveryPopup' && (!this.storeList || Object.keys(this.storeList).length <= 1)) return; + this.tempData = this.$util.deepClone(this.orderCreateData); + this.$refs[ref].open(); + }, + closePopup(ref) { + this.orderCreateData = this.$util.deepClone(this.tempData); + this.$refs[ref].close(); + this.tempData = null; + }, + //优惠券单独多商户 + /** + * 显示店铺优惠券信息 + * @param {Object} siteId + * @param {Object} couponData + */ + openSiteCoupon(merch_id) { + + this.tempData = this.$util.deepClone(this.orderCreateData); + this.merchCoupon.merch_id = merch_id; + this.selectCouponId = this.orderCreateData.coupon[merch_id].coupon_id; + // this.selectCouponMoney = this.orderCreateData.coupon[siteId].coupon_money; + + this.merchCoupon.data = this.coupon_list[merch_id]; + this.$refs.couponPopup.open(); + this.$forceUpdate(); + }, + /**商户选择券*/ + selectCoupon(data,merch_id) { + + // if (this.orderCreateData.coupon[merch_id].coupon_id == data.coupon_id){ + // this.orderCreateData.coupon[merch_id].coupon_id = 0 + // }else{ + // this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id + // }; + if (this.selectCouponId != data.coupon_id) { + this.selectCouponId = data.coupon_id; + } else { + this.selectCouponId = 0; + } + this.$forceUpdate(); + // this.orderCreateData.coupon[merch_id].coupon_id = data.coupon_id + console.log(this.selectCouponId) + }, + //确定使用优惠券 + useCpopon() { + console.log(this.merchCoupon.merch_id) + this.orderCreateData.coupon[this.merchCoupon.merch_id].coupon_id = this.selectCouponId; + console.log(this.orderCreateData.coupon) + this.$refs.couponPopup.close(); + this.calculate(); + }, + + //------------------- + /** + * 选择优惠券 + * @param {Object} data + */ + /*selectCoupon(data) { + if (this.orderCreateData.coupon.coupon_id == data.coupon_id) this.orderCreateData.coupon = { + coupon_id: 0 + }; + else this.orderCreateData.coupon = { + coupon_id: data.coupon_id + }; + },*/ + /** + * 使用优惠券 + */ + // useCpopon() { + // this.$refs.couponPopup.close(); + // this.calculate(); + // }, + /** + * 切换发票开关 + */ + changeIsInvoice() { + if (this.orderCreateData.is_invoice == 0) { + this.orderCreateData.is_invoice = 1; + if (!this.orderCreateData.invoice_type) this.orderCreateData.invoice_type = this.goodsData.invoice.invoice_type.split(',')[0]; + } else { + this.orderCreateData.is_invoice = 0; + } + }, + /** + * 切换发票类型 + * @param {Object} invoice_type + */ + changeInvoiceType(invoice_type) { + this.orderCreateData.invoice_type = invoice_type; + }, + /** + * 切换发票个人还是企业 + * @param {Object} invoice_title_type + */ + changeInvoiceTitleType(invoice_title_type) { + this.orderCreateData.invoice_title_type = invoice_title_type; + }, + /** + * 切换增值税专用发票开关 + */ + changeIsTaxInvoice() { + if (this.orderCreateData.is_tax_invoice == 0) this.orderCreateData.is_tax_invoice = 1; + else this.orderCreateData.is_tax_invoice = 0; + this.$forceUpdate(); + }, + /** + * 选择发票内容 + * @param {Object} invoice_content + */ + changeInvoiceContent(invoice_content) { + this.orderCreateData.invoice_content = invoice_content; + this.$forceUpdate(); + }, + /** + * 验证发票内容 + */ + invoiceVerify() { + if (!this.orderCreateData.invoice_title) { + this.$util.showToast({ + title: '请填写发票抬头' + }); + return false; + } + if (!this.orderCreateData.taxpayer_number && this.orderCreateData.invoice_title_type == 2) { + this.$util.showToast({ + title: '请填写纳税人识别号' + }); + return false; + } + if (this.orderCreateData.invoice_type == 1 && !this.orderCreateData.invoice_full_address && this.paymentData.is_virtual == 1) { + this.$util.showToast({ + title: '请填写发票邮寄地址' + }); + return false; + } + if (this.orderCreateData.invoice_type == 2 && !this.orderCreateData.invoice_email) { + this.$util.showToast({ + title: '请填写邮箱' + }); + return false; + } + if (this.orderCreateData.invoice_type == 2) { + var reg = /^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/; + if (!reg.test(this.orderCreateData.invoice_email)) { + this.$util.showToast({ + title: '请填写正确的邮箱' + }); + return false; + } + } + if (!this.orderCreateData.invoice_content) { + this.$util.showToast({ + title: '请选择发票内容' + }); + return false; + } + return true; + }, + /** + * 保存发票设置 + */ + saveInvoice() { + if (this.orderCreateData.is_invoice == 1 && !this.invoiceVerify()) return; + this.calculate(); + this.$refs.invoicePopup.close(); + }, + /** + * 保存留言 + */ + saveBuyerMessage() { + this.$refs.buyerMessagePopup.close(); + }, + /** + * 选择会员卡 + */ + selectMemberCard() { + this.orderCreateData.is_open_card = this.orderCreateData.is_open_card ? 0 : 1; + if (!this.orderCreateData.member_card_unit) this.orderCreateData.member_card_unit = this.cardChargeType[0].key; + this.payment(); + }, + /** + * 选择会员卡充值类型 + * @param {Object} key + */ + selectMembercardUnit(key) { + this.orderCreateData.member_card_unit = key; + this.calculate(); + }, + /** + * 使用积分抵扣 + */ + usePoint() { + this.orderCreateData.is_point = this.orderCreateData.is_point ? 0 : 1; + this.calculate(); + }, + /** + * 支付弹窗关闭 + */ + payClose() { + // 更新购物车数量 + this.$store.dispatch('getCartNumber'); + this.$util.redirectTo('/pages/order/detail', { + order_id: this.$refs.choosePaymentPopup.payInfo.order_id + }, 'redirectTo'); + }, + + /** + * 同城配送送达时间 + */ + localtime(type = '') { + if (this.calculateGoodsData && this.calculateGoodsData.config.local) { + let data = this.$util.deepClone(this.calculateGoodsData.delivery.local.info); + if (Object.keys(data).length) { + if (data.delivery_time) { + data.end_time = data.delivery_time[(data.delivery_time.length - 1)].end_time; + } + + let obj = { + delivery: this.orderCreateData.delivery, + dataTime: data + } + + this.$refs.timePopup.open(obj, type); + } + + } + }, + /** + * 剩余起送价 + */ + surplusStartMoney() { + let money = 0; + if (this.calculateData && this.calculateData.delivery && this.calculateData.delivery.delivery_type == 'local') { + let startDeliveryMoney = this.calculateGoodsData.delivery.start_money ?? 0; + money = parseFloat(startDeliveryMoney) - parseFloat(this.calculateData.goods_money); + money = money < 0 ? 0 : money; + } + return money; + }, + /** + * 交易协议 + */ + getTransactionAgreement() { + this.$api.sendRequest({ + url: '/api/order/transactionagreement', + success: res => { + if (res.data) { + this.transactionAgreement = res.data; + if (this.transactionAgreement.content) this.transactionAgreement.content = htmlParser(this.transactionAgreement.content); + } + } + }) + }, + editForm(index) { + this.tempFormData = { + index: index, + json_data: this.$util.deepClone(this.goodsData.goods_list[index].goods_form.json_data) + }; + this.$refs.editFormPopup.open(); + }, + saveForm() { + if (this.$refs.tempForm.verify()) { + this.$set(this.paymentData.goods_list[this.tempFormData.index].goods_form, 'json_data', this.$refs.tempForm.formData); + this.$refs.editFormPopup.close(); + } + }, + /** + * 切换次卡 + * @param {Object} index + */ + selectMemberGoodsCard(index) { + let sku_id = this.goodsData.goods_list[index].sku_id; + this.selectGoodsCard = { + skuId: sku_id, + itemId: this.orderCreateData.member_goods_card[sku_id] ? this.orderCreateData.member_goods_card[sku_id] : 0, + cardList: this.$util.deepClone(this.calculateGoodsData.goods_list[index].member_card_list), + click: (item_id) => { + this.selectGoodsCard.itemId = this.selectGoodsCard.itemId == item_id ? 0 : item_id; + } + } + this.$refs.memberGoodsCardPopup.open(); + }, + /** + * 选择次卡 + */ + saveMemberGoodsCard() { + this.orderCreateData.member_goods_card[this.selectGoodsCard.skuId] = this.selectGoodsCard.itemId || 0; + this.$refs.memberGoodsCardPopup.close(); + this.payment(); + }, + back() { + uni.navigateBack({ + delta: 1 + }); + }, + getStoreList() { + let storeList = null; + if (this.orderCreateData.delivery) { + if (this.orderCreateData.delivery.delivery_type == 'local' && this.localConfig) { + storeList = this.localConfig.store_list; + storeList = storeList.reduce((res, item) => { + return { + ...res, + [item.store_id]: item + }; + }, {}); + + } + if (this.orderCreateData.delivery.delivery_type == 'store' && this.storeConfig) { + storeList = this.storeConfig.store_list; + storeList = storeList.reduce((res, item) => { + return { + ...res, + [item.store_id]: item + }; + }, {}); + } + } + return storeList; + }, + getStore(mescroll) { + this.$api.sendRequest({ + url: '/api/store/getStorePage', + data: { + page_size: mescroll.size, + page: mescroll.num, + latitude: this.latitude ?? '', + longitude: this.longitude ?? '', + type: this.orderCreateData.delivery.delivery_type + }, + success: res => { + let newArr = []; + let msg = res.message; + if (res.code == 0 && res.data) { + newArr = res.data.list; + } + mescroll.endSuccess(newArr.length); + //设置列表数据 + + if (mescroll.num == 1) this.storeData = []; //如果是第一页需手动制空列表 + this.storeData = this.storeData.concat(newArr); //追加新数据 + }, + fail: res => { + mescroll.endErr(); + } + }); + } + }, + filters: { + // 金额格式化输出 + moneyFormat(money) { + return parseFloat(money).toFixed(2); + } + } +} \ No newline at end of file diff --git a/components/diy-components/diy-article.vue b/components/diy-components/diy-article.vue new file mode 100644 index 0000000..1fc23ef --- /dev/null +++ b/components/diy-components/diy-article.vue @@ -0,0 +1,211 @@ + + + + + + + + + + {{ item.article_title }} + {{ item.article_abstract }} + + + + {{ item.category_name }} + + {{ $util.timeStampTurnTime(item.create_time, 'date') }} + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-audio.vue b/components/diy-components/diy-audio.vue new file mode 100644 index 0000000..80a3121 --- /dev/null +++ b/components/diy-components/diy-audio.vue @@ -0,0 +1,444 @@ + + + + + {{value.text}} + {{value.desc}}----{{value.id}} + + + + + + {{audiotime}} + + + + + + + + + + {{value.text}} + {{value.desc}} + + + + + + + {{audiotime}} + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-bargain.vue b/components/diy-components/diy-bargain.vue new file mode 100644 index 0000000..186a8e3 --- /dev/null +++ b/components/diy-components/diy-bargain.vue @@ -0,0 +1,723 @@ + + + + + + + + {{ value.titleStyle.leftText }} + + + 低至0元免费拿 + + {{ value.titleStyle.more }} + + + + + + + + + + + + + {{ item.goods_name }} + + + + + + + + + 已砍 + ¥{{ (item.price - item.curr_price).toFixed(2) }} + ,仅差 + ¥{{ item.curr_price }} + + + 最低可砍至 + ¥{{ item.floor_price }} + + + + 最低可砍至 + ¥{{ item.floor_price }} + + + + ¥ + {{ item.price.split('.')[0] }} + .{{ item.price.split('.')[1] }} + + + {{ item.is_bargaining ? '继续砍价' : value.btnStyle.text }} + + + + + + + + + + + + + + 已砍{{ item.sale_num }}件 + + + + + {{ item.goods_name }} + + + ¥ + {{ item.floor_price.split('.')[0] }} + {{ '.' + item.floor_price.split('.')[1] }} + + + ¥{{ item.price }} + + + + + + + + + + + + + 已砍{{ item.sale_num }}件 + + + + + {{ item.goods_name }} + + + ¥ + {{ item.floor_price.split('.')[0] }} + {{ '.' + item.floor_price.split('.')[1] }} + + + ¥{{ item.price }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-bottom-nav.vue b/components/diy-components/diy-bottom-nav.vue new file mode 100644 index 0000000..48a6374 --- /dev/null +++ b/components/diy-components/diy-bottom-nav.vue @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + {{ cartNumber > 99 ? '99+' : cartNumber }} + + + + + + + + + + + + + + + + + {{ lang =='en-us'?item.en_text:item.text }} + + + {{ lang =='en-us'?item.en_text:item.text }} + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-category-item.vue b/components/diy-components/diy-category-item.vue new file mode 100644 index 0000000..93e76be --- /dev/null +++ b/components/diy-components/diy-category-item.vue @@ -0,0 +1,1303 @@ + + + + + + + + + {{ category.category_name }} + + + + + + {{ one.category_name }} + + + + + + + {{ one.category_name }} + + + + + + {{ two.category_name }} + + + + + + + + + + + + + 全部 + + {{ one.category_name }} + + + + + + + + 全部 + + {{ one.category_name }} + + + + + + + + + + {{ category.category_name }} + + + + + + + + {{ item.label_name }} + + + + {{ item.goods_name }} + + + + + ¥ + {{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }} + .{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }} + + + 咨询 + + + + + + + + + + + + + ¥ + {{ showMarketPrice(item) }} + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.label_name }} + + + + {{ item.goods_name }} + + + + + ¥ + {{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }} + .{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }} + + + 咨询 + + + + + + + + + + + + + + ¥ + {{ showMarketPrice(item) }} + + + + + 立即购买 + + + + 选规格 + {{ item.num }} + + + + + + + {{ cartList['goods_' + item.goods_id]['sku_' + item.sku_id].num }} + + + + + + + + + + + + + + 立即购买 + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-category.vue b/components/diy-components/diy-category.vue new file mode 100644 index 0000000..5ce0a35 --- /dev/null +++ b/components/diy-components/diy-category.vue @@ -0,0 +1,1007 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.category_name }} + + + + + 展开 + + + + + + + + + + + {{ item.category_name }} + + + + 点击收起 + + + + + + + + + + + + {{ item.category_name }} + + + + + + + + + + 已经到底了~ + + + + + + + + + + + + 暂时没有分类哦! + + + + + 暂时没有分类哦! + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-comp-extend.vue b/components/diy-components/diy-comp-extend.vue new file mode 100644 index 0000000..7ff6eb7 --- /dev/null +++ b/components/diy-components/diy-comp-extend.vue @@ -0,0 +1,23 @@ + + + + + + + diff --git a/components/diy-components/diy-coupon.vue b/components/diy-components/diy-coupon.vue new file mode 100644 index 0000000..00f605f --- /dev/null +++ b/components/diy-components/diy-coupon.vue @@ -0,0 +1,1074 @@ + + + + + + + + + + + + + ¥ + {{ item.money | moneyConduct }} + + + {{ item.discount | moneyConduct }} + 折 + + + {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} + + + + {{ value.btnStyle.text }} + + 去使用 + + + + + + + + + + + + + ¥ + {{ item.money | moneyConduct }} + + + {{ item.discount | moneyConduct }} + 折 + + + {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} + + + + {{ value.btnStyle.text || '领取' }} + + 去使用 + + + + + + + + + + + + ¥ + {{ item.money | moneyConduct }} + + + {{ item.discount | moneyConduct }} + 折 + + + {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} + 所有商品可用 + 指定商品可用 + 指定商品不可用 + + + + {{ value.btnStyle.text || '领取' }} + + 去使用 + + + + + + + + + + + + ¥ + {{ item.money | moneyConduct }} + + + {{ item.discount | moneyConduct }} + 折 + + + {{ item.at_least > 0 ? '满' + Number(item.at_least) + '元可用' : '无门槛优惠券' }} + + + + {{ value.btnStyle.text || '立即使用' }} + + 去使用 + + + + + + + + + + + + + + + {{ item.money | moneyConduct }} + 元 + + + {{ item.discount | moneyConduct }} + 折 + + + + + + {{ item.coupon_name }} + 满{{ Number(item.at_least) }}元可用 + 无门槛优惠券 + + {{ value.btnStyle.text || '立即领取' }} + 去使用 + + + + + + + + + + + + + + + {{ (item.discount == '0.00' ? item.money : item.discount) | moneyConduct }} + {{ item.discount == '0.00' ? '元' : '折' }} + + 优惠券 + + + {{ value.btnStyle.text }} + + + 去使用 + + 满{{ item.at_least | moneyConduct }}元使用 + 无门槛使用 + + + + + + + 暂无优惠券 + + 去逛逛 + + + + + + + + + + + + + + {{ item.money | moneyConduct }} + 元 + + + {{ item.discount | moneyConduct }} + 折 + + + + 满{{ Number(item.at_least) }}元可用 + 无门槛优惠券 + 有效期至{{ $util.timeStampTurnTime(item.end_time, 'yearmonthday') }} + + + + {{ value.btnStyle.text || '立即领取' }} + + 去使用 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-fenxiao-goods-list.vue b/components/diy-components/diy-fenxiao-goods-list.vue new file mode 100644 index 0000000..16bc90a --- /dev/null +++ b/components/diy-components/diy-fenxiao-goods-list.vue @@ -0,0 +1,419 @@ + + + + + + + + + + {{ item.goods_name }} + + + + + + 赚 ¥ + {{ item.commission_money.split('.')[0] }} + {{ '.' + item.commission_money.split('.')[1] }} + + + 关注 + + + 取消关注 + + + + ¥{{ item.discount_price }} + + + + + + + + + + diff --git a/components/diy-components/diy-float-btn.vue b/components/diy-components/diy-float-btn.vue new file mode 100644 index 0000000..c381f8c --- /dev/null +++ b/components/diy-components/diy-float-btn.vue @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-follow-official-account.vue b/components/diy-components/diy-follow-official-account.vue new file mode 100644 index 0000000..0b637b5 --- /dev/null +++ b/components/diy-components/diy-follow-official-account.vue @@ -0,0 +1,29 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-form.vue b/components/diy-components/diy-form.vue new file mode 100644 index 0000000..ed581fd --- /dev/null +++ b/components/diy-components/diy-form.vue @@ -0,0 +1,110 @@ + + + + + 您的姓名 + + + + + + 手机号码 + + + + + + 您的邮箱 + + + + + + 所在城市 + + + + + + 备注 + + + + + + 提交信息 + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-goods-brand.vue b/components/diy-components/diy-goods-brand.vue new file mode 100644 index 0000000..f4d7323 --- /dev/null +++ b/components/diy-components/diy-goods-brand.vue @@ -0,0 +1,158 @@ + + + + + {{ value.title }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-goods-list.vue b/components/diy-components/diy-goods-list.vue new file mode 100644 index 0000000..a2bc1b6 --- /dev/null +++ b/components/diy-components/diy-goods-list.vue @@ -0,0 +1,1410 @@ + + + + + + + + + + + + + + {{ lang=='en-us'?item.en_goods_name:item.goods_name }} + + + + {{ item.label_name }} + + + {{ goodsValue.tag.text }} + + + + + + ¥ + {{ showPrice(item).split('.')[0] }} + {{ '.' + showPrice(item).split('.')[1] }} + + + + + + + ¥{{ showMarketPrice(item) }} + + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + + + + + + + + {{ goodsValue.btnStyle.text }} + + + + + + + + + + + + + + + + + + + + + + + + + {{ lang=='en-us'?item.en_goods_name:item.goods_name }} + + + + {{ item.label_name }} + + + {{ goodsValue.tag.text }} + + + + + + ¥ + {{ showPrice(item).split('.')[0] }} + {{ '.' + showPrice(item).split('.')[1] }} + + + + + + + ¥{{ showMarketPrice(item) }} + + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + + + + + + + + {{ lang=='en-us'?dataItem.en_goods_name:dataItem.goods_name }} + + + + {{ dataItem.label_name }} + + + {{ goodsValue.tag.text }} + + + + + + ¥ + + {{ showPrice(dataItem).split('.')[0] }} + + + {{ '.' + showPrice(dataItem).split('.')[1] }} + + + + + + + + ¥{{ showMarketPrice(dataItem) }} + + + 已售{{ dataItem.sale_num }}{{ dataItem.unit ? dataItem.unit : '件' }} + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-goods-recommend.vue b/components/diy-components/diy-goods-recommend.vue new file mode 100644 index 0000000..e8e55ff --- /dev/null +++ b/components/diy-components/diy-goods-recommend.vue @@ -0,0 +1,599 @@ + + + + + + {{ goodsValue.topStyle.title }} + + {{ goodsValue.topStyle.subTitle }} + + + + + + + + + + + + + {{ dataItem.goods_name }} + + + + + {{ goodsValue.labelStyle.title }} + + + + ¥ + {{ showPrice(dataItem).split('.')[0] }} + {{ '.' + showPrice(dataItem).split('.')[1] }} + + ¥{{ showMarketPrice(dataItem) }} + + 售{{ dataItem.sale_num }}{{ dataItem.unit ? dataItem.unit : '件' }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-graphic-nav.vue b/components/diy-components/diy-graphic-nav.vue new file mode 100644 index 0000000..1e86dcf --- /dev/null +++ b/components/diy-components/diy-graphic-nav.vue @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + {{ item.label.text }} + + + + {{ item.title }} + + + + + + + + + + + + + + + + + + + + + + + {{ item.label.text }} + + + + {{ item.title }} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-group.vue b/components/diy-components/diy-group.vue new file mode 100644 index 0000000..06fa0a2 --- /dev/null +++ b/components/diy-components/diy-group.vue @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-groupbuy.vue b/components/diy-components/diy-groupbuy.vue new file mode 100644 index 0000000..a59c111 --- /dev/null +++ b/components/diy-components/diy-groupbuy.vue @@ -0,0 +1,462 @@ + + + + + + + + + + + + {{ item.goods_name }} + + + ¥ + {{ item.groupbuy_price.split('.')[0] }} + {{ '.' + item.groupbuy_price.split('.')[1] }} + + + {{ value.btnStyle.text }} + + + + + + + + + + + + 已团{{ item.sell_num }}件 + + + + + {{ item.goods_name }} + + + ¥ + {{ item.groupbuy_price.split('.')[0] }} + {{ '.' + item.groupbuy_price.split('.')[1] }} + + ¥{{ item.price }} + + + + + + + + + + + 已团{{ item.sell_num }}件 + + + + {{ item.goods_name }} + + + ¥ + {{ item.groupbuy_price.split('.')[0] }} + {{ '.' + item.groupbuy_price.split('.')[1] }} + + ¥{{ item.price }} + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-horz-blank.vue b/components/diy-components/diy-horz-blank.vue new file mode 100644 index 0000000..d1d3447 --- /dev/null +++ b/components/diy-components/diy-horz-blank.vue @@ -0,0 +1,40 @@ + + + + + + + diff --git a/components/diy-components/diy-horz-line.vue b/components/diy-components/diy-horz-line.vue new file mode 100644 index 0000000..4c00b44 --- /dev/null +++ b/components/diy-components/diy-horz-line.vue @@ -0,0 +1,25 @@ + + + + + + + diff --git a/components/diy-components/diy-hot-area.vue b/components/diy-components/diy-hot-area.vue new file mode 100644 index 0000000..413091a --- /dev/null +++ b/components/diy-components/diy-hot-area.vue @@ -0,0 +1,73 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-icon.vue b/components/diy-components/diy-icon.vue new file mode 100644 index 0000000..db5a648 --- /dev/null +++ b/components/diy-components/diy-icon.vue @@ -0,0 +1,84 @@ + + + + + + + + + diff --git a/components/diy-components/diy-img-ads.vue b/components/diy-components/diy-img-ads.vue new file mode 100644 index 0000000..12e7303 --- /dev/null +++ b/components/diy-components/diy-img-ads.vue @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-index-page.vue b/components/diy-components/diy-index-page.vue new file mode 100644 index 0000000..db4df4b --- /dev/null +++ b/components/diy-components/diy-index-page.vue @@ -0,0 +1,830 @@ + + + + + + + + + {{ item.short_name ? item.short_name : item.category_name }} + + + {{ item.short_name ? item.short_name : item.category_name }} + + + + + + + + + + + {{ item.short_name ? item.short_name : item.category_name }} + + + + + + + + + + + + + + + + + + + + + + + {{ item.category_name }} + + + + + + + + + + + {{ item.category_name }} + + + + + + + + + + {{ item.category_name }} + + + + + + + + + + + + + + + + + {{ goodsTag(item) }} + + + + + + + {{ item.goods_name }} + + + + {{ $lang('common.currencySymbol') }} + {{ showPrice(item) }} + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ showMarketPrice(item) }} + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-kefu.vue b/components/diy-components/diy-kefu.vue new file mode 100644 index 0000000..fa37ed9 --- /dev/null +++ b/components/diy-components/diy-kefu.vue @@ -0,0 +1,71 @@ + + + + + + + + + + {{item.title}} + {{item.desc}} + + + + 立即添加 + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-listmenu.vue b/components/diy-components/diy-listmenu.vue new file mode 100644 index 0000000..0fc8d28 --- /dev/null +++ b/components/diy-components/diy-listmenu.vue @@ -0,0 +1,77 @@ + + + + + + + + + + + {{item.title}} + {{lang=='en-us'?'view':'查看'}} + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-live.vue b/components/diy-components/diy-live.vue new file mode 100644 index 0000000..d6316da --- /dev/null +++ b/components/diy-components/diy-live.vue @@ -0,0 +1,241 @@ + + + + + + + + + + + + {{ liveInfo.status_name }} + + {{ liveInfo.name }} + + + + + + + 主播:{{ liveInfo.anchor_name }} + + | + + 直播商品:{{ liveInfo.goods.length }} + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-many-goods-list.vue b/components/diy-components/diy-many-goods-list.vue new file mode 100644 index 0000000..0df252b --- /dev/null +++ b/components/diy-components/diy-many-goods-list.vue @@ -0,0 +1,247 @@ + + + + + + + {{ item.title }} + {{ item.desc }} + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-map.vue b/components/diy-components/diy-map.vue new file mode 100644 index 0000000..4c5265f --- /dev/null +++ b/components/diy-components/diy-map.vue @@ -0,0 +1,78 @@ + + + + + + 一键导航 + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-member-info.vue b/components/diy-components/diy-member-info.vue new file mode 100644 index 0000000..bde0e11 --- /dev/null +++ b/components/diy-components/diy-member-info.vue @@ -0,0 +1,1466 @@ + + + + + + + + + + + + + 点击授权头像昵称 + + + {{ memberInfo.nickname }} + + + {{ memberInfo.member_level_name }} + + + + + {{ memberInfo.member_level_name }} + + + + {{ memberInfo.member_level_name }} + + + + + + 点击获取微信头像 + + + {{ memberInfo.nickname }} + + + {{ memberInfo.member_level_name }}VIP1 + + + + + {{ memberInfo.member_level_name }} + + + + {{ memberInfo.member_level_name }} + + + + {{langIndex == 0?'CN':'EN'}} + + + + + + + + {{$lang('login')}} + {{$lang('loginTpis')}} + + + {{langIndex == 0?'CN':'EN'}} + + + + + + {{ memberInfo ? (parseFloat(memberInfo.balance) + parseFloat(memberInfo.balance_money)).toFixed(2) : '--' }} + + {{ $lang('balance') }} + + + + {{ memberInfo ? parseFloat(memberInfo.point) : '--' }} + {{ $lang('point') }} + + + + + {{ memberInfo && memberInfo.coupon_num != undefined ? memberInfo.coupon_num : '--' }} + + {{ $lang('coupon') }} + + + + + + + + {{ memberInfo ? (parseFloat(memberInfo.balance) + parseFloat(memberInfo.balance_money)).toFixed(2) : '--' }} + {{ $lang('balance') }} + + + + {{ memberInfo ? parseFloat(memberInfo.point) : '--' }} + {{ $lang('point') }} + + + + + {{ memberInfo && memberInfo.coupon_num != undefined ? memberInfo.coupon_num : '--' }} + + {{ $lang('coupon') }} + + + + + + + + + + 获取您的昵称、头像 + 获取用户头像、昵称完善个人资料,主要用于向用户提供具有辨识度的用户中心界面 + + + + + 头像 + + + + + + + 昵称 + + + + + + 头像 + + + + + + + 昵称 + + + + 保存 + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-member-my-order.vue b/components/diy-components/diy-member-my-order.vue new file mode 100644 index 0000000..ea971b5 --- /dev/null +++ b/components/diy-components/diy-member-my-order.vue @@ -0,0 +1,249 @@ + + + + + + + + + + + + + + {{ orderNum.waitpay > 99 ? '99+' : orderNum.waitpay }} + + {{ $lang('waitpay') }} + + + + + + + + + + + {{ orderNum.waitsend > 99 ? '99+' : orderNum.waitsend }} + + {{ $lang('waitsend') }} + + + + + + + + + + + {{ orderNum.waitconfirm > 99 ? '99+' : orderNum.waitconfirm }} + + {{ $lang('waitconfirm') }} + + + + + + + + + + + + + {{ $lang('completed') }} + + + + + + + + + + + {{ orderNum.refunding > 99 ? '99+' : orderNum.refunding }} + + {{ $lang('activist') }} + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-merch-list.vue b/components/diy-components/diy-merch-list.vue new file mode 100644 index 0000000..aa6ed96 --- /dev/null +++ b/components/diy-components/diy-merch-list.vue @@ -0,0 +1,350 @@ + + + + + + + + + + + {{ item.merch_name }} + {{ item.desc }} + + + + + + + + + + + + + + + + + + {{ item.merch_name }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-notes.vue b/components/diy-components/diy-notes.vue new file mode 100644 index 0000000..d28244e --- /dev/null +++ b/components/diy-components/diy-notes.vue @@ -0,0 +1,351 @@ + + + + + {{ value.title }} + {{ value.more }} + + + + + + + {{ item.note_title }} + + {{ labelItem }} + + + #{{ item.note_type == 'goods_item' ? '单品介绍' : '掌柜说' }}# + {{ item.note_abstract }} + + + + + + + + + + + + {{ item.update_time_day }} + + + 阅读 {{ item.initial_read_num + item.read_num }} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-notice.vue b/components/diy-components/diy-notice.vue new file mode 100644 index 0000000..fe1039b --- /dev/null +++ b/components/diy-components/diy-notice.vue @@ -0,0 +1,300 @@ + + + + + + + + + + + + + {{ item.title }} + + + {{ item.title }} + + + + + + + + + + {{ item.title }} + + + + + + + + + + + + 公告 + + + {{ notice }} + 我知道了 + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-payment-qrcode.vue b/components/diy-components/diy-payment-qrcode.vue new file mode 100644 index 0000000..593b31a --- /dev/null +++ b/components/diy-components/diy-payment-qrcode.vue @@ -0,0 +1,203 @@ + + + + + + 门店消费时使用,支付时点击下方展示付款码 + + + + + + 付款码 + + + + 扫码付 + + + + + + 门店支付 + + + + + + + + 提示 + + + 扫码付请退出程序后直接使用微信扫一扫或返回上一页使用付款码进行支付 + 我知道了 + + + + + + + + + diff --git a/components/diy-components/diy-picture.vue b/components/diy-components/diy-picture.vue new file mode 100644 index 0000000..ce49f83 --- /dev/null +++ b/components/diy-components/diy-picture.vue @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-pinfan.vue b/components/diy-components/diy-pinfan.vue new file mode 100644 index 0000000..6082776 --- /dev/null +++ b/components/diy-components/diy-pinfan.vue @@ -0,0 +1,540 @@ + + + + + + + + + + + {{ item.goods_name }} + + + + + {{ item.pintuan_num }}人团 + + + 已拼{{ item.order_num }}件 + + + + + ¥ + {{ item.pintuan_price.split(".")[0] }} + {{ "."+item.pintuan_price.split(".")[1] }} + + + ¥{{ item.price }} + + + {{ value.btnStyle.text }} + 返{{ item.reward_type_num }}积分 + 返¥{{ item.reward_type_num }} + 返优惠券 + + + + + + + + + + + + + + + {{ item.goods_name }} + + + + {{ item.pintuan_num }}人团 + + + 返{{ item.reward_type_num }}积分 + + + 返¥{{ item.reward_type_num }} + + 返优惠券 + + + ¥ + {{ item.pintuan_price.split('.')[0] }} + {{ "."+item.pintuan_price.split('.')[1] }} + + + + + + + + + + + + + + {{ item.goods_name }} + + + + {{ item.pintuan_num }}人团 + + + 返{{ item.reward_type_num }}积分 + + + 返¥{{ item.reward_type_num }} + + + 返优惠券 + + + + ¥ + {{ item.pintuan_price.split('.')[1] }} + {{ "."+item.pintuan_price.split('.')[1] }} + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-pintuan.vue b/components/diy-components/diy-pintuan.vue new file mode 100644 index 0000000..715a636 --- /dev/null +++ b/components/diy-components/diy-pintuan.vue @@ -0,0 +1,776 @@ + + + + + + {{ value.titleStyle.leftText }} + + + + + + + + + + + + + + + {{ value.titleStyle.virtualNum || headData.pintuan_count }} + {{ value.titleStyle.style == 'style-2' ? '人参与' : '人拼团成功' }} + + + + {{ value.titleStyle.more }} + + + + + + + + + + + + {{ item.goods_name }} + + + + + {{ item.pintuan_num }}人团 + + + 已拼{{ item.order_num }}件 + + + + + + + ¥ + + {{ item.pintuan_price.split('.')[0] }} + + + {{ '.' + item.pintuan_price.split('.')[1] }} + + + + ¥{{ item.price }} + + + + {{ value.btnStyle.text }} + + + + + + + + + + + + + {{ item.pintuan_num }}人团 + + + + + {{ item.goods_name }} + + + ¥ + + {{ item.pintuan_price.split('.')[0] }} + + + {{ '.' + item.pintuan_price.split('.')[1] }} + + + + + + ¥ + + {{ item.pintuan_price.split('.')[0] }} + + + {{ '.' + item.pintuan_price.split('.')[1] }} + + + 去参团 + + + 已拼{{ item.sale_num }}件 + + + + + + + + + + + {{ item.pintuan_num }}人团 + + + + + {{ item.goods_name }} + + + ¥ + + {{ item.pintuan_price.split('.')[0] }} + + + {{ '.' + item.pintuan_price.split('.')[1] }} + + + 已拼{{ item.sale_num }}件 + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-presale.vue b/components/diy-components/diy-presale.vue new file mode 100644 index 0000000..4798511 --- /dev/null +++ b/components/diy-components/diy-presale.vue @@ -0,0 +1,435 @@ + + + + + + + + + + + {{ item.goods_name }} + + + ¥ + + {{ showPrice(item).split('.')[0] }} + + + {{ '.' + showPrice(item).split('.')[1] }} + + + + {{ value.btnStyle.text }} + + + + + + + + + + + + + {{ item.goods_name }} + + + ¥ + + {{ showPrice(item).split('.')[0] }} + + + {{ '.' + showPrice(item).split('.')[1] }} + + + + + + + + + + + + + + + {{ item.goods_name }} + + + ¥ + + {{ showPrice(item).split('.')[0] }} + + + {{ '.' + showPrice(item).split('.')[1] }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-quick-nav.vue b/components/diy-components/diy-quick-nav.vue new file mode 100644 index 0000000..cceb9ac --- /dev/null +++ b/components/diy-components/diy-quick-nav.vue @@ -0,0 +1,116 @@ + + + + + + + + + + + + {{ item.title }} + + + + + + + + + + + + + diff --git a/components/diy-components/diy-rich-text.vue b/components/diy-components/diy-rich-text.vue new file mode 100644 index 0000000..de28770 --- /dev/null +++ b/components/diy-components/diy-rich-text.vue @@ -0,0 +1,56 @@ + + + + + + + + + diff --git a/components/diy-components/diy-rubik-cube.vue b/components/diy-components/diy-rubik-cube.vue new file mode 100644 index 0000000..efe0bf5 --- /dev/null +++ b/components/diy-components/diy-rubik-cube.vue @@ -0,0 +1,514 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-search.vue b/components/diy-components/diy-search.vue new file mode 100644 index 0000000..076b937 --- /dev/null +++ b/components/diy-components/diy-search.vue @@ -0,0 +1,336 @@ + + + + + + + + + + + + + + + + + + + 搜索 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-seckill.vue b/components/diy-components/diy-seckill.vue new file mode 100644 index 0000000..a431fa3 --- /dev/null +++ b/components/diy-components/diy-seckill.vue @@ -0,0 +1,1182 @@ + + + + + + {{ value.titleStyle.leftText }} + + + 距离开始 + + {{ isFuture ? '距离开始' : '距离结束' }} + + {{ seckillH ? seckillH : '00' }} + : + {{ seckillI ? seckillI : '00' }} + : + {{ seckillS ? seckillS : '00' }} + + + {{ value.titleStyle.more }} + + + + + + + + + + + + + {{ item.goods_name }} + + + + + + + + + 已抢{{ item.goods_stock + item.sale_num ? ((item.sale_num / (item.goods_stock + item.sale_num)) * 100).toFixed(2) : '0.00' }}% + + + + + + ¥ + + {{ item.seckill_price.split('.')[0] }} + + + {{ '.' + item.seckill_price.split('.')[1] }} + + + + ¥{{ item.price }} + + + 原价: + ¥{{ item.price }} + + + + {{ isFuture ? '即将开始' : value.btnStyle.text }} + + + + + + + + + + + + + + {{ item.goods_name }} + + + ¥ + + {{ item.seckill_price.split('.')[0] }} + + + {{ '.' + item.seckill_price.split('.')[1] }} + + + + + ¥{{ item.price }} + + + {{ isFuture ? '即将开始' : value.btnStyle.text }} + + + + + + + + + + + + + + + {{ item.goods_name }} + + + + ¥ + + {{ item.seckill_price.split('.')[0] }} + + + {{ '.' + item.seckill_price.split('.')[1] }} + + + + ¥{{ item.price }} + + + + + + + + + + + + + {{ item.goods_name }} + + + + ¥ + + {{ item.seckill_price.split('.')[0] }} + + + {{ '.' + item.seckill_price.split('.')[1] }} + + + + ¥{{ item.price }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-store-label.vue b/components/diy-components/diy-store-label.vue new file mode 100644 index 0000000..7fd4ca8 --- /dev/null +++ b/components/diy-components/diy-store-label.vue @@ -0,0 +1,170 @@ + + + + + + + + {{ item }} + + + + + + + + {{ item.label_name }} + + + + + + + + + \ No newline at end of file diff --git a/components/diy-components/diy-store.vue b/components/diy-components/diy-store.vue new file mode 100644 index 0000000..5e7caad --- /dev/null +++ b/components/diy-components/diy-store.vue @@ -0,0 +1,273 @@ + + + + + + + + {{ globalStoreInfo.store_name }} + + 切换 + + + + 定位中... + + + + {{ globalStoreInfo.show_address }} + 获取当前位置... + + + + + + + + + + + + + + + + + + + {{ globalStoreInfo.store_name }} + + 切换 + + + + 定位中... + + + + + + + + + + + + {{ globalStoreInfo.store_name }} + + + 定位中... + + + + + + + + + + + + + diff --git a/components/diy-components/diy-text.vue b/components/diy-components/diy-text.vue new file mode 100644 index 0000000..4a33ef3 --- /dev/null +++ b/components/diy-components/diy-text.vue @@ -0,0 +1,981 @@ + + + + + {{ value.text }} + + + ─── + {{ value.text }} + ─── + + + + {{ value.text }} + + + + + + + + {{ value.text }} + + + + + + {{ value.text }} + + + + + + + + + + + {{ value.text }} + + + + + + + + + {{ value.text }} + + + + + + + + {{ value.text }} + + + + + + + + {{ value.text }} + + + + + + + + + + + {{ value.text }} + + + + {{ value.more.text }} + + + + {{ value.subTitle.text }} + + + + + + + + + + {{ value.text }} + + + + {{ value.more.text }} + + + + {{ value.subTitle.text }} + + + + + + + + + + + {{ value.text }} + + {{ value.subTitle.text }} + + + {{ value.more.text }} + + + + + + + + + + + + + + {{ value.text }} + + {{ value.subTitle.text }} + + {{ value.more.text }} + + + + + + + {{ value.text }} + + + + + + + + {{ value.text }} + + 专区 + + + + + + {{ value.subTitle.text }} + + + + {{ value.more.text }} + + + + + + + + + + + + + + + + + {{ value.text }} + + + + + + + + + + + + {{ value.subTitle.text }} + + + + + + + {{ value.text }} + + + + {{ value.subTitle.text }} + + + {{ value.more.text }} + + + + + + + + + + diff --git a/components/diy-components/diy-video.vue b/components/diy-components/diy-video.vue new file mode 100644 index 0000000..05c6bf6 --- /dev/null +++ b/components/diy-components/diy-video.vue @@ -0,0 +1,46 @@ + + + + + + + \ No newline at end of file diff --git a/components/goods-detail-view/detail.js b/components/goods-detail-view/detail.js new file mode 100644 index 0000000..45a3720 --- /dev/null +++ b/components/goods-detail-view/detail.js @@ -0,0 +1,465 @@ +// 商品详情业务 +import { + Weixin +} from '@/common/js/wx-jssdk.js'; + +export default { + data() { + return { + skuId: 0, + goodsId: 0, + isIphoneX: false, //判断手机是否是iphoneX以上 + whetherCollection: 0, + + //是否开启预览,0:不开启,1:开启 + preview: 0, + videoContext: '', + + // 媒体,图片,视频 + + // 解决每个商品SKU图片数量不同时,无法切换到第一个,导致轮播图显示不出来 + swiperInterval: 1, + swiperAutoplay: false, + swiperCurrent: 1, + switchMedia: 'img', + + //评价 + goodsEvaluate: [{ + member_headimg: '', + member_name: '', + content: '', + images: [], + create_time: 0, + sku_name: '' + }], + evaluateConfig: { + evaluate_audit: 1, + evaluate_show: 0, + evaluate_status: 1 + }, + + // 是否可分享到好物圈 + goodsCircle: false, + service: null, + shareUrl: '', // 分享链接 + source_member: 0, //分享人的id + isCommunity: false, //社群弹窗 + + poster: "-1", //海报 + posterMsg: "", //海报错误信息 + posterHeight: 0, + posterParams: {}, //海报所需参数 + goodsRoute: '', + posterApi: '', + goodsAttrShow: false, // 商品属性是否展开 + + //门店列表 + storeList: { + data: [], + page: 1, + page_size: 10 + }, + isShowStore: false, + latitude: null, // 纬度 + longitude: null, // 经度 + evaluateCount: 0, // 商品评论数量 + deliveryType: null, // 配送方式 + isVirtual: 0 //是否为虚拟商品 + } + }, + created() { + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + if (this.location) { + this.latitude = this.location.latitude; + this.longitude = this.location.longitude; + } else { + this.$util.getLocation(); + } + this.getStoreData(); + }, + watch: { + location: function (nVal) { + if (nVal) { + this.latitude = nVal.latitude; + this.longitude = nVal.longitude; + this.getStoreData(); + } + } + }, + methods: { + init(params) { + this.skuId = params.sku_id; + this.goodsId = params.goods_id; + this.preview = params.preview; + this.source_member = params.source_member; + this.whetherCollection = params.whetherCollection; + this.posterParams = params.posterParams; + + this.shareUrl = params.shareUrl; + this.goodsRoute = params.goodsRoute; + this.posterApi = params.posterApi; + this.isVirtual = params.isVirtual; + this.deliveryType = params.deliveryType; + this.evaluateConfig = params.evaluateConfig; + + if (this.evaluateConfig.evaluate_show == 1) { + //商品评论 + this.getGoodsEvaluate(params.evaluateList); + this.evaluateCount = params.evaluateCount; + } + + for (let k in this.deliveryType) { + if (k == 'store') { + this.isShowStore = true; + } + } + + this.getService(); + + this.videoContext = uni.createVideoContext('goodsVideo'); + + // #ifdef MP-WEIXIN + this.goodsSyncToGoodsCircle(); + // #endif + + }, + swiperChange(e) { + this.swiperCurrent = e.detail.current + 1; + }, + + //-------------------------------------服务------------------------------------- + + openMerchantsServicePopup() { + this.$refs.merchantsServicePopup.open(); + }, + closeMerchantsServicePopup() { + this.$refs.merchantsServicePopup.close(); + }, + + //-------------------------------------门店列表------------------------------------- + openStoreListPopup() { + this.$refs.storeListPopup.open(); + }, + closeStoreListPopup() { + this.$refs.storeListPopup.close(); + }, + getStoreData() { + //门店列表 + let data = { + page: this.storeList.page, + page_size: this.storeList.page_size + }; + if (this.latitude && this.longitude) { + data.latitude = this.latitude; + data.longitude = this.longitude; + } + this.$api.sendRequest({ + url: '/api/store/page', + data: data, + success: res => { + if (this.storeList.page == 1) this.storeList.data == []; + if (res.code >= 0 && res.data) { + this.storeList.data = this.storeList.data.concat(res.data.list); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + selectStore(item) { + this.$util.redirectTo('/pages_tool/store/detail', { + store_id: item.store_id + }); + this.closeStoreListPopup(); + }, + //-------------------------------------属性------------------------------------- + + switchGoodsAttr() { + this.goodsAttrShow = !this.goodsAttrShow; + }, + //-------------------------------------评价------------------------------------- + //商品评论列表 + getGoodsEvaluate(list) { + if (list) { + this.goodsEvaluate = list; + this.goodsEvaluate.forEach((item, index) => { + if (this.goodsEvaluate[index].images) this.goodsEvaluate[index].images = this.goodsEvaluate[index].images.split(","); + if (this.goodsEvaluate[index].is_anonymous == 1) this.goodsEvaluate[index].member_name = this.goodsEvaluate[index].member_name.replace(this.goodsEvaluate[index].member_name.substring(1, this.goodsEvaluate[index].member_name.length - 1), '***') + }) + // if (this.goodsEvaluate.images) this.goodsEvaluate.images = this.goodsEvaluate.images.split(","); + // if (this.goodsEvaluate.is_anonymous == 1) this.goodsEvaluate.member_name = this.goodsEvaluate.member_name.replace( + // this.goodsEvaluate.member_name.substring(1, this.goodsEvaluate.member_name.length - 1), '***') + } + }, + // 预览评价图片 + previewEvaluate(index, img_index, field) { + var paths = []; + for (let i = 0; i < this.goodsEvaluate[index][field].length; i++) { + paths.push(this.$util.img(this.goodsEvaluate[index][field][i])); + } + uni.previewImage({ + current: img_index, + urls: paths + }); + }, + //-------------------------------------关注------------------------------------- + async collection() { + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + + if (this.storeToken) { + + //未关注添加关注 + if (this.whetherCollection == 0) { + let res = await this.$api.sendRequest({ + url: "/api/goodscollect/add", + data: { + sku_id: this.skuId, + goods_id: this.goodsSkuDetail.goods_id, + sku_name: this.goodsSkuDetail.sku_name, + sku_price: this.goodsSkuDetail.show_price, + sku_image: this.goodsSkuDetail.sku_image + }, + async: false, + }); + var data = res.data; + if (data > 0) { + this.whetherCollection = 1; + } + } else { + //已关注取消关注 + let res = await this.$api.sendRequest({ + url: "/api/goodscollect/delete", + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + async: false, + }); + var data = res.data; + if (data > 0) { + this.whetherCollection = 0; + } + } + return this.whetherCollection; + } else { + if (this.source_member) { + this.$refs.login.open(this.shareUrl + '&source_member=' + this.source_member); + } else { + this.$refs.login.open(this.shareUrl); + } + } + }, + //-------------------------------------分享------------------------------------- + // 打开分享弹出层 + openSharePopup() { + this.$refs.sharePopup.open(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + copyUrl() { + let text = this.$config.h5Domain + this.shareUrl; + if (this.memberInfo && this.memberInfo.member_id) text += '&source_member=' + this.memberInfo.member_id; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + + //-------------------------------------海报------------------------------------- + // 打开海报弹出层 + openPosterPopup() { + this.getGoodsPoster(); + this.$refs.sharePopup.close(); + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + this.poster = '' + }, + //生成海报 + getGoodsPoster() { + uni.showLoading({ + 'title': '海报生成中...' + }) + //活动海报信息 + if (this.memberInfo && this.memberInfo.member_id) this.posterParams.source_member = this.memberInfo.member_id; + + this.$api.sendRequest({ + url: this.posterApi, + data: { + page: this.goodsRoute, + qrcode_param: JSON.stringify(this.posterParams) + }, + success: res => { + if (res.code == 0) { + this.$refs.posterPopup.open(); + this.poster = res.data.path + "?time=" + new Date().getTime(); + } else { + this.posterMsg = res.message; + this.$util.showToast({ + title: res.message + }) + } + uni.hideLoading(); + }, + fail: err => { + uni.hideLoading(); + } + }); + }, + // 预览图片 + previewMedia(index) { + var paths = []; + for (let i = 0; i < this.goodsSkuDetail.sku_images.length; i++) { + paths.push(this.$util.img(this.goodsSkuDetail.sku_images[i], { + size: 'big' + })); + } + uni.previewImage({ + current: index, + urls: paths, + // longPressActions: { + // itemList: ['发送给朋友', '保存图片', '关注'], + // success: function(data) { + // console.log('选中了第' + (data.tapIndex + 1) + '个按钮,第' + (data.index + 1) + '张图片'); + // }, + // fail: function(err) { + // console.log(err.errMsg); + // } + // } + }); + }, + swiperImageError(index) { + this.goodsSkuDetail.sku_images[index] = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + // #ifdef MP || APP-PLUS + //小程序中保存海报 + saveGoodsPoster() { + let url = this.$util.img(this.poster); + uni.downloadFile({ + url: url, + success: (res) => { + if (res.errMsg == "downloadFile:ok") { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + this.$util.showToast({ + title: "保存成功" + }); + }, + fail: (err) => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + } + }, + fail: (err) => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + }, + // #endif + //售后保障查询 + getService() { + this.$api.sendRequest({ + url: '/api/goods/aftersale', + success: res => { + if (res.code == 0 && res.data) { + this.service = res.data; + } + } + }); + }, + + // #ifdef MP-WEIXIN + /** + * 将商品同步到微信圈子 + */ + goodsSyncToGoodsCircle() { + this.$api.sendRequest({ + url: '/goodscircle/api/goods/sync', + data: { + goods_id: this.goodsSkuDetail.goods_id + }, + success: res => { + if (res.code == 0) { + this.goodsCircle = true; + } + } + }) + }, + /** + * 将商品推荐到微信圈子 + */ + openBusinessView() { + if (wx.openBusinessView) { + wx.openBusinessView({ + businessType: 'friendGoodsRecommend', + extraData: { + product: { + item_code: this.goodsSkuDetail.goods_id, + title: this.goodsSkuDetail.sku_name, + image_list: this.goodsSkuDetail.sku_images.map((ele) => { + return this.$util.img(ele); + }) + } + }, + success: function (res) { + console.log('success', res); + }, + fail: function (res) { + console.log('fail', res); + } + }) + } + }, + // #endif + toEvaluateDetail(id) { + this.$util.redirectTo('/pages_tool/goods/evaluate', { + goods_id: id + }); + }, + showImg(e) { + //拿到图片的路径里面的内容放在我们数组中 + let contentimg = e.target.dataset.nodes; + let arrImg = []; + for (var i = 0; i < contentimg.length; i++) { + var img = contentimg[i].children; + if (Array.isArray(img)) { + for (var j = 0; j < img.length; j++) { + if (img[j].attrs && img[j].name == "img") { + if (img[j].attrs.src) { + arrImg.push(img[j].attrs.src) + } + } + } + } + } + //最后一步就是把我们的所有图片放在预览的api中就可以了 + uni.previewImage({ + current: arrImg, + urls: arrImg, + }) + }, + + //-------------------------------------社群------------------------------------- + + //添加福利群 + onCommunity() { + this.isCommunity = true + }, + onCloseCommunity() { + this.isCommunity = false + }, + + } + +} \ No newline at end of file diff --git a/components/goods-detail-view/goods-detail-view.vue b/components/goods-detail-view/goods-detail-view.vue new file mode 100644 index 0000000..7590573 --- /dev/null +++ b/components/goods-detail-view/goods-detail-view.vue @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + {{ swiperCurrent }} + /{{ goodsSkuDetail.sku_images.length }} + + + + + + + + + + + {{ $lang('video') }} + {{ $lang('image') }} + + + + + + + + + + + + + + + + + {{$lang('send')}} + + + + {{$lang('express')}} + + + + + + + 未配置 + + + + + + + + 服务 + + + + + + + + + {{ item.service_name }} + + + + + + + + + + + + + + + + + + + + + + + + + + + {{goodsSkuDetail.merchinfo.merch_name}} + 官方认证商家,值得信赖! + + + + + + + + + + + + + 配送 + + + + + + + + {{ item.name }} + {{ item.desc }} + + + + + + + + + + + + + + 商品服务 + + + + + + + + + + + {{ item.service_name }} + {{ item.desc }} + + + + + 确定 + + + + + + + + + + + 门店列表 + + + + + + + + + + + + + {{ item.store_name }} + + 距离{{ item.distance > 1 ? item.distance + 'km' : item.distance * 1000 + 'm' }} + + + 营业时间:{{ item.open_date }} + + {{ item.full_address + item.address }} + + + + + + + + + + + + + + + + + + {{ goodsSkuDetail.qr_data.qr_name }} + {{ goodsSkuDetail.qr_data.community_describe }} + + + 添加 + + + + + + + + + + + + + + + + 评价 + ({{ evaluateCount }}) + + 暂无评价 + + 查看全部 + + + + + + + + + + + + + + {{ item.member_name[0] }}***{{ item.member_name[item.member_name.length - 1] }} + + {{ item.member_name }} + + + + + + {{ $util.timeStampTurnTime(item.create_time) }} + + {{ item.content }} + + + + + + + + + + + + + 规格属性 + + + + {{ item.attr_name }} + {{ item.attr_value_name }} + + + + + 展开 + + + 收起 + + + + + + + + + + + {{$lang('details')}} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 保存图片 + + + 长按图片进行保存 + + + + + + + + + + + 分享 + + + + + + 分享给好友 + + + + + + + + + 分享到好物圈 + + + + + + + + 生成分享海报 + + + + + + + 复制链接 + + + + + 取消分享 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/hover-nav/hover-nav.vue b/components/hover-nav/hover-nav.vue new file mode 100644 index 0000000..c4f38c3 --- /dev/null +++ b/components/hover-nav/hover-nav.vue @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/loading-cover/loading-cover.vue b/components/loading-cover/loading-cover.vue new file mode 100644 index 0000000..4bac381 --- /dev/null +++ b/components/loading-cover/loading-cover.vue @@ -0,0 +1,115 @@ + + + + + + + + + + + + + diff --git a/components/mescroll/components/mescroll-down.css b/components/mescroll/components/mescroll-down.css new file mode 100644 index 0000000..1b31399 --- /dev/null +++ b/components/mescroll/components/mescroll-down.css @@ -0,0 +1,55 @@ +/* 下拉刷新区域 */ +.mescroll-downwarp { + position: absolute; + top: -100%; + left: 0; + width: 100%; + height: 100%; + text-align: center; +} + +/* 下拉刷新--内容区,定位于区域底部 */ +.mescroll-downwarp .downwarp-content { + position: absolute; + left: 0; + bottom: 0; + width: 100%; + min-height: 60rpx; + padding: 20rpx 0; + text-align: center; +} + +/* 下拉刷新--提示文本 */ +.mescroll-downwarp .downwarp-tip { + display: inline-block; + font-size: 28rpx; + color: gray; + vertical-align: middle; + margin-left: 16rpx; +} + +/* 下拉刷新--旋转进度条 */ +.mescroll-downwarp .downwarp-progress { + display: inline-block; + width: 32rpx; + height: 32rpx; + border-radius: 50%; + border: 2rpx solid gray; + border-bottom-color: transparent; + vertical-align: middle; +} + +/* 旋转动画 */ +.mescroll-downwarp .mescroll-rotate { + animation: mescrollDownRotate 0.6s linear infinite; +} + +@keyframes mescrollDownRotate { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/components/mescroll/components/mescroll-down.vue b/components/mescroll/components/mescroll-down.vue new file mode 100644 index 0000000..b37b696 --- /dev/null +++ b/components/mescroll/components/mescroll-down.vue @@ -0,0 +1,52 @@ + + + + + + {{ downText }} + + + + + + + diff --git a/components/mescroll/components/mescroll-empty.vue b/components/mescroll/components/mescroll-empty.vue new file mode 100644 index 0000000..f34da7c --- /dev/null +++ b/components/mescroll/components/mescroll-empty.vue @@ -0,0 +1,90 @@ + + + + + {{ tip }} + {{ option.btnText }} + + + + + + diff --git a/components/mescroll/components/mescroll-top.vue b/components/mescroll/components/mescroll-top.vue new file mode 100644 index 0000000..3bc0641 --- /dev/null +++ b/components/mescroll/components/mescroll-top.vue @@ -0,0 +1,81 @@ + + + + + + + + diff --git a/components/mescroll/components/mescroll-up.css b/components/mescroll/components/mescroll-up.css new file mode 100644 index 0000000..ca835c3 --- /dev/null +++ b/components/mescroll/components/mescroll-up.css @@ -0,0 +1,47 @@ +/* 上拉加载区域 */ +.mescroll-upwarp { + min-height: 60rpx; + padding: 30rpx 0; + text-align: center; + clear: both; + margin-bottom: 20rpx; +} + +/*提示文本 */ +.mescroll-upwarp .upwarp-tip, +.mescroll-upwarp .upwarp-nodata { + display: inline-block; + font-size: 28rpx; + color: #b1b1b1; + vertical-align: middle; +} + +.mescroll-upwarp .upwarp-tip { + margin-left: 16rpx; +} + +/*旋转进度条 */ +.mescroll-upwarp .upwarp-progress { + display: inline-block; + width: 32rpx; + height: 32rpx; + border-radius: 50%; + border: 2rpx solid #b1b1b1; + border-bottom-color: transparent; + vertical-align: middle; +} + +/* 旋转动画 */ +.mescroll-upwarp .mescroll-rotate { + animation: mescrollUpRotate 0.6s linear infinite; +} + +@keyframes mescrollUpRotate { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} diff --git a/components/mescroll/components/mescroll-up.vue b/components/mescroll/components/mescroll-up.vue new file mode 100644 index 0000000..beab032 --- /dev/null +++ b/components/mescroll/components/mescroll-up.vue @@ -0,0 +1,39 @@ + + + + + + + {{ mOption.textLoading }} + + + {{ mOption.textNoMore }} + + + + + + diff --git a/components/mescroll/mescroll-body.css b/components/mescroll/mescroll-body.css new file mode 100644 index 0000000..86cd5f8 --- /dev/null +++ b/components/mescroll/mescroll-body.css @@ -0,0 +1,15 @@ +page { + -webkit-overflow-scrolling: touch; + /* 使iOS滚动流畅 */ +} + +.mescroll-body { + position: relative; + /* 下拉刷新区域相对自身定位 */ + height: auto; + /* 不可固定高度,否则overflow: hidden, 可通过设置最小高度使列表不满屏仍可下拉*/ + overflow: hidden; + /* 遮住顶部下拉刷新区域 */ + box-sizing: border-box; + /* 避免设置padding出现双滚动条的问题 */ +} diff --git a/components/mescroll/mescroll-body.vue b/components/mescroll/mescroll-body.vue new file mode 100644 index 0000000..f3199c0 --- /dev/null +++ b/components/mescroll/mescroll-body.vue @@ -0,0 +1,298 @@ + + + + + + + + + {{ downText }} + + + + + + + + + + + + + + + + {{ mescroll.optUp.textLoading }} + + + {{ mescroll.optUp.textNoMore }} + + + + + + + + + + + diff --git a/components/mescroll/mescroll-mixins.js b/components/mescroll/mescroll-mixins.js new file mode 100644 index 0000000..4b3ba3f --- /dev/null +++ b/components/mescroll/mescroll-mixins.js @@ -0,0 +1,60 @@ +// mescroll-body 和 mescroll-uni 通用 + +// import MescrollUni from "./mescroll-uni.vue"; +// import MescrollBody from "./mescroll-body.vue"; + +const MescrollMixin = { + // components: { // 非H5端无法通过mixin注册组件, 只能在main.js中注册全局组件或具体界面中注册 + // MescrollUni, + // MescrollBody + // }, + data() { + return { + mescroll: null //mescroll实例对象 + } + }, + // 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + onPullDownRefresh() { + this.mescroll && this.mescroll.onPullDownRefresh(); + }, + // 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) + onPageScroll(e) { + this.mescroll && this.mescroll.onPageScroll(e); + }, + // 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) + onReachBottom() { + this.mescroll && this.mescroll.onReachBottom(); + }, + methods: { + // mescroll组件初始化的回调,可获取到mescroll对象 + mescrollInit(mescroll) { + this.mescroll = mescroll; + this.mescrollInitByRef(); // 兼容字节跳动小程序 + }, + // 以ref的方式初始化mescroll对象 (兼容字节跳动小程序: http://www.mescroll.com/qa.html?v=20200107#q26) + mescrollInitByRef() { + if (!this.mescroll || !this.mescroll.resetUpScroll) { + let mescrollRef = this.$refs.mescrollRef; + if (mescrollRef) this.mescroll = mescrollRef.mescroll + } + }, + // 下拉刷新的回调 + downCallback() { + // mixin默认resetUpScroll + this.mescroll.resetUpScroll() + }, + // 上拉加载的回调 + upCallback() { + // mixin默认延时500自动结束加载 + setTimeout(() => { + this.mescroll.endErr(); + }, 500) + } + }, + mounted() { + this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况 + } + +} + +export default MescrollMixin; diff --git a/components/mescroll/mescroll-uni-option.js b/components/mescroll/mescroll-uni-option.js new file mode 100644 index 0000000..bfcd06d --- /dev/null +++ b/components/mescroll/mescroll-uni-option.js @@ -0,0 +1,35 @@ +// 全局配置 +// mescroll-body 和 mescroll-uni 通用 +const GlobalOption = { + down: { + // 其他down的配置参数也可以写,这里只展示了常用的配置: + textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 + textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 + textLoading: '加载中 ...', // 加载中的提示文本 + offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 + native: false // 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + }, + up: { + // 其他up的配置参数也可以写,这里只展示了常用的配置: + textLoading: '加载中 ...', // 加载中的提示文本 + textNoMore: '', // 没有更多数据的提示文本 + // textNoMore: '— 我是有底线的 —', // 没有更多数据的提示文本 + offset: 80, // 距底部多远时,触发upCallback + isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 + toTop: { + // 回到顶部按钮,需配置src才显示 + src: "http://www.mescroll.com/img/mescroll-totop.png?v=1", // 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png ) + offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000px + right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + width: 72 // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) + }, + empty: { + use: true, // 是否显示空布局 + icon: "http://www.mescroll.com/img/mescroll-empty.png?v=1", // 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png ) + tip: '~ 暂无相关数据 ~' // 提示 + } + } +} + +export default GlobalOption diff --git a/components/mescroll/mescroll-uni.css b/components/mescroll/mescroll-uni.css new file mode 100644 index 0000000..1c97a00 --- /dev/null +++ b/components/mescroll/mescroll-uni.css @@ -0,0 +1,33 @@ +page { + height: 100%; + box-sizing: border-box; + /* 避免设置padding出现双滚动条的问题 */ +} + +.mescroll-uni-warp { + height: 100%; +} + +.mescroll-uni { + position: relative; + width: 100%; + height: 100%; + min-height: 200rpx; + overflow-y: auto; + box-sizing: border-box; + /* 避免设置padding出现双滚动条的问题 */ +} + +/* 定位的方式固定高度 */ +.mescroll-uni-fixed { + z-index: 1; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + width: auto; + /* 使right生效 */ + height: auto; + /* 使bottom生效 */ +} diff --git a/components/mescroll/mescroll-uni.js b/components/mescroll/mescroll-uni.js new file mode 100644 index 0000000..1b2eb9d --- /dev/null +++ b/components/mescroll/mescroll-uni.js @@ -0,0 +1,841 @@ +/* mescroll + * version 1.2.3 + * 2020-02-18 wenju + * http://www.mescroll.com + */ + +export default function MeScroll(options, isScrollBody) { + let me = this; + me.version = '1.2.3'; // mescroll版本号 + me.options = options || {}; // 配置 + me.isScrollBody = isScrollBody || false; // 滚动区域是否为原生页面滚动; 默认为scroll-view + + me.isDownScrolling = false; // 是否在执行下拉刷新的回调 + me.isUpScrolling = false; // 是否在执行上拉加载的回调 + let hasDownCallback = me.options.down && me.options.down.callback; // 是否配置了down的callback + + // 初始化下拉刷新 + me.initDownScroll(); + // 初始化上拉加载,则初始化 + me.initUpScroll(); + + // 自动加载 + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + // 自动触发下拉刷新 (只有配置了down的callback才自动触发下拉刷新) + if (me.optDown.use && me.optDown.auto && hasDownCallback) { + if (me.optDown.autoShowLoading) { + me.triggerDownScroll(); // 显示下拉进度,执行下拉回调 + } else { + me.optDown.callback && me.optDown.callback(me); // 不显示下拉进度,直接执行下拉回调 + } + } + // 自动触发上拉加载 + setTimeout(function() { // 延时确保先执行down的callback,再执行up的callback,因为部分小程序emit是异步,会导致isUpAutoLoad判断有误 + me.optUp.use && me.optUp.auto && !me.isUpAutoLoad && me.triggerUpScroll(); + }, 100) + }, 30); // 需让me.optDown.inited和me.optUp.inited先执行 +} + +/* 配置参数:下拉刷新 */ +MeScroll.prototype.extendDownScroll = function(optDown) { + // 下拉刷新的配置 + MeScroll.extend(optDown, { + use: true, // 是否启用下拉刷新; 默认true + auto: true, // 是否在初始化完毕之后自动执行下拉刷新的回调; 默认true + native: false, // 是否使用系统自带的下拉刷新; 默认false; 仅mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) + autoShowLoading: false, // 如果设置auto=true(在初始化完毕之后自动执行下拉刷新的回调),那么是否显示下拉刷新的进度; 默认false + isLock: false, // 是否锁定下拉刷新,默认false; + offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 + startTop: 100, // scroll-view滚动到顶部时,此时的scroll-top不一定为0, 此值用于控制最大的误差 + fps: 80, // 下拉节流 (值越大每秒刷新频率越高) + inOffsetRate: 1, // 在列表顶部,下拉的距离小于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉 + outOffsetRate: 0.2, // 在列表顶部,下拉的距离大于offset时,改变下拉区域高度比例;值小于1且越接近0,高度变化越小,表现为越往下越难拉 + bottomOffset: 20, // 当手指touchmove位置在距离body底部20px范围内的时候结束上拉刷新,避免Webview嵌套导致touchend事件不执行 + minAngle: 45, // 向下滑动最少偏移的角度,取值区间 [0,90];默认45度,即向下滑动的角度大于45度则触发下拉;而小于45度,将不触发下拉,避免与左右滑动的轮播等组件冲突; + textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 + textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 + textLoading: '加载中 ...', // 加载中的提示文本 + inited: null, // 下拉刷新初始化完毕的回调 + inOffset: null, // 下拉的距离进入offset范围内那一刻的回调 + outOffset: null, // 下拉的距离大于offset那一刻的回调 + onMoving: null, // 下拉过程中的回调,滑动过程一直在执行; rate下拉区域当前高度与指定距离的比值(inOffset: rate<1; outOffset: rate>=1); downHight当前下拉区域的高度 + beforeLoading: null, // 准备触发下拉刷新的回调: 如果return true,将不触发showLoading和callback回调; 常用来完全自定义下拉刷新, 参考案例【淘宝 v6.8.0】 + showLoading: null, // 显示下拉刷新进度的回调 + afterLoading: null, // 准备结束下拉的回调. 返回结束下拉的延时执行时间,默认0ms; 常用于结束下拉之前再显示另外一小段动画,才去隐藏下拉刷新的场景, 参考案例【dotJump】 + endDownScroll: null, // 结束下拉刷新的回调 + callback: function(mescroll) { + // 下拉刷新的回调;默认重置上拉加载列表为第一页 + mescroll.resetUpScroll(); + } + }) +} + +/* 配置参数:上拉加载 */ +MeScroll.prototype.extendUpScroll = function(optUp) { + // 上拉加载的配置 + MeScroll.extend(optUp, { + use: true, // 是否启用上拉加载; 默认true + auto: true, // 是否在初始化完毕之后自动执行上拉加载的回调; 默认true + isLock: false, // 是否锁定上拉加载,默认false; + isBoth: true, // 上拉加载时,如果滑动到列表顶部是否可以同时触发下拉刷新;默认true,两者可同时触发; + isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 + callback: null, // 上拉加载的回调;function(page,mescroll){ } + page: { + num: 0, // 当前页码,默认0,回调之前会加1,即callback(page)会从1开始 + size: 10, // 每页数据的数量 + time: null // 加载第一页数据服务器返回的时间; 防止用户翻页时,后台新增了数据从而导致下一页数据重复; + }, + noMoreSize: 5, // 如果列表已无数据,可设置列表的总数量要大于等于5条才显示无更多数据;避免列表数据过少(比如只有一条数据),显示无更多数据会不好看 + offset: 80, // 距底部多远时,触发upCallback + textLoading: '加载中 ...', // 加载中的提示文本 + textNoMore: '-- END --', // 没有更多数据的提示文本 + inited: null, // 初始化完毕的回调 + showLoading: null, // 显示加载中的回调 + showNoMore: null, // 显示无更多数据的回调 + hideUpScroll: null, // 隐藏上拉加载的回调 + errDistance: 60, // endErr的时候需往上滑动一段距离,使其往下滑动时再次触发onReachBottom,仅mescroll-body生效 + toTop: { + // 回到顶部按钮,需配置src才显示 + src: null, // 图片路径,默认null (绝对路径或网络图) + offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000 + duration: 300, // 回到顶部的动画时长,默认300ms (当值为0或300则使用系统自带回到顶部,更流畅; 其他值则通过step模拟,部分机型可能不够流畅,所以非特殊情况不建议修改此项) + btnClick: null, // 点击按钮的回调 + onShow: null, // 是否显示的回调 + zIndex: 9990, // fixed定位z-index值 + left: null, // 到左边的距离, 默认null. 此项有值时,right不生效. (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + right: 20, // 到右边的距离, 默认20 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + bottom: 120, // 到底部的距离, 默认120 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + safearea: false, // bottom的偏移量是否加上底部安全区的距离, 默认false, 需要适配iPhoneX时使用 (具体的界面如果不配置此项,则取本vue的safearea值) + width: 72, // 回到顶部图标的宽度, 默认72 (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + radius: "50%" // 圆角, 默认"50%" (支持20, "20rpx", "20px", "20%"格式的值, 其中纯数字则默认单位rpx) + }, + empty: { + use: true, // 是否显示空布局 + icon: null, // 图标路径 + tip: '~ 暂无相关数据 ~', // 提示 + btnText: '', // 按钮 + btnClick: null, // 点击按钮的回调 + onShow: null, // 是否显示的回调 + fixed: false, // 是否使用fixed定位,默认false; 配置fixed为true,以下的top和zIndex才生效 (transform会使fixed失效,最终会降级为absolute) + top: "100rpx", // fixed定位的top值 (完整的单位值,如 "10%"; "100rpx") + zIndex: 99 // fixed定位z-index值 + }, + onScroll: false // 是否监听滚动事件 + }) +} + +/* 配置参数 */ +MeScroll.extend = function(userOption, defaultOption) { + if (!userOption) return defaultOption; + for (let key in defaultOption) { + if (userOption[key] == null) { + let def = defaultOption[key]; + if (def != null && typeof def === 'object') { + userOption[key] = MeScroll.extend({}, def); // 深度匹配 + } else { + userOption[key] = def; + } + } else if (typeof userOption[key] === 'object') { + MeScroll.extend(userOption[key], defaultOption[key]); // 深度匹配 + } + } + return userOption; +} + +/* -------初始化下拉刷新------- */ +MeScroll.prototype.initDownScroll = function() { + let me = this; + // 配置参数 + me.optDown = me.options.down || {}; + me.extendDownScroll(me.optDown); + + // 如果是mescroll-body且配置了native,则禁止自定义的下拉刷新 + if (me.isScrollBody && me.optDown.native) { + me.optDown.use = false + } else { + me.optDown.native = false // 仅mescroll-body支持,mescroll-uni不支持 + } + + me.downHight = 0; // 下拉区域的高度 + + // 在页面中加入下拉布局 + if (me.optDown.use && me.optDown.inited) { + // 初始化完毕的回调 + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + me.optDown.inited(me); + }, 0) + } +} + +/* 列表touchstart事件 */ +MeScroll.prototype.touchstartEvent = function(e) { + if (!this.optDown.use) return; + + this.startPoint = this.getPoint(e); // 记录起点 + this.startTop = this.getScrollTop(); // 记录此时的滚动条位置 + this.lastPoint = this.startPoint; // 重置上次move的点 + this.maxTouchmoveY = this.getBodyHeight() - this.optDown.bottomOffset; // 手指触摸的最大范围(写在touchstart避免body获取高度为0的情况) + this.inTouchend = false; // 标记不是touchend +} + +/* 列表touchmove事件 */ +MeScroll.prototype.touchmoveEvent = function(e) { + if (!this.optDown.use) return; + if (!this.startPoint) return; + let me = this; + + // 节流 + let t = new Date().getTime(); + if (me.moveTime && t - me.moveTime < me.moveTimeDiff) { // 小于节流时间,则不处理 + return; + } else { + me.moveTime = t + if (!me.moveTimeDiff) me.moveTimeDiff = 1000 / me.optDown.fps + } + + let scrollTop = me.getScrollTop(); // 当前滚动条的距离 + let curPoint = me.getPoint(e); // 当前点 + + let moveY = curPoint.y - me.startPoint.y; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 + + // 向下拉 && 在顶部 + // mescroll-body,直接判定在顶部即可 + // scroll-view在滚动时不会触发touchmove,当触顶/底/左/右时,才会触发touchmove + // scroll-view滚动到顶部时,scrollTop不一定为0; 在iOS的APP中scrollTop可能为负数,不一定和startTop相等 + if (moveY > 0 && ( + (me.isScrollBody && scrollTop <= 0) || + (!me.isScrollBody && (scrollTop <= 0 || (scrollTop <= me.optDown.startTop && scrollTop === me.startTop))) + )) { + // 可下拉的条件 + if (!me.inTouchend && !me.isDownScrolling && !me.optDown.isLock && (!me.isUpScrolling || (me.isUpScrolling && + me.optUp.isBoth))) { + + // 下拉的角度是否在配置的范围内 + let angle = me.getAngle(me.lastPoint, curPoint); // 两点之间的角度,区间 [0,90] + if (angle < me.optDown.minAngle) return; // 如果小于配置的角度,则不往下执行下拉刷新 + + // 如果手指的位置超过配置的距离,则提前结束下拉,避免Webview嵌套导致touchend无法触发 + if (me.maxTouchmoveY > 0 && curPoint.y >= me.maxTouchmoveY) { + me.inTouchend = true; // 标记执行touchend + me.touchendEvent(); // 提前触发touchend + return; + } + + me.preventDefault(e); // 阻止默认事件 + + let diff = curPoint.y - me.lastPoint.y; // 和上次比,移动的距离 (大于0向下,小于0向上) + + // 下拉距离 < 指定距离 + if (me.downHight < me.optDown.offset) { + if (me.movetype !== 1) { + me.movetype = 1; // 加入标记,保证只执行一次 + me.optDown.inOffset && me.optDown.inOffset(me); // 进入指定距离范围内那一刻的回调,只执行一次 + me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来 + } + me.downHight += diff * me.optDown.inOffsetRate; // 越往下,高度变化越小 + + // 指定距离 <= 下拉距离 + } else { + if (me.movetype !== 2) { + me.movetype = 2; // 加入标记,保证只执行一次 + me.optDown.outOffset && me.optDown.outOffset(me); // 下拉超过指定距离那一刻的回调,只执行一次 + me.isMoveDown = true; // 标记下拉区域高度改变,在touchend重置回来 + } + if (diff > 0) { // 向下拉 + me.downHight += Math.round(diff * me.optDown.outOffsetRate); // 越往下,高度变化越小 + } else { // 向上收 + me.downHight += diff; // 向上收回高度,则向上滑多少收多少高度 + } + } + + let rate = me.downHight / me.optDown.offset; // 下拉区域当前高度与指定距离的比值 + me.optDown.onMoving && me.optDown.onMoving(me, rate, me.downHight); // 下拉过程中的回调,一直在执行 + } + } + + me.lastPoint = curPoint; // 记录本次移动的点 +} + +/* 列表touchend事件 */ +MeScroll.prototype.touchendEvent = function(e) { + if (!this.optDown.use) return; + // 如果下拉区域高度已改变,则需重置回来 + if (this.isMoveDown) { + if (this.downHight >= this.optDown.offset) { + // 符合触发刷新的条件 + this.triggerDownScroll(); + } else { + // 不符合的话 则重置 + this.downHight = 0; + this.optDown.endDownScroll && this.optDown.endDownScroll(this); + } + this.movetype = 0; + this.isMoveDown = false; + } else if (!this.isScrollBody && this.getScrollTop() === this.startTop) { // scroll-view到顶/左/右/底的滑动事件 + let isScrollUp = this.getPoint(e).y - this.startPoint.y < 0; // 和起点比,移动的距离,大于0向下拉,小于0向上拉 + // 上滑 + if (isScrollUp) { + // 需检查滑动的角度 + let angle = this.getAngle(this.getPoint(e), this.startPoint); // 两点之间的角度,区间 [0,90] + if (angle > 80) { + // 检查并触发上拉 + this.triggerUpScroll(true); + } + } + } +} + +/* 根据点击滑动事件获取第一个手指的坐标 */ +MeScroll.prototype.getPoint = function(e) { + if (!e) { + return { + x: 0, + y: 0 + } + } + if (e.touches && e.touches[0]) { + return { + x: e.touches[0].pageX, + y: e.touches[0].pageY + } + } else if (e.changedTouches && e.changedTouches[0]) { + return { + x: e.changedTouches[0].pageX, + y: e.changedTouches[0].pageY + } + } else { + return { + x: e.clientX, + y: e.clientY + } + } +} + +/* 计算两点之间的角度: 区间 [0,90]*/ +MeScroll.prototype.getAngle = function(p1, p2) { + let x = Math.abs(p1.x - p2.x); + let y = Math.abs(p1.y - p2.y); + let z = Math.sqrt(x * x + y * y); + let angle = 0; + if (z !== 0) { + angle = Math.asin(y / z) / Math.PI * 180; + } + return angle +} + +/* 触发下拉刷新 */ +MeScroll.prototype.triggerDownScroll = function() { + if (this.optDown.beforeLoading && this.optDown.beforeLoading(this)) { + //return true则处于完全自定义状态 + } else { + this.showDownScroll(); // 下拉刷新中... + this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据 + } +} + +/* 显示下拉进度布局 */ +MeScroll.prototype.showDownScroll = function() { + this.isDownScrolling = true; // 标记下拉中 + if (this.optDown.native) { + uni.startPullDownRefresh(); // 系统自带的下拉刷新 + this.optDown.showLoading && this.optDown.showLoading(this, 0); // 仍触发showLoading,因为上拉加载用到 + } else { + this.downHight = this.optDown.offset; // 更新下拉区域高度 + this.optDown.showLoading && this.optDown.showLoading(this, this.downHight); // 下拉刷新中... + } +} + +/* 显示系统自带的下拉刷新时需要处理的业务 */ +MeScroll.prototype.onPullDownRefresh = function() { + this.isDownScrolling = true; // 标记下拉中 + this.optDown.showLoading && this.optDown.showLoading(this, 0); // 仍触发showLoading,因为上拉加载用到 + this.optDown.callback && this.optDown.callback(this); // 执行回调,联网加载数据 +} + +/* 结束下拉刷新 */ +MeScroll.prototype.endDownScroll = function() { + if (this.optDown.native) { // 结束原生下拉刷新 + this.isDownScrolling = false; + this.optDown.endDownScroll && this.optDown.endDownScroll(this); + uni.stopPullDownRefresh(); + return + } + let me = this; + // 结束下拉刷新的方法 + let endScroll = function() { + me.downHight = 0; + me.isDownScrolling = false; + me.optDown.endDownScroll && me.optDown.endDownScroll(me); + !me.isScrollBody && me.setScrollHeight(0) // scroll-view重置滚动区域,使数据不满屏时仍可检查触发翻页 + } + // 结束下拉刷新时的回调 + let delay = 0; + if (me.optDown.afterLoading) delay = me.optDown.afterLoading(me); // 结束下拉刷新的延时,单位ms + if (typeof delay === 'number' && delay > 0) { + setTimeout(endScroll, delay); + } else { + endScroll(); + } +} + +/* 锁定下拉刷新:isLock=ture,null锁定;isLock=false解锁 */ +MeScroll.prototype.lockDownScroll = function(isLock) { + if (isLock == null) isLock = true; + this.optDown.isLock = isLock; +} + +/* 锁定上拉加载:isLock=ture,null锁定;isLock=false解锁 */ +MeScroll.prototype.lockUpScroll = function(isLock) { + if (isLock == null) isLock = true; + this.optUp.isLock = isLock; +} + +/* -------初始化上拉加载------- */ +MeScroll.prototype.initUpScroll = function() { + let me = this; + // 配置参数 + me.optUp = me.options.up || { + use: false + }; + me.extendUpScroll(me.optUp); + + if (!me.optUp.isBounce) me.setBounce(false); // 不允许bounce时,需禁止window的touchmove事件 + + if (me.optUp.use === false) return; // 配置不使用上拉加载时,则不初始化上拉布局 + me.optUp.hasNext = true; // 如果使用上拉,则默认有下一页 + me.startNum = me.optUp.page.num + 1; // 记录page开始的页码 + + // 初始化完毕的回调 + if (me.optUp.inited) { + setTimeout(function() { // 待主线程执行完毕再执行,避免new MeScroll未初始化,在回调获取不到mescroll的实例 + me.optUp.inited(me); + }, 0) + } +} + +/*滚动到底部的事件 (仅mescroll-body生效)*/ +MeScroll.prototype.onReachBottom = function() { + if (this.isScrollBody && !this.isUpScrolling) { // 只能支持下拉刷新的时候同时可以触发上拉加载,否则滚动到底部就需要上滑一点才能触发onReachBottom + if (!this.optUp.isLock && this.optUp.hasNext) { + this.triggerUpScroll(); + } + } +} + +/*列表滚动事件 (仅mescroll-body生效)*/ +MeScroll.prototype.onPageScroll = function(e) { + if (!this.isScrollBody) return; + + // 更新滚动条的位置 (主要用于判断下拉刷新时,滚动条是否在顶部) + this.setScrollTop(e.scrollTop); + + // 顶部按钮的显示隐藏 + if (e.scrollTop >= this.optUp.toTop.offset) { + this.showTopBtn(); + } else { + this.hideTopBtn(); + } +} + +/*列表滚动事件*/ +MeScroll.prototype.scroll = function(e, onScroll) { + // 更新滚动条的位置 + this.setScrollTop(e.scrollTop); + // 更新滚动内容高度 + this.setScrollHeight(e.scrollHeight); + + // 向上滑还是向下滑动 + if (this.preScrollY == null) this.preScrollY = 0; + this.isScrollUp = e.scrollTop - this.preScrollY > 0; + this.preScrollY = e.scrollTop; + + // 上滑 && 检查并触发上拉 + this.isScrollUp && this.triggerUpScroll(true); + + // 顶部按钮的显示隐藏 + if (e.scrollTop >= this.optUp.toTop.offset) { + this.showTopBtn(); + } else { + this.hideTopBtn(); + } + + // 滑动监听 + this.optUp.onScroll && onScroll && onScroll() +} + +/* 触发上拉加载 */ +MeScroll.prototype.triggerUpScroll = function(isCheck) { + if (!this.isUpScrolling && this.optUp.use && this.optUp.callback) { + // 是否校验在底部; 默认不校验 + if (isCheck === true) { + let canUp = false; + // 还有下一页 && 没有锁定 && 不在下拉中 + if (this.optUp.hasNext && !this.optUp.isLock && !this.isDownScrolling) { + if (this.getScrollBottom() <= this.optUp.offset) { // 到底部 + canUp = true; // 标记可上拉 + } + } + if (canUp === false) return; + } + this.showUpScroll(); // 上拉加载中... + this.optUp.page.num++; // 预先加一页,如果失败则减回 + this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调 + this.num = this.optUp.page.num; // 把最新的页数赋值在mescroll上,避免对page的影响 + this.size = this.optUp.page.size; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.time = this.optUp.page.time; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.optUp.callback(this); // 执行回调,联网加载数据 + } +} + +/* 显示上拉加载中 */ +MeScroll.prototype.showUpScroll = function() { + this.isUpScrolling = true; // 标记上拉加载中 + this.optUp.showLoading && this.optUp.showLoading(this); // 回调 +} + +/* 显示上拉无更多数据 */ +MeScroll.prototype.showNoMore = function() { + this.optUp.hasNext = false; // 标记无更多数据 + this.optUp.showNoMore && this.optUp.showNoMore(this); // 回调 +} + +/* 隐藏上拉区域**/ +MeScroll.prototype.hideUpScroll = function() { + this.optUp.hideUpScroll && this.optUp.hideUpScroll(this); // 回调 +} + +/* 结束上拉加载 */ +MeScroll.prototype.endUpScroll = function(isShowNoMore) { + if (isShowNoMore != null) { // isShowNoMore=null,不处理下拉状态,下拉刷新的时候调用 + if (isShowNoMore) { + this.showNoMore(); // isShowNoMore=true,显示无更多数据 + } else { + this.hideUpScroll(); // isShowNoMore=false,隐藏上拉加载 + } + } + this.isUpScrolling = false; // 标记结束上拉加载 +} + +/* 重置上拉加载列表为第一页 + *isShowLoading 是否显示进度布局; + * 1.默认null,不传参,则显示上拉加载的进度布局 + * 2.传参true, 则显示下拉刷新的进度布局 + * 3.传参false,则不显示上拉和下拉的进度 (常用于静默更新列表数据) + */ +MeScroll.prototype.resetUpScroll = function(isShowLoading) { + if (this.optUp && this.optUp.use) { + let page = this.optUp.page; + this.prePageNum = page.num; // 缓存重置前的页码,加载失败可退回 + this.prePageTime = page.time; // 缓存重置前的时间,加载失败可退回 + page.num = this.startNum; // 重置为第一页 + page.time = null; // 重置时间为空 + if (!this.isDownScrolling && isShowLoading !== false) { // 如果不是下拉刷新触发的resetUpScroll并且不配置列表静默更新,则显示进度; + if (isShowLoading == null) { + this.removeEmpty(); // 移除空布局 + this.showUpScroll(); // 不传参,默认显示上拉加载的进度布局 + } else { + this.showDownScroll(); // 传true,显示下拉刷新的进度布局,不清空列表 + } + } + this.isUpAutoLoad = true; // 标记上拉已经自动执行过,避免初始化时多次触发上拉回调 + this.num = page.num; // 把最新的页数赋值在mescroll上,避免对page的影响 + this.size = page.size; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.time = page.time; // 把最新的页码赋值在mescroll上,避免对page的影响 + this.optUp.callback && this.optUp.callback(this); // 执行上拉回调 + } +} + +/* 设置page.num的值 */ +MeScroll.prototype.setPageNum = function(num) { + this.optUp.page.num = num - 1; +} + +/* 设置page.size的值 */ +MeScroll.prototype.setPageSize = function(size) { + this.optUp.page.size = size; +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据量(必传) + * totalPage: 总页数(必传) + * systime: 服务器时间 (可空) + */ +MeScroll.prototype.endByPage = function(dataSize, totalPage, systime) { + let hasNext; + if (this.optUp.use && totalPage != null) hasNext = this.optUp.page.num < totalPage; // 是否还有下一页 + this.endSuccess(dataSize, hasNext, systime); +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据量(必传) + * totalSize: 列表所有数据总数量(必传) + * systime: 服务器时间 (可空) + */ +MeScroll.prototype.endBySize = function(dataSize, totalSize, systime) { + let hasNext; + if (this.optUp.use && totalSize != null) { + let loadSize = (this.optUp.page.num - 1) * this.optUp.page.size + dataSize; // 已加载的数据总数 + hasNext = loadSize < totalSize; // 是否还有下一页 + } + this.endSuccess(dataSize, hasNext, systime); +} + +/* 联网回调成功,结束下拉刷新和上拉加载 + * dataSize: 当前页的数据个数(不是所有页的数据总和),用于上拉加载判断是否还有下一页.如果不传,则会判断还有下一页 + * hasNext: 是否还有下一页,布尔类型;用来解决这个小问题:比如列表共有20条数据,每页加载10条,共2页.如果只根据dataSize判断,则需翻到第三页才会知道无更多数据,如果传了hasNext,则翻到第二页即可显示无更多数据. + * systime: 服务器时间(可空);用来解决这个小问题:当准备翻下一页时,数据库新增了几条记录,此时翻下一页,前面的几条数据会和上一页的重复;这里传入了systime,那么upCallback的page.time就会有值,把page.time传给服务器,让后台过滤新加入的那几条记录 + */ +MeScroll.prototype.endSuccess = function(dataSize, hasNext, systime) { + let me = this; + // 结束下拉刷新 + if (me.isDownScrolling) me.endDownScroll(); + + // 结束上拉加载 + if (me.optUp.use) { + let isShowNoMore; // 是否已无更多数据 + if (dataSize != null) { + let pageNum = me.optUp.page.num; // 当前页码 + let pageSize = me.optUp.page.size; // 每页长度 + // 如果是第一页 + if (pageNum === 1) { + if (systime) me.optUp.page.time = systime; // 设置加载列表数据第一页的时间 + } + if (dataSize < pageSize || hasNext === false) { + // 返回的数据不满一页时,则说明已无更多数据 + me.optUp.hasNext = false; + if (dataSize === 0 && pageNum === 1) { + // 如果第一页无任何数据且配置了空布局 + isShowNoMore = false; + me.showEmpty(); + } else { + // 总列表数少于配置的数量,则不显示无更多数据 + let allDataSize = (pageNum - 1) * pageSize + dataSize; + if (allDataSize < me.optUp.noMoreSize) { + isShowNoMore = false; + } else { + isShowNoMore = true; + } + me.removeEmpty(); // 移除空布局 + } + } else { + // 还有下一页 + isShowNoMore = false; + me.optUp.hasNext = true; + me.removeEmpty(); // 移除空布局 + } + } + + // 隐藏上拉 + me.endUpScroll(isShowNoMore); + } +} + +/* 回调失败,结束下拉刷新和上拉加载 */ +MeScroll.prototype.endErr = function(errDistance) { + // 结束下拉,回调失败重置回原来的页码和时间 + if (this.isDownScrolling) { + let page = this.optUp.page; + if (page && this.prePageNum) { + page.num = this.prePageNum; + page.time = this.prePageTime; + } + this.endDownScroll(); + } + // 结束上拉,回调失败重置回原来的页码 + if (this.isUpScrolling) { + this.optUp.page.num--; + this.endUpScroll(false); + // 如果是mescroll-body,则需往回滚一定距离 + if (this.isScrollBody && errDistance !== 0) { // 不处理0 + if (!errDistance) errDistance = this.optUp.errDistance; // 不传,则取默认 + this.scrollTo(this.getScrollTop() - errDistance, 0) // 往上回滚的距离 + } + } +} + +/* 显示空布局 */ +MeScroll.prototype.showEmpty = function() { + this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(true) +} + +/* 移除空布局 */ +MeScroll.prototype.removeEmpty = function() { + this.optUp.empty.use && this.optUp.empty.onShow && this.optUp.empty.onShow(false) +} + +/* 显示回到顶部的按钮 */ +MeScroll.prototype.showTopBtn = function() { + if (!this.topBtnShow) { + this.topBtnShow = true; + this.optUp.toTop.onShow && this.optUp.toTop.onShow(true); + } +} + +/* 隐藏回到顶部的按钮 */ +MeScroll.prototype.hideTopBtn = function() { + if (this.topBtnShow) { + this.topBtnShow = false; + this.optUp.toTop.onShow && this.optUp.toTop.onShow(false); + } +} + +/* 获取滚动条的位置 */ +MeScroll.prototype.getScrollTop = function() { + return this.scrollTop || 0 +} + +/* 记录滚动条的位置 */ +MeScroll.prototype.setScrollTop = function(y) { + this.scrollTop = y; +} + +/* 滚动到指定位置 */ +MeScroll.prototype.scrollTo = function(y, t) { + this.myScrollTo && this.myScrollTo(y, t) // scrollview需自定义回到顶部方法 +} + +/* 自定义scrollTo */ +MeScroll.prototype.resetScrollTo = function(myScrollTo) { + this.myScrollTo = myScrollTo +} + +/* 滚动条到底部的距离 */ +MeScroll.prototype.getScrollBottom = function() { + return this.getScrollHeight() - this.getClientHeight() - this.getScrollTop() +} + +/* 计步器 + star: 开始值 + end: 结束值 + callback(step,timer): 回调step值,计步器timer,可自行通过window.clearInterval(timer)结束计步器; + t: 计步时长,传0则直接回调end值;不传则默认300ms + rate: 周期;不传则默认30ms计步一次 + * */ +MeScroll.prototype.getStep = function(star, end, callback, t, rate) { + let diff = end - star; // 差值 + if (t === 0 || diff === 0) { + callback && callback(end); + return; + } + t = t || 300; // 时长 300ms + rate = rate || 30; // 周期 30ms + let count = t / rate; // 次数 + let step = diff / count; // 步长 + let i = 0; // 计数 + let timer = setInterval(function() { + if (i < count - 1) { + star += step; + callback && callback(star, timer); + i++; + } else { + callback && callback(end, timer); // 最后一次直接设置end,避免计算误差 + clearInterval(timer); + } + }, rate); +} + +/* 滚动容器的高度 */ +MeScroll.prototype.getClientHeight = function(isReal) { + let h = this.clientHeight || 0 + if (h === 0 && isReal !== true) { // 未获取到容器的高度,可临时取body的高度 (可能会有误差) + h = this.getBodyHeight() + } + return h +} +MeScroll.prototype.setClientHeight = function(h) { + this.clientHeight = h; +} + +/* 滚动内容的高度 */ +MeScroll.prototype.getScrollHeight = function() { + return this.scrollHeight || 0; +} +MeScroll.prototype.setScrollHeight = function(h) { + this.scrollHeight = h; +} + +/* body的高度 */ +MeScroll.prototype.getBodyHeight = function() { + return this.bodyHeight || 0; +} +MeScroll.prototype.setBodyHeight = function(h) { + this.bodyHeight = h; +} + +/* 阻止浏览器默认滚动事件 */ +MeScroll.prototype.preventDefault = function(e) { + // 小程序不支持e.preventDefault + // app的bounce只能通过配置pages.json的style.app-plus.bounce为"none"来禁止 + // cancelable:是否可以被禁用; defaultPrevented:是否已经被禁用 + if (e && e.cancelable && !e.defaultPrevented) e.preventDefault() +} + +/* 是否允许下拉回弹(橡皮筋效果); true或null为允许; false禁止bounce */ +MeScroll.prototype.setBounce = function(isBounce) { + // #ifdef H5 + if (isBounce === false) { + this.optUp.isBounce = false; // 禁止 + // 标记当前页使用了mescroll (需延时,确保page已切换) + setTimeout(function() { + let uniPageDom = document.getElementsByTagName('uni-page')[0]; + uniPageDom && uniPageDom.setAttribute('use_mescroll', true) + }, 30); + // 避免重复添加事件 + if (window.isSetBounce) return; + window.isSetBounce = true; + // 需禁止window的touchmove事件才能有效的阻止bounce + window.bounceTouchmove = function(e) { + let el = e.target; + // 当前touch的元素及父元素是否要拦截touchmove事件 + let isPrevent = true; + while (el !== document.body && el !== document) { + if (el.tagName === 'UNI-PAGE') { // 只扫描当前页 + if (!el.getAttribute('use_mescroll')) { + isPrevent = false; // 如果当前页没有使用mescroll,则不阻止 + } + break; + } + let cls = el.classList; + if (cls) { + if (cls.contains('mescroll-touch')) { // 采用scroll-view 此处不能过滤mescroll-uni,否则下拉仍然有回弹 + isPrevent = false; // mescroll-touch无需拦截touchmove事件 + break; + } else if (cls.contains('mescroll-touch-x') || cls.contains('mescroll-touch-y')) { + // 如果配置了水平或者垂直滑动 + let curX = e.touches ? e.touches[0].pageX : e.clientX; // 当前第一个手指距离列表顶部的距离x + let curY = e.touches ? e.touches[0].pageY : e.clientY; // 当前第一个手指距离列表顶部的距离y + if (!this.preWinX) this.preWinX = curX; // 设置上次移动的距离x + if (!this.preWinY) this.preWinY = curY; // 设置上次移动的距离y + // 计算两点之间的角度 + let x = Math.abs(this.preWinX - curX); + let y = Math.abs(this.preWinY - curY); + let z = Math.sqrt(x * x + y * y); + this.preWinX = curX; // 记录本次curX的值 + this.preWinY = curY; // 记录本次curY的值 + if (z !== 0) { + let angle = Math.asin(y / z) / Math.PI * 180; // 角度区间 [0,90] + if ((angle <= 45 && cls.contains('mescroll-touch-x')) || (angle > 45 && cls.contains('mescroll-touch-y'))) { + isPrevent = false; // 水平滑动或者垂直滑动,不拦截touchmove事件 + break; + } + } + } + } + el = el.parentNode; // 继续检查其父元素 + } + // 拦截touchmove事件:是否可以被禁用&&是否已经被禁用 (这里不使用me.preventDefault(e)的方法,因为某些情况下会报找不到方法的异常) + if (isPrevent && e.cancelable && !e.defaultPrevented && typeof e.preventDefault === "function") e.preventDefault(); + } + window.addEventListener('touchmove', window.bounceTouchmove, { + passive: false + }); + } else { + this.optUp.isBounce = true; // 允许 + if (window.bounceTouchmove) { + window.removeEventListener('touchmove', window.bounceTouchmove); + window.bounceTouchmove = null; + window.isSetBounce = false; + } + } + // #endif +} diff --git a/components/mescroll/mescroll-uni.vue b/components/mescroll/mescroll-uni.vue new file mode 100644 index 0000000..7a40618 --- /dev/null +++ b/components/mescroll/mescroll-uni.vue @@ -0,0 +1,429 @@ + + + + + + + + + + {{ downText }} + + + + + + + + + + + + + + + + + + + {{ mescroll.optUp.textNoMore }} + + + + + + + + + + + + \ No newline at end of file diff --git a/components/mescroll/mixins/mescroll-comp.js b/components/mescroll/mixins/mescroll-comp.js new file mode 100644 index 0000000..5151dbc --- /dev/null +++ b/components/mescroll/mixins/mescroll-comp.js @@ -0,0 +1,23 @@ +/** + * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: + * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) + * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) + */ +const MescrollCompMixin = { + // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 + onPageScroll(e) { + let item = this.$refs["mescrollItem"]; + if (item && item.mescroll) item.mescroll.onPageScroll(e); + }, + onReachBottom() { + let item = this.$refs["mescrollItem"]; + if (item && item.mescroll) item.mescroll.onReachBottom(); + }, + // 当down的native: true时, 还需传递此方法进到子组件 + onPullDownRefresh() { + let item = this.$refs["mescrollItem"]; + if (item && item.mescroll) item.mescroll.onPullDownRefresh(); + } +} + +export default MescrollCompMixin; diff --git a/components/mescroll/mixins/mescroll-more-item.js b/components/mescroll/mixins/mescroll-more-item.js new file mode 100644 index 0000000..acdd290 --- /dev/null +++ b/components/mescroll/mixins/mescroll-more-item.js @@ -0,0 +1,48 @@ +/** + * mescroll-more-item的mixins, 仅在多个 mescroll-body 写在子组件时使用 (参考 mescroll-more 案例) + */ +const MescrollMoreItemMixin = { + props: { + i: Number, // 每个tab页的专属下标 + index: { // 当前tab的下标 + type: Number, + default () { + return 0 + } + } + }, + data() { + return { + downOption: { + auto: false // 不自动加载 + }, + upOption: { + auto: false // 不自动加载 + }, + isInit: false // 当前tab是否已初始化 + } + }, + watch: { + // 监听下标的变化 + index(val) { + if (this.i === val && !this.isInit) { + this.isInit = true; // 标记为true + this.mescroll && this.mescroll.triggerDownScroll(); + } + } + }, + methods: { + // mescroll组件初始化的回调,可获取到mescroll对象 + mescrollInit(mescroll) { + this.mescroll = mescroll; + this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序 (mescroll-mixins.js) + // 自动加载当前tab的数据 + if (this.i === this.index) { + this.isInit = true; // 标记为true + this.mescroll.triggerDownScroll(); + } + }, + } +} + +export default MescrollMoreItemMixin; diff --git a/components/mescroll/mixins/mescroll-more.js b/components/mescroll/mixins/mescroll-more.js new file mode 100644 index 0000000..8a11d40 --- /dev/null +++ b/components/mescroll/mixins/mescroll-more.js @@ -0,0 +1,56 @@ +/** + * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: + * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) + * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) + */ +const MescrollMoreMixin = { + data() { + return { + tabIndex: 0 // 当前tab下标 + } + }, + // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 + onPageScroll(e) { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onPageScroll(e); + }, + onReachBottom() { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onReachBottom(); + }, + // 当down的native: true时, 还需传递此方法进到子组件 + onPullDownRefresh() { + let mescroll = this.getMescroll(this.tabIndex); + mescroll && mescroll.onPullDownRefresh(); + }, + methods: { + // 根据下标获取对应子组件的mescroll + getMescroll(i) { + if (!this.mescrollItems) this.mescrollItems = []; + if (!this.mescrollItems[i]) { + // v-for中的refs + let vForItem = this.$refs["mescrollItem"]; + if (vForItem) { + this.mescrollItems[i] = vForItem[i] + } else { + // 普通的refs,不可重复 + this.mescrollItems[i] = this.$refs["mescrollItem" + i]; + } + } + let item = this.mescrollItems[i] + return item ? item.mescroll : null + }, + // 切换tab,恢复滚动条位置 + tabChange(i) { + let mescroll = this.getMescroll(i); + if (mescroll) { + // 延时(比$nextTick靠谱一些),确保元素已渲染 + setTimeout(() => { + mescroll.scrollTo(mescroll.getScrollTop(), 0) + }, 30) + } + } + } +} + +export default MescrollMoreMixin; diff --git a/components/mescroll/my-list-mescroll.vue b/components/mescroll/my-list-mescroll.vue new file mode 100644 index 0000000..834a950 --- /dev/null +++ b/components/mescroll/my-list-mescroll.vue @@ -0,0 +1,113 @@ + + + + + + + + + diff --git a/components/ns-adv/ns-adv.vue b/components/ns-adv/ns-adv.vue new file mode 100644 index 0000000..0d44df7 --- /dev/null +++ b/components/ns-adv/ns-adv.vue @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/ns-birthday-gift/ns-birthday-gift.vue b/components/ns-birthday-gift/ns-birthday-gift.vue new file mode 100644 index 0000000..e34abb7 --- /dev/null +++ b/components/ns-birthday-gift/ns-birthday-gift.vue @@ -0,0 +1,336 @@ + + + + + + + Dear {{ memberInfo.nickname }} + + {{ birthday.blessing_content }} + + 感谢您一直以来的支持,在您生日到来之际,特为您送上最真诚的祝福! + + + 生日贺礼 + + + + + + + + {{ parseFloat(birthday.point) }} + 积分 + + 用于下单时抵现或兑换商品等 + + 立即查看 + + + + + {{ parseFloat(birthday.balance) }} + 元红包 + + 不可提现红包 + + 立即查看 + + + + + {{ parseFloat(birthday.balance_money) }} + 元红包 + + 可提现红包 + + 立即查看 + + + + + + + + + {{ parseFloat(item.money) }} + 元优惠劵 + + + + + {{ item.discount }} + 折 + + + 用于下单时抵现或兑换商品等 + + 立即查看 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/ns-contact/ns-contact.vue b/components/ns-contact/ns-contact.vue new file mode 100644 index 0000000..b69bca8 --- /dev/null +++ b/components/ns-contact/ns-contact.vue @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + 联系客服 + + + {{ siteInfo.site_tel ? '请联系客服,客服电话是' + siteInfo.site_tel : '抱歉,商家暂无客服,请线下联系' }} + + + + + + + + + \ No newline at end of file diff --git a/components/ns-copyright/ns-copyright.vue b/components/ns-copyright/ns-copyright.vue new file mode 100644 index 0000000..53444af --- /dev/null +++ b/components/ns-copyright/ns-copyright.vue @@ -0,0 +1,142 @@ + + + + + + + + + \ No newline at end of file diff --git a/components/ns-empty/ns-empty.vue b/components/ns-empty/ns-empty.vue new file mode 100644 index 0000000..3d46f4a --- /dev/null +++ b/components/ns-empty/ns-empty.vue @@ -0,0 +1,95 @@ + + + + {{ text }} + {{ subText }} + {{ emptyBtn.text }} + + + + + + diff --git a/components/ns-form/ns-form.vue b/components/ns-form/ns-form.vue new file mode 100644 index 0000000..452c8df --- /dev/null +++ b/components/ns-form/ns-form.vue @@ -0,0 +1,867 @@ + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + {{ item.val }} + 请选择 + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + + + + {{ v.value }} + + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + + + + {{ v.value }} + + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + {{ item.val ? item.val : item.value.placeholder }} + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + + {{ item.start_date ? item.start_date : item.value.placeholder_start }} + + + + + + + + {{ item.end_date ? item.end_date : item.value.placeholder_end }} + + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + {{ item.val ? item.val : item.value.placeholder }} + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + + {{ item.start_time ? item.start_time : item.value.placeholder_start }} + + + + + + + + {{ item.end_time ? item.end_time : item.value.placeholder_end }} + + + + + + + + + + + {{ item.value.title }} + {{ item.value.required ? '*' : '' }} + + + + + {{ item.val ? item.val : item.select_arr == '2' ? '请选择省市' : '请选择省市区/县' }} + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/ns-goods-action-button/ns-goods-action-button.vue b/components/ns-goods-action-button/ns-goods-action-button.vue new file mode 100644 index 0000000..1210943 --- /dev/null +++ b/components/ns-goods-action-button/ns-goods-action-button.vue @@ -0,0 +1,96 @@ + + {{ disabledText }} + + {{ textPrice }} + {{ text }} + + + + + + \ No newline at end of file diff --git a/components/ns-goods-action-icon/ns-goods-action-icon.vue b/components/ns-goods-action-icon/ns-goods-action-icon.vue new file mode 100644 index 0000000..d88a20e --- /dev/null +++ b/components/ns-goods-action-icon/ns-goods-action-icon.vue @@ -0,0 +1,146 @@ + + + + + + + {{ text }} + {{ cornerMark }} + + + + + + + {{ text }} + {{ cornerMark > 99 ? '99+' : cornerMark }} + + + + + + + + diff --git a/components/ns-goods-action/ns-goods-action.vue b/components/ns-goods-action/ns-goods-action.vue new file mode 100644 index 0000000..e6379c7 --- /dev/null +++ b/components/ns-goods-action/ns-goods-action.vue @@ -0,0 +1,33 @@ + + + + + + + diff --git a/components/ns-goods-promotion/ns-goods-promotion.vue b/components/ns-goods-promotion/ns-goods-promotion.vue new file mode 100644 index 0000000..cbc219e --- /dev/null +++ b/components/ns-goods-promotion/ns-goods-promotion.vue @@ -0,0 +1,125 @@ + + + + + + 限时折扣 + 当前商品正在参加{{ item.promotion_name }} + + + + + + 团购 + 当前商品正在参加{{ item.promotion_name }} + + + + + 拼团 + 当前商品正在参加{{ item.promotion_name }} + + + + + 秒杀 + 当前商品正在参加{{ item.promotion_name }} + + + + + 专题活动 + 当前商品正在参加{{ item.promotion_name }} + + + + + 砍价 + 当前商品正在参加{{ item.promotion_name }} + + + + + 拼团返利 + 当前商品正在参加{{ item.promotion_name }} + + + + + + + + + diff --git a/components/ns-goods-recommend/ns-goods-recommend.vue b/components/ns-goods-recommend/ns-goods-recommend.vue new file mode 100644 index 0000000..2bec54c --- /dev/null +++ b/components/ns-goods-recommend/ns-goods-recommend.vue @@ -0,0 +1,401 @@ + + + + + + + \ No newline at end of file diff --git a/components/ns-goods-sku/ns-goods-sku-category.vue b/components/ns-goods-sku/ns-goods-sku-category.vue new file mode 100644 index 0000000..7cc117c --- /dev/null +++ b/components/ns-goods-sku/ns-goods-sku-category.vue @@ -0,0 +1,852 @@ + + + + + + + + + + + + {{ goodsDetail.goods_name }} + + + 库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} + + 起售{{goodsDetail.min_buy}}件 + + + + + + + + {{ item.spec_name }} + + + + {{ item_value.spec_value_name }} + + + + + + + + + 已选择: + {{ item.spec_value_name }} + + + + + + ¥{{ goodsDetail.show_price }} + + + + + + + + + + + + + + + + + 加入购物车 + 确定 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/ns-goods-sku/ns-goods-sku-index.vue b/components/ns-goods-sku/ns-goods-sku-index.vue new file mode 100644 index 0000000..5dcf5f0 --- /dev/null +++ b/components/ns-goods-sku/ns-goods-sku-index.vue @@ -0,0 +1,236 @@ + + + + + + + + + \ No newline at end of file diff --git a/components/ns-goods-sku/ns-goods-sku.vue b/components/ns-goods-sku/ns-goods-sku.vue new file mode 100644 index 0000000..993553b --- /dev/null +++ b/components/ns-goods-sku/ns-goods-sku.vue @@ -0,0 +1,1545 @@ + + + + + + + + + + + + + + + + + + + + + + {{ goodsDetail.point }}积分 + + + + {{ $lang('common.currencySymbol') }}{{ goodsDetail.exchange_price }} + + + + 库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} + + + + {{ goodsDetail.name }} + + + 积分: + {{ goodsDetail.point }} + + + 库存: + {{ goodsDetail.stock }}{{ goodsDetail.unit }} + + + + + + ¥ + {{ parseFloat(goodsDetail.presale_deposit).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.presale_deposit).toFixed(2).split('.')[1] }} + + 尾款 + ¥ + {{ balance }} + + + + 库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} + + + + + + + + ¥ + {{ parseFloat(pintuanPrice(goodsDetail)).toFixed(2).split('.')[0] }} + .{{ parseFloat(pintuanPrice(goodsDetail)).toFixed(2).split('.')[1] }} + + + ¥ + {{ parseFloat(goodsDetail.promotion_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.promotion_price).toFixed(2).split('.')[1] }} + + + + + ¥ + {{ parseFloat(pintuanPrice(goodsDetail)).toFixed(2).split('.')[0] }} + .{{ parseFloat(pintuanPrice(goodsDetail)).toFixed(2).split('.')[1] }} + + + + ¥ + {{ parseFloat(goodsDetail.groupbuy_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.groupbuy_price).toFixed(2).split('.')[1] }} + + + ¥ + {{ parseFloat(goodsDetail.topic_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.topic_price).toFixed(2).split('.')[1] }} + + + ¥ + {{ parseFloat(goodsDetail.seckill_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.seckill_price).toFixed(2).split('.')[1] }} + + + ¥ + + + {{ parseFloat(goodsDetail.discount_price).toFixed(2).split('.')[0] }} + {{ parseFloat(goodsDetail.member_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.discount_price).toFixed(2).split('.')[1] }} + .{{ parseFloat(goodsDetail.member_price).toFixed(2).split('.')[1] }} + + + {{ parseFloat(goodsDetail.discount_price).toFixed(2).split('.')[0] }} + {{ parseFloat(goodsDetail.price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.discount_price).toFixed(2).split('.')[1] }} + .{{ parseFloat(goodsDetail.price).toFixed(2).split('.')[1] }} + + + + {{ parseFloat(goodsDetail.member_price).toFixed(2).split('.')[0] }} + {{ parseFloat(goodsDetail.price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsDetail.member_price).toFixed(2).split('.')[1] }} + .{{ parseFloat(goodsDetail.price).toFixed(2).split('.')[1] }} + + + 库存{{ goodsDetail.stock }}{{ goodsDetail.unit }} + + + + 已选规格: + {{ item.spec_value_name }} + + + + + + + + + + + + + {{ goodsDetail.pintuan_num }}人团 + + + {{ goodsDetail.pintuan_num_2 }}人团 + + + {{ goodsDetail.pintuan_num_3 }}人团 + + + + + {{ item.spec_name }} + + + {{ item_value.spec_value_name }} + + + + + + 兑换数量 + 购买数量 + (每人限购{{ limitNumber }}{{ goodsDetail.unit }}) + + ({{ minBuy }}{{ goodsDetail.unit }}起售,限购{{ maxBuy }}{{ goodsDetail.unit }}) + + (限购{{ maxBuy }}{{ goodsDetail.unit }}) + ({{ minBuy }}{{ goodsDetail.unit }}起售) + + - + + + + + + + + + + + + 加入购物车 + + + + 兑换 + 库存不足 + + + + 兑换 + + + + 加入购物车 + 立即购买 + 确认 + + + 立即抢购 + 库存不足 + + + 立即抢购 + + + 库存不足 + + 该商品已下架 + + + + + + + + + \ No newline at end of file diff --git a/components/ns-loading/ns-loading.vue b/components/ns-loading/ns-loading.vue new file mode 100644 index 0000000..eb4507c --- /dev/null +++ b/components/ns-loading/ns-loading.vue @@ -0,0 +1,89 @@ + + + + + {{ downText }} + + + + + + + diff --git a/components/ns-login/ns-login.vue b/components/ns-login/ns-login.vue new file mode 100644 index 0000000..3d431b6 --- /dev/null +++ b/components/ns-login/ns-login.vue @@ -0,0 +1,784 @@ + + + + + + + + + + 检测到您还未绑定手机号 + 为了方便您接收订单等信息,需要绑定手机号 + + + + 手机号 + + + + 验证码 + + + + + 动态码 + + {{ dynacodeData.codeText }} + + + + 保存 + + + + + + 获取您的昵称、头像 + + 、手机号 + + + + 获取用户头像、昵称 + + 、手机号 + + 完善个人资料,主要用于向用户提供具有辨识度的用户中心界面 + + + + + + 头像 + + + + + + + 昵称 + + + + + + + 头像 + + + + + + + 昵称 + + + + + 手机号 + + {{ formData.mobile }} + 获取手机号 + + + 保存 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/ns-navbar/ns-navbar.vue b/components/ns-navbar/ns-navbar.vue new file mode 100644 index 0000000..6667b50 --- /dev/null +++ b/components/ns-navbar/ns-navbar.vue @@ -0,0 +1,404 @@ + + + + + + + \ No newline at end of file diff --git a/components/ns-new-gift/ns-new-gift.vue b/components/ns-new-gift/ns-new-gift.vue new file mode 100644 index 0000000..a6553c9 --- /dev/null +++ b/components/ns-new-gift/ns-new-gift.vue @@ -0,0 +1,349 @@ + + + + + + + + + {{ newgift.activity_name }} + + + Dear {{ memberInfo.nickname }} + {{ newgift.remark }} + 感谢您一直以来的支持,为回馈会员,商城{{ newgift.activity_name ? newgift.activity_name : 'xx' }}节日,为您提供以下福利 + + + + + + {{ newgift.award_list.point }} + 积分 + + 用于参与活动购买商品时抵扣 + + 立即查看 + + + + + {{ newgift.award_list.balance | int }} + 元红包 + + 不可提现红包 + + 立即查看 + + + + + {{ newgift.award_list.balance_money | int }} + 元红包 + + 可提现红包 + + 立即查看 + + + + + + + {{ parseFloat(item.money) }} + 元优惠劵 + + + {{ item.discount | int }} + 折 + + 用于下单时抵现或兑换商品等 + + 立即查看 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/ns-payment/ns-payment.vue b/components/ns-payment/ns-payment.vue new file mode 100644 index 0000000..ba31411 --- /dev/null +++ b/components/ns-payment/ns-payment.vue @@ -0,0 +1,647 @@ + + + + + + + 支付方式 + + + + + + 支付金额{{ payMoney | moneyFormat }}元 + + + + + 余额抵扣 + 可用¥{{ balanceDeduct }} + + + + + + + + {{ item.name }} + + + + + 平台尚未配置支付方式! + + + + + 确认支付 + + + + + + + + + + \ No newline at end of file diff --git a/components/ns-select-time/ns-select-time.vue b/components/ns-select-time/ns-select-time.vue new file mode 100644 index 0000000..15a5553 --- /dev/null +++ b/components/ns-select-time/ns-select-time.vue @@ -0,0 +1,369 @@ + + + + + + 选择送达时间 + 选择自提时间 + + + + + + + {{ item.title }} + {{ item.month }} + {{ item.Day }} + + + + + + {{ item }} + + + + + + + + + + + + diff --git a/components/ns-switch/ns-switch.vue b/components/ns-switch/ns-switch.vue new file mode 100644 index 0000000..8ce894b --- /dev/null +++ b/components/ns-switch/ns-switch.vue @@ -0,0 +1,69 @@ + + + + + + + + + + diff --git a/components/payment/payment.vue b/components/payment/payment.vue new file mode 100644 index 0000000..4147770 --- /dev/null +++ b/components/payment/payment.vue @@ -0,0 +1,654 @@ + + + + + + + 支付方式 + + + + + 支付金额{{ payMoney|moneyFormat }}元 + + + + + + 余额支付 + 可用¥{{ balanceDeduct|moneyFormat }} + + + + + + + + {{ item.name }} + + + + + 平台尚未配置支付方式! + + + + + 确认支付 + + + + + + + + + + \ No newline at end of file diff --git a/components/pengpai-fadein-out/pengpai-fadein-out.vue b/components/pengpai-fadein-out/pengpai-fadein-out.vue new file mode 100644 index 0000000..31c32aa --- /dev/null +++ b/components/pengpai-fadein-out/pengpai-fadein-out.vue @@ -0,0 +1,269 @@ + + + + + + + + + + + {{ penpaiData.title }} + + + + + + + + + diff --git a/components/pick-regions/pick-regions.vue b/components/pick-regions/pick-regions.vue new file mode 100644 index 0000000..e47d1fa --- /dev/null +++ b/components/pick-regions/pick-regions.vue @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + 取消 + 完成 + + + + {{item}} + + + {{item}} + + + {{item}} + + + + + + + + + + + \ No newline at end of file diff --git a/components/register-reward/register-reward.vue b/components/register-reward/register-reward.vue new file mode 100644 index 0000000..b567b1f --- /dev/null +++ b/components/register-reward/register-reward.vue @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + 积分奖励 + + + + {{ reward.point }} + 积分 + + 用于下单时抵现或兑换商品等 + + 立即查看 + + + + 成长值 + + + + {{ reward.growth }} + 成长值 + + 用于提升会员等级 + + 立即查看 + + + + 红包奖励 + + + + {{ reward.balance }} + 元 + + 不可提现下单时可用 + + 立即查看 + + + + 优惠券奖励 + + + + {{ item.coupon_name }} + + + 满{{ item.at_least }}{{ item.type == 'discount' ? '打' + item.discount + '折' : '减' + item.money }} + + + 无门槛,{{ item.type == 'discount' ? '打' + item.discount + '折' : '减' + item.money }} + + + 立即查看 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/toTop/toTop.vue b/components/toTop/toTop.vue new file mode 100644 index 0000000..0eabd20 --- /dev/null +++ b/components/toTop/toTop.vue @@ -0,0 +1,58 @@ + + + + + + + + diff --git a/components/uni-badge/uni-badge.vue b/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..a59580e --- /dev/null +++ b/components/uni-badge/uni-badge.vue @@ -0,0 +1,105 @@ + + + {{ text }} + + + + + + diff --git a/components/uni-count-down/uni-count-down.vue b/components/uni-count-down/uni-count-down.vue new file mode 100644 index 0000000..2bdf21d --- /dev/null +++ b/components/uni-count-down/uni-count-down.vue @@ -0,0 +1,252 @@ + + + + {{ d }} + + {{ showColon ? '天' : '天' }} + + {{ h }} + + {{ showColon ? ':' : '时' }} + + {{ i }} + + {{ showColon ? ':' : '分' }} + + {{ s }} + + 秒 + + + + diff --git a/components/uni-drawer/uni-drawer.vue b/components/uni-drawer/uni-drawer.vue new file mode 100644 index 0000000..65c3e62 --- /dev/null +++ b/components/uni-drawer/uni-drawer.vue @@ -0,0 +1,146 @@ + + + + + + + + + + diff --git a/components/uni-grid-item/uni-grid-item.vue b/components/uni-grid-item/uni-grid-item.vue new file mode 100644 index 0000000..44c79dc --- /dev/null +++ b/components/uni-grid-item/uni-grid-item.vue @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + diff --git a/components/uni-grid/uni-grid.vue b/components/uni-grid/uni-grid.vue new file mode 100644 index 0000000..979e814 --- /dev/null +++ b/components/uni-grid/uni-grid.vue @@ -0,0 +1,95 @@ + + + + + + + + + + + diff --git a/components/uni-icons/icons.js b/components/uni-icons/icons.js new file mode 100644 index 0000000..1f5a778 --- /dev/null +++ b/components/uni-icons/icons.js @@ -0,0 +1,96 @@ +export default { + 'contact': '\ue100', + 'person': '\ue101', + 'personadd': '\ue102', + 'contact-filled': '\ue130', + 'person-filled': '\ue131', + 'personadd-filled': '\ue132', + 'phone': '\ue200', + 'email': '\ue201', + 'chatbubble': '\ue202', + 'chatboxes': '\ue203', + 'phone-filled': '\ue230', + 'email-filled': '\ue231', + 'chatbubble-filled': '\ue232', + 'chatboxes-filled': '\ue233', + 'weibo': '\ue260', + 'weixin': '\ue261', + 'pengyouquan': '\ue262', + 'chat': '\ue263', + 'qq': '\ue264', + 'videocam': '\ue300', + 'camera': '\ue301', + 'mic': '\ue302', + 'location': '\ue303', + 'mic-filled': '\ue332', + 'speech': '\ue332', + 'location-filled': '\ue333', + 'micoff': '\ue360', + 'image': '\ue363', + 'map': '\ue364', + 'compose': '\ue400', + 'trash': '\ue401', + 'upload': '\ue402', + 'download': '\ue403', + 'close': '\ue404', + 'redo': '\ue405', + 'undo': '\ue406', + 'refresh': '\ue407', + 'star': '\ue408', + 'plus': '\ue409', + 'minus': '\ue410', + 'circle': '\ue411', + 'checkbox': '\ue411', + 'close-filled': '\ue434', + 'clear': '\ue434', + 'refresh-filled': '\ue437', + 'star-filled': '\ue438', + 'plus-filled': '\ue439', + 'minus-filled': '\ue440', + 'circle-filled': '\ue441', + 'checkbox-filled': '\ue442', + 'closeempty': '\ue460', + 'refreshempty': '\ue461', + 'reload': '\ue462', + 'starhalf': '\ue463', + 'spinner': '\ue464', + 'spinner-cycle': '\ue465', + 'search': '\ue466', + 'plusempty': '\ue468', + 'forward': '\ue470', + 'back': '\ue471', + 'left-nav': '\ue471', + 'checkmarkempty': '\ue472', + 'home': '\ue500', + 'navigate': '\ue501', + 'gear': '\ue502', + 'paperplane': '\ue503', + 'info': '\ue504', + 'help': '\ue505', + 'locked': '\ue506', + 'more': '\ue507', + 'flag': '\ue508', + 'home-filled': '\ue530', + 'gear-filled': '\ue532', + 'info-filled': '\ue534', + 'help-filled': '\ue535', + 'more-filled': '\ue537', + 'settings': '\ue560', + 'list': '\ue562', + 'bars': '\ue563', + 'loop': '\ue565', + 'paperclip': '\ue567', + 'eye': '\ue568', + 'arrowup': '\ue580', + 'arrowdown': '\ue581', + 'arrowleft': '\ue582', + 'arrowright': '\ue583', + 'arrowthinup': '\ue584', + 'arrowthindown': '\ue585', + 'arrowthinleft': '\ue586', + 'arrowthinright': '\ue587', + 'pulldown': '\ue588', + 'closefill': '\ue589', + 'sound': '\ue590', + 'scan': '\ue612' +} diff --git a/components/uni-icons/uni-icons.vue b/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..bbf6631 --- /dev/null +++ b/components/uni-icons/uni-icons.vue @@ -0,0 +1,63 @@ + + {{ icons[type] }} + + + + + diff --git a/components/uni-number-box/uni-number-box.vue b/components/uni-number-box/uni-number-box.vue new file mode 100644 index 0000000..d2c61c1 --- /dev/null +++ b/components/uni-number-box/uni-number-box.vue @@ -0,0 +1,261 @@ + + + - + + + + + + + + + + + + \ No newline at end of file diff --git a/components/uni-popup/uni-popup-sku-new.vue b/components/uni-popup/uni-popup-sku-new.vue new file mode 100644 index 0000000..eeb4e29 --- /dev/null +++ b/components/uni-popup/uni-popup-sku-new.vue @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + diff --git a/components/uni-popup/uni-popup-sku.vue b/components/uni-popup/uni-popup-sku.vue new file mode 100644 index 0000000..409f66e --- /dev/null +++ b/components/uni-popup/uni-popup-sku.vue @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + diff --git a/components/uni-popup/uni-popup.vue b/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..f4fa592 --- /dev/null +++ b/components/uni-popup/uni-popup.vue @@ -0,0 +1,244 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/components/uni-tag/uni-tag.vue b/components/uni-tag/uni-tag.vue new file mode 100644 index 0000000..8702b41 --- /dev/null +++ b/components/uni-tag/uni-tag.vue @@ -0,0 +1,158 @@ + + + {{ text }} + + + + + + diff --git a/components/wx-privacy-popup/privacy-popup.vue b/components/wx-privacy-popup/privacy-popup.vue new file mode 100644 index 0000000..916e360 --- /dev/null +++ b/components/wx-privacy-popup/privacy-popup.vue @@ -0,0 +1,232 @@ + + + + + 用户隐私保护提示 + + 感谢您使用本小程序,在使用前您应当阅读并同意 + {{privacyContractName}}, + 当点击同意并继续时,即表示您已理解并同意该条款内容,该条款将对您产生法律约束力;如您不同意,将无法继续使用小程序相关功能。 + + + 不同意 + 同意并继续 + + + + + + + + + \ No newline at end of file diff --git a/components/xiao-star-component/xiao-star-component.vue b/components/xiao-star-component/xiao-star-component.vue new file mode 100644 index 0000000..cce3844 --- /dev/null +++ b/components/xiao-star-component/xiao-star-component.vue @@ -0,0 +1,234 @@ + + + + + + + + + + + + + diff --git a/lang/en-us/common.js b/lang/en-us/common.js new file mode 100644 index 0000000..f9e4173 --- /dev/null +++ b/lang/en-us/common.js @@ -0,0 +1,21 @@ +export const lang = { + + // 底部选项卡 + tabBar: { + home: 'index', + category: 'category', + cart: 'cart', + member: 'member', + }, + + //公共 + common: { + //语言包名称 + name: '英文', + mescrollTextInOffset: 'pull to refresh', + mescrollTextOutOffset: 'Loading...', + mescrollEmpty: "No data available", + goodsRecommendTitle: 'Guess you like', + currencySymbol: '¥' + } +} diff --git a/lang/en-us/contact/contact.js b/lang/en-us/contact/contact.js new file mode 100644 index 0000000..6ade10d --- /dev/null +++ b/lang/en-us/contact/contact.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: 'Electronic Card' +} diff --git a/lang/en-us/goods/category.js b/lang/en-us/goods/category.js new file mode 100644 index 0000000..0c94fbb --- /dev/null +++ b/lang/en-us/goods/category.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: 'Category', + search: 'Search', + seeMore : '查看更多' +} diff --git a/lang/en-us/goods/detail.js b/lang/en-us/goods/detail.js new file mode 100644 index 0000000..a48ea63 --- /dev/null +++ b/lang/en-us/goods/detail.js @@ -0,0 +1,37 @@ +export const lang = { + //title为每个页面的标题 + title: 'Goods dtails', + details:'Details', + home:'Home', + cart:'Cart', + + leave:'leave a message', + make:'make an appointment', + makebtn:'make', + + sales:'sales', + stock:'stock', + send:'send', + express:'Express Delivery', + commission:'Commission Details', + + express:'Express Delivery', + addcart:'Add Cart', + buynow:'Buy Now', + status:'Goods Off', + sellout:'Sell Out', + max:'Maximum', + + + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频', + + kefu:'Contact', + follow:'Follow', + + spec:'Spec' +} diff --git a/lang/en-us/member/index.js b/lang/en-us/member/index.js new file mode 100644 index 0000000..887d37f --- /dev/null +++ b/lang/en-us/member/index.js @@ -0,0 +1,48 @@ +export const lang = { + //title为每个页面的标题 + title: 'member', + login: 'Login', + loginTpis: 'Login experience', + memberLevel: '会员等级', + moreAuthority: '更多权限', + allOrders: '全部订单', + seeAllOrders: '查看全部订单', + waitPay: '待付款', + readyDelivery: '待发货', + waitDelivery: '待收货', + refunding: '退款', + // 会员中心入口 + sign: '签到', + personInfo: '个人资料', + receivingAddress: '收货地址', + accountList: '账户列表', + couponList: '优惠券', + mySpellList: '我的拼单', + myBargain: '我的砍价', + virtualCode: '虚拟码', + winningRecord: '我的礼品', + myCollection: '我的关注', + myTracks: '我的足迹', + pintuanOrder: '拼团订单', + yushouOrder: '预售订单', + verification: '核销台', + message: '我的消息', + exchangeOrder: '积分兑换', + // 推广中心 + balance: 'Balance', + point: 'Point', + coupon: 'Coupon', + memberRecommend: '邀请有礼', + myPresale: '我的预售', + myGiftcard: '我的礼品卡', + myDivideticket: '我的瓜分券', + myRebate:'拼团返利', + myHongbao:'我的红包列表', + myBlindBox:'我的盲盒', + + waitpay:'Waitpay', + waitsend:'Waitsend', + waitconfirm:'Waitconfirm', + activist:'Activist', + completed:'Completed', +} diff --git a/lang/zh-cn/article/detail.js b/lang/zh-cn/article/detail.js new file mode 100644 index 0000000..2d9ca88 --- /dev/null +++ b/lang/zh-cn/article/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '文章详情' +} diff --git a/lang/zh-cn/article/list.js b/lang/zh-cn/article/list.js new file mode 100644 index 0000000..129277a --- /dev/null +++ b/lang/zh-cn/article/list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '文章列表', + emptyText:"当前暂无文章信息" +} diff --git a/lang/zh-cn/bale/detail.js b/lang/zh-cn/bale/detail.js new file mode 100644 index 0000000..02a0bea --- /dev/null +++ b/lang/zh-cn/bale/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '' +} diff --git a/lang/zh-cn/bale/payment.js b/lang/zh-cn/bale/payment.js new file mode 100644 index 0000000..a6fa0ed --- /dev/null +++ b/lang/zh-cn/bale/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} \ No newline at end of file diff --git a/lang/zh-cn/bargain/detail.js b/lang/zh-cn/bargain/detail.js new file mode 100644 index 0000000..c3c6999 --- /dev/null +++ b/lang/zh-cn/bargain/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频', +} diff --git a/lang/zh-cn/bargain/launch.js b/lang/zh-cn/bargain/launch.js new file mode 100644 index 0000000..4a271f2 --- /dev/null +++ b/lang/zh-cn/bargain/launch.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '砍价详情' +} diff --git a/lang/zh-cn/bargain/list.js b/lang/zh-cn/bargain/list.js new file mode 100644 index 0000000..efbd47b --- /dev/null +++ b/lang/zh-cn/bargain/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '砍价专区' +} diff --git a/lang/zh-cn/bargain/my_bargain.js b/lang/zh-cn/bargain/my_bargain.js new file mode 100644 index 0000000..bb9b398 --- /dev/null +++ b/lang/zh-cn/bargain/my_bargain.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的砍价' +} diff --git a/lang/zh-cn/bargain/payment.js b/lang/zh-cn/bargain/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/bargain/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/combo/detail.js b/lang/zh-cn/combo/detail.js new file mode 100644 index 0000000..e67f6f4 --- /dev/null +++ b/lang/zh-cn/combo/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '组合套餐' +} diff --git a/lang/zh-cn/combo/payment.js b/lang/zh-cn/combo/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/combo/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/common.js b/lang/zh-cn/common.js new file mode 100644 index 0000000..f486d80 --- /dev/null +++ b/lang/zh-cn/common.js @@ -0,0 +1,22 @@ +export const lang = { + + // 底部选项卡 + tabBar: { + home: '首页', + category: '分类', + cart: '购物车', + member: '个人中心' + }, + + //公共 + common: { + //语言包名称 + name: '中文', + mescrollTextInOffset: '下拉刷新', + mescrollTextOutOffset: '释放更新', + mescrollEmpty: "暂无相关数据", + goodsRecommendTitle: '猜你喜欢', + currencySymbol: '¥', + submit: '提交' + } +} diff --git a/lang/zh-cn/contact/contact.js b/lang/zh-cn/contact/contact.js new file mode 100644 index 0000000..d2c2592 --- /dev/null +++ b/lang/zh-cn/contact/contact.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '电子名片' +} diff --git a/lang/zh-cn/diy/diy.js b/lang/zh-cn/diy/diy.js new file mode 100644 index 0000000..74eb5f5 --- /dev/null +++ b/lang/zh-cn/diy/diy.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '', +} diff --git a/lang/zh-cn/fenxiao/apply.js b/lang/zh-cn/fenxiao/apply.js new file mode 100644 index 0000000..46bed58 --- /dev/null +++ b/lang/zh-cn/fenxiao/apply.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销商申请' + title: '' +} diff --git a/lang/zh-cn/fenxiao/bill.js b/lang/zh-cn/fenxiao/bill.js new file mode 100644 index 0000000..5deadae --- /dev/null +++ b/lang/zh-cn/fenxiao/bill.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '账单' +} diff --git a/lang/zh-cn/fenxiao/follow.js b/lang/zh-cn/fenxiao/follow.js new file mode 100644 index 0000000..7ba4f3f --- /dev/null +++ b/lang/zh-cn/fenxiao/follow.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的关注' +} diff --git a/lang/zh-cn/fenxiao/goods_list.js b/lang/zh-cn/fenxiao/goods_list.js new file mode 100644 index 0000000..2c765c5 --- /dev/null +++ b/lang/zh-cn/fenxiao/goods_list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销商品列表', + title: '' +} diff --git a/lang/zh-cn/fenxiao/index.js b/lang/zh-cn/fenxiao/index.js new file mode 100644 index 0000000..3f940bb --- /dev/null +++ b/lang/zh-cn/fenxiao/index.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销中心', + title: '' +} diff --git a/lang/zh-cn/fenxiao/level.js b/lang/zh-cn/fenxiao/level.js new file mode 100644 index 0000000..a504074 --- /dev/null +++ b/lang/zh-cn/fenxiao/level.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销商等级', + title: '' +} diff --git a/lang/zh-cn/fenxiao/order.js b/lang/zh-cn/fenxiao/order.js new file mode 100644 index 0000000..7db8bb1 --- /dev/null +++ b/lang/zh-cn/fenxiao/order.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '分销订单', + title: '' +} diff --git a/lang/zh-cn/fenxiao/order_detail.js b/lang/zh-cn/fenxiao/order_detail.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/fenxiao/order_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/fenxiao/promote_code.js b/lang/zh-cn/fenxiao/promote_code.js new file mode 100644 index 0000000..e462f20 --- /dev/null +++ b/lang/zh-cn/fenxiao/promote_code.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '推广海报' +} diff --git a/lang/zh-cn/fenxiao/team.js b/lang/zh-cn/fenxiao/team.js new file mode 100644 index 0000000..26c1595 --- /dev/null +++ b/lang/zh-cn/fenxiao/team.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '我的团队' + title: '' +} diff --git a/lang/zh-cn/fenxiao/withdraw_apply.js b/lang/zh-cn/fenxiao/withdraw_apply.js new file mode 100644 index 0000000..5ed3079 --- /dev/null +++ b/lang/zh-cn/fenxiao/withdraw_apply.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '提现申请' + title: '' +} diff --git a/lang/zh-cn/fenxiao/withdraw_list.js b/lang/zh-cn/fenxiao/withdraw_list.js new file mode 100644 index 0000000..6b4a6ae --- /dev/null +++ b/lang/zh-cn/fenxiao/withdraw_list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + // title: '提现记录' + title: '' +} diff --git a/lang/zh-cn/game/cards.js b/lang/zh-cn/game/cards.js new file mode 100644 index 0000000..ce82d23 --- /dev/null +++ b/lang/zh-cn/game/cards.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '刮刮乐' +} diff --git a/lang/zh-cn/game/record.js b/lang/zh-cn/game/record.js new file mode 100644 index 0000000..de9a180 --- /dev/null +++ b/lang/zh-cn/game/record.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '中奖纪录' +} diff --git a/lang/zh-cn/game/smash_eggs.js b/lang/zh-cn/game/smash_eggs.js new file mode 100644 index 0000000..4acf085 --- /dev/null +++ b/lang/zh-cn/game/smash_eggs.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '砸金蛋' +} diff --git a/lang/zh-cn/game/turntable.js b/lang/zh-cn/game/turntable.js new file mode 100644 index 0000000..3ebe1ec --- /dev/null +++ b/lang/zh-cn/game/turntable.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '大转盘' +} diff --git a/lang/zh-cn/goods/brand.js b/lang/zh-cn/goods/brand.js new file mode 100644 index 0000000..68694de --- /dev/null +++ b/lang/zh-cn/goods/brand.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '品牌专区' +} diff --git a/lang/zh-cn/goods/cart.js b/lang/zh-cn/goods/cart.js new file mode 100644 index 0000000..85f4341 --- /dev/null +++ b/lang/zh-cn/goods/cart.js @@ -0,0 +1,13 @@ +export const lang = { + //title为每个页面的标题 + title: '购物车', + complete: '完成', + edit: '管理', + allElection: '全选', + total: '合计', + settlement: '结算', + emptyTips: '暂无商品', + goForStroll: '去逛逛', + del: '删除', + login: '去登录' +} diff --git a/lang/zh-cn/goods/category.js b/lang/zh-cn/goods/category.js new file mode 100644 index 0000000..321a563 --- /dev/null +++ b/lang/zh-cn/goods/category.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: '商品分类', + search:'商品搜索', + seeMore : '查看更多' +} diff --git a/lang/zh-cn/goods/consult.js b/lang/zh-cn/goods/consult.js new file mode 100644 index 0000000..89b8e55 --- /dev/null +++ b/lang/zh-cn/goods/consult.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '商品咨询' +} diff --git a/lang/zh-cn/goods/consult_edit.js b/lang/zh-cn/goods/consult_edit.js new file mode 100644 index 0000000..c27770a --- /dev/null +++ b/lang/zh-cn/goods/consult_edit.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我要咨询' +} diff --git a/lang/zh-cn/goods/coupon.js b/lang/zh-cn/goods/coupon.js new file mode 100644 index 0000000..0e6b51a --- /dev/null +++ b/lang/zh-cn/goods/coupon.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '优惠券领取' +} diff --git a/lang/zh-cn/goods/coupon_receive.js b/lang/zh-cn/goods/coupon_receive.js new file mode 100644 index 0000000..2bbf131 --- /dev/null +++ b/lang/zh-cn/goods/coupon_receive.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '领取优惠券' +} diff --git a/lang/zh-cn/goods/detail.js b/lang/zh-cn/goods/detail.js new file mode 100644 index 0000000..116d3c1 --- /dev/null +++ b/lang/zh-cn/goods/detail.js @@ -0,0 +1,31 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + details:'商品详情', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频', + home:'首页', + cart:'购物车', + leave:'立即留言', + make:'立即咨询', + + send:'配送', + express:'快递发货', + commission:'佣金详情', + commissiontext:'佣金', + addcart:'添加购物车', + buynow:'立即购买', + status:'该商品已下架', + sellout:'库存不足', + max:'已达最大限购数量', + makebtn:'咨询', + sales:'销量', + stock:'库存', + kefu:'客服', + follow:'收藏', + spec:'规格', +} diff --git a/lang/zh-cn/goods/evaluate.js b/lang/zh-cn/goods/evaluate.js new file mode 100644 index 0000000..3694418 --- /dev/null +++ b/lang/zh-cn/goods/evaluate.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '商品评价' +} diff --git a/lang/zh-cn/goods/list.js b/lang/zh-cn/goods/list.js new file mode 100644 index 0000000..653aaed --- /dev/null +++ b/lang/zh-cn/goods/list.js @@ -0,0 +1,11 @@ +export const lang = { + //title为每个页面的标题 + title: '商品列表', + Random:'综合', + Sales:'销量', + Price:'价格', + Filter:'筛选', + Search:'请输入您要搜索的商品', + Make:'咨询', + +} diff --git a/lang/zh-cn/goods/not_exist.js b/lang/zh-cn/goods/not_exist.js new file mode 100644 index 0000000..7690bf6 --- /dev/null +++ b/lang/zh-cn/goods/not_exist.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '商品找不到', +} diff --git a/lang/zh-cn/goods/point.js b/lang/zh-cn/goods/point.js new file mode 100644 index 0000000..4c12e0b --- /dev/null +++ b/lang/zh-cn/goods/point.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '积分中心' +} diff --git a/lang/zh-cn/goods/search.js b/lang/zh-cn/goods/search.js new file mode 100644 index 0000000..70059c1 --- /dev/null +++ b/lang/zh-cn/goods/search.js @@ -0,0 +1,9 @@ +export const lang = { + //title为每个页面的标题 + title: '搜索', + history: '历史搜索', + hot: '热门搜索', + find: '搜索发现', + hidefind: '当前搜索发现已隐藏', + inputPlaceholder: '搜索商品' +} diff --git a/lang/zh-cn/groupbuy/detail.js b/lang/zh-cn/groupbuy/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/groupbuy/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/groupbuy/list.js b/lang/zh-cn/groupbuy/list.js new file mode 100644 index 0000000..98b8fd7 --- /dev/null +++ b/lang/zh-cn/groupbuy/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '团购专区' +} diff --git a/lang/zh-cn/groupbuy/payment.js b/lang/zh-cn/groupbuy/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/groupbuy/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/help/detail.js b/lang/zh-cn/help/detail.js new file mode 100644 index 0000000..f872d86 --- /dev/null +++ b/lang/zh-cn/help/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '帮助详情' +} diff --git a/lang/zh-cn/help/list.js b/lang/zh-cn/help/list.js new file mode 100644 index 0000000..34c12e0 --- /dev/null +++ b/lang/zh-cn/help/list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '帮助中心', + emptyText:"当前暂无帮助信息" +} diff --git a/lang/zh-cn/hongbao/list.js b/lang/zh-cn/hongbao/list.js new file mode 100644 index 0000000..94882b2 --- /dev/null +++ b/lang/zh-cn/hongbao/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '瓜分红包列表' +} diff --git a/lang/zh-cn/hongbao/my_hongbao.js b/lang/zh-cn/hongbao/my_hongbao.js new file mode 100644 index 0000000..e541b7e --- /dev/null +++ b/lang/zh-cn/hongbao/my_hongbao.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的红包列表' +} diff --git a/lang/zh-cn/index/index.js b/lang/zh-cn/index/index.js new file mode 100644 index 0000000..74eb5f5 --- /dev/null +++ b/lang/zh-cn/index/index.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '', +} diff --git a/lang/zh-cn/live/list.js b/lang/zh-cn/live/list.js new file mode 100644 index 0000000..69c6591 --- /dev/null +++ b/lang/zh-cn/live/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '直播', +} diff --git a/lang/zh-cn/login/find.js b/lang/zh-cn/login/find.js new file mode 100644 index 0000000..6cd27dd --- /dev/null +++ b/lang/zh-cn/login/find.js @@ -0,0 +1,12 @@ +export const lang = { + //title为每个页面的标题 + title: '找回密码', + findPassword: '找回密码', + accountPlaceholder: '请输入手机号', + captchaPlaceholder: "请输入验证码", + dynacodePlaceholder: '请输入动态码', + passwordPlaceholder: '请输入新密码', + rePasswordPlaceholder: '请确认新密码', + next: '下一步', + save: '确认修改' +} diff --git a/lang/zh-cn/login/login.js b/lang/zh-cn/login/login.js new file mode 100644 index 0000000..14e5f68 --- /dev/null +++ b/lang/zh-cn/login/login.js @@ -0,0 +1,20 @@ +export const lang = { + //title为每个页面的标题 + title: '登录', + mobileLogin: '手机号登录', + accountLogin: '账号登录', + autoLogin: '一键授权登录', + login: '登录', + mobilePlaceholder: '手机号登录仅限中国大陆用户', + dynacodePlaceholder: '请输入动态码', + captchaPlaceholder: '请输入验证码', + accountPlaceholder: '请输入账号', + passwordPlaceholder: '请输入密码', + rePasswordPlaceholder: '请确认密码', + forgetPassword: '忘记密码', + register: '注册', + registerTips: '没有账号的用户快来', + registerTips1: '注册', + registerTips2: '吧', + newUserRegister: '新用户注册' +} diff --git a/lang/zh-cn/login/register.js b/lang/zh-cn/login/register.js new file mode 100644 index 0000000..503e921 --- /dev/null +++ b/lang/zh-cn/login/register.js @@ -0,0 +1,17 @@ +export const lang = { + //title为每个页面的标题 + title: '注册', + mobileRegister: '手机号注册', + accountRegister: '账号注册', + mobilePlaceholder: '手机号登录仅限中国大陆用户', + dynacodePlaceholder: '请输入动态码', + captchaPlaceholder: '请输入验证码', + accountPlaceholder: '请输入用户名', + passwordPlaceholder: '请输入密码', + rePasswordPlaceholder: '请确认密码', + completeRegister: '完成注册,并登录', + registerTips: '点击注册即代表您已同意', + registerAgreement: '注册协议', + next: '下一步', + save: '保存' +} diff --git a/lang/zh-cn/member/account.js b/lang/zh-cn/member/account.js new file mode 100644 index 0000000..79dde87 --- /dev/null +++ b/lang/zh-cn/member/account.js @@ -0,0 +1,13 @@ +export const lang = { + //title为每个页面的标题 + title: '账户列表', + name: '姓名', + accountType: '账号类型', + mobilePhone: '手机号码', + withdrawalAccount: '提现账号', + bankInfo: '支行信息', + newAddAccount: '新增账户', + del: '删除', + update: "修改", + emptyText:"当前暂无账户" +} diff --git a/lang/zh-cn/member/account_edit.js b/lang/zh-cn/member/account_edit.js new file mode 100644 index 0000000..5088b38 --- /dev/null +++ b/lang/zh-cn/member/account_edit.js @@ -0,0 +1,14 @@ +export const lang = { + //title为每个页面的标题 + title: '编辑账户', + name: '姓名', + namePlaceholder: '请输入真实姓名', + mobilePhone: '手机号码', + mobilePhonePlaceholder: '请输入手机号', + accountType: '账号类型', + bankInfo: '支行信息', + bankInfoPlaceholder: '请输入支行信息', + withdrawalAccount: '提现账号', + withdrawalAccountPlaceholder: '请输入提现账号', + save: '保存' +} diff --git a/lang/zh-cn/member/address.js b/lang/zh-cn/member/address.js new file mode 100644 index 0000000..08a97e8 --- /dev/null +++ b/lang/zh-cn/member/address.js @@ -0,0 +1,9 @@ +export const lang = { + //title为每个页面的标题 + title: '收货地址', + newAddAddress: '添加收货地址', + getAddress: '一键获取地址', + is_default: '默认', + modify: '编辑', + del: '删除' +} diff --git a/lang/zh-cn/member/address_edit.js b/lang/zh-cn/member/address_edit.js new file mode 100644 index 0000000..e93f405 --- /dev/null +++ b/lang/zh-cn/member/address_edit.js @@ -0,0 +1,14 @@ +export const lang = { + //title为每个页面的标题 + title: '编辑收货地址', + consignee: '姓名', + consigneePlaceholder: '收货人姓名', + mobile: '手机', + mobilePlaceholder: '收货人手机号', + telephone: '电话', + telephonePlaceholder: '收货人固定电话(选填)', + receivingCity: '地区', + address: '详细地址', + addressPlaceholder: '小区、街道、写字楼', + save: '保存' +} diff --git a/lang/zh-cn/member/apply_withdrawal.js b/lang/zh-cn/member/apply_withdrawal.js new file mode 100644 index 0000000..d2f5f7a --- /dev/null +++ b/lang/zh-cn/member/apply_withdrawal.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '申请提现' +} diff --git a/lang/zh-cn/member/assets.js b/lang/zh-cn/member/assets.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/assets.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/balance.js b/lang/zh-cn/member/balance.js new file mode 100644 index 0000000..49fb93d --- /dev/null +++ b/lang/zh-cn/member/balance.js @@ -0,0 +1,13 @@ +export const lang = { + //title为每个页面的标题 + title: '我的余额', + accountBalance: '账户余额 ', + money:' (元)', + recharge: '充值', + withdrawal: '提现', + balanceDetailed: '余额明细', + emptyTips: '暂无余额记录', + rechargeRecord:'充值记录', + ableAccountBalance:'现金余额 ', + noAccountBalance:'储值余额 ', +} diff --git a/lang/zh-cn/member/balance_detail.js b/lang/zh-cn/member/balance_detail.js new file mode 100644 index 0000000..538ab54 --- /dev/null +++ b/lang/zh-cn/member/balance_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '余额明细' +} diff --git a/lang/zh-cn/member/cancellation.js b/lang/zh-cn/member/cancellation.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancellation.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/cancelrefuse.js b/lang/zh-cn/member/cancelrefuse.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancelrefuse.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/cancelstatus.js b/lang/zh-cn/member/cancelstatus.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancelstatus.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/cancelsuccess.js b/lang/zh-cn/member/cancelsuccess.js new file mode 100644 index 0000000..1702e20 --- /dev/null +++ b/lang/zh-cn/member/cancelsuccess.js @@ -0,0 +1,3 @@ +export const lang = { + title: '账号注销', +} \ No newline at end of file diff --git a/lang/zh-cn/member/card.js b/lang/zh-cn/member/card.js new file mode 100644 index 0000000..1aab742 --- /dev/null +++ b/lang/zh-cn/member/card.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '会员卡' +} diff --git a/lang/zh-cn/member/card_buy.js b/lang/zh-cn/member/card_buy.js new file mode 100644 index 0000000..1aab742 --- /dev/null +++ b/lang/zh-cn/member/card_buy.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '会员卡' +} diff --git a/lang/zh-cn/member/collection.js b/lang/zh-cn/member/collection.js new file mode 100644 index 0000000..7ba4f3f --- /dev/null +++ b/lang/zh-cn/member/collection.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的关注' +} diff --git a/lang/zh-cn/member/contact.js b/lang/zh-cn/member/contact.js new file mode 100644 index 0000000..ff0307c --- /dev/null +++ b/lang/zh-cn/member/contact.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '客服', +} diff --git a/lang/zh-cn/member/coupon.js b/lang/zh-cn/member/coupon.js new file mode 100644 index 0000000..3b4a64d --- /dev/null +++ b/lang/zh-cn/member/coupon.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的优惠券' +} diff --git a/lang/zh-cn/member/footprint.js b/lang/zh-cn/member/footprint.js new file mode 100644 index 0000000..2809ba2 --- /dev/null +++ b/lang/zh-cn/member/footprint.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '我的足迹', + emptyTpis: '您还未浏览过任何商品!' +} diff --git a/lang/zh-cn/member/gift.js b/lang/zh-cn/member/gift.js new file mode 100644 index 0000000..ebdcbda --- /dev/null +++ b/lang/zh-cn/member/gift.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '我的礼品', + emptyTips: '暂无礼品' +} diff --git a/lang/zh-cn/member/gift_detail.js b/lang/zh-cn/member/gift_detail.js new file mode 100644 index 0000000..492e1ae --- /dev/null +++ b/lang/zh-cn/member/gift_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '礼品订单', +} diff --git a/lang/zh-cn/member/index.js b/lang/zh-cn/member/index.js new file mode 100644 index 0000000..f6250cc --- /dev/null +++ b/lang/zh-cn/member/index.js @@ -0,0 +1,51 @@ +export const lang = { + //title为每个页面的标题 + title: '会员中心', + login: '登录/注册', + loginTpis: '点击登录 享受更多精彩信息', + memberLevel: '会员等级', + moreAuthority: '更多权限', + allOrders: '全部订单', + seeAllOrders: '查看全部订单', + waitPay: '待付款', + readyDelivery: '待发货', + waitDelivery: '待收货', + refunding: '退款', + // 会员中心入口 + sign: '签到', + personInfo: '个人资料', + receivingAddress: '收货地址', + accountList: '账户列表', + couponList: '优惠券', + mySpellList: '我的拼单', + myBargain: '我的砍价', + virtualCode: '虚拟码', + winningRecord: '我的礼品', + myCollection: '我的关注', + myTracks: '我的足迹', + pintuanOrder: '拼团订单', + yushouOrder: '预售订单', + verification: '核销台', + message: '我的消息', + exchangeOrder: '积分兑换', + + waitpay:'待付款', + waitsend:'待发货', + waitconfirm:'待收货', + activist:'售后', + completed:'已完成', + + // 推广中心 + balance: '余额', + point: '积分', + coupon: '优惠券', + memberRecommend: '邀请有礼', + myPresale: '我的预售', + myGiftcard: '我的礼品卡', + myDivideticket: '我的瓜分券', + myRebate:'拼团返利', + myHongbao:'我的红包列表', + myBlindBox:'我的盲盒', + + +} diff --git a/lang/zh-cn/member/info.js b/lang/zh-cn/member/info.js new file mode 100644 index 0000000..52b220a --- /dev/null +++ b/lang/zh-cn/member/info.js @@ -0,0 +1,56 @@ +export const lang = { + //title为每个页面的标题 + title: '个人资料', + headImg: '头像', + account: '账号', + nickname: '昵称', + realName: '真实姓名', + sex: '性别', + birthday: '生日', + password: '密码', + paypassword: '支付密码', + mobilePhone: '手机', + bindMobile: '绑定手机', + cancellation: '注销账号', + lang: "语言", + logout: '退出登录', + save: "保存", + noset: '未设置', + + nickPlaceholder: "请输入新昵称", + pleaseRealName:"请输入真实姓名", + + nowPassword: "当前密码", + newPassword: "新密码", + confirmPassword: "确认新密码", + + phoneNumber: "手机号", + + confirmCode: "验证码", + confirmCodeInput: "请输入验证码", + confirmCodeInputerror: "验证码错误", + findanimateCode: "获取动态码", + animateCode: "动态码", + animateCodeInput: "请输入动态码", + + modifyNickname: "修改昵称", + modifyPassword: "修改密码", + bindPhone: "绑定手机", + + alikeNickname: "与原昵称一致,无需修改", + noEmityNickname: "昵称不能为空", + + updateSuccess: "修改成功", + + pleaseInputOldPassword: "请输入原始密码", + pleaseInputNewPassword: "请输入新密码", + passwordLength: "密码长度不能小于6位", + alikePassword: "两次密码不一致", + + samePassword: "新密码不能与原密码相同", + + surePhoneNumber: "请输入正确的手机号", + + alikePhone: "与原手机号一致,无需修改", + modify: '修改' +} diff --git a/lang/zh-cn/member/info_edit.js b/lang/zh-cn/member/info_edit.js new file mode 100644 index 0000000..9220f03 --- /dev/null +++ b/lang/zh-cn/member/info_edit.js @@ -0,0 +1,61 @@ +export const lang = { + //title为每个页面的标题 + title: '个人资料', + headImg: '头像', + account: '账号', + username: '用户名', + nickname: '昵称', + realName: '真实姓名', + sex: '性别', + birthday: '生日', + password: '密码', + paypassword: '支付密码', + mobilePhone: '手机', + bindMobile: '绑定手机', + cancellation: '注销账号', + lang: "语言", + logout: '退出登录', + save: "保存", + noset: '未设置', + + usernamePlaceholder: "请输入新用户名", + nickPlaceholder: "请输入新昵称", + pleaseRealName:"请输入真实姓名", + + nowPassword: "当前密码", + newPassword: "新密码", + confirmPassword: "确认新密码", + + phoneNumber: "手机号", + + confirmCode: "验证码", + confirmCodeInput: "请输入验证码", + confirmCodeInputerror: "验证码错误", + findanimateCode: "获取动态码", + animateCode: "动态码", + animateCodeInput: "请输入动态码", + + modifyNickname: "修改昵称", + modifyPassword: "修改密码", + bindPhone: "绑定手机", + + alikeusername: "与原用户名一致,无需修改", + noEmityUsername: "用户名不能为空", + + alikeNickname: "与原昵称一致,无需修改", + noEmityNickname: "昵称不能为空", + + updateSuccess: "修改成功", + + pleaseInputOldPassword: "请输入原始密码", + pleaseInputNewPassword: "请输入新密码", + passwordLength: "密码长度不能小于6位", + alikePassword: "两次密码不一致", + + samePassword: "新密码不能与原密码相同", + + surePhoneNumber: "请输入正确的手机号", + + alikePhone: "与原手机号一致,无需修改", + modify: '修改' +} diff --git a/lang/zh-cn/member/invite_friends.js b/lang/zh-cn/member/invite_friends.js new file mode 100644 index 0000000..5456928 --- /dev/null +++ b/lang/zh-cn/member/invite_friends.js @@ -0,0 +1,3 @@ +export const lang = { + title: '邀请好友', +} \ No newline at end of file diff --git a/lang/zh-cn/member/level.js b/lang/zh-cn/member/level.js new file mode 100644 index 0000000..a4a0e8d --- /dev/null +++ b/lang/zh-cn/member/level.js @@ -0,0 +1,17 @@ +export const lang = { + //title为每个页面的标题 + title: '会员等级', + defaultLevelTips: '您已经是最高级别的会员了!', + tag: '专属标签', + tagDesc: '标签达人', + discount: '专享折扣', + discountDesc: '专享{0}折', + service: '优质服务', + serviceDesc: '360度全方位', + memberLevel: '会员等级', + condition: '条件', + equity: '权益', + giftPackage: '升级礼包', + levelExplain: '等级说明', + upgradeTips: '升级会员,享专属权益' +} diff --git a/lang/zh-cn/member/message.js b/lang/zh-cn/member/message.js new file mode 100644 index 0000000..c970ecb --- /dev/null +++ b/lang/zh-cn/member/message.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的消息' +} diff --git a/lang/zh-cn/member/modify_face.js b/lang/zh-cn/member/modify_face.js new file mode 100644 index 0000000..cb7f76f --- /dev/null +++ b/lang/zh-cn/member/modify_face.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '修改头像' +} diff --git a/lang/zh-cn/member/pay_password.js b/lang/zh-cn/member/pay_password.js new file mode 100644 index 0000000..f699e06 --- /dev/null +++ b/lang/zh-cn/member/pay_password.js @@ -0,0 +1,3 @@ +export const lang = { + title: '支付密码', +} \ No newline at end of file diff --git a/lang/zh-cn/member/point.js b/lang/zh-cn/member/point.js new file mode 100644 index 0000000..bd74dd9 --- /dev/null +++ b/lang/zh-cn/member/point.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的积分' +} diff --git a/lang/zh-cn/member/point_detail.js b/lang/zh-cn/member/point_detail.js new file mode 100644 index 0000000..5c33ed8 --- /dev/null +++ b/lang/zh-cn/member/point_detail.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: '积分明细', + emptyTpis: '您暂时还没有积分记录哦!', + pointExplain: '积分说明' +} diff --git a/lang/zh-cn/member/signin.js b/lang/zh-cn/member/signin.js new file mode 100644 index 0000000..00003a9 --- /dev/null +++ b/lang/zh-cn/member/signin.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '签到有礼' +} diff --git a/lang/zh-cn/member/withdrawal.js b/lang/zh-cn/member/withdrawal.js new file mode 100644 index 0000000..9b99202 --- /dev/null +++ b/lang/zh-cn/member/withdrawal.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '提现记录' +} diff --git a/lang/zh-cn/member/withdrawal_detail.js b/lang/zh-cn/member/withdrawal_detail.js new file mode 100644 index 0000000..8b822bb --- /dev/null +++ b/lang/zh-cn/member/withdrawal_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '提现详情' +} diff --git a/lang/zh-cn/notice/detail.js b/lang/zh-cn/notice/detail.js new file mode 100644 index 0000000..d2d77c9 --- /dev/null +++ b/lang/zh-cn/notice/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '公告详情' +} diff --git a/lang/zh-cn/notice/list.js b/lang/zh-cn/notice/list.js new file mode 100644 index 0000000..e2c2d7c --- /dev/null +++ b/lang/zh-cn/notice/list.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: '公告列表', + emptyText:"当前暂无更多信息", + contentTitle:'升级公告' +} diff --git a/lang/zh-cn/order/activist.js b/lang/zh-cn/order/activist.js new file mode 100644 index 0000000..3113f05 --- /dev/null +++ b/lang/zh-cn/order/activist.js @@ -0,0 +1,6 @@ +export const lang = { + //title为每个页面的标题 + title: '退款', + checkDetail: '查看详情', + emptyTips: '暂无退款记录' +} diff --git a/lang/zh-cn/order/detail.js b/lang/zh-cn/order/detail.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_local_delivery.js b/lang/zh-cn/order/detail_local_delivery.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_local_delivery.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_pickup.js b/lang/zh-cn/order/detail_pickup.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_pickup.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_point.js b/lang/zh-cn/order/detail_point.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_point.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/detail_virtual.js b/lang/zh-cn/order/detail_virtual.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/order/detail_virtual.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/order/evaluate.js b/lang/zh-cn/order/evaluate.js new file mode 100644 index 0000000..73d6c04 --- /dev/null +++ b/lang/zh-cn/order/evaluate.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我要评价' +} diff --git a/lang/zh-cn/order/list.js b/lang/zh-cn/order/list.js new file mode 100644 index 0000000..1160a28 --- /dev/null +++ b/lang/zh-cn/order/list.js @@ -0,0 +1,13 @@ +export const lang = { + //title为每个页面的标题 + title: '订单列表', + emptyTips: '暂无相关订单', + all: '全部', + waitPay: '待付款', + readyDelivery: '待发货', + waitDelivery: '待收货', + waitEvaluate: '待评价', + waitUse: '待使用', + update: "释放刷新", + updateIng: "加载中..." +} diff --git a/lang/zh-cn/order/logistics.js b/lang/zh-cn/order/logistics.js new file mode 100644 index 0000000..3736635 --- /dev/null +++ b/lang/zh-cn/order/logistics.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '物流信息' +} diff --git a/lang/zh-cn/order/payment.js b/lang/zh-cn/order/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/order/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/order/refund.js b/lang/zh-cn/order/refund.js new file mode 100644 index 0000000..d1b3c1d --- /dev/null +++ b/lang/zh-cn/order/refund.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '申请退款', +} diff --git a/lang/zh-cn/order/refund_batch.js b/lang/zh-cn/order/refund_batch.js new file mode 100644 index 0000000..d1b3c1d --- /dev/null +++ b/lang/zh-cn/order/refund_batch.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '申请退款', +} diff --git a/lang/zh-cn/order/refund_detail.js b/lang/zh-cn/order/refund_detail.js new file mode 100644 index 0000000..f931c6b --- /dev/null +++ b/lang/zh-cn/order/refund_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '退款详情', +} diff --git a/lang/zh-cn/pay/index.js b/lang/zh-cn/pay/index.js new file mode 100644 index 0000000..60ddcaf --- /dev/null +++ b/lang/zh-cn/pay/index.js @@ -0,0 +1,7 @@ +export const lang = { + //title为每个页面的标题 + title: '支付方式', + paymentAmount: '支付金额', + confirmPayment: '确认支付', + seeOrder: '查看订单' +} diff --git a/lang/zh-cn/pay/result.js b/lang/zh-cn/pay/result.js new file mode 100644 index 0000000..294c202 --- /dev/null +++ b/lang/zh-cn/pay/result.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '支付结果', + paymentSuccess: '支付成功', + paymentFail: '支付失败', + goHome: '回到首页', + memberCenter: '会员中心', + payMoney: '支付金额', + unit: '元' +} diff --git a/lang/zh-cn/pintuan/detail.js b/lang/zh-cn/pintuan/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/pintuan/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/pintuan/list.js b/lang/zh-cn/pintuan/list.js new file mode 100644 index 0000000..c9e868c --- /dev/null +++ b/lang/zh-cn/pintuan/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '拼团专区' +} diff --git a/lang/zh-cn/pintuan/my_spell.js b/lang/zh-cn/pintuan/my_spell.js new file mode 100644 index 0000000..ffb8d0f --- /dev/null +++ b/lang/zh-cn/pintuan/my_spell.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '我的拼单' +} diff --git a/lang/zh-cn/pintuan/payment.js b/lang/zh-cn/pintuan/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/pintuan/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/pintuan/share.js b/lang/zh-cn/pintuan/share.js new file mode 100644 index 0000000..9b25eb4 --- /dev/null +++ b/lang/zh-cn/pintuan/share.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '拼团分享' +} diff --git a/lang/zh-cn/point/detail.js b/lang/zh-cn/point/detail.js new file mode 100644 index 0000000..17ad9f1 --- /dev/null +++ b/lang/zh-cn/point/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '兑换' +} diff --git a/lang/zh-cn/point/goods_detail.js b/lang/zh-cn/point/goods_detail.js new file mode 100644 index 0000000..7c5e6bf --- /dev/null +++ b/lang/zh-cn/point/goods_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + // title: '兑换' +} \ No newline at end of file diff --git a/lang/zh-cn/point/list.js b/lang/zh-cn/point/list.js new file mode 100644 index 0000000..35fa006 --- /dev/null +++ b/lang/zh-cn/point/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '积分商城' +} diff --git a/lang/zh-cn/point/order_detail.js b/lang/zh-cn/point/order_detail.js new file mode 100644 index 0000000..02b134b --- /dev/null +++ b/lang/zh-cn/point/order_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '积分兑换订单详情' +} diff --git a/lang/zh-cn/point/order_list.js b/lang/zh-cn/point/order_list.js new file mode 100644 index 0000000..5139a9a --- /dev/null +++ b/lang/zh-cn/point/order_list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '积分兑换', + emptyTips: '暂无更多数据了' +} diff --git a/lang/zh-cn/point/payment.js b/lang/zh-cn/point/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/point/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/point/result.js b/lang/zh-cn/point/result.js new file mode 100644 index 0000000..fb9a581 --- /dev/null +++ b/lang/zh-cn/point/result.js @@ -0,0 +1,7 @@ +export const lang = { + //title为每个页面的标题 + title: '兑换结果', + exchangeSuccess: '兑换成功', + see: '查看兑换记录', + goHome: '回到首页' +} diff --git a/lang/zh-cn/presale/detail.js b/lang/zh-cn/presale/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/presale/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/presale/list.js b/lang/zh-cn/presale/list.js new file mode 100644 index 0000000..6062102 --- /dev/null +++ b/lang/zh-cn/presale/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '预售专区' +} diff --git a/lang/zh-cn/presale/order_detail.js b/lang/zh-cn/presale/order_detail.js new file mode 100644 index 0000000..6c02235 --- /dev/null +++ b/lang/zh-cn/presale/order_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '订单详情' +} diff --git a/lang/zh-cn/presale/order_list.js b/lang/zh-cn/presale/order_list.js new file mode 100644 index 0000000..33e46b3 --- /dev/null +++ b/lang/zh-cn/presale/order_list.js @@ -0,0 +1,7 @@ +export const lang = { + //title为每个页面的标题 + title: '我的预售', + emptyTips: '暂无相关预售订单', + update: "释放刷新", + updateIng: "加载中..." +} diff --git a/lang/zh-cn/presale/payment.js b/lang/zh-cn/presale/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/presale/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/recharge/detail.js b/lang/zh-cn/recharge/detail.js new file mode 100644 index 0000000..7f56b11 --- /dev/null +++ b/lang/zh-cn/recharge/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '充值详情' +} diff --git a/lang/zh-cn/recharge/list.js b/lang/zh-cn/recharge/list.js new file mode 100644 index 0000000..0247946 --- /dev/null +++ b/lang/zh-cn/recharge/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '充值列表' +} diff --git a/lang/zh-cn/recharge/order_list.js b/lang/zh-cn/recharge/order_list.js new file mode 100644 index 0000000..ccae5ec --- /dev/null +++ b/lang/zh-cn/recharge/order_list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '充值记录', +} diff --git a/lang/zh-cn/seckill/detail.js b/lang/zh-cn/seckill/detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/seckill/detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/seckill/list.js b/lang/zh-cn/seckill/list.js new file mode 100644 index 0000000..d546477 --- /dev/null +++ b/lang/zh-cn/seckill/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '秒杀专区' +} diff --git a/lang/zh-cn/seckill/payment.js b/lang/zh-cn/seckill/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/seckill/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/store_notes/note_detail.js b/lang/zh-cn/store_notes/note_detail.js new file mode 100644 index 0000000..f776d19 --- /dev/null +++ b/lang/zh-cn/store_notes/note_detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '笔记详情' +} \ No newline at end of file diff --git a/lang/zh-cn/store_notes/note_list.js b/lang/zh-cn/store_notes/note_list.js new file mode 100644 index 0000000..daf0791 --- /dev/null +++ b/lang/zh-cn/store_notes/note_list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '店铺笔记' +} \ No newline at end of file diff --git a/lang/zh-cn/storeclose/storeclose.js b/lang/zh-cn/storeclose/storeclose.js new file mode 100644 index 0000000..af147fc --- /dev/null +++ b/lang/zh-cn/storeclose/storeclose.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '店铺打烊' +} diff --git a/lang/zh-cn/topics/detail.js b/lang/zh-cn/topics/detail.js new file mode 100644 index 0000000..37300ef --- /dev/null +++ b/lang/zh-cn/topics/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '专题活动详情' +} diff --git a/lang/zh-cn/topics/goods_detail.js b/lang/zh-cn/topics/goods_detail.js new file mode 100644 index 0000000..aa08c12 --- /dev/null +++ b/lang/zh-cn/topics/goods_detail.js @@ -0,0 +1,10 @@ +export const lang = { + //title为每个页面的标题 + title: '', + select: '选择', + params: '参数', + service: '商品服务', + allGoods: '全部商品', + image: '图片', + video: '视频' +} diff --git a/lang/zh-cn/topics/list.js b/lang/zh-cn/topics/list.js new file mode 100644 index 0000000..88fad9a --- /dev/null +++ b/lang/zh-cn/topics/list.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '专题活动列表' +} diff --git a/lang/zh-cn/topics/payment.js b/lang/zh-cn/topics/payment.js new file mode 100644 index 0000000..88657dd --- /dev/null +++ b/lang/zh-cn/topics/payment.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '待付款订单' +} diff --git a/lang/zh-cn/verification/detail.js b/lang/zh-cn/verification/detail.js new file mode 100644 index 0000000..d363d70 --- /dev/null +++ b/lang/zh-cn/verification/detail.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '核销明细' +} diff --git a/lang/zh-cn/verification/index.js b/lang/zh-cn/verification/index.js new file mode 100644 index 0000000..e03614d --- /dev/null +++ b/lang/zh-cn/verification/index.js @@ -0,0 +1,4 @@ +export const lang = { + //title为每个页面的标题 + title: '核销台' +} diff --git a/lang/zh-cn/verification/list.js b/lang/zh-cn/verification/list.js new file mode 100644 index 0000000..0280f33 --- /dev/null +++ b/lang/zh-cn/verification/list.js @@ -0,0 +1,5 @@ +export const lang = { + //title为每个页面的标题 + title: '核销记录', + emptyTips: '暂无记录' +} diff --git a/main.js b/main.js new file mode 100644 index 0000000..3354500 --- /dev/null +++ b/main.js @@ -0,0 +1,59 @@ +// #ifdef H5 +import './common/js/pc' +// #endif +import Vue from 'vue' +import App from './App' +import store from './store' +import Util from './common/js/util.js' +import Http from './common/js/http.js' +import Lang from './common/js/lang.js' +import Config from './common/js/config.js' +import globalConfig from './common/js/golbalConfig.js'; +import { + uniStorage +} from './common/js/storage.js' + +Vue.prototype.$store = store //挂在vue + +Vue.config.productionTip = false + +Vue.prototype.$util = Util; +Vue.prototype.$api = Http; + +Vue.prototype.$langConfig = Lang; //语言包对象 +Vue.prototype.$lang = Lang.lang; //解析语言包 + +Vue.prototype.$config = Config; + +Vue.mixin(globalConfig); + +App.mpType = 'app'; + +// 重写存储,增加前缀 +uniStorage(); + +//常用组件 +import loadingCover from '@/components/loading-cover/loading-cover.vue'; +Vue.component('loading-cover', loadingCover); + +import nsEmpty from '@/components/ns-empty/ns-empty.vue'; +Vue.component('ns-empty', nsEmpty); + +import MescrollUni from "@/components/mescroll/my-list-mescroll.vue"; +Vue.component("mescroll-uni", MescrollUni); //上拉加载,下拉刷新组件 + +import MescrollBody from "@/components/mescroll/mescroll-body.vue" +Vue.component('mescroll-body', MescrollBody); + +import NsLogin from "@/components/ns-login/ns-login.vue" +Vue.component('ns-login', NsLogin); + +import PrivacyPopup from '@/components/wx-privacy-popup/privacy-popup.vue'; +Vue.component('privacy-popup', PrivacyPopup) + +const app = new Vue({ + ...App, + store +}) + +app.$mount() \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..1a7fa82 --- /dev/null +++ b/manifest.json @@ -0,0 +1,130 @@ +{ + "name" : "lucky_weapp", + "appid" : "__UNI__FB025B5", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueCompiler" : "uni-app", + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : { + "ad" : {} + } + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "wxd0d197d489e31428", + "setting" : { + "urlCheck" : false, + "postcss" : false, + "es6" : true, + "minified" : true + }, + "usingComponents" : true, + "permission" : { + "scope.userLocation" : { + "desc" : "为了更好地为您提供服务" + }, + "scope.writePhotosAlbum" : { + "desc" : "为了更好地为您提供服务" + } + }, + "requiredPrivateInfos" : [ "chooseLocation", "getLocation", "chooseAddress" ], + "__usePrivacyCheck__" : true, + "optimization" : { + "subPackages" : true + } + }, + "mp-alipay" : { + "usingComponents" : true, + "appid" : "" + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "h5" : { + "sdkConfigs" : { + "maps" : { + "qqmap" : { + "key" : "TUHBZ-CNWKU-UHAVP-GZQ26-HNZFO-3YBF4" + } + } + }, + "router" : { + "mode" : "history", + "base" : "/hwapp/" + }, + "title" : " ", + "devServer" : { + "https" : false + }, + "optimization" : { + "treeShaking" : { + "enable" : false + } + }, + "domain" : " ", + "unipush" : { + "enable" : false + }, + "async" : { + "loading" : "", + "error" : "", + "delay" : 0, + "timeout" : 3000 + }, + "template" : "" + }, + "uniStatistics" : { + "version" : "2" + }, + "sassImplementationName": "node-sass" +} diff --git a/node_modules/jweixin-module/README.md b/node_modules/jweixin-module/README.md new file mode 100644 index 0000000..f4e08bd --- /dev/null +++ b/node_modules/jweixin-module/README.md @@ -0,0 +1,30 @@ +# jweixin-module + +微信JS-SDK + +## 安装 + +### NPM + +```shell +npm install jweixin-module --save +``` + +### UMD + +```http +https://unpkg.com/jweixin-module/out/index.js +``` + +## 使用 + +```js +var wx = require('jweixin-module') +wx.ready(function(){ + // TODO +}); +``` + +## 完整API + +>[微信JS-SDK说明文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115) diff --git a/node_modules/jweixin-module/out/index.js b/node_modules/jweixin-module/out/index.js new file mode 100644 index 0000000..807ab6a --- /dev/null +++ b/node_modules/jweixin-module/out/index.js @@ -0,0 +1 @@ +!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(e):"function"==typeof define&&(define.amd||define.cmd)?define(function(){return n(e)}):n(e,!0)}(window,function(o,e){function c(n,e,i){o.WeixinJSBridge?WeixinJSBridge.invoke(n,r(e),function(e){a(n,e,i)}):d(n,i)}function i(n,i,t){o.WeixinJSBridge?WeixinJSBridge.on(n,function(e){t&&t.trigger&&t.trigger(e),a(n,e,i)}):d(n,t||i)}function r(e){return(e=e||{}).appId=M.appId,e.verifyAppId=M.appId,e.verifySignType="sha1",e.verifyTimestamp=M.timestamp+"",e.verifyNonceStr=M.nonceStr,e.verifySignature=M.signature,e}function n(e){return{timeStamp:e.timestamp+"",nonceStr:e.nonceStr,package:e.package,paySign:e.paySign,signType:e.signType||"SHA1"}}function a(e,n,i){"openEnterpriseChat"==e&&(n.errCode=n.err_code),delete n.err_code,delete n.err_desc,delete n.err_detail;var t=n.errMsg;t||(t=n.err_msg,delete n.err_msg,t=function(e,n){var i=e,t=f[i];t&&(i=t);var o="ok";if(n){var r=n.indexOf(":");"confirm"==(o=n.substring(r+1))&&(o="ok"),"failed"==o&&(o="fail"),-1!=o.indexOf("failed_")&&(o=o.substring(7)),-1!=o.indexOf("fail_")&&(o=o.substring(5)),"access denied"!=(o=(o=o.replace(/_/g," ")).toLowerCase())&&"no permission to execute"!=o||(o="permission denied"),"config"==i&&"function not exist"==o&&(o="ok"),""==o&&(o="fail")}return n=i+":"+o}(e,t),n.errMsg=t),(i=i||{})._complete&&(i._complete(n),delete i._complete),t=n.errMsg||"",M.debug&&!i.isInnerInvoke&&alert(JSON.stringify(n));var o=t.indexOf(":");switch(t.substring(o+1)){case"ok":i.success&&i.success(n);break;case"cancel":i.cancel&&i.cancel(n);break;default:i.fail&&i.fail(n)}i.complete&&i.complete(n)}function s(e){if(e){for(var n=0,i=e.length;n=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/node/-/node-22.1.0.tgz", + "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.13.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001649", + "resolved": "https://repo.huaweicloud.com/repository/npm/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0", + "peer": true + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://repo.huaweicloud.com/repository/npm/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://repo.huaweicloud.com/repository/npm/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.31.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://repo.huaweicloud.com/repository/npm/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/undici-types": { + "version": "6.13.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + } + } + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://repo.huaweicloud.com/repository/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@types/eslint": { + "version": "9.6.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/eslint/-/eslint-9.6.0.tgz", + "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", + "dev": true, + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "peer": true + }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "@types/node": { + "version": "22.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@types/node/-/node-22.1.0.tgz", + "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "dev": true, + "requires": { + "undici-types": "~6.13.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "acorn": { + "version": "8.12.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true + }, + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://repo.huaweicloud.com/repository/npm/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "browserslist": { + "version": "4.23.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "peer": true, + "requires": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001649", + "resolved": "https://repo.huaweicloud.com/repository/npm/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", + "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "dev": true, + "peer": true + }, + "chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "peer": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.5.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/electron-to-chromium/-/electron-to-chromium-1.5.4.tgz", + "integrity": "sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==", + "dev": true, + "peer": true + }, + "enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "es-module-lexer": { + "version": "1.5.4", + "resolved": "https://repo.huaweicloud.com/repository/npm/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "peer": true + }, + "escalade": { + "version": "3.1.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "peer": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://repo.huaweicloud.com/repository/npm/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "peer": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "peer": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://repo.huaweicloud.com/repository/npm/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "peer": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node-releases": { + "version": "2.0.18", + "resolved": "https://repo.huaweicloud.com/repository/npm/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "peer": true + }, + "picocolors": { + "version": "1.0.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "dev": true, + "peer": true + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://repo.huaweicloud.com/repository/npm/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://repo.huaweicloud.com/repository/npm/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true + }, + "terser": { + "version": "5.31.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://repo.huaweicloud.com/repository/npm/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + } + }, + "undici-types": { + "version": "6.13.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "peer": true, + "requires": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "watchpack": { + "version": "2.4.1", + "resolved": "https://repo.huaweicloud.com/repository/npm/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.93.0", + "resolved": "https://repo.huaweicloud.com/repository/npm/webpack/-/webpack-5.93.0.tgz", + "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://repo.huaweicloud.com/repository/npm/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3ecf82a --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "terser-webpack-plugin": "^5.3.10" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..d83912d --- /dev/null +++ b/pages.json @@ -0,0 +1,891 @@ +{ + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + { + "path": "pages/index/index", + "style": { + // "navigationStyle": "custom", + "enablePullDownRefresh": true + } + }, + + { + "path": "pages/contact/contact", + "style": { + "navigationBarTitleText": "电子名片" + } + }, + //******************商品模块(11)****************** + { + "path": "pages/goods/cart", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "购物车" + } + }, + { + "path": "pages/goods/category", + "style": { + "disableScroll": true, + "navigationBarTitleText": "商品分类", + "enablePullDownRefresh": true + } + }, + + // 商品详情 + { + "path": "pages/goods/detail", + "style": { + "navigationBarTitleText": "商品详情" + } + }, + { + "path": "pages/goods/list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "商品列表" + } + }, + + //******************会员模块(20)****************** + { + "path": "pages/member/index", + "style": { + "enablePullDownRefresh": true + } + }, + //******************订单模块(12)****************** + { + "path": "pages/order/payment", + "style": { + "navigationStyle": "custom" + } + }, + { + "path": "pages/order/list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "pages/order/detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "pages/order/detail_local_delivery", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "pages/order/detail_pickup", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + //积分订单详情 + { + "path": "pages/order/detail_point", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + } + ], + "subPackages": [{ + + //******************营销活动模块(26)****************** + "root": "pages_promotion", + "pages": [ + + //----------积分模块(2)---------- + { + "path": "point/list", + "style": { + "navigationStyle": "custom" + } + }, { + "path": "point/goods_list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "point/detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "point/payment", + "style": { + "navigationStyle": "custom" + } + }, + { + "path": "point/order_list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "point/result", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + + //****************** 商户 ****************** + { + "path": "merch/merchcategory", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "入驻商户" + } + }, + { + "path": "merch/detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "商户首页" + } + }, + //****************** 分销 ****************** + { + "path": "fenxiao/index", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/promote", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/apply", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/order", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/relation", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/order_detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/team", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/withdraw_apply", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/withdraw_list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/withdrawal_detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/promote_code", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/level", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/goods_list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/bill", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "fenxiao/ranking_list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "排行榜" + } + }, + { + "path": "fenxiao/child_fenxiao", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "分销商" + } + } + ] + }, + { + //*****************其他模块(26)****************** + "root": "pages_tool", + "pages": [ + { + "path": "agreement/contenr", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "vr/index", + "style": { + "navigationBarTitleText": "" + } + }, + { + "path": "webview/webview", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "index/diy", + "style": { + // #ifdef MP-WEIXIN + // "navigationStyle": "custom", + // #endif + "enablePullDownRefresh": true + } + }, + //******************会员模块(20)****************** + { + "path": "member/modify_face", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/account", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/account_edit", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/apply_withdrawal", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/balance", + "style": { + "navigationStyle": "custom" + } + }, + { + "path": "member/balance_detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/collection", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/coupon", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "disableScroll": true + } + }, + { + "path": "member/contact", + "style": { + "navigationStyle": "custom", + "enablePullDownRefresh": true + } + }, + { + "path": "member/footprint", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/level", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/card", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/card_buy", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/card_agreement", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/level_growth_rules", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/point", + "style": { + "navigationStyle": "custom" + } + }, + { + "path": "member/point_detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/withdrawal", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/withdrawal_detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/address", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/address_edit", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/pay_password", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/cancellation", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/assets", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/cancelstatus", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/cancelsuccess", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/cancelrefuse", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "member/info", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "个人资料" + } + }, + { + "path": "member/info_edit", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + //******************登录模块****************** + { + "path": "login/find", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + + //******************商品模块****************** + { + "path": "goods/coupon", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "goods/coupon_receive", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "goods/evaluate", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "goods/search", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "goods/brand", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "goods/not_exist", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + + + //******************CMS模块(6)****************** + { + "path": "help/list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "help/detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "notice/list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "notice/detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "article/list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "article/detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + //******************会员充值(4)****************** + { + "path": "recharge/list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "scrollEnabled": true // 禁止页面滚动 + } + }, + { + "path": "recharge/order_list", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + //******************邀请****************** + { + "path": "member/invite_friends", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + //******************支付模块(2)****************** + { + "path": "pay/index", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "pay/wx_pay", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "pay/result", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "pay/cashier", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "storeclose/storeclose", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + //******************订单模块(2)****************** + { + "path": "order/logistics", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "order/evaluate", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "order/refund", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "order/refund_goods_select", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "order/refund_type_select", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "order/refund_batch", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "order/refund_detail", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + { + "path": "order/activist", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "退款" + } + }, + { + "path": "order/detail_virtual", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + }, + //******************登录模块(3)****************** + { + "path": "login/login", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom", + // #endif + "navigationBarTitleText": "登录" + } + }, + { + "path": "form/form", + "style": { + // #ifdef APP-PLUS + "navigationStyle": "custom" + // #endif + } + } + ] + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "", + "navigationBarBackgroundColor": "#ffffff", + "backgroundColor": "#F7f7f7", + "backgroundColorTop": "#f7f7f7", + "backgroundColorBottom": "#f7f7f7" + }, + "tabBar": { + // #ifdef H5 + "custom": true, + // #endif + "color": "#333", + "selectedColor": "#FF0036", + "backgroundColor": "#fff", + "borderStyle": "white", + "list": [{ + "pagePath": "pages/index/index", + "text": "" + }, + { + "pagePath": "pages/goods/category", + "text": "" + }, + { + "pagePath": "pages/contact/contact", + "text": "" + }, + { + "pagePath": "pages/member/index", + "text": "" + } + ] + }, + "easycom": { + "diy-*(\\W.*)": "@/components/diy-components/diy$1.vue" + }, + "preloadRule": { + "pages/index/index": { + "network": "all", + "packages": ["pages_tool"] + } + } +} \ No newline at end of file diff --git a/pages/contact/contact.vue b/pages/contact/contact.vue new file mode 100644 index 0000000..62984d6 --- /dev/null +++ b/pages/contact/contact.vue @@ -0,0 +1,511 @@ + + + + + + + + + + + + + 在线留言 + + + + + + + + + + + 专属客服 + + + + + + 在线留言 + + + + + + + + + + + {{item.realname}} + {{item.position}} + + {{item.address}} + + + {{item.mobile}} + 一键拨打 + + + + {{item.email}} + 立即导航 + + + + + + + 一键导航 + + + + + + + + + + + + + + 在线留言 + + + + + + + 姓名 + + + + + + 联系方式 + + + + + + 留言内容 + + + + + + + + + 提交 + + + + + + + + + + + diff --git a/pages/goods/cart.vue b/pages/goods/cart.vue new file mode 100644 index 0000000..b9c1971 --- /dev/null +++ b/pages/goods/cart.vue @@ -0,0 +1,347 @@ + + + + + + + + 共{{ cartData[0].cartList.length }}种商品 + + {{ isAction ? $lang('complete') : $lang('edit') }} + + + + + + 优惠券 + 领券结算最高可减{{ discount.coupon_info.coupon_money | moneyFormat }}元 + + + 点击{{ discount.coupon_info.receive_type == 'wait' ? '领取' : '查看' }} + + + + + + {{globalStoreInfo.store_name}} + + + + + + + + + + + {{ item.goods_name }} + + + + + {{ x.spec_name }}:{{ x.spec_value_name }} + {{ i < item.sku_spec_format.length - 1 ? ';' : '' }} + + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(item.member_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(item.member_price).toFixed(2).split('.')[1] }} + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(item.discount_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(item.discount_price).toFixed(2).split('.')[1] }} + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(item.member_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(item.member_price).toFixed(2).split('.')[1] }} + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(item.price).toFixed(2).split('.')[0] }} + .{{ parseFloat(item.price).toFixed(2).split('.')[1] }} + + + + + + + + 满减 + + + {{ Number(mitem.limit) }}减{{ mitem.discount_money }} + + + + + + + {{ $lang('del') }} + + + + + + + + 失效商品{{ invalidGoods.length }}件 + + 清空 + + + + + + + + + + {{ goodsItem.sku_name }} + + + + + {{ x.spec_name }}:{{ x.spec_value_name }} + {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsItem.member_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsItem.member_price).toFixed(2).split('.')[1] }} + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsItem.discount_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsItem.discount_price).toFixed(2).split('.')[1] }} + + + + 已失效 + + + + + + + + + + + 去登录 + + + + + + + + + + + + + + 优惠明细 + + + + + 商品总额 + ¥{{ discount.goods_money | moneyFormat }} + + + 优惠券 + -¥{{ discount.coupon_money | moneyFormat }} + + + 满减 + -¥{{ discount.promotion_money | moneyFormat }} + + + + 合计 + ¥{{ discount.order_money | moneyFormat }} + + + + + + + + + + 优惠券 + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(discount.coupon_info.money) }} + + + {{ parseFloat(discount.coupon_info.discount) }} + 折 + + + + 满{{ discount.coupon_info.at_least }}可用 + + + 无门槛 + + + + + + {{ discount.coupon_info.coupon_name }} + + 最多可抵¥{{ discount.coupon_info.discount_limit }} + + + 有效期:{{ $util.timeStampTurnTime(discount.coupon_info.end_time) }} + + + 有效期:领取之日起{{ discount.coupon_info.fixed_term }}天内有效 + + 有效期:长期有效 + + + 已领取 + 领取 + + + + + + + + + + + + + {{ $lang('allElection') }} + + + + {{ $lang('total') }}: + {{ $lang('common.currencySymbol') }} + + {{ parseFloat(discount.order_money).toFixed(2).split('.')[0] }} + .{{ parseFloat(discount.order_money).toFixed(2).split('.')[1] }} + + + {{ parseFloat(totalPrice).toFixed(2).split('.')[0] }} + .{{ parseFloat(totalPrice).toFixed(2).split('.')[1] }} + + + + 优惠明细 + + + + + {{ $lang('del') }} + + + + {{ discount.coupon_info && discount.coupon_info.receive_type == 'wait' ? '领券' : '立即' }}结算({{ totalCount }}) + + {{ $lang('settlement') }}({{ totalCount }}) + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/goods/category.vue b/pages/goods/category.vue new file mode 100644 index 0000000..702267e --- /dev/null +++ b/pages/goods/category.vue @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/goods/detail.vue b/pages/goods/detail.vue new file mode 100644 index 0000000..f970686 --- /dev/null +++ b/pages/goods/detail.vue @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + 限时折扣 + 已售{{ goodsSkuDetail.sale_num }}{{ goodsSkuDetail.unit }} + + + + + 距结束仅剩 + + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsSkuDetail.discount_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsSkuDetail.discount_price).toFixed(2).split('.')[1] }} + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsSkuDetail.member_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsSkuDetail.member_price).toFixed(2).split('.')[1] }} + + + + + 原价 + {{ $lang('common.currencySymbol') }} + {{ goodsSkuDetail.price }} + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsSkuDetail.price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsSkuDetail.price).toFixed(2).split('.')[1] }} + + + + + {{ $lang('common.currencySymbol') }} + + {{ goodsSkuDetail.price }} + {{ goodsSkuDetail.market_price }} + + + + + + + + + {{$lang('makebtn')}} + + + + + + {{ goodsSkuDetail.goods_name }} + + {{ goodsSkuDetail.introduction }} + + + {{ goodsSkuDetail.label_name }} + + + {{$lang('stock')}}: {{ goodsSkuDetail.stock +goodsSkuDetail.unit}} + {{$lang('sales')}}: {{ goodsSkuDetail.sale_num+goodsSkuDetail.unit }} + + + + + + + + + + + {{$lang('commission')}} + + + One {{$lang('commissiontext')}} + + ¥ + {{ parseFloat(goodsSkuDetail.fenxiao_detail.commission_money).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsSkuDetail.fenxiao_detail.commission_money).toFixed(2).split('.')[1] }} + + + + + + + + + + + {{$lang('spec')}} + + {{ item.spec_name }}/{{ item.spec_value_name }} + + + + + + + + + + + + + + + + + + 组合套餐 + {{ bundling[0].bl_name }} + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ goodsSkuDetail.price }} + + + {{ goodsSkuDetail.goods_name }} + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ item.price }} + + + {{ item.sku_name }} + + + + + + + + + + + + 组合套餐 + + + + + + + + {{ item.bl_name }} + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ goodsSkuDetail.price }} + + + {{ goodsSkuDetail.goods_name }} + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ goods.price }} + + + {{ goods.sku_name }} + + + + + + + 套餐价 + {{ $lang('common.currencySymbol') }} + {{ item.bl_price }} + 立即购买 + + + + + + + + + + + + + + + + 优惠券 + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(item.money) }} + + + {{ parseFloat(item.discount) }} + 折 + + + + 满{{ item.at_least }}可用 + + + 无门槛 + + + + + + {{ item.coupon_name }} + 最多可抵¥{{ item.discount_limit }} + 有效期:{{ $util.timeStampTurnTime(item.end_time) }} + 有效期:领取之日起{{ item.fixed_term }}天内有效 + 有效期:长期有效 + + + 已抢光 + 已领取 + 领取 + + + + 确定 + + + + + + + + + + 促销 + + + + + 满减 + {{ manjian.manjian }} + + + 满送 + {{ manjian.mansong }} + + + 包邮 + {{ manjian.free_shipping }} + + + 确定 + + + + + + + + + 商品留言 + + + + + + + + + + 确定 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pages/goods/list.vue b/pages/goods/list.vue new file mode 100644 index 0000000..4ab611b --- /dev/null +++ b/pages/goods/list.vue @@ -0,0 +1,317 @@ + + + + + + + + + + + + + + + + + {{langstatus?$lang('Random'):'综合'}} + + + {{langstatus?$lang('Sales'):'销量'}} + + + + {{langstatus?$lang('Price'):'价格'}} + + + + + + + + {{langstatus?$lang('Filter'):'筛选'}} + + + + + + + + + + + + + + {{ goodsTag(item) }} + + + + + + + + + + + {{ item.en_goods_name }} + + + {{ item.goods_name }} + + + + {{ item.goods_name }} + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }} + .{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }} + + + {{langstatus?$lang('Make'):'咨询'}} + + + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ showMarketPrice(item) }} + + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + + + + + {{ config.text }} + + + + + + + + + + + + + + + + + + {{ goodsTag(item) }} + + + + + + + {{ item.goods_name }} + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }} + .{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }} + + + {{langstatus?$lang('Make'):'咨询'}} + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ showMarketPrice(item) }} + + + + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + + + + + {{ config.text }} + + + + + + + + + + + + + + + + + + + + + + 筛选 + + + + + + + + + + + + + 全部分类 + + + 全部 + + + {{ item.category_name }} + + + + + + 重置 + 确定 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/goods/public/css/cart.scss b/pages/goods/public/css/cart.scss new file mode 100644 index 0000000..514e550 --- /dev/null +++ b/pages/goods/public/css/cart.scss @@ -0,0 +1,647 @@ +.container { + width: 100vw; + height: 100vh;; + display: flex; + flex-direction: column; +} +.scroll-view { + flex: 1; + height: 0; + transform: translateX(0); +} +.cart-header { + padding: 20rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + line-height: 36rpx; + background: #f7f7f7; + + .num-wrap { + margin-left: $margin-both; + color: #666666; + font-size: 26rpx; + } + + .cart-action { + line-height: inherit; + margin-right: $margin-both; + color: #666666; + font-size: 26rpx; + } + + &.invalid { + margin-left: $margin-both; + margin-top: $margin-updown; + flex: 1; + line-height: inherit; + } +} + +.cart-wrap { + margin: 0 24rpx 24rpx; + border-radius: 16rpx; + overflow: hidden; + + .fixed-wrap { + height: 116rpx; + } + + .cart-goods { + background: #fff; + box-sizing: border-box; + position: relative; + padding: 30rpx 0 30rpx 30rpx; + &::after { + content: ''; + position: absolute; + left: 20rpx; + right: 20rpx; + height: 2rpx; + bottom: 0; + background-color: #f2f2f2; + } + &:last-of-type::after { + height: 0; + } + + .goods-wrap { + display: flex; + position: relative; + padding-left: 64rpx; + transition: all 0.1s; + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + transition: all 0.2s; + } + & > .icon-yuan_checkbox { + color: $color-disabled; + } + + &.edit { + transform: translateX(-70rpx); + > .iconfont { + opacity: 0; + } + } + + .goods-img { + width: 180rpx; + height: 180rpx; + + image { + width: 100%; + height: 100%; + border-radius: 8rpx; + } + } + + .goods-info { + flex: 1; + width: 0; + padding: 0 30rpx; + display: flex; + flex-direction: column; + justify-content: space-between; + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + } + + .sku-wrap { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + width: 100%; + + .sku { + line-height: 1; + margin: 10rpx 0 18rpx 0; + display: inline-flex; + align-items: center; + background: #f4f4f4; + border-radius: 8rpx; + padding: 0 10rpx 0 20rpx; + + .goods-spec { + color: #666666; + font-size: 24rpx; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .iconfont { + font-size: 28rpx; + padding-left: 10rpx; + color: #666666; + } + } + } + + .goods-sub-section { + display: flex; + justify-content: space-between; + width: 100%; + align-items: center; + + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + } + + .goods-price { + display: flex; + flex-direction: row; + font-weight: bold; + color: var(--price-color); + .bottom-price { + width: 100%; + font-size: $font-size-toolbar; + line-height: 1; + color: var(--price-color); + image { + width: 56rpx; + height: 22rpx; + margin-left: 6rpx; + } + } + } + + /deep/ .decrease { + width: 52rpx; + height: 52rpx; + line-height: 48rpx; + font-size: 40rpx; + border-radius: 10rpx 0px 0px 10rpx; + } + /deep/ input { + height: 52rpx; + line-height: 52rpx; + } + /deep/ .increase { + width: 52rpx; + height: 52rpx; + line-height: 48rpx; + font-size: 40rpx; + border-radius: 0px 10rpx 10rpx 0px; + } + } + } + } + + .item-del { + position: absolute; + width: 0; + height: 99%; + color: #fff; + right: 0; + top: 0; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s; + overflow: hidden; + white-space: nowrap; + font-size: $font-size-tag; + &.show { + width: 90rpx; + } + } + + &:first-child { + padding-top: 30rpx; + } + &:last-child { + .goods-info { + border-bottom: none; + padding-bottom: 0; + } + } + + .discount-wrap { + line-height: 1.5; + font-size: 24rpx; + margin-top: 20rpx; + display: flex; + + .discount-tag { + color: $base-color; + line-height: 1; + padding: 0 10rpx; + border-radius: $border-radius; + border: 1.5px solid $base-color; + margin-right: 10rpx; + white-space: nowrap; + line-height: 32rpx; + background: var(--main-color-shallow); + } + .interval { + height: 20rpx; + margin: 0 10rpx; + border-left: 2rpx solid #ddd; + white-space: nowrap; + margin-top: 10rpx; + &:last-child { + display: none; + } + } + .scroll-view { + flex: 1; + width: 0; + height: 100%; + white-space: nowrap; + } + } + } + + .invalid-goods { + .invalid-mark { + color: $color-tip; + padding: 6rpx 16rpx; + display: inline-block; + font-size: $font-size-goods-tag; + } + } +} + +.invalid .cart-header { + padding-top: 0; +} +.invalid .cart-header + .cart-goods { + padding-top: 30rpx; +} + +.cart-bottom-block { + height: 100rpx; + margin-top: 20rpx; +} +.cart-bottom { + width: 100vw; + height: 100rpx; + position: fixed; + left: 0; + bottom: var(--tab-bar-height, 0); + background: #fff; + overflow: hidden; + display: flex; + z-index: 9; + .all-election { + height: 100rpx; + position: relative; + display: inline-block; + + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + left: 30rpx; + transform: translateY(-50%); + } + & > .icon-yuan_checkbox { + color: $color-disabled; + } + + & > text { + margin-left: 56rpx; + line-height: 100rpx; + padding-left: 30rpx; + } + } + + .settlement-info { + flex: 1; + width: 0; + padding-right: 10rpx; + display: flex; + flex-direction: column; + justify-content: center; + text-align: right; + + .money { + line-height: 1; + font-size: 32rpx; + + .value { + font-weight: bold; + color: var(--price-color); + } + + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + color: var(--price-color); + font-weight: bold; + } + } + .detail { + line-height: 1; + font-size: 22rpx; + color: #666666; + margin-top: 10rpx; + + .iconfont { + font-size: 28rpx; + margin-left: 6rpx; + transition: all 0.1s; + display: inline-block; + &.open { + transform: rotate(180deg); + } + } + } + } + + .action-btn { + // width: 200rpx; + height: 100rpx; + line-height: 100rpx; + border-radius: 0; + margin: 0; + display: flex; + justify-content: flex-end; + align-items: center; + margin-right: 30rpx; + white-space: nowrap; + + button { + padding: 0 30rpx; + height: 70rpx; + line-height: 70rpx; + font-size: $font-size-base; + font-weight: bold; + border-radius: 50rpx; + &.delete { + height: 50rpx; + line-height: 46rpx; + } + } + } +} +.cart-bottom.active { + bottom: calc(constant(safe-area-inset-bottom) + 110rpx) !important; + bottom: calc(env(safe-area-inset-bottom) + 110rpx) !important; +} +.cart-empty { + text-align: center; + padding: 140rpx $padding 80rpx $padding; + + image { + width: 380rpx; + } + + button { + min-width: 300rpx; + margin-top: 100rpx; + height: 70rpx; + line-height: 70rpx !important; + font-size: $font-size-base; + border-radius: 50rpx; + &.visit-the { + font-weight: bold; + } + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + } +} + +.discount-popup { + .popup-body { + min-height: 300rpx; + } + + .detail-item { + height: 60rpx; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 30rpx; + + .money { + font-weight: bold; + } + + .reduce { + color: var(--price-color); + } + } + + .total { + margin-top: 20rpx; + + .title { + font-size: 36rpx; + font-weight: bold; + } + } +} + +.coupon-use-tips { + padding: 30rpx; + line-height: 1; + background: #fff; + border-bottom: 2rpx solid #eee; + display: flex; + justify-content: space-between; + align-items: center; + + & view { + line-height: 1; + } + + .iconfont { + font-size: 28rpx; + margin-left: 4rpx; + } + .title { + font-size: 28rpx; + font-weight: 600; + } + .desc { + font-size: 26rpx; + margin-left: 24rpx; + } +} + +.coupon-item { + margin: $margin-updown $margin-both; + border-radius: 4rpx; + padding: 0; + position: relative; + background-color: #fff2f0; + + &:before, + &:after { + position: absolute; + content: ''; + background-color: #fff; + top: 50%; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + &:before { + left: 0; + transform: translate(-50%, -50%); + } + &:after { + right: 0; + transform: translate(50%, -50%); + } + + .coupon-info { + height: 190rpx; + display: flex; + width: 100%; + position: relative; + + .info-wrap { + width: 220rpx; + height: 190rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + background-repeat: no-repeat; + background-size: 100% 100%; + background: linear-gradient(to left, var(--bg-color), var(--bg-color-shallow)); + position: relative; + .coupon-line { + position: absolute; + right: 0; + top: 0; + height: 100%; + } + .coupon-money { + color: #fff; + text-align: center; + line-height: 1; + .unit { + font-size: 30rpx; + } + .money { + font-size: 60rpx; + } + } + .at-least { + font-size: $font-size-tag; + color: #fff; + text-align: center; + margin-top: 20rpx; + } + } + + .desc-wrap { + flex: 1; + max-width: calc(100% - 400rpx); + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .coupon-name { + margin-top: 10rpx; + margin-bottom: 4rpx; + font-size: $font-size-base; + } + .limit { + font-size: $font-size-activity-tag; + } + .time { + border-top: 2rpx dashed $color-disabled; + position: absolute; + bottom: 30rpx; + color: $color-tip; + padding-top: 10rpx; + line-height: 1.5; + font-size: $font-size-activity-tag; + } + } + + button { + font-size: $font-size-tag; + position: absolute; + top: 50%; + right: 20rpx; + transform: translate(0, -50%); + margin: 0; + height: 50rpx; + line-height: 50rpx; + width: 100rpx; + padding: 0; + &[disabled] { + background-color: #dedede !important; + } + } + } + + &.disabled { + background-color: #f2f2f2; + .coupon-money { + color: $color-tip !important; + } + .at-least { + color: $color-tip !important; + } + } +} + +.uni-popup-discount { + z-index: 5; +} + +.store-wrap { + display: flex; + align-items: center; + background-color: #fff; + padding: 26rpx 30rpx 0; + font-weight: bold; + line-height: 1; + + .name { + font-size: $font-size-base; + margin-left: 10rpx; + } +} \ No newline at end of file diff --git a/pages/goods/public/css/detail.scss b/pages/goods/public/css/detail.scss new file mode 100644 index 0000000..2161abc --- /dev/null +++ b/pages/goods/public/css/detail.scss @@ -0,0 +1,585 @@ +// 优惠券弹出层 +.goods-coupon-popup-layer { + height: 800rpx; + .coupon-body { + position: absolute; + left: 0; + right: 0; + height: 65%; + + .coupon-item { + margin: $margin-updown $margin-both; + border-radius: 4rpx; + padding: 0; + position: relative; + background-color: #fff2f0; + + &:before, + &:after { + position: absolute; + content: ''; + background-color: #fff; + top: 50%; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + z-index: 5; + } + &:before { + left: 0; + transform: translate(-50%, -50%); + } + &:after { + right: 0; + transform: translate(50%, -50%); + } + + .coupon-info { + height: 190rpx; + display: flex; + width: 100%; + position: relative; + + .info-wrap { + width: 220rpx; + height: 190rpx; + display: flex; + justify-content: center; + align-items: center; + margin-right: 20rpx; + background-repeat: no-repeat; + background-size: 100% 100%; + background: linear-gradient(to left, var(--bg-color), var(--bg-color-shallow)); + position: relative; + &.disabled { + background: #dedede; + } + .coupon-line { + position: absolute; + right: 0; + top: 0; + height: 100%; + } + .coupon-money { + color: #fff; + text-align: center; + line-height: 1; + .unit { + font-size: 30rpx; + } + .money { + font-size: 60rpx; + } + } + .at-least { + font-size: $font-size-tag; + color: #fff; + text-align: center; + margin-top: 20rpx; + } + } + + .desc-wrap { + flex: 1; + max-width: calc(100% - 400rpx); + position: relative; + + view { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .coupon-name { + margin-top: 10rpx; + margin-bottom: 4rpx; + font-size: $font-size-base; + } + .limit { + font-size: $font-size-activity-tag; + } + .time { + width: 100%; + border-top: 2rpx dashed $color-disabled; + position: absolute; + bottom: 30rpx; + color: $color-tip; + padding-top: 10rpx; + line-height: 1.5; + font-size: $font-size-activity-tag; + } + } + + button { + font-size: $font-size-tag; + position: absolute; + top: 50%; + right: 20rpx; + transform: translate(0, -50%); + margin: 0; + height: 50rpx; + line-height: 50rpx; + width: 100rpx; + padding: 0; + &[disabled] { + background-color: #dedede !important; + } + } + } + + &.disabled { + background-color: #f2f2f2; + .coupon-money { + color: $color-tip !important; + } + .at-least { + color: $color-tip !important; + } + } + } + } +} + +// 满减 +.manjian-popup-layer { + height: 660rpx; + .free-tip { + min-width: 72rpx; + height: 36rpx; + line-height: 36rpx; + text-align: center; + border: none; + padding: 8rpx 8rpx; + border-radius: $border-radius; + margin-right: 20rpx; + font-size: $font-size-activity-tag; + display: inline-block; + font-weight: bold; + color: var(--main-color); + background-color: var(--main-color-shallow); + } + .manjian-body { + position: absolute; + left: 0; + right: 0; + height: 60%; + .item { + padding: $padding 0; + margin: 0 30rpx; + border-bottom: 1px solid $color-line; + .value { + margin-left: 20rpx; + } + &:last-child { + border-bottom: 0; + } + } + } +} + +// 组合套餐 +.combo-goods-wrap { + display: flex; + // width: calc(100% - 40rpx); + white-space: nowrap; + align-items: center; + padding: 20rpx 0; + + .goods-wrap { + display: flex; + align-items: center; + + .goods-item { + width: 25%; + display: inline-block; + margin-right: 30rpx; + position: relative; + vertical-align: middle; + .combo-img { + height: 160rpx; + width: 160rpx; + overflow: hidden; + border-radius: $border-radius; + position: relative; + + image { + width: 100%; + height: 100%; + } + .price-wrap { + position: absolute; + bottom: 0; + background: rgba(0, 0, 0, 0.4); + color: #fff; + left: 0; + width: 100%; + font-weight: bold; + .unit { + font-size: $font-size-tag; + margin-left: 10rpx; + } + .price { + font-size: $font-size-base; + } + } + } + + .name { + display: block; + height: 40rpx; + line-height: 40rpx; + font-size: $font-size-tag; + margin-top: 10rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } +} + +// 组合套餐 +.bundling-popup-layer { + height: 600rpx; + .bundling-body { + position: absolute; + left: 0; + right: 0; + height: 83%; + background-color: $color-bg; + + .bundling-view { + margin: 20rpx 30rpx; + border-radius: $border-radius; + + .bundling-item { + padding: $padding 30rpx; + background-color: #fff; + margin-bottom: 20rpx; + .title { + margin-bottom: 20rpx; + display: flex; + justify-content: space-between; + align-items: center; + .icon-right { + position: initial; + } + } + &:last-child { + margin-bottom: 0; + } + scroll-view { + width: 100%; + white-space: nowrap; + box-sizing: border-box; + .goods-wrap { + display: flex; + align-items: center; + + .goods-item { + width: 25%; + display: inline-block; + margin-right: 30rpx; + position: relative; + vertical-align: middle; + .combo-img { + height: 160rpx; + width: 160rpx; + overflow: hidden; + border-radius: $border-radius; + position: relative; + + image { + width: 100%; + height: 100%; + } + .price-wrap { + position: absolute; + bottom: 0; + background: rgba(0, 0, 0, 0.4); + color: #fff; + left: 0; + width: 100%; + font-weight: bold; + .unit { + font-size: $font-size-tag; + margin-left: 10rpx; + } + .price { + font-size: $font-size-base; + } + } + } + + .name { + display: block; + height: 40rpx; + line-height: 40rpx; + font-size: $font-size-tag; + margin-top: 10rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + } + .bundling-price-wrap { + text-align: right; + margin-top: 20rpx; + .label { + font-size: $font-size-base; + vertical-align: middle; + margin-right: 20rpx; + } + .unit { + font-size: $font-size-tag; + vertical-align: middle; + margin-right: 4rpx; + font-weight: bold; + } + .price { + font-size: $font-size-toolbar; + vertical-align: middle; + font-weight: bold; + margin-right: 20rpx; + } + button { + vertical-align: middle; + background-color: var(--goods-btn-color); + } + } + } + } + } +} + +.newdetail { + .item { + &.coupon { + .coupon-list { + flex: 1; + overflow: hidden; + line-height: 1; + height: 60rpx; + // line-height: 40rpx; + max-width: 84%; + box-sizing: border-box; + } + .coupon-item { + margin-top: 8rpx; + margin-bottom: 10rpx; + padding: 3rpx 16rpx; + margin-right: 20rpx; + position: relative; + border: 1.5px solid; + background-size: cover; + border-radius: 6rpx; + display: inline-block; + // height: 40rpx; + // line-height: 34rpx; + box-sizing: border-box; + // &:nth-child(2) { + // margin-left: 0; + // } + border-color: var(--goods-coupon); + &::after, + &::before { + content: ''; + width: 12rpx; + height: 12rpx; + position: absolute; + top: 50%; + border-radius: $border-radius; + background: #fff; + border: 1px solid var(--goods-coupon) !important; + } + &::after { + left: -10rpx; + transform: translateY(-50%) rotate(-45deg); + border-top-color: transparent !important; + border-left-color: transparent !important; + } + &::before { + right: -10rpx; + transform: translateY(-50%) rotate(-45deg); + border-bottom-color: transparent !important; + border-right-color: transparent !important; + } + &:first-child { + margin-left: 0; + } + &:last-child { + margin-right: 0; + } + view { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 24rpx; + text-align: center; + line-height: 1.5; + // height: 36rpx; + // height: 36rpx; + // line-height: 34rpx; + color: var(--goods-coupon); + font-weight: bold; + } + } + } + } +} + +.more-img-wrap { + width: 38rpx; + height: 38rpx; + position: absolute; + right: 30rpx; + image { + width: 100%; + height: 100%; + } +} + +// 会员卡 +.member-card-wrap { + margin-top: 20rpx; + height: 80rpx; + border-radius: 10rpx; + background: linear-gradient(to right, var(--goods-card-bg), var(--goods-card-bg-shallow)); + display: flex; + align-items: center; + padding: 0 20rpx; + color: var(--goods-card-color); + + .icon-huiyuan { + margin-right: 10rpx; + line-height: 1; + font-size: 32rpx; + } + + .info { + flex: 1; + color: #e5ce75; + font-size: $font-size-tag; + } + + .btn { + text-align: center; + line-height: 50rpx; + height: 50rpx; + border-radius: 6rpx; + width: 160rpx; + font-size: $font-size-tag; + color: #222; + font-weight: bold; + background: var(--goods-card-color); + } +} + +.goods-promotion { + background: var(--promotion-color); + height: 75px; + .price-info { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + .icon-box { + margin-right: 20rpx; + .iconfont { + font-size: 60rpx; + color: #ffffff; + } + } + .price-box { + display: flex; + align-items: flex-start; + flex-direction: column; + height: 100%; + justify-content: center; + .promotion-text { + font-size: 36rpx; + color: #fff; + line-height: 1; + } + .sale-num { + display: flex; + align-items: center; + margin-top: 18rpx; + view { + color: #ffffff; + line-height: 1; + } + } + } + } +} +.countdown { + width: 220rpx; + background: var(--promotion-aux-color); + .txt { + color: #ffffff !important; + font-size: 28rpx !important; + } + .clockrun { + margin-top: 16rpx !important; + } + &:after { + position: absolute; + content: ''; + top: calc(50% - 15rpx); + z-index: 5; + left: -15rpx; + width: 0; + height: 0; + border-style: solid; + border-width: 15rpx 15rpx 15rpx 0; + border-color: transparent var(--promotion-aux-color) transparent transparent; + } +} + +.fenxiao-detail { + padding-top: 20rpx; + + .title { + font-weight: 600; + font-size: $font-size-base; + } + + .commission-ratio { + margin-top: 10rpx; + border-radius: $border-radius; + + .item { + display: flex; + border-bottom: 2rpx solid $color-line; + height: 80rpx; + align-items: center; + + &:last-child { + border-bottom: none; + } + + view { + flex: 1; + + &:first-child { + font-size: $font-size-base; + } + + &:last-child { + text-align: right; + font-weight: bold; + .unit { + font-size: $font-size-tag; + margin-right: 4rpx; + } + .money { + font-size: $font-size-base; + } + } + } + } + } +} diff --git a/pages/goods/public/css/list.scss b/pages/goods/public/css/list.scss new file mode 100644 index 0000000..2e40653 --- /dev/null +++ b/pages/goods/public/css/list.scss @@ -0,0 +1,647 @@ +.head-wrap { + background: #fff; + position: fixed; + width: 100%; + left: 0; + z-index: 1; + + .search-wrap { + flex: 0.5; + padding: 30rpx 30rpx 0; + font-size: $font-size-tag; + display: flex; + align-items: center; + .iconfont { + margin-left: 16rpx; + font-size: 36rpx; + } + .input-wrap { + flex: 1; + display: flex; + justify-content: space-between; + align-items: center; + background: $color-bg; + height: 64rpx; + padding-left: 10rpx; + border-radius: 70rpx; + input { + width: 90%; + background: $color-bg; + font-size: $font-size-tag; + height: 100%; + padding: 0 25rpx 0 40rpx; + line-height: 50rpx; + border-radius: 40rpx; + } + text { + font-size: $font-size-toolbar; + color: $color-tip; + width: 80rpx; + text-align: center; + margin-right: 20rpx; + } + } + .category-wrap, + .list-style { + display: flex; + justify-content: center; + align-items: center; + .iconfont { + font-size: 50rpx; + color: $color-tip; + } + text { + display: block; + margin-top: 60rpx; + } + } + } + + .sort-wrap { + display: flex; + padding: 10rpx 20rpx 10rpx 0; + > view { + flex: 1; + text-align: center; + font-size: $font-size-base; + height: 60rpx; + line-height: 60rpx; + font-weight: bold; + } + .comprehensive-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: inline-block; + margin-left: 10rpx; + width: 40rpx; + .iconfont { + font-size: $font-size-toolbar; + line-height: 1; + margin-bottom: 5rpx; + } + } + } + .price-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 40rpx; + .iconfont { + position: relative; + float: left; + font-size: 32rpx; + line-height: 1; + height: 20rpx; + color: #909399; + &.asc { + top: -2rpx; + } + &.desc { + top: -6rpx; + } + } + } + } + .screen-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: inline-block; + margin-left: 10rpx; + width: 40rpx; + .iconfont { + font-size: $font-size-toolbar; + line-height: 1; + } + } + } + } +} + +.category-list-wrap { + height: 100%; + .class-box { + display: flex; + flex-wrap: wrap; + padding: 0 $padding; + view { + width: calc((100% - 60rpx) / 3); + font-size: $font-size-goods-tag; + margin-right: 20rpx; + height: 60rpx; + line-height: 60rpx; + text-align: center; + margin-bottom: 12rpx; + flex-shrink: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + background: rgba(245, 245, 245, 1); + border-radius: 5rpx; + &:nth-of-type(3n) { + margin-right: 0; + } + } + } + .first { + font-size: $font-size-tag; + display: block; + // background: $page-color-base; + padding: 20rpx; + } + .second { + border-bottom: 2rpx solid $color-line; + padding: 20rpx; + display: block; + font-size: $font-size-tag; + } + .third { + padding: 0 20rpx 20rpx; + overflow: hidden; + font-size: $font-size-tag; + > view { + display: inline-block; + margin-right: 20rpx; + margin-top: 20rpx; + } + .uni-tag { + padding: 0 20rpx; + } + } +} + +.screen-wrap { + .title { + font-size: $font-size-tag; + padding: $padding; + background: #f6f4f5; + } + scroll-view { + height: 85%; + .item-wrap { + border-bottom: 1px solid #f0f0f0; + .label { + font-size: $font-size-tag; + padding: $padding; + view { + display: inline-block; + font-size: 60rpx; + height: 40rpx; + vertical-align: middle; + line-height: 40rpx; + } + } + + .list { + margin: $margin-updown $margin-both; + overflow: hidden; + > view { + display: inline-block; + margin-right: 25rpx; + margin-bottom: 25rpx; + } + .uni-tag { + padding: 0 $padding; + font-size: $font-size-goods-tag; + background: #f5f5f5; + height: 52rpx; + line-height: 52rpx; + border: 0; + } + } + .price-wrap { + display: flex; + justify-content: center; + align-items: center; + padding: $padding; + input { + flex: 1; + background: #f5f5f5; + height: 52rpx; + width: 182rpx; + line-height: 50rpx; + font-size: $font-size-goods-tag; + border-radius: 50rpx; + text-align: center; + &:first-child { + margin-right: 10rpx; + } + &:last-child { + margin-left: 10rpx; + } + } + } + } + } + .footer { + height: 90rpx; + display: flex; + justify-content: center; + align-items: flex-start; + display: flex; + //position: absolute; + bottom: 0; + width: 100%; + .footer-box { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin: 0; + width: 40%; + } + .footer-box1 { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 0; + width: 40%; + } + } +} +.safe-area { + bottom: 68rpx !important; +} +.empty { + margin-top: 100rpx; +} +.buy-num { + font-size: $font-size-activity-tag; +} +.icon { + width: 34rpx; + height: 30rpx; +} +.list-style-new { + display: flex; + align-items: center; + .line { + width: 4rpx; + height: 28rpx; + background-color: rgba(227, 227, 227, 1); + margin-right: 60rpx; + } +} +.h-line { + width: 37rpx; + height: 2rpx; + background-color: $color-tip; +} + +.lineheight-clear { +} + +// 商品列表单列样式 +.goods-list.single-column { + display: none; + + &.show { + display: block; + } + + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: $border-radius; + display: flex; + position: relative; + + .goods-img { + position: relative; + width: 200rpx; + height: 200rpx; + // overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + overflow: hidden; + + image { + width: 200rpx; + height: 200rpx; + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 26rpx; + left: 26rpx; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .introduction { + line-height: 1; + margin-top: 10rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + + .unit { + margin-right: 6rpx; + color: var(--price-color); + } + .price { + color: var(--price-color); + } + } + + .pro-info { + display: flex; + margin-top: auto; + align-items: center; + position: relative; + + .delete-price { + text-decoration: line-through; + font-size: $font-size-tag !important; + flex: 1; + + .unit { + margin-right: 0; + } + } + .block-wrap { + flex: 1; + line-height: 1; + margin-right: 20rpx; + .sale { + font-size: $font-size-tag !important; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + display: flex; + max-height: 30rpx; + } + } + .sell-out{ + position: absolute; + z-index: 1; + width: 100%; + height: 100%; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); + text{ + color: #fff; + font-size: 150rpx; + } + } + } +} +// 商品列表双列样式 +.goods-list.double-column { + display: none; + margin: 0 24rpx; + padding-top: $margin-updown; + position: relative; + flex-wrap: wrap; + justify-content: space-between; + + &.show { + display: flex; + } + + .goods-item { + display: flex; + flex-direction: column; + width: calc(50% - 10rpx); + border-radius: $border-radius; + overflow: hidden; + background-color: #fff; + + &:nth-child(2n + 2) { + margin-right: 0; + } + + .goods-img { + position: relative; + overflow: hidden; + padding-top: 100%; + border-top-left-radius: $border-radius; + border-top-right-radius: $border-radius; + + image { + width: 100%; + position: absolute !important; + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 16rpx; + position: absolute; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 0; + left: 0; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + padding: 20rpx; + display: flex; + flex-direction: column; + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + margin-top: 20rpx; + } + + .lineheight-clear { + margin-top: 16rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + + .unit { + margin-right: 6rpx; + color: var(--price-color); + } + .price { + color: var(--price-color); + } + } + + .pro-info { + display: flex; + margin-top: auto; + align-items: center; + + .block-wrap { + flex: 1; + line-height: 1; + margin-right: 20rpx; + .sale { + font-size: $font-size-tag !important; + } + } + } + + .delete-price { + // display: inline-block; + // margin-left: 6rpx; + // float: right; + .unit { + margin-right: 6rpx; + } + text { + line-height: 1; + font-size: $font-size-tag !important; + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + .sell-out{ + position: absolute; + z-index: 1; + width: 100%; + height: 100%; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); + text{ + color: #fff; + font-size: 250rpx; + } + } + } +} + +.cart-action-wrap { + position: relative; + + .shopping-cart-btn { + font-size: 36rpx; + border: 2rpx solid $base-color; + border-radius: 50%; + padding: 10rpx; + color: $base-color; + width: 36rpx; + height: 36rpx; + text-align: center; + line-height: 36rpx; + } + + .plus-sign-btn { + font-size: 36rpx; + border: 2rpx solid $base-color; + border-radius: 50%; + padding: 10rpx; + color: $base-color; + width: 36rpx; + height: 36rpx; + text-align: center; + line-height: 36rpx; + } + + .buy-btn { + background-color: $base-color; + color: var(--btn-text-color); + border-radius: 50rpx; + font-size: $font-size-tag; + padding: 12rpx 30rpx; + line-height: 1; + } + .icon-diy { + font-size: 80rpx; + } +} diff --git a/pages/goods/public/js/cart.js b/pages/goods/public/js/cart.js new file mode 100644 index 0000000..a9fbaf2 --- /dev/null +++ b/pages/goods/public/js/cart.js @@ -0,0 +1,599 @@ +export default { + data() { + return { + cartData: [], // 购物车 + checkAll: true, + totalPrice: '0.00', + totalCount: 0, + isSub: false, + invalidGoods: [], // 失效商品集合 + isIphoneX: false, //判断手机是否是iphoneX以上, + isAction: false, // 是否操作删除 + goodsSkuDetail: null, + discount: {}, + manjian: {}, + receiveSub: false, + discountPopupShow: false, + startX: '', // 触摸开始位置 + endX: '', // 触摸结束位置 + refresherTriggered: false, // 设置当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发 + timeout: {} + }; + }, + onLoad() { + uni.hideTabBar(); + this.isIphoneX = this.$util.uniappIsIPhoneX(); + }, + onShow() { + if (this.storeToken) { + this.getCartData(); + } else { + this.cartData = []; + this.invalidGoods = []; + this.calculationTotalPrice(); + } + }, + onHide() { + this.isAction = false; + }, + onUnload() { + if (!this.storeToken && this.$refs.login) this.$refs.login.cancelCompleteInfo(); + }, + onReady() { + if (!this.storeToken) { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }, + computed: { + hasData() { + return this.cartData.length > 0 || this.invalidGoods.length > 0; + } + }, + methods: { + initNum(item) { + let max_buy = item.max_buy > 0 && item.max_buy < item.stock ? item.max_buy : item.stock; + max_buy = max_buy == 0 ? 1 : max_buy; + if (item.num > max_buy) return max_buy; + return item.num; + }, + /** + * 获取购物车数据 + */ + getCartData() { + this.$api.sendRequest({ + url: '/api/cart/goodslists', + success: res => { + if (res.code >= 0) { + if (res.data.length) this.handleCartData(res.data); + else this.cartData = []; + } + this.refresherTriggered = false; + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + /** + * 处理购物车数据结构 + */ + handleCartData(data) { + this.invalidGoods = []; + this.cartData = []; + var temp = {}; + data.forEach((item, index) => { + if (item.goods_state == 1) { + if (item.store_goods_status != undefined && item.store_goods_status != 1) { + this.invalidGoods.push(item); + } else if (item.min_buy > 0 && item.min_buy > item.stock) { + // 如果最小限购超出库存则该商品失效 + this.invalidGoods.push(item); + } else { + item.checked = true; + item.edit = false; + if (temp['site_' + item.site_id] != undefined) { + temp['site_' + item.site_id].cartList.push(item); + } else { + temp['site_' + item.site_id] = { + siteId: item.site_id, + siteName: item.site_name, + edit: false, + checked: true, + cartList: [item] + }; + } + } + } else { + this.invalidGoods.push(item); + } + }); + + this.cartData = []; + Object.keys(temp).forEach(key => { + this.cartData.push(temp[key]); + }); + this.calculationTotalPrice(); + if (this.cartData.length) { + this.cartData[0].cartList.forEach(v => { + if (v.sku_spec_format) { + v.sku_spec_format = JSON.parse(v.sku_spec_format); + } else { + v.sku_spec_format = []; + } + }); + } + if (this.invalidGoods.length) { + this.invalidGoods.forEach(v => { + if (v.sku_spec_format) { + v.sku_spec_format = JSON.parse(v.sku_spec_format); + } else { + v.sku_spec_format = []; + } + }); + } + }, + /** + * 单选 + * @param siteIndex + * @param index + */ + singleElection(siteIndex, index) { + this.cartData[siteIndex].cartList[index].checked = !this.cartData[siteIndex].cartList[index].checked; + this.calculationTotalPrice(); + }, + /** + * 店铺全选 + * @param checked + * @param index + */ + siteAllElection(checked, index) { + this.cartData[index].checked = checked; + this.cartData[index].cartList.forEach(item => { + item.checked = checked; + }); + this.calculationTotalPrice(); + }, + /** + * 全选 + */ + allElection(checked) { + if (typeof checked == 'boolean') { + this.checkAll = checked; + } else { + this.checkAll = !this.checkAll; + } + if (this.cartData.length) { + this.cartData.forEach(siteItem => { + siteItem.checked = this.checkAll; + siteItem.cartList.forEach(item => { + item.checked = this.checkAll; + }); + }); + } + this.calculationTotalPrice(); + }, + /** + * 计算购物车总价 + */ + calculationTotalPrice() { + if (this.cartData.length) { + let totalPrice = 0, + totalCount = 0, + siteAllElectionCount = 0; + + this.cartData.forEach(siteItem => { + let siteGoodsCount = 0; + siteItem.cartList.forEach(item => { + if (item.checked) { + siteGoodsCount += 1; + totalCount += parseInt(item.num); + if (Number(item.member_price) > 0 && Number(item.member_price) < Number(item.discount_price)) { + totalPrice += item.member_price * item.num; + } else { + totalPrice += item.discount_price * item.num; + } + } + }); + if (siteItem.cartList.length == siteGoodsCount) { + siteItem.checked = true; + siteAllElectionCount += 1; + } else { + siteItem.checked = false; + } + }); + this.totalPrice = totalPrice.toFixed(2); + this.totalCount = totalCount; + this.checkAll = this.cartData.length == siteAllElectionCount; + } else { + this.totalPrice = '0.00'; + this.totalCount = 0; + } + this.discountCalculate(); + }, + /** + * 删除购物车 + * @param tag + * @param siteIndex + * @param cartIndex + */ + deleteCart(tag, siteIndex, cartIndex) { + var cart_id = []; + if (tag == 'all') { + for (let i = 0; i < this.cartData.length; i++) { + for (let j = 0; j < this.cartData[i].cartList.length; j++) { + if (this.cartData[i].cartList[j].checked) cart_id.push(this.cartData[i].cartList[j].cart_id); + } + } + } else { + cart_id.push(this.cartData[siteIndex].cartList[cartIndex].cart_id); + } + if (cart_id.length == 0) { + this.$util.showToast({ + title: '请选择要删除的商品' + }); + return; + } + + uni.showModal({ + title: '提示', + content: cart_id.length > 1 ? '确定要删除这些商品吗?' : '确定要删除该商品吗?', + success: res => { + if (res.confirm) { + cart_id = cart_id.toString(); + + this.$api.sendRequest({ + url: '/api/cart/delete', + data: { + cart_id + }, + success: res => { + if (res.code >= 0) { + + if (tag == 'all') { + // 全选 + for (var i = 0; i < this.cartData.length; i++) { + for (var j = 0; j < this.cartData[i].cartList.length; j++) { + var item = this.cartData[i].cartList[j]; + if (item.checked) { + this.cartData[i].cartList.splice(j, 1); + j = -1; + } + } + if (this.cartData[i].cartList.length == 0) { + this.cartData.splice(i, 1); + i = -1; + } + } + + this.$store.dispatch('emptyCart'); + } else { + let item = this.cartData[siteIndex].cartList; + let goods_id = item[cartIndex].goods_id; + let sku_id = item[cartIndex].sku_id; + + delete this.cartList['goods_' + goods_id]['sku_' + sku_id]; + if (Object.keys(this.cartList['goods_' + goods_id]).length == 2) { + delete this.cartList['goods_' + goods_id]; + } + this.$store.dispatch('cartCalculate'); + + item.splice(cartIndex, 1); + if (item.length == 0) this.cartData.splice(siteIndex, 1); + + } + + this.resetEditStatus(); + this.calculationTotalPrice(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } + } + }); + }, + /** + * 变更购物车数量 + * @param {Object} params + */ + cartNumChange(num, params) { + if (isNaN(num)) return; + let data = this.cartData[params.siteIndex].cartList[params.cartIndex], + max_buy = data.is_limit && data.max_buy > 0 && data.max_buy < data.stock ? data.max_buy : data.stock, + min_buy = data.min_buy > 0 ? data.min_buy : 1; + if (num > max_buy) num = max_buy; + if (num < min_buy) num = min_buy; + + let cartId = this.cartData[params.siteIndex].cartList[params.cartIndex].cart_id + + if (this.timeout[cartId]) clearTimeout(this.timeout[cartId]) + + this.timeout[cartId] = setTimeout(() => { + this.$api.sendRequest({ + url: '/api/cart/edit', + data: { + num, + cart_id: cartId + }, + success: res => { + if (res.code >= 0) { + let item = this.cartData[params.siteIndex].cartList[params.cartIndex]; + let goods_id = item.goods_id; + let sku_id = item.sku_id; + item.num = num; + + this.cartList['goods_' + goods_id]['sku_' + sku_id].num = num; + this.$store.dispatch('cartCalculate'); + this.resetEditStatus(); + + this.calculationTotalPrice(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, 800) + }, + /** + * 结算 + */ + settlement() { + if (this.totalCount > 0) { + let cart_ids = []; + this.cartData.forEach(siteItem => { + siteItem.cartList.forEach(item => { + if (item.checked) { + cart_ids.push(item.cart_id); + } + }); + }); + + if (this.discount.coupon_info && this.discount.coupon_info.receive_type == 'wait') this.receiveCoupon( + this.discount.coupon_info.coupon_type_id, false); + + if (this.isSub) return; + this.isSub = true; + + uni.removeStorageSync('delivery'); + uni.setStorage({ + key: 'orderCreateData', + data: { + cart_ids: cart_ids.toString() + }, + success: () => { + this.$util.redirectTo('/pages/order/payment'); + this.isSub = false; + } + }); + } + }, + /** + * 清空失效商品 + */ + clearInvalidGoods() { + uni.showModal({ + title: '提示', + content: '确定要清空这些商品吗?', + success: res => { + if (res.confirm) { + var cart_ids = []; + this.invalidGoods.forEach(goodsItem => { + cart_ids.push(goodsItem.cart_id); + }); + if (cart_ids.length) { + this.$api.sendRequest({ + url: '/api/cart/delete', + data: { + cart_id: cart_ids.toString() + }, + success: res => { + if (res.code >= 0) { + this.invalidGoods = []; + this.refreshCartNumber(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } + } + } + }); + }, + imageError(siteIndex, cartIndex) { + this.cartData[siteIndex].cartList[cartIndex].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + toGoodsDetail(item) { + this.$util.redirectTo('/pages/goods/detail', { + sku_id: item.sku_id + }); + }, + // 购物车数量 + refreshCartNumber() { + if (this.storeToken) { + this.$store.dispatch('getCartNumber'); + this.resetEditStatus(); + } + }, + goodsLimit(event, params) { + let data = this.cartData[params.siteIndex].cartList[params.cartIndex]; + if (event.type == 'plus') { + if (data.max_buy > 0 && data.max_buy < data.stock) { + this.$util.showToast({ + title: '该商品每人限购' + data.max_buy + '件' + }); + } else { + this.$util.showToast({ + title: '库存不足' + }); + } + } else { + // 数量减至最少时,则删除商品 + this.deleteCart('single', params.siteIndex, params.cartIndex); + // this.$util.showToast({ + // title: '最少购买' + event.value + '件' + // }); + } + }, + toLogin() { + this.$refs.login.open(); + }, + // 重置编辑状态 + resetEditStatus() { + if (this.cartData.length) { + for (var i = 0; i < this.cartData[0].cartList.length; i++) { + this.cartData[0].cartList[i].edit = false; + } + this.$forceUpdate(); + } + }, + changeAction() { + this.isAction = !this.isAction; + this.resetEditStatus(); + }, + selectSku(data) { + let goodsSkuDetail = this.$util.deepClone(data); + if (goodsSkuDetail.goods_spec_format) goodsSkuDetail.goods_spec_format = JSON.parse(goodsSkuDetail.goods_spec_format); + this.goodsSkuDetail = goodsSkuDetail; + + this.$nextTick(() => { + this.$refs.selectSku.show('confirm', (sku_id, num) => { + this.$api.sendRequest({ + url: '/api/cart/editcartsku', + data: { + cart_id: data.cart_id, + sku_id: sku_id, + num: num + }, + success: res => { + if (res.code >= 0) { + this.invalidGoods = []; + this.getCartData(); + this.refreshCartNumber(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, this.goodsSkuDetail); + }) + }, + toggleDiscountPopup() { + if (this.$refs.discountPopup.showPopup) this.$refs.discountPopup.close(); + else this.$refs.discountPopup.open(); + this.discountPopupShow = !this.discountPopupShow; + }, + /** + * 优惠信息计算 + */ + discountCalculate() { + if (this.cartData.length == 0) return; + let skuIds = []; + this.cartData.forEach(siteItem => { + siteItem.cartList.forEach(item => { + if (item.checked) { + skuIds.push({ + sku_id: item.sku_id, + num: item.num + }); + } + }); + }); + if (skuIds.length == 0) { + this.discount = {}; + return; + } + + this.$api.sendRequest({ + url: '/api/cartcalculate/calculate', + data: { + sku_ids: JSON.stringify(skuIds) + }, + success: res => { + if (res.code >= 0 && res.data && (res.data.coupon_money > 0 || res.data.promotion_money > 0)) { + this.discount = res.data; + let manjian = {}; + res.data.goods_list.forEach(item => { + if (item.promotion && item.promotion.manjian) { + manjian['sku_' + item.sku_id] = JSON.parse(item.promotion.manjian.rule_json); + } + }) + Object.assign(this.manjian, manjian); + this.refresherTriggered = false; + } else { + this.discount = {}; + } + } + }) + }, + /** + * 领取优惠券 + * tips 失败时是否提示 + * @param {Object} couponTypeId + */ + receiveCoupon(couponTypeId, tips = true) { + if (this.receiveSub) return; + this.receiveSub = true; + this.$api.sendRequest({ + url: '/coupon/api/coupon/receive', + data: { + coupon_type_id: couponTypeId, + get_type: 2 //获取方式:1订单2.直接领取3.活动领取 + }, + success: res => { + if (res.code == 0) { + this.$set(this.discount.coupon_info, 'receive_type', ''); + } else { + if (tips) this.$util.showToast({ + title: res.message + }); + this.receiveSub = false; + } + } + }); + }, + // 手指触摸事件 用于菜单左滑 + touchS(e) { + this.startX = e.touches[0].clientX; + // console.log('开始' + e.touches[0].clientX); + }, + touchE(e, cartIndex) { + this.endX = e.changedTouches[0].clientX; + // 触摸开始到停止的差值,小于0左滑,大于0右滑 + var disX = this.startX - this.endX; + // cartIndex.edit = disX > 50; + if (disX > 50) cartIndex.edit = true; + else if (disX < 0) cartIndex.edit = false; + this.$forceUpdate(); + }, + moneyFormat(money) { + if (isNaN(parseFloat(money))) return money; + return parseFloat(money).toFixed(2); + }, + refreshSkuDetail(goodsSkuDetail) { + this.goodsSkuDetail = goodsSkuDetail; + }, + onRefresh(e) { + this.refresherTriggered = true; + if (this.storeToken) { + this.getCartData(); + this.refreshCartNumber(); + } else { + this.cartData = []; + this.invalidGoods = []; + this.calculationTotalPrice(); + } + } + }, +} \ No newline at end of file diff --git a/pages/goods/public/js/detail.js b/pages/goods/public/js/detail.js new file mode 100644 index 0000000..f010ccb --- /dev/null +++ b/pages/goods/public/js/detail.js @@ -0,0 +1,525 @@ +export default { + data() { + return { + goodsRoute: '/pages/goods/detail', + couponList: [], //优惠券列表 + couponBtnSwitch: false, //获取优惠券防止重复提交 + + posterApi: '/api/goods/poster', + + //满减活动 + manjian: { + type: 0, + manjian_name: "", + rule_json: null + }, + //组合套餐 + bundlingType: false, + bundling: [{ + bundling_goods: { + bl_name: '', + sku_image: '' + } + }], + + membercard: null, // 会员卡信息 + hackReset: true, + cardOff: false, + informationform:[]//留言表单 + + } + }, + computed: { + showDiscount() { + var flag = false; + if ( + this.preview == 0 && + this.addonIsExist.discount && + this.goodsSkuDetail.promotion_type == 1 && + this.goodsSkuDetail.discountTimeMachine && + (!this.goodsSkuDetail.member_price || (this.goodsSkuDetail.member_price > 0 && Number(this.goodsSkuDetail.member_price) > Number(this.goodsSkuDetail.discount_price)) + ) + ) { + flag = true; + } + return flag; + }, + memberCardDiscount() { + let discount = 0, + showPrice = this.goodsSkuDetail.member_price > 0 && Number(this.goodsSkuDetail.member_price) < Number(this.goodsSkuDetail.discount_price) ? this.goodsSkuDetail.member_price : this.goodsSkuDetail.discount_price; + if (this.membercard && this.membercard.member_price > 0 && (parseFloat(showPrice) > parseFloat(this.membercard.member_price))) { + discount = parseFloat(showPrice) - parseFloat(this.membercard.member_price); + } + return discount.toFixed(2); + }, + //表单高度 + FormHeight(){ + let height = 48; + if (this.goodsForm && this.goodsForm.length) { + height += this.goodsForm.length * 5; + } + height += 'vh'; + return height; + } + }, + onLoad(data) { + + // #ifdef MP-ALIPAY + let options = my.getLaunchOptionsSync(); + options.query && Object.assign(data, options.query) + // #endif + + this.skuId = data.sku_id || 0; + this.goodsId = data.goods_id || 0; + + // 小程序扫码进入 + if (data.scene) { + var sceneParams = decodeURIComponent(data.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('goods_id') != -1) this.goodsId = item.split('-')[1]; + }); + } + } + + // #ifdef MP-WEIXIN + this.getShareImg(); + // #endif + }, + async onShow() { + //同步获取商品详情 + await this.getGoodsSkuDetail(); + }, + onHide() { + this.couponBtnSwitch = false; + }, + methods: { + //拨打电话 + phoneClick(mobile){ + uni.makePhoneCall({ + phoneNumber: mobile+'', + success(){}, + fail(){} + }) + }, + setSkuId(val) { + if (val) { + this.skuId = val; + this.getBundling(); + } + }, + // 获取商品详情 + async getGoodsSkuDetail() { + let res = await this.$api.sendRequest({ + url: '/api/goodssku/detail', + async: false, + data: { + sku_id: this.skuId, + goods_id: this.goodsId, + } + }); + let data = res.data; + if (data.goods_sku_detail != null) { + if (data.goods_sku_detail.promotion_type == 'presale' && data.goods_sku_detail.presale_id) { + this.$util.redirectTo('/pages_promotion/presale/detail', { + id: data.goods_sku_detail.presale_id, + sku_id: this.skuId + }, 'reLaunch'); + return; + } + if(uni.getStorageSync('lang') == 'en-us') data.goods_sku_detail.goods_name = data.goods_sku_detail.en_goods_name + + this.goodsSkuDetail = data.goods_sku_detail; + if (!this.skuId) this.skuId = this.goodsSkuDetail.sku_id; + if (!this.goodsId) this.goodsId = this.goodsSkuDetail.goods_id; + // 分享参数、链接 + this.shareQuery = 'goods_id=' + this.goodsSkuDetail.goods_id; + this.shareUrl = this.goodsRoute + '?' + this.shareQuery; + + // 在线客服聊天参数 + this.chatRoomParams = { + sku_id: this.goodsSkuDetail.sku_id + }; + let typeId = this.goodsSkuDetail.goods_promotion[0]; + if (typeId) { + // 限时折扣 + if (typeId.discount_id) { + this.chatRoomParams.type = 'discount' + this.chatRoomParams.type_id = typeId.discount_id + } + } + + // 海报参数 + this.posterParams = { + goods_id: this.goodsId + }; + + // 处理商品数据 + this.handleGoodsSkuData(); + + // 限时折扣 + if (this.goodsSkuDetail.promotion_type == 1 && this.addonIsExist.discount) { + //检测倒计时 + if ((this.goodsSkuDetail.end_time - res.timestamp) > 0) { + this.goodsSkuDetail.discountTimeMachine = this.$util.countDown(this.goodsSkuDetail.end_time - res.timestamp); + } else { + this.goodsSkuDetail.promotion_type = 0; + } + } + if (this.goodsSkuDetail.promotion_type == 1 && this.goodsSkuDetail.discountTimeMachine) { + if (this.goodsSkuDetail.member_price > 0 && Number(this.goodsSkuDetail.member_price) <= Number(this.goodsSkuDetail.discount_price)) { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.member_price; + } else { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.discount_price; + } + } else { + if (this.goodsSkuDetail.member_price > 0) { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.member_price; + } else { + this.goodsSkuDetail.show_price = this.goodsSkuDetail.price; + } + } + + // 满减 + if (this.goodsSkuDetail.manjian) { + this.getManjian(this.goodsSkuDetail.manjian); + } + + // 会员卡 + if (this.goodsSkuDetail.membercard) { + this.membercard = this.goodsSkuDetail.membercard; + } + + // 优惠券 + if (this.goodsSkuDetail.coupon_list) { + this.couponList = this.goodsSkuDetail.coupon_list; + this.couponList.forEach(v => { + if (v.count == v.lead_count) v.useState = 2; + else if (v.max_fetch != 0 && v.member_coupon_num && v.member_coupon_num >= v.max_fetch) v.useState = 1; + else v.useState = 0; + }); + this.couponList = this.couponList.sort(this.sortBy('useState')) + } + + // 组合套餐 + // if (this.goodsSkuDetail.bundling_list) { + // this.handleBundlingData(this.goodsSkuDetail.bundling_list); + // } + + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + + } else { + this.$util.redirectTo('/pages_tool/goods/not_exist', {}, 'redirectTo'); + } + }, + choiceSku() { + this.$refs.goodsSku.show("buy_now", () => { + this.$store.dispatch('getCartNumber'); + }); + }, + + //商品留言打开 + showinformation(){ + this.informationform = this.goodsSkuDetail.goods_form + this.$refs.informationPopup.open(); + }, + //商品留言关闭 + closeinformationPopup(){ + this.$refs.informationPopup.close(); + }, + //保存商品留言 + saveubfirnation(){ + //缺少 + if (!this.$refs.form.verify()) return; + + // uni.setStorageSync('goodFormData', { + // goods_id: this.goodsSkuDetail.goods_id, + // form_data: this.$refs.form.formData + // }); + this.$api.sendRequest({ + url: '/api/goods/information', + data: { + goods_id: this.goodsSkuDetail.goods_id, + form_data: JSON.stringify(this.$refs.form.formData) + }, + success: res => { + var data = res.data; + if (res.code == 0) { + + }else{ + this.$util.showToast({ + title: res.msg + }); + } + + + }, + }); + }, + // 加入购物车 + joinCart() { + if (!this.storeToken && this.preview == 0) { + this.$refs.login.open(this.shareUrl); + return; + } + if (this.goodsSkuDetail.is_virtual == 1) { + this.$refs.goodsSku.show("buy_now", () => { + this.$store.dispatch('getCartNumber'); + }); + } else { + this.$refs.goodsSku.show("join_cart", () => { + this.$store.dispatch('getCartNumber'); + }); + } + }, + // 立即购买 + buyNow() { + if (!this.storeToken && this.preview == 0) { + this.$refs.login.open(this.shareUrl); + return; + } + this.$refs.goodsSku.show("buy_now", () => { + }); + }, + + sortBy(field) { + //根据传过来的字段进行排序,y-x 得分从高到低,x-y 从低到高 + return (y, x) => { + return y[field] - x[field] + } + }, + + // 打开优惠券弹出层 + openCouponPopup() { + this.$refs.couponPopup.open(); + }, + // 关闭优惠券弹出层 + closeCouponPopup() { + this.$refs.couponPopup.close(); + }, + // 领取优惠券 + receiveCoupon(item) { + let that = this; + if (this.preview) return; // 开启预览,禁止任何操作和跳转 + if (this.couponBtnSwitch) return; + this.couponBtnSwitch = true; + if (this.storeToken) { + this.$api.sendRequest({ + url: '/coupon/api/coupon/receive', + data: { + coupon_type_id: item.coupon_type_id, + get_type: 2 //获取方式:1订单2.直接领取3.活动领取 + }, + success: res => { + var data = res.data; + + let msg = ''; + + let list = this.couponList; + if (res.data.is_exist == 1 && res.code < 0) { + msg = '您已领取过该优惠券,快去使用吧'; + } else if (res.code == 0) { + msg = '领取成功,快去使用吧'; + } else { + msg = res.message; + } + if (res.data.is_exist == 1) { + for (let i = 0; i < list.length; i++) { + if (list[i].coupon_type_id == item.coupon_type_id) { + that.$set(that.couponList[i], 'useState', 1); + } + } + } else { + for (let i = 0; i < list.length; i++) { + if (list[i].coupon_type_id == item.coupon_type_id) { + that.$set(that.couponList[i], 'useState', 2); + + } + + } + } + this.$util.showToast({ + title: msg + }); + that.$forceUpdate() + this.hackReset = false; + this.$nextTick(() => { + this.hackReset = true; + }) + + this.couponBtnSwitch = false; + }, + }); + } else { + this.$refs.login.open(this.shareUrl); + this.couponBtnSwitch = false; + } + }, + + //-------------------------------------满减------------------------------------- + + //获取满减信息 + getManjian(data) { + this.manjian = data; + let limit = data.type == 0 ? '元' : '件'; + Object.keys(data.rule_json).forEach((key) => { + var item = data.rule_json[key]; + if (item.coupon_data) { + for (var i = 0; i < item.coupon_data.length; i++) { + item.coupon_data[i].coupon_num = item.coupon_num[i] + } + } + item.limit = data.type == 0 ? parseFloat(item.limit).toFixed(2) : parseInt(item.limit); + // 满减 + if (item.discount_money != undefined) { + if (this.manjian.manjian == undefined) { + this.manjian.manjian = '满' + item.limit + limit + '减' + item.discount_money + '元'; + } else { + this.manjian.manjian += ';满' + item.limit + limit + '减' + item.discount_money + '元'; + } + } + // 满送 + if (item.point != undefined || item.coupon != undefined) { + let text = ''; + if (item.point != undefined) { + text = '送' + item.point + '积分'; + } + if (item.coupon != undefined && item.coupon_data != undefined) { + item.coupon_data.forEach((couponItem, couponIndex) => { + if (couponItem.type == 'discount') { + if (text == '') text = '送' + item.coupon_num[couponIndex] + '张' + parseFloat(couponItem.discount) + '折优惠券'; + else text += '、送' + item.coupon_num[couponIndex] + '张' + parseFloat(couponItem.discount) + '折优惠券'; + } else { + if (text == '') text = '送' + item.coupon_num[couponIndex] + '张' + parseFloat(couponItem.money) + '元优惠券'; + else text += '、送' + item.coupon_num[couponIndex] + '张' + parseFloat(couponItem.money) + '元优惠券'; + } + }) + } + if (this.manjian.mansong == undefined) { + this.manjian.mansong = '满' + item.limit + limit + text; + } else { + this.manjian.mansong += ';' + '满' + item.limit + limit + text; + } + } + // 包邮 + if (item.free_shipping != undefined) { + if (this.manjian.free_shipping == undefined) { + this.manjian.free_shipping = '满' + item.limit + limit + '包邮'; + } else { + this.manjian.free_shipping += ';满' + item.limit + limit + '包邮'; + } + } + }); + }, + openManjianPopup() { + this.$refs.manjianPopup.open(); + }, + closeManjianPopup() { + this.$refs.manjianPopup.close(); + }, + + //-------------------------------------组合套餐------------------------------------- + + //获取当前商品关联的组合套餐 + getBundling() { + // 连锁门店没有营销活动 + if (this.globalStoreConfig && this.globalStoreConfig.store_business == 'store') return; + + this.$api.sendRequest({ + url: "/bundling/api/bundling/lists", + data: { + sku_id: this.skuId + }, + success: res => { + // this.handleBundlingData(res.data); + } + }); + }, + handleBundlingData(data) { + this.bundling = data; + if (this.bundling.length) { + + for (var i = 0; i < this.bundling[0].bundling_goods.length; i++) { + if (this.bundling[0].bundling_goods[i].sku_id == this.skuId) { + this.bundlingType = true; + break; + } else { + this.bundlingType = false; + } + } + + for (var i = 0; i < this.bundling.length; i++) { + for (var j = 0; j < this.bundling[i].bundling_goods.length; j++) { + if (this.bundling[i].bundling_goods[j].sku_id == this.skuId) { + this.bundling[i].bundling_goods.splice(j, 1); + } + } + } + } + }, + // 打开组合套餐弹出层 + openBundlingPopup() { + this.$refs.bundlingPopup.open(); + }, + // 关闭组合套餐弹出层 + closeBundlingPopup() { + this.$refs.bundlingPopup.close(); + }, + imageError() { + this.goodsSkuDetail.sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + bundlingImageError(index, goods_index) { + this.bundling[index].bundling_goods[goods_index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + fenxiao() { + this.$refs.fenxiaoPopup.show() + }, + toGoodsDetail(item) { + this.$util.redirectTo(this.goodsRoute, { + sku_id: item + }); + }, + toComoDetail(id) { + this.$util.redirectTo('/pages_promotion/bundling/detail', { + bl_id: id + }); + }, + /** + * 获取分享图 + */ + getShareImg() { + let posterParams = { + goods_id: this.goodsId + }; + this.$api.sendRequest({ + url: '/api/goods/shareimg', + data: { + qrcode_param: JSON.stringify(posterParams) + }, + success: res => { + if (res.code == 0) this.shareImg = res.data.path + '?no=' + parseInt((new Date()).getTime() / 1000); + } + }) + }, + /** + * 金额格式化输出 + * @param {Object} money + */ + decimalPointFormat(money) { + if (isNaN(parseFloat(money))) return money; + let arr = money.toString().split("."); + let arr1 = arr[1].split("").reverse(); + let arr2 = []; + arr1.forEach((item, index) => { + if (item > 1) { + arr2 = arr1.splice(index); + } + }); + let str = arr2.length ? (arr[0] + "." + arr2.reverse().join("")) : arr[0]; + return str; + } + } +} \ No newline at end of file diff --git a/pages/goods/public/js/list.js b/pages/goods/public/js/list.js new file mode 100644 index 0000000..e861076 --- /dev/null +++ b/pages/goods/public/js/list.js @@ -0,0 +1,467 @@ +export default { + data() { + return { + listStyle: '', + loadingType: 'loading', //加载更多状态 + orderType: '', + priceOrder: 'desc', //1 价格从低到高 2价格从高到低 + categoryList: [], //排序类型 + goodsList: [], + order: '', + sort: 'desc', + showScreen: false, + keyword: '', + categoryId: 0, + minPrice: '', + maxPrice: '', + isFreeShipping: false, //是否免邮 + isIphoneX: false, + coupon: 0, + emptyShow: false, + isList: true, //列表样式 + //分享所需标题 + share_title: '', + //搜索到多少件商品 + count: 0, + //当前分类名称 + category_title: '', + //优惠券数据 + coupon_name: '', + //列表瀑布流数据 + listHeight: [], + listPosition: [], + debounce: null, + brandId: 0, + brandList: [], //品牌筛选项 + config: { + fontWeight: false, + padding: 0, + cartEvent: "detail", + text: "购买", + textColor: "#FFFFFF", + theme: "default", + aroundRadius: 25, + control: true, + bgColor: "#FF6A00", + style: "button", + iconDiy: { + iconType: "icon", + icon: "", + style: { + fontSize: "60", + iconBgColor: [], + iconBgColorDeg: 0, + iconBgImg: "", + bgRadius: 0, + iconColor: [ + "#000000" + ], + iconColorDeg: 0 + } + } + }, + + langstatus:0, + lang:uni.getStorageSync('lang') + } + }, + + onLoad(options) { + + this.$api.sendRequest({ + url: '/api/lucky/status', + data: {}, + success: res => { + console.log(res) + this.langstatus = res.status + if(this.langstatus == 1){ + // this.$langConfig.refresh(); + uni.setNavigationBarTitle({ + title:uni.getStorageSync('lang') == 'en-us'?'Goods List':'商品列表' + }) + } + } + }); + + this.categoryId = options.category_id || 0; + this.keyword = options.keyword || ''; + this.coupon = options.coupon || 0; + this.goods_id_arr = options.goods_id_arr || 0; + this.brandId = options.brand_id || 0; + + this.loadCategoryList(this.categoryId); + this.getBrandList(); + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + //小程序分享接收source_member + if (options.source_member) { + uni.setStorageSync('source_member', options.source_member); + } + // 小程序扫码进入,接收source_member + if (options.scene) { + var sceneParams = decodeURIComponent(options.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1]; + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1); + }); + } + } + + uni.onWindowResize(res => { + if (this.debounce) clearTimeout(this.debounce); + this.waterfallflow(0); + }) + }, + onShow() { + //记录分享关系 + if (this.storeToken && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + }, + /** + * 转发分享 + */ + onShareAppMessage(res) { + var title = '搜索到' + this.count + '件“' + this.keyword + this.category_title + this.coupon_name + '”相关的优质商品'; + let route = this.$util.getCurrentShareRoute(this.memberInfo ? this.memberInfo.member_id : 0); + var path = route.path; + return { + title: title, + path: path, + success: res => { + }, + fail: res => { + } + }; + }, + // 分享到微信朋友圈 + onShareTimeline() { + var title = '搜索到' + this.count + '件“' + this.keyword + this.category_title + this.coupon_name + '”相关的优质商品'; + let route = this.$util.getCurrentShareRoute(this.memberInfo ? this.memberInfo.member_id : 0); + var query = route.query; + return { + title: title, + query: query, + imageUrl: '' + }; + }, + methods: { + /** + * 获取优惠券数据 + */ + couponInfo(id) { + return new Promise(resolve => { + this.$api.sendRequest({ + url: '/coupon/api/coupon/typeinfo', + data: { + coupon_type_id: id + }, + success: res => { + if (res.code >= 0) { + resolve(res.data.coupon_name); + } + } + }); + }) + }, + /** + * 获取分类名称 + */ + share_select(data, id) { + return new Promise((resolve) => { + data.forEach((item) => { + if (item.category_id == id) { + resolve(item.category_name) + } + if (item.child_list && item.child_list.length > 0) { + item.child_list.forEach((v) => { + if (v.category_id == id) { + resolve(v.category_name) + } + if (v.child_list && v.child_list.length > 0) { + v.forEach((m) => { + if (m.category_id == id) { + resolve(m.category_name) + } + }) + + } + }) + } + }) + }) + }, + //加载分类 + loadCategoryList(fid, sid) { + this.$api.sendRequest({ + url: '/api/goodscategory/tree', + data: {}, + success: res => { + if (res.data != null) { + this.categoryList = res.data + } + } + }); + }, + getGoodsList(mescroll) { + this.$api.sendRequest({ + url: '/api/goodssku/page', + data: { + page: mescroll.num, + page_size: mescroll.size, + keyword: this.keyword, + category_id: this.categoryId, + brand_id: this.brandId, + min_price: this.minPrice, + max_price: this.maxPrice, + is_free_shipping: (this.isFreeShipping ? 1 : 0), + order: this.order, + sort: this.sort, + coupon: this.coupon, + goods_id_arr: this.goods_id_arr + }, + success: res => { + let newArr = [] + let msg = res.message; + if (res.code == 0 && res.data) { + this.count = res.data.count; + if (res.data.page_count == 0) { + this.emptyShow = true + } + newArr = res.data.list; + newArr = newArr.map(item => { + item.id = this.genNonDuplicate(); + return item; + }); + } else { + this.$util.showToast({ + title: msg + }) + } + this.category_title = ''; + this.coupon_name = ''; + if (res.data.config) this.config = res.data.config; + if (this.categoryId) { + this.share_select(this.categoryList, this.categoryId).then(resolve => { + this.category_title = resolve + }); + } + if (this.coupon) { + this.couponInfo(this.coupon).then(resolve => { + this.coupon_name = resolve + }); + } + mescroll.endSuccess(newArr.length); + //设置列表数据 + if (mescroll.num == 1) this.goodsList = []; //如果是第一页需手动制空列表 + this.goodsList = this.goodsList.concat(newArr); //追加新数据 + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + + this.waterfallflow((mescroll.num - 1) * 10); + }, + fail: res => { + //联网失败的回调 + mescroll.endErr(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + changeListStyle() { + this.isList = !this.isList; + this.waterfallflow(0); + }, + //筛选点击 + sortTabClick(tag) { + if (tag == 'sale_num') { + this.order = 'sale_num'; + this.sort = 'desc'; + } else if (tag == 'discount_price') { + this.order = 'discount_price'; + this.sort = 'desc'; + } else if (tag == 'screen') { + //筛选 + this.showScreen = true; + return; + } else { + this.order = ''; + this.sort = ''; + } + + if (this.orderType === tag && tag !== 'discount_price') return; + + this.orderType = tag; + if (tag === 'discount_price') { + this.priceOrder = this.priceOrder === 'asc' ? 'desc' : 'asc'; + this.sort = this.priceOrder; + } else { + this.priceOrder = ''; + } + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + }, + //商品详情 + toDetail(item) { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: item.goods_id + }); + }, + search() { + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + }, + selectedCategory(categoryId) { + this.categoryId = categoryId; + }, + screenData() { + if (this.minPrice != '' || this.maxPrice != '') { + // if (!Number(this.minPrice) && this.minPrice) { + // this.$util.showToast({ + // title: '请输入最低价' + // }); + // return; + // } + if (!Number(this.maxPrice) && this.maxPrice) { + this.$util.showToast({ + title: '请输入最高价' + }); + return; + } + if (Number(this.minPrice) < 0 || Number(this.maxPrice) < 0) { + this.$util.showToast({ + title: '筛选价格不能小于0' + }); + return; + } + if (this.minPrice != '' && Number(this.minPrice) > Number(this.maxPrice) && this.maxPrice) { + + this.$util.showToast({ + title: '最低价不能大于最高价' + }); + return; + } + if (this.maxPrice != '' && Number(this.maxPrice) < Number(this.minPrice)) { + this.$util.showToast({ + title: '最高价不能小于最低价' + }); + return; + } + } + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + this.showScreen = false; + }, + //重置数据 + resetData() { + this.categoryId = 0 + this.minPrice = '' + this.maxPrice = '' + this.isFreeShipping = false + }, + goodsImg(imgStr) { + let imgs = imgStr.split(','); + return imgs[0] ? this.$util.img(imgs[0], { + size: 'mid' + }) : this.$util.getDefaultImage().goods; + }, + imgError(index) { + this.goodsList[index].goods_image = this.$util.getDefaultImage().goods; + }, + showPrice(data) { + let price = data.discount_price; + if (data.member_price && parseFloat(data.member_price) < parseFloat(price)) price = data.member_price; + return price; + }, + showMarketPrice(item) { + if (item.market_price_show) { + let price = this.showPrice(item); + if (item.market_price > 0) { + return item.market_price; + } else if (parseFloat(item.price) > parseFloat(price)) { + return item.price; + } + } + return ''; + }, + goodsTag(data) { + return data.label_name || ''; + }, + /** + * 瀑布流 + */ + waterfallflow(start = 0) { + if (!this.isList) { + //页面渲染完成后的事件 + this.$nextTick(() => { + setTimeout(() => { + let listHeight = []; + let listPosition = []; + if (start != 0) { + listHeight = this.listHeight; + listPosition = this.listPosition; + } + let column = 2; + const query = uni.createSelectorQuery().in(this); + query.selectAll('.double-column .goods-item').boundingClientRect(data => { + for (let i = start; i < data.length; i++) { + if (i < column) { + let position = {}; + position.top = uni.upx2px(20) + 'px'; + if (i % column == 0) { + position.left = data[i].width * i + "px"; + } else { + position.left = data[i].width * i + (i % column * uni + .upx2px(30)) + "px"; + } + listPosition[i] = position; + listHeight[i] = data[i].height + uni.upx2px(20); + } else { + let minHeight = Math.min(...listHeight); // 找到第一列的最小高度 + let minIndex = listHeight.findIndex(item => item === minHeight) // 找到最小高度的索引 + //设置当前子元素项的位置 + let position = {}; + position.top = minHeight + uni.upx2px(20) + "px"; + position.left = listPosition[minIndex].left; + listPosition[i] = position; + //重新定义数组最小项的高度 进行累加 + listHeight[minIndex] += data[i].height + uni.upx2px(20); + } + } + this.listHeight = listHeight; + this.listPosition = listPosition; + }).exec(); + }, 50) + }) + } + }, + getBrandList() { + var data = { + page: 1, + page_size: 0 + }; + this.$api.sendRequest({ + url: '/api/goodsbrand/page', + data: data, + success: res => { + if (res.code == 0 && res.data) { + let data = res.data; + this.brandList = data.list; + } + } + }); + }, + /** + * 添加购物车回调 + */ + addCart(id) { + }, + genNonDuplicate(len = 6) { + return Number(Math.random().toString().substr(3, len) + Date.now()).toString(36); + } + } +} \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..88f5589 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,226 @@ + + + + + + + + + + {{ siteInfo.site_name }} + {{ followOfficialAccount.welcomeMsg }} + + + 关注公众号 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 关注了解更多 + + + + + + + + + + 我知道了 + + + + + + + + 请确认门店 + + + {{ currentPosition }} + + + 重新定位 + + + + 当前门店 + {{ nearestStore.store_name }} + {{ nearestStore.show_address }} + + + {{ nearestStore.distance > 1 ? nearestStore.distance + 'km' : nearestStore.distance * 1000 + 'm' }} + + + 确认进入 + + 选择其他门店 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/index/public/css/index.scss b/pages/index/public/css/index.scss new file mode 100644 index 0000000..1a9f437 --- /dev/null +++ b/pages/index/public/css/index.scss @@ -0,0 +1,88 @@ +.site-info-box { + padding: 20rpx 20rpx; + display: flex; + justify-content: space-between; + align-items: center; + background-color: rgba(0, 0, 0, 0.6); + position: fixed; + width: calc(100% - 40rpx); + z-index: 999; + .site-info { + display: flex; + align-items: center; + .img-box { + width: 70rpx; + height: 70rpx; + line-height: 70rpx; + border-radius: 50%; + overflow: hidden; + image { + width: 100%; + height: 100%; + } + } + .info-box { + display: flex; + flex-direction: column; + color: #fff; + justify-content: space-between; + margin-left: 20rpx; + text-align: left; + width: 400rpx; + text { + display: -webkit-box; + font-size: $font-size-tag; + overflow: hidden; + opacity: 0.8; + white-space: normal; + text-overflow: ellipsis; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + line-height: 1.4; + &:nth-child(1) { + width: 300rpx; + font-weight: bold; + opacity: 1; + } + } + } + } + .dite-button { + background-color: #fff; + width: 180rpx; + height: 56rpx; + line-height: 56rpx; + text-align: center; + border-radius: 66rpx; + color: $base-color; + font-size: $font-size-tag; + } +} + +.official-accounts-inner /deep/ .uni-popup__wrapper.uni-custom.center .uni-popup__wrapper-box { + overflow: inherit; +} +.official-accounts-wrap { + display: flex; + align-items: center; + flex-direction: column; + padding: 30rpx; + .content { + width: 300rpx; + height: 300rpx; + } + .desc { + margin-top: 10rpx; + font-size: $font-size-tag; + color: $color-tip; + } + .close { + position: absolute; + left: 50%; + bottom: -130rpx; + transform: translateX(-50%); + z-index: 99; + color: #fff; + font-size: 70rpx; + } +} \ No newline at end of file diff --git a/pages/index/public/js/index.js b/pages/index/public/js/index.js new file mode 100644 index 0000000..8432be7 --- /dev/null +++ b/pages/index/public/js/index.js @@ -0,0 +1,41 @@ +export default { + data() { + return { + wechatQrcode: '', // 公众号二维码 + diyRoute: '/pages/index/index' + }; + }, + onLoad(option) { + // #ifdef H5 + // H5地图选择位置回调数据 + if (option.module && option.module == 'locationPicker') { + option.name = ''; // 清空地址 + } + // #endif + this.name = option.name || 'DIY_VIEW_INDEX'; // 根据店铺运营模式,打开平台(shop)或者连锁门店(stroe)页面,接口会自行判断 + + }, + onShow() { + this.getFollowQrcode(); + }, + methods: { + // 关注公众号 + getFollowQrcode() { + if (!this.$util.isWeiXin()) return; + this.$api.sendRequest({ + url: '/wechat/api/wechat/followqrcode', + success: res => { + if (res.code >= 0 && res.data) { + this.wechatQrcode = res.data.qrcode; + } + } + }); + }, + officialAccountsOpen() { + this.$refs.officialAccountsPopup.open(); + }, + officialAccountsClose() { + this.$refs.officialAccountsPopup.close(); + }, + } +} \ No newline at end of file diff --git a/pages/member/index.vue b/pages/member/index.vue new file mode 100644 index 0000000..9a1531c --- /dev/null +++ b/pages/member/index.vue @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + 隐私协议 + 注册协议 + + + + + + + + + + + + + + + + + + + + + + + + 我知道了 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/member/public/js/index.js b/pages/member/public/js/index.js new file mode 100644 index 0000000..44f9916 --- /dev/null +++ b/pages/member/public/js/index.js @@ -0,0 +1,95 @@ +export default { + data() { + return { + diyRoute: '/pages/member/index' + }; + }, + computed: {}, + watch: { + storeToken: function(nVal, oVal) { + if (nVal) { + this.initData(); + if (uni.getStorageSync('source_member')) this.$util.onSourceMember(uni.getStorageSync( + 'source_member')); + } + } + }, + onLoad(data) { + //刷新多语言 + this.$langConfig.refresh(); + + uni.hideTabBar(); + this.name = 'DIY_VIEW_MEMBER_INDEX'; + if (data.code) { + this.$api.sendRequest({ + url: '/wechat/api/wechat/authcodetoopenid', + data: { + code: data.code + }, + success: res => { + if (res.code >= 0) { + if (res.data.userinfo.nickName) this.modifyNickname(res.data.userinfo.nickName); + if (res.data.userinfo.avatarUrl) this.modifyHeadimg(res.data.userinfo + .avatarUrl); + } + } + }); + } + }, + onShow() { + + // 刷新会员数据 + if (this.$refs.diyGroup) { + if (this.$refs.diyGroup.$refs.diyMemberIndex) this.$refs.diyGroup.$refs.diyMemberIndex[0].init(); + if (this.$refs.diyGroup.$refs.diyMemberMyOrder) this.$refs.diyGroup.$refs.diyMemberMyOrder[0].getOrderNum(); + } + }, + methods: { + /** + * 查询会员信息 + */ + initData() { + if (this.storeToken) { + this.$nextTick(() => { + this.$refs.nsNewGift.init(); + this.$refs.birthdayGift.init(); + }); + } + }, + /** + * 修改昵称 + * @param {Object} nickName + */ + modifyNickname(nickName) { + this.$api.sendRequest({ + url: '/api/member/modifynickname', + data: { + nickname: nickName + }, + success: res => { + if (res.code == 0) { + this.memberInfo.nickname = nickName; + this.$store.commit('setMemberInfo', this.memberInfo); + } + } + }); + }, + /** + * 修改头像 + */ + modifyHeadimg(headimg) { + this.$api.sendRequest({ + url: '/api/member/modifyheadimg', + data: { + headimg: headimg + }, + success: res => { + if (res.code == 0) { + this.memberInfo.headimg = headimg; + this.$store.commit('setMemberInfo', this.memberInfo); + } + } + }); + }, + }, +}; \ No newline at end of file diff --git a/pages/order/detail.vue b/pages/order/detail.vue new file mode 100644 index 0000000..ec9f273 --- /dev/null +++ b/pages/order/detail.vue @@ -0,0 +1,824 @@ + + + + + + + + + + {{ orderData.order_status_name }} + ({{ orderData.promotion_status_name }}) + + + 预计{{ $util.timeStampTurnTime(orderData.predict_delivery_time, true) }}日后发货 + + 订单关闭原因:{{ orderData.close_cause }} + + + + 剩余时间: + + + + + + + + + + + + {{ orderData.name }} {{ orderData.mobile }} + + + 收货地址:{{ orderData.full_address }} {{ orderData.address }} + + + + + 送达时间: + {{ orderData.buyer_ask_delivery_time }} + + + + 配送员: + {{ orderData.package_list.deliverer }} + + + 外卖电话: + {{ orderData.package_list.deliverer_mobile }} + + + + + + + + + + + + + + + + {{ orderData.delivery_store_name }} + + + + + 营业时间:{{ orderData.delivery_store_info.open_date }} + 地址:{{ orderData.delivery_store_info.full_address }} + + + + + + 当前无自提门店 + + + + + 姓名 + + + + 预留手机 + + + + 提货时间 + + + + + + + + + 提货码: + {{ orderData.delivery_code }} + + 复制 + + + + + + + + + + + + + + + + + + + {{ goodsItem.sku_name }} + + + + {{ x.spec_value_name }} + {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} + + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsItem.price).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsItem.price).toFixed(2).split('.')[1] }} + + + + + + {{ goodsItem.num }} + + + + + 次卡抵扣 + + -{{ $lang('common.currencySymbol') }} + {{ parseFloat(goodsItem.card_promotion_money).toFixed(2).split('.')[0] }} + .{{ parseFloat(goodsItem.card_promotion_money).toFixed(2).split('.')[1] }} + + + + + + + + {{ item.value.title }}: + + + + + + + {{ item.val }} + 复制 + + + + + + + + + {{ orderData.order_status == 10 ? '申请售后' : '申请退款' }} + + + + + {{ orderData.order_status == 10 ? '查看售后' : '查看退款' }} + + + + + + + + + + 订单类型: + + {{ orderData.order_type_name }} + + + + 订单编号: + + {{ orderData.order_no }} + 复制 + + + + 订单交易号: + + {{ orderData.out_trade_no }} + + + + 创建时间: + + {{ $util.timeStampTurnTime(orderData.create_time) }} + + + + 关闭时间: + + {{ $util.timeStampTurnTime(orderData.close_time) }} + + + + + + 支付方式: + + {{ orderData.pay_type_name }} + + + + 支付时间: + + {{ $util.timeStampTurnTime(orderData.pay_time) }} + + + + + 配送方式: + + {{ orderData.delivery_type_name }} + + + + 买家留言: + + {{ orderData.buyer_message }} + + + + 活动优惠: + + {{ orderData.promotion_type_name }} + + + + + + 发票类型: + + {{ orderData.invoice_type == 1 ? '纸质发票' : '电子发票' }} + + + + 发票抬头类型: + + {{ orderData.invoice_title_type == 1 ? '个人' : '企业' }} + + + + 发票抬头: + + {{ orderData.invoice_title }} + + + + + 发票内容: + + {{ orderData.invoice_content }} + + + + 发票邮寄地址: + + {{ orderData.invoice_full_address }} + + + + 发票接收邮件: + + {{ orderData.invoice_email }} + + + + + + + {{ item.value.title }}: + + + + + + + {{ item.val }} + 复制 + + + + + + + 我的卡包: + 查看 + + + + + + + + + + + + 请将条形码或二维码出示给核销员 + + + + {{ orderData.virtual_code }} + 复制 + + + + + 核销信息 + + 核销次数 + + + 剩余{{ orderData.virtual_goods.verify_total_count - orderData.virtual_goods.verify_use_num }}次/共{{ orderData.virtual_goods.verify_total_count }}次 + + + + + 有效期 + + {{ $util.timeStampTurnTime(orderData.virtual_goods.expire_time) }} + 永久有效 + + + + + + 核销记录 + + + + 核销人 + + {{ item.verifier_name }} + + + + 核销时间 + + {{ $util.timeStampTurnTime(item.verify_time) }} + + + + + 暂无核销记录 + + + + + + 卡密信息 + + + 卡号: + + {{ item.card_info.cardno }} + 复制 + + + + 密码: + + {{ item.card_info.password }} + 复制 + + + + + + + + + + + + 请将条形码或二维码出示给核销员 + + + + {{ orderData.virtual_code }} + 复制 + + + + + 核销信息 + + 核销次数 + + + 剩余{{ orderData.virtual_goods.verify_total_count - orderData.virtual_goods.verify_use_num }}次/共{{ orderData.virtual_goods.verify_total_count }}次 + + + + + 有效期 + + {{ $util.timeStampTurnTime(orderData.virtual_goods.expire_time) }} + 永久有效 + + + + + + 核销记录 + + + + 核销人 + + {{ item.verifier_name }} + + + + 核销时间 + + {{ $util.timeStampTurnTime(item.verify_time) }} + + + + + 暂无核销记录 + + + + + + 商品金额 + + + {{ $lang('common.currencySymbol') }} + {{ orderData.goods_money }} + + + + + 运费 + + + {{ $lang('common.currencySymbol') }} + {{ orderData.delivery_money }} + + + + + 会员卡 + + + {{ $lang('common.currencySymbol') }} + {{ orderData.member_card_money }} + + + + + + 税费 + ({{ orderData.invoice_rate }}%) + + + + + + {{ $lang('common.currencySymbol') }} + {{ orderData.invoice_money }} + + + + + 发票邮寄费 + + + + + {{ $lang('common.currencySymbol') }} + {{ orderData.invoice_delivery_money }} + + + + + 订单调整 + + + - + + + {{ $lang('common.currencySymbol') }} + {{ orderData.adjust_money | abs }} + + + + + 优惠 + + + - + {{ $lang('common.currencySymbol') }} + {{ orderData.promotion_money }} + + + + + 优惠券 + + + - + {{ $lang('common.currencySymbol') }} + {{ orderData.coupon_money }} + + + + + 使用余额 + + + - + {{ $lang('common.currencySymbol') }} + {{ orderData.balance_money }} + + + + + 积分抵扣 + + + - + {{ $lang('common.currencySymbol') }} + {{ orderData.point_money }} + + + + + + 实付金额: + + {{ $lang('common.currencySymbol') }} + {{ orderData.order_money }} + + + + + + + 评价 + 追评 + + + + {{ operationItem.title }} + + + + + + + 评价 + 追评 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/order/detail_local_delivery.vue b/pages/order/detail_local_delivery.vue new file mode 100644 index 0000000..005f434 --- /dev/null +++ b/pages/order/detail_local_delivery.vue @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/pages/order/detail_pickup.vue b/pages/order/detail_pickup.vue new file mode 100644 index 0000000..005f434 --- /dev/null +++ b/pages/order/detail_pickup.vue @@ -0,0 +1,22 @@ + + + + + + + + + + diff --git a/pages/order/detail_point.vue b/pages/order/detail_point.vue new file mode 100644 index 0000000..75b21f1 --- /dev/null +++ b/pages/order/detail_point.vue @@ -0,0 +1,304 @@ + + + + + + + + + + + + {{ orderData.order_status == 0 ? '待支付' : orderData.order_status == 1 ? '已完成' : orderData.order_status == -1 ? '已关闭' : '' }} + + + + + + + + + + + + + + + {{ orderData.exchange_name }} + + + + + {{ orderData.point }}积分 + + + + {{ $lang('common.currencySymbol') }} + {{ orderData.price }} + + + + + + + + {{ orderData.num }} + + + + + + + + + + + + + + 订单编号: + + {{ orderData.order_no }} + 复制 + + + + 订单交易号: + + {{ orderData.out_trade_no }} + + + + 创建时间: + + {{ $util.timeStampTurnTime(orderData.create_time) }} + + + + 关闭时间: + + {{ $util.timeStampTurnTime(orderData.close_time) }} + + + + + + + + + + 使用积分 + + + {{ orderData.point }} + + + + + 运费 + + + {{ $lang('common.currencySymbol') }} + {{ orderData.delivery_price }} + + + + + + 实付金额: + + {{ $lang('common.currencySymbol') }} + {{ orderData.order_money }} + + + + + + 关闭 + 支付 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/order/list.vue b/pages/order/list.vue new file mode 100644 index 0000000..db0ca2f --- /dev/null +++ b/pages/order/list.vue @@ -0,0 +1,453 @@ + + + + + + + + + + + + + {{ statusItem.name }} + + + + + + + + + + + + + + + + 订单号:{{ orderItem.order_no }} + {{ orderItem.order_type_name }} + {{ orderItem.order_status_name }} + + + + + + + + + + {{ goodsItem.goods_name }} + {{ goodsItem.sku_name }} + + + + {{ x.spec_value_name }} + {{ i < goodsItem.sku_spec_format.length - 1 ? '; ' : '' }} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 共{{ orderItem.goods_num }}件商品 + + 实付款: + {{ $lang('common.currencySymbol') }}{{ orderItem.order_money }} + + + + + + + 剩余时间: + + + + 评价 + 追评 + + + {{ operationItem.title }} + + + + + 评价 + 追评 + + + + 查看详情 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages/order/payment.vue b/pages/order/payment.vue new file mode 100644 index 0000000..d4610f4 --- /dev/null +++ b/pages/order/payment.vue @@ -0,0 +1,105 @@ + + + + + + + + + + diff --git a/pages/order/public/css/detail.scss b/pages/order/public/css/detail.scss new file mode 100644 index 0000000..a1b1c06 --- /dev/null +++ b/pages/order/public/css/detail.scss @@ -0,0 +1,871 @@ +@mixin flex-row-center { + display: flex; + justify-content: center; + align-items: center; +} + +@mixin wrap { + margin: $margin-updown 24rpx; + padding: 30rpx; + border-radius: 16rpx; + background: #fff; + position: relative; +} +text, +view { + font-size: $font-size-tag; +} +.bottom-safe-area { + padding-bottom: calc(constant(safe-area-inset-bottom) + 10rpx) !important; + padding-bottom: calc(env(safe-area-inset-bottom) + 10rpx) !important; +} + +.align-right { + text-align: right; +} + +.color-text-white { + color: #fff; +} + +.detail-container { + // height: 100vh; + .height-box { + display: block; + padding-bottom: 100rpx; + } + + &.safe-area { + .height-box { + display: block; + padding-bottom: 168rpx; + } + } +} + +.status-wrap { + background-size: 100% 100%; + padding: 40rpx; + height: 180rpx; + position: relative; + + image { + width: 104rpx; + height: 86rpx; + margin-right: 20rpx; + margin-top: 20rpx; + } + + .order-status-left { + display: flex; + } + + .order-time { + position: absolute; + top: 70rpx; + right: 30rpx; + display: flex; + align-items: center; + font-size: 10px; + color: #fff; + + image { + width: 26rpx; + height: 26rpx; + margin-right: 6rpx; + } + } + + & > view { + text-align: center; + color: #fff; + } + + .desc { + margin-left: 20rpx; + } + + .price { + font-weight: 600; + } + + .action-group { + text-align: center; + padding-top: 20rpx; + + .action-btn { + line-height: 1; + padding: 16rpx 50rpx; + display: inline-block; + border-radius: $border-radius; + background: #fff; + box-shadow: 0 0 14rpx rgba(158, 158, 158, 0.6); + } + } +} + +/deep/ #action-date .uni-countdown .uni-countdown__number { + border: none !important; + padding: 0 !important; + margin: 0 !important; + background: rgba(0, 0, 0, 0) !important; +} + +.address-wrap { + @include wrap; + min-height: 100rpx; + margin-top: -69rpx; + + .icon { + position: absolute; + top: 20rpx; + margin-right: 20rpx; + + image { + width: 60rpx; + height: 60rpx; + } + + .iconfont { + line-height: 50rpx; + font-size: $font-size-base; + } + .icon-mendian { + font-size: $font-size-toolbar; + } + } + + .address-info { + padding-left: 40rpx; + + .info { + display: flex; + line-height: 1; + color: #333; + } + + .detail { + line-height: 1.3; + color: #333; + margin-top: 20rpx; + } + } + + .store-info { + padding-left: 100rpx; + } + + .cell-more { + position: absolute; + top: 50%; + transform: translateY(-50%); + right: 10rpx; + + .iconfont { + color: #999; + } + } +} + +.pickup-info { + @include wrap; + + .pickup-point-info { + .name { + display: flex; + height: 50rpx; + align-items: flex-end; + margin-bottom: 10px; + + text { + line-height: 1; + &.mark { + font-size: $font-size-activity-tag; + padding: 1px 10rpx; + border: 0.5px solid #ffffff; + border-radius: 4rpx; + margin-left: 10rpx; + } + } + } + + .address, + .time, + .contact { + font-size: $font-size-tag; + line-height: 1; + margin-top: 16rpx; + + .iconfont { + color: #999; + font-size: $font-size-tag; + line-height: 1; + margin-right: 10rpx; + } + } + } + .hr { + border-top: 1px dashed #e5e5e5; + margin: 20rpx 0; + } + + .pickup-code-info { + .info { + text-align: center; + } + + .code { + display: flex; + flex-direction: column; + align-items: center; + image.barcode { + width: 360rpx; + height: auto; + will-change: transform; + margin-top: 20rpx; + } + image.qrcode { + width: 240rpx; + height: auto; + will-change: transform; + margin-top: 50rpx; + } + } + + .copy { + font-size: $font-size-tag; + display: inline-block; + color: #666; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 14rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 0.5px solid #666; + } + } +} + +.virtual-mobile-wrap { + @include wrap; + margin-top: -69rpx; + display: flex; + + view:nth-child(2) { + flex: 1; + text-align: right; + } +} + +.verify-code-wrap { + @include wrap; + + .wrap { + text-align: center; + line-height: 2; + + .copy { + font-size: $font-size-tag; + display: inline-block; + color: #666; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 14rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 0.5px solid #666; + } + + .virtual-code { + font-weight: bold; + } + } + + .hr { + border-top: 1px dashed #e5e5e5; + margin: 20rpx 0; + } + + .code { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + + image.barcode { + width: 400rpx; + margin-top: 10rpx; + } + image.qrcode { + width: 300rpx; + margin-top: 50rpx; + } + + text { + margin-top: 20rpx; + } + } +} + +.verify-info-wrap { + @include wrap; + + .head { + font-size: $font-size-base; + border-bottom: 1px dashed #f7f7f7; + line-height: 1; + padding: 10rpx 0 30rpx 0; + } + + .order-cell { + .tit { + font-size: $font-size-base; + } + + .box text { + font-size: $font-size-base; + font-weight: bold; + } + } + + .record-empty { + text-align: center; + padding-top: 30rpx; + } + + .record-item { + margin-bottom: 40rpx; + + &:last-child { + margin-bottom: 0; + } + } +} + +.carmichael { + .order-cell { + .tit { + font-size: $font-size-base; + } + + .box text { + font-size: $font-size-base; + font-weight: normal; + } + + .copy { + font-size: $font-size-activity-tag; + display: inline-block; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 2rpx solid #d2d2d2; + } + } +} + +.site-wrap { + @include wrap; + padding: 10rpx 30rpx; + + .site-header { + display: flex; + align-items: center; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-base; + } + } + + .site-body { + .goods-item { + padding-top: 20rpx; + border-bottom: 2rpx solid #f7f7f7; + &:last-child { + border-bottom: 0; + } + } + + .goods-wrap { + margin-bottom: 20rpx; + display: flex; + position: relative; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 160rpx; + height: 160rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + display: flex; + flex-direction: column; + justify-content: space-between; + max-width: calc(100% - 180rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + font-weight: bold; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + margin-top: 20rpx; + + .goods-price { + font-weight: 700; + font-size: $font-size-activity-tag; + color: var(--price-color); + } + + .unit { + font-weight: 700; + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + &:last-of-type { + text-align: right; + font-weight: bold; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + + .goods-card { + text-align: right; + } + } + } + + .goods-form { + .tit { + font-size: $font-size-base; + width: 190rpx; + } + + .box { + padding-right: 0; + + text { + font-size: $font-size-base; + word-wrap: break-word; + word-break: break-all; + } + .copy { + font-size: $font-size-activity-tag !important; + display: inline-block; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 20rpx; + border-radius: $border-radius; + border: 2rpx solid #d2d2d2; + float: right; + } + } + } + + .goods-action { + text-align: right; + margin: 20rpx 0; + + navigator { + display: inline-block; + } + + .order-box-btn { + height: 48rpx !important; + line-height: 48rpx !important; + font-size: $font-size-tag !important; + display: inline-block; + background: #fff; + border: 2rpx solid #999; + margin-left: 10rpx; + box-sizing: content-box; + } + } + } +} + +.order-cell { + display: flex; + margin: 20rpx 0; + align-items: center; + background: #fff; + line-height: 40rpx; + + .tit { + text-align: left; + } + + .box { + flex: 1; + padding: 0 20rpx; + line-height: inherit; + + .textarea { + height: 40rpx; + } + } + + .img-box { + display: flex; + flex-wrap: wrap; + + .img { + width: 100rpx; + height: 100rpx; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-right: 30rpx; + margin-bottom: 30rpx; + position: relative; + border-radius: $border-radius; + line-height: 1; + overflow: hidden; + + image { + width: 100%; + } + } + } + + .iconfont { + color: #bbb; + font-size: $font-size-base; + } + + .order-pay { + padding: 0; + + text { + display: inline-block; + margin-left: 6rpx; + } + } +} + +.order-summary { + @include wrap; + + .order-cell { + &:first-child { + margin-top: 0; + } + + .tit { + font-size: $font-size-base; + width: 190rpx; + } + + .box { + display: flex; + align-items: center; + + text { + font-size: $font-size-base; + word-wrap: break-word; + word-break: break-all; + } + } + + .copy { + white-space: nowrap; + font-size: $font-size-activity-tag !important; + display: inline-block; + background: #f7f7f7; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: $border-radius; + border: 2rpx solid #d2d2d2; + } + } + + .hr { + // width: calc(100% - 190rpx); + width: 100%; + height: 2rpx; + background: #f7f7f7; + margin-bottom: 20rpx; + } +} + +.order-money { + @include wrap; + + .order-cell { + .tit { + font-size: $font-size-base; + } + + .box { + font-weight: 600; + padding: 0; + text-align: right; + + text { + font-size: $font-size-base; + font-weight: bold; + } + > text.color-text { + color: var(--price-color); + } + + .operator { + font-size: $font-size-tag; + margin-right: 6rpx; + } + &.align-right { + .color-base-text { + text { + color: var(--price-color); + } + } + } + } + } +} + +.kefu { + @include wrap; + margin: 30rpx 0 10rpx; + border-top: 2rpx solid #f7f7f7; + padding-bottom: 0; + padding-top: 30rpx; + & > view { + @include flex-row-center; + + .iconfont { + font-weight: bold; + margin-right: 10rpx; + font-size: $font-size-base; + line-height: 1; + } + } + + button { + width: 100%; + // position: absolute; + border: none; + z-index: 1; + padding: 0; + margin: 0; + background: none; + height: 50rpx; + line-height: 50rpx; + display: flex; + justify-content: center; + &::after { + border: none !important; + } + .iconfont { + margin-right: 10rpx; + } + } +} + +.fixed-bottom-box { + height: 80rpx; +} +.order-action { + text-align: right; + + .order-box-btn { + margin-right: $margin-both; + margin-left: 0; + font-size: $font-size-tag; + height: 60rpx; + line-height: 60rpx; + box-sizing: content-box; + min-width: 60rpx; + text-align: center; + + &.color-base-bg { + color: var(--btn-text-color); + } + + &:last-child { + margin-right: 0; + } + } +} +.status-name { + view, + text { + font-size: $font-size-toolbar; + color: #fff; + line-height: 1; + margin-top: 40rpx; + text-align: left; + } + + .desc { + font-size: $font-size-tag; + margin: 10rpx 0 0 0; + } +} + +.head-nav { + width: 100%; + height: var(--status-bar-height); +} + +.head-nav.active { + padding-top: 40rpx; +} + +.head-return { + height: 90rpx; + line-height: 90rpx; + color: #fff; + font-weight: 600; + font-size: $font-size-toolbar; + position: relative; + text-align: center; + text { + position: absolute; + top: 50%; + transform: translateY(-50%); + left: 20rpx; + display: inline-block; + margin-right: 10rpx; + font-size: $font-size-toolbar; + } +} + +.store-detail view { + font-size: $font-size-activity-tag; +} + +.store-wrap { + @include wrap; + margin-top: -76rpx; + + .store-info { + display: flex; + align-items: center; + padding-left: 50rpx; + position: relative; + + .icon { + left: 0; + position: absolute; + top: 4rpx; + + .iconfont { + line-height: 50rpx; + font-size: $font-size-base; + } + .icon-mendian { + font-size: $font-size-toolbar; + } + } + + .store-name { + display: flex; + + .name { + flex: 1; + } + } + + .store-info-detail { + flex: 1; + .store-detail view { + font-size: $font-size-goods-tag + 2rpx; + } + & > view:first-of-type { + font-size: $font-size-tag + 2rpx; + } + } + .cell-more { + margin-left: 50rpx; + } + } +} +.pick-block { + &.first-pick-block { + border-top: 2rpx solid #f1f1f1; + } + display: flex; + align-items: center; + margin-top: 20rpx; + padding-top: 20rpx; + input, + .last-child { + flex: 1; + text-align: right; + font-size: $font-size-tag; + } +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; + margin-bottom: 10rpx; +} +.goods-spec { + color: #838383; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; +} + +.fixed-bottom { + width: 100%; + position: fixed; + left: 0; + bottom: 0; + padding: 10rpx 30rpx; + box-sizing: border-box; + background: #ffffff; + z-index: 5; +} + +.order-cell.order-form { + .box { + display: block; + padding-right: 0; + .copy { + margin-left: 20rpx; + float: right; + } + } +} diff --git a/pages/order/public/css/list.scss b/pages/order/public/css/list.scss new file mode 100644 index 0000000..f90c89f --- /dev/null +++ b/pages/order/public/css/list.scss @@ -0,0 +1,410 @@ +$margin-both: 24rpx; + +.order-container { + width: 100vw; +} + +.align-right { + text-align: right; +} + +.cate-search { + width: calc(100% - 48rpx); + background: #ffffff; + padding: 10rpx 24rpx 0 24rpx; + /* #ifdef H5 */ + padding-top: 30rpx; + /* #endif */ + position: relative; + z-index: 998; + + input { + font-size: $font-size-base; + height: 76rpx; + padding: 0 25rpx 0 30rpx; + line-height: 60rpx; + width: calc(100% - 120rpx); + background: none; + } + + text { + font-size: 32rpx; + color: $color-tip; + width: 120rpx; + text-align: center; + } + + .search-box { + width: 100%; + background: $color-bg; + display: flex; + justify-content: center; + align-items: center; + border-radius: 100rpx; + } +} + +.order-nav { + width: 100vw; + height: 80rpx; + flex-direction: row; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + background: #fff; + display: flex; + position: fixed; + left: 0; + z-index: 998; + justify-content: space-around; + border-radius: 0px 0px 24rpx 24rpx; + + .uni-tab-item { + width: 120rpx; + text-align: center; + } + + .uni-tab-item-title { + display: inline-block; + height: 80rpx; + line-height: 80rpx; + border-bottom: 1px solid #fff; + flex-wrap: nowrap; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + text-align: center; + font-size: 30rpx; + position: relative; + } + + .uni-tab-item-title-active::after { + content: ' '; + display: block; + position: absolute; + left: 0; + bottom: 0; + width: 100%; + height: 6rpx; + background: linear-gradient(270deg, var(--base-color-light-9) 0%, var(--base-color) 100%); + } + + ::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; + } +} + +.order-item { + margin: $margin-updown $margin-both; + border-radius: 12rpx; + background: #fff; + position: relative; + + .order-header { + display: flex; + align-items: center; + position: relative; + padding: $padding 24rpx 26rpx 24rpx; + + &.waitpay { + padding-left: 70rpx; + + .icon-yuan_checked, + .icon-yuan_checkbox { + font-size: $font-size-toolbar; + position: absolute; + top: 48%; + left: 20rpx; + transform: translateY(-50%); + } + .icon-yuan_checkbox { + color: $color-tip; + } + } + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + font-size: $font-size-base; + } + + .order-no { + font-size: 26rpx; + } + .order-type-name { + font-size: 26rpx; + margin-left: 10rpx; + } + + .status-name { + flex: 1; + text-align: right; + font-size: 26rpx; + font-weight: 600; + } + } + + .order-body { + .goods-wrap { + display: flex; + position: relative; + padding: 0 24rpx 30rpx 24rpx; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 160rpx; + height: 160rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 180rpx); + display: flex; + flex-direction: column; + + .pro-info { + flex: 1; + } + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + color: $color-title; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + margin-top: 14rpx; + + .goods-price { + font-size: $font-size-tag; + color: var(--price-color); + flex: 1; + font-weight: bold; + } + .goods-num { + font-size: $font-size-tag; + color: $color-tip; + flex: 1; + text-align: right; + line-height: 1; + + .iconfont { + font-size: $font-size-tag; + } + } + .goods-type { + font-size: $font-size-tag; + } + + .unit { + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + display: flex; + flex-direction: column; + + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + + .goods-action { + text-align: right; + + .action-btn { + line-height: 1; + padding: 14rpx 20rpx; + color: $color-title; + display: inline-block; + border-radius: $border-radius; + background: #fff; + border: 2rpx solid #999; + font-size: $font-size-tag; + margin-left: 10rpx; + } + } + } + } + + .multi-order-goods { + width: calc(100vw - 96rpx); + white-space: nowrap; + margin: 0 24rpx 30rpx 24rpx !important; + position: relative; + + .scroll-view { + width: 100%; + } + + .goods-wrap { + padding: 0; + } + + .goods-img { + min-width: 160rpx; + } + + .shade { + position: absolute; + z-index: 5; + height: 100%; + width: 44rpx; + right: 0; + top: 0; + + image { + width: 100%; + height: 100%; + } + } + } + } + + .order-footer { + .order-base-info { + .total { + padding: $padding; + font-size: $font-size-tag; + background: rgba(248, 248, 248, 0.5); + display: flex; + margin: 0 24rpx; + + & > text { + flex: 1; + line-height: 1; + margin-left: 10rpx; + } + } + + .order-type { + padding-top: 20rpx; + flex: 0.5; + + & > text { + line-height: 1; + } + } + } + + .order-action { + text-align: right; + padding: 30rpx 24rpx; + position: relative; + + .order-time { + position: absolute; + top: 35rpx; + left: 30rpx; + display: flex; + align-items: center; + font-size: 10px; + color: #b5b6b9; + + image { + width: 26rpx; + height: 26rpx; + margin-right: 6rpx; + } + } + + .action-btn { + line-height: 1; + padding: 20rpx 26rpx; + color: #333; + display: inline-block; + border-radius: $border-radius; + background: #fff; + border: 2rpx solid #999; + font-size: $font-size-tag; + margin-left: 10rpx; + } + } + } +} + +/deep/ #action-date .uni-countdown .uni-countdown__number { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} + +.order-batch-action { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + .action-btn { + height: 68rpx; + line-height: 68rpx; + background: #fff; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 16rpx 20rpx 16rpx 0; + border-radius: $border-radius; + border: 1px solid #ffffff; + + &.white { + height: 68rpx; + line-height: 68rpx; + color: #333; + border: 1px solid #999; + background: #fff; + } + } +} +.sku { + display: flex; + line-height: 1; + margin-top: 10rpx; +} +.goods-spec { + color: $color-tip; + font-size: $font-size-goods-tag; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; +} diff --git a/pages/order/public/js/orderMethod.js b/pages/order/public/js/orderMethod.js new file mode 100644 index 0000000..b741e30 --- /dev/null +++ b/pages/order/public/js/orderMethod.js @@ -0,0 +1,262 @@ +export default { + methods: { + /** + * 订单支付 + * @param {Object} orderData + */ + orderPay(orderData) { + if (orderData.adjust_money == 0) { + this.pay(); + } else { + uni.showModal({ + title: '提示', + content: '商家已将支付金额调整为' + orderData.pay_money + '元,是否继续支付?', + success: res => { + if (res.confirm) { + this.pay(); + } + } + }) + } + }, + pay() { + this.$api.sendRequest({ + url: '/api/order/pay', + data: { + order_ids: this.orderData.order_id + }, + success: res => { + if (res.code >= 0) { + this.$refs.choosePaymentPopup.getPayInfo(res.data); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }) + }, + /** + * 关闭订单 + * @param order_id + * @param callback + */ + orderClose(order_id, callback) { + uni.showModal({ + title: '提示', + content: '您确定要关闭该订单吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/close', + data: { + order_id + }, + success: res => { + if (res.code >= 0) { + typeof callback == 'function' && callback(); + } else { + this.$util.showToast({ + title: '当前订单可能存在拼团,维权等操作,' + res.message + + '不可以关闭哦!', + duration: 2000 + }) + } + } + }) + } + } + }) + }, + /** + * 订单收货 + * @param orderData + * @param callback + */ + orderDelivery(orderData, callback) { + // 如果不在微信小程序中 + // #ifndef MP-WEIXIN + uni.showModal({ + title: '提示', + content: '您确定已经收到货物了吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/takedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + } + }) + // #endif + + // #ifdef MP-WEIXIN + // 检测微信小程序是否已开通发货信息管理服务 + if (orderData.pay_type == 'wechatpay' && wx.openBusinessView && orderData.is_trade_managed) { + wx.openBusinessView({ + businessType: 'weappOrderConfirm', + extraData: { + merchant_id: orderData.pay_config.mch_id, + merchant_trade_no: orderData.out_trade_no + }, + success: res => { + if (res.extraData.status == 'success') { + this.$api.sendRequest({ + url: '/api/order/takedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } else { + this.$api.sendRequest({ + url: '/api/order/takedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + }, + fail: function(res) { + console.log('fail', res); + } + }) + } else { + uni.showModal({ + title: '提示', + content: '您确定已经收到货物了吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/takedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + } + }) + } + // #endif + }, + /** + * 订单虚拟商品收货 + * @param orderData + * @param callback + */ + orderVirtualDelivery(orderData, callback) { + // 如果不在微信小程序中 + // #ifndef MP-WEIXIN + uni.showModal({ + title: '提示', + content: '您确定要进行收货吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/membervirtualtakedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + }, + }) + // #endif + + // #ifdef MP-WEIXIN + // 检测微信小程序是否已开通发货信息管理服务 + if (orderData.pay_type == 'wechatpay' && wx.openBusinessView && orderData.is_trade_managed) { + wx.openBusinessView({ + businessType: 'weappOrderConfirm', + extraData: { + merchant_id: orderData.pay_config.mch_id, + merchant_trade_no: orderData.out_trade_no + }, + success: res => { + if (res.extraData.status == 'success') { + this.$api.sendRequest({ + url: '/api/order/membervirtualtakedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } else { + this.$api.sendRequest({ + url: '/api/order/membervirtualtakedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + }, + fail: function(res) {} + }) + } else { + uni.showModal({ + title: '提示', + content: '您确定要进行收货吗?', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/order/membervirtualtakedelivery', + data: { + order_id: orderData.order_id + }, + success: res => { + this.$util.showToast({ + title: res.message + }) + typeof callback == 'function' && callback(); + } + }) + } + }, + }) + } + // #endif + }, + } +} \ No newline at end of file diff --git a/pages/order/public/js/refundMethod.js b/pages/order/public/js/refundMethod.js new file mode 100644 index 0000000..2feb464 --- /dev/null +++ b/pages/order/public/js/refundMethod.js @@ -0,0 +1,30 @@ +export default { + methods: { + /** + * 撤销退款申请 + * @param {Object} order_goods_id + * @param {Object} callback + */ + cancleRefund(order_goods_id, callback) { + uni.showModal({ + content: '撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。', + cancelText: '暂不撤销', + cancelColor: '#898989', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/orderrefund/cancel', + data: { + order_goods_id + }, + success: res => { + typeof callback == 'function' && callback(res); + } + }) + } + } + }) + }, + + } +} diff --git a/pages_promotion/components/l-time/l-time.vue b/pages_promotion/components/l-time/l-time.vue new file mode 100644 index 0000000..4ba8dee --- /dev/null +++ b/pages_promotion/components/l-time/l-time.vue @@ -0,0 +1,56 @@ + + {{ temp }} + + + + + diff --git a/pages_promotion/components/l-time/time.js b/pages_promotion/components/l-time/time.js new file mode 100644 index 0000000..76c5f4b --- /dev/null +++ b/pages_promotion/components/l-time/time.js @@ -0,0 +1,161 @@ +Function.prototype.asyAfter = function(afterfn) { + var _self = this; + return function() { + var ret = _self.apply(this, arguments); + if (ret === 'next') { + return afterfn.apply(this, arguments); + } + return ret; + } +} + +Date.prototype.pattern = function(fmt) { + var o = { + "M+": this.getMonth() + 1, //月份 + "d+": this.getDate(), //日 + "h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时 + "H+": this.getHours(), //小时 + "m+": this.getMinutes(), //分 + "s+": this.getSeconds(), //秒 + "q+": Math.floor((this.getMonth() + 3) / 3), //季度 + "S": this.getMilliseconds() //毫秒 + }; + var week = { + "0": "\u65e5", + "1": "\u4e00", + "2": "\u4e8c", + "3": "\u4e09", + "4": "\u56db", + "5": "\u4e94", + "6": "\u516d" + }; + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); + } + if (/(E+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "\u661f\u671f" : "\u5468") : + "") + + week[this.getDay() + ""]); + } + for (var k in o) { + if (new RegExp("(" + k + ")").test(fmt)) { + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]) + .length))); + } + } + return fmt; +} + +const isType = type => (/^\[object\s(.*)\]$/.exec(Object.prototype.toString.call(type)))[1]; +let Time = function() {}; +let timeProto = Time.prototype; + +//获取当前时间戳 +timeProto.getUnix = function() { + return new Date().getTime(); +} + +//获取当天0点0分0秒时间戳 +timeProto.getTodayUnix = function() { + let date = new Date(); + let myDate = `${date.getFullYear()}/${(date.getMonth() + 1)}/${date.getDate()} 00:00:00`; + return new Date(myDate).getTime(); +} + +//获取今年1月1日0点0分0秒时间戳 +timeProto.getYearUnix = function() { + let date = new Date(); + date.setMonth(0); + date.setDate(1); + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + return date.getTime(); +} + +//获取当前时间标准年月日 +timeProto.getLastDate = function(constTime) { + if (!constTime) { + return; + } + let date = new Date(constTime); + if (date.pattern) { + return date.pattern("yyyy-MM-dd"); + } + + let month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1; + let day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate(); + return date.getFullYear() + '-' + month + '-' + day; +} + +const resDateStr = function(timer, constTime) { + let _just = function(timer) { + + if (timer <= 0 || Math.floor(timer / 60) <= 0) { + return "刚刚" + } else return 'next'; + } + + let _mm = function(timer) { + if (timer < 3600) { + return Math.floor(timer / 60) + "分钟前" + } else return 'next'; + } + let _hh = function(timer, constTime) { + let today = _time_.getTodayUnix(); + if (timer >= 3600 && (constTime - today >= 0)) { + //可切换显示模式 + // return "今天 " + new Date(constTime).pattern("HH:mm"); + return Math.floor(timer / 60 / 60) + "小时前"; + } else { + return 'next' + }; + } + let _dd = function(timer, constTime) { + let today = _time_.getTodayUnix(); + timer = (today - constTime) / 1000; + if (timer / 86400 <= 31) { + return Math.ceil(timer / 86400) + "天前" + } else return 'next'; + } + let _dlast = function(timer, constTime) { + return _time_.getLastDate(constTime); + } + + let dateFilter = _just.asyAfter(_mm).asyAfter(_hh).asyAfter(_dd).asyAfter(_dlast); + return dateFilter(timer, constTime); +} + + +//转换时间 +const reg = new RegExp("-", "g"); +timeProto.getFormatTime = function(constTime, max) { + if (!constTime) { + return ""; + } + + switch (isType(constTime)) { + case 'Date': + constTime = constTime.getTime(); + break; + case 'String': + constTime = constTime.replace(reg, "/"); + default: + constTime = new Date(constTime).getTime(); + break; + } + + let now = this.getUnix(); + let year = this.getYearUnix(); + let timer = (now - constTime) / 1000; + if (constTime > now && max) { + return this.getLastDate(constTime); + } + + let _t = this; + return resDateStr(timer, constTime); +} + +const _time_ = new Time(); +export default _time_; diff --git a/pages_promotion/components/yuyue-date/yuyue-date.js b/pages_promotion/components/yuyue-date/yuyue-date.js new file mode 100644 index 0000000..bfe777e --- /dev/null +++ b/pages_promotion/components/yuyue-date/yuyue-date.js @@ -0,0 +1,98 @@ +//字符串拼接 +export function strFormat(str) { + return str < 10 ? `0${str}` : str +} +// 获取当前时间 +export function currentTime() { + const myDate = new Date(); + const year = myDate.getFullYear() + const m = myDate.getMonth() + 1; + const d = myDate.getDate(); + // const date = year + '-' + strFormat(m) + '-' + strFormat(d); // 隐藏年 + const date = strFormat(m) + '-' + strFormat(d); + + const hour = myDate.getHours() + const min = myDate.getMinutes() + const secon = myDate.getSeconds() + const time = strFormat(hour) + ':' + strFormat(min) + ':' + strFormat(secon); + return { + year, + date, + time + } +} + +//时间戳转日期 +export function timeStamp(time) { + const dates = new Date(time) + const year = dates.getFullYear() + const month = dates.getMonth() + 1 + const date = dates.getDate() + const day = dates.getDay() + const hour = dates.getHours() + const min = dates.getMinutes() + const days = ['日', '一', '二', '三', '四', '五', '六'] + return { + allDate: `${year}/${strFormat(month)}/${strFormat(date)}`, + date: `${strFormat(month)}-${strFormat(date)}`, //返回的日期 07-01,${strFormat(year)}-${strFormat(month)}-${strFormat(date)} + day: `周${days[day]}`, //返回的礼拜天数 星期一 + hour: strFormat(hour) + ':' + strFormat(min) // + ':00' //返回的时钟 08:00 + } +} + +//获取最近7天的日期和礼拜天数 +export function initData(appointedDay = '') { + const time = [] + const date = appointedDay ? new Date(appointedDay) : new Date() + + const now = date.getTime() //获取当前日期的时间戳 + let timeStr = 3600 * 24 * 1000 //一天的时间戳 + let obj = { + 0: "今天", + 1: "明天", + 2: "后天" + } + for (let i = 0; i < 7; i++) { + const timeObj = {} + timeObj.date = timeStamp(now + timeStr * i).date //保存日期 + timeObj.timeStamp = now + timeStr * i //保存时间戳 + timeObj.week = appointedDay == '' ? (obj[i] ?? timeStamp(now + timeStr * i).day) : timeStamp(now + timeStr * i) + .day + time.push(timeObj) + } + return time +} + +//时间数组 +export function initTime(startTime = '09:00', endTime = '18:30', timeInterval = 1) { + const time = [] + const date = timeStamp(Date.now()).allDate + const startDate = `${date} ${startTime}` + const endDate = `${date} ${endTime}` + const startTimeStamp = new Date(startDate).getTime() + const endTimeStamp = new Date(endDate).getTime() + const timeStr = 3600 * 1000 * timeInterval + for (let i = startTimeStamp; i <= endTimeStamp; i = i + timeStr) { + const timeObj = {} + timeObj.time = timeStamp(i).hour + timeObj.disable = false + time.push(timeObj) + } + return time +} + +export function weekDate(){ + var now = new Date(); //当前日期 + var nowDayOfWeek = now.getDay(); //今天本周的第几天 + var nowDay = now.getDate(); //当前日 + var nowMonth = now.getMonth(); //当前月 + var nowYear = now.getYear(); //当前年 + + var weekStartDate = new Date(nowYear, nowMonth, nowDay - nowDayOfWeek + 1); + var weekEndDate = new Date(nowYear, nowMonth, nowDay + (7 - nowDayOfWeek)); + + var arr = []; + arr[0] = strFormat(weekStartDate.getMonth()+1) + '-' + strFormat(weekStartDate.getDate()); + arr[1] = strFormat(weekEndDate.getMonth()+1) + '-' + strFormat(weekEndDate.getDate()); + return arr; +} diff --git a/pages_promotion/components/yuyue-date/yuyue-date.scss b/pages_promotion/components/yuyue-date/yuyue-date.scss new file mode 100644 index 0000000..7e37727 --- /dev/null +++ b/pages_promotion/components/yuyue-date/yuyue-date.scss @@ -0,0 +1,158 @@ +.content { + text-align: center; + height: 100%; + .head { + position: relative; + font-weight: bold; + padding: 32rpx 0 24rpx; + font-size: $font-size-toolbar; + .iconfont { + position: absolute; + right: 20rpx; + } + } + + .container { + view, + text, + image { + box-sizing: border-box; + } + .date-list-wrap { + display: flex; + align-items: center; + border-bottom: 2rpx solid #e6e6e6; + scroll-view { + width: 80%; + white-space: nowrap; + height: 100rpx; + line-height: 100rpx; + background-color: #fff; + position: relative; + .flex-box { + display: inline-block; + width: 25%; + + &.active { + .date-box { + border: none; + .days { + font-weight: bold; + color: #818181; + } + .date { + font-weight: bold; + color: #818181; + } + } + } + .date-box { + color: #909399; + text { + font-size: $font-size-tag; + } + } + } + } + .appointed-day { + flex: 1; + border-left: 2rpx solid #e6e6e6; + .day-box, + .iconfont { + font-size: $font-size-tag; + color: #909399; + } + .iconfont { + margin-left: 4rpx; + } + } + } + .time-box { + padding: 0 12rpx; + display: flex; + flex-wrap: wrap; + overflow: scroll; + background-color: #fff; + height: auto; + .item { + width: 25%; + padding: 0 8rpx; + margin-top: 30rpx; + &-box { + width: 100%; + height: 140rpx; + padding: 0 40rpx; + background: #fff; + color: #333; + border: 2rpx solid #eeeeee; + font-size: $font-size-base; + border-radius: 10rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + &.disable { + background: #f1f3f6 !important; + color: #999 !important; + } + &.active { + background: $base-color; + color:#fff; + // background: #0094D7; + border: 2rpx solid $base-color; + font-weight: bold; + } + .all { + font-size: $font-size-tag; + padding-top: 10rpx; + } + // 自定义样式 + &.diy{ + height: 60rpx; + border-radius: 40rpx; + .all{ + display: none; + } + } + } + } + } + } + + .bottom { + display: flex; + flex-direction: row; + position: fixed; + align-items: center; + bottom: 0; + top: auto; + left: 0; + width: 100%; + background-color: #fff; + box-shadow: 0 -2rpx 20rpx #bcbcbc; + + .show-time { + width: 66%; + height: 100rpx; + line-height: 100rpx; + font-size: $font-size-base; + text-align: left; + margin-left: 40rpx; + } + + .submit-btn { + width: 25%; + height: 70rpx; + line-height: 70rpx; + font-size: $font-size-base; + } + } +} + +.yuyue-date-desc{ + padding-top: 2rpx; + padding-bottom: 4rpx; + font-size: $font-size-tag; + color: $color-sub; + text-align: center; +} diff --git a/pages_promotion/components/yuyue-date/yuyue-date.vue b/pages_promotion/components/yuyue-date/yuyue-date.vue new file mode 100644 index 0000000..7bc855e --- /dev/null +++ b/pages_promotion/components/yuyue-date/yuyue-date.vue @@ -0,0 +1,414 @@ + + + + + + + + + + + + + {{ item.week }} {{ item.date }} + + + + + + + 指定日期 + + + + + + + + + + + + {{ item.time }} + + + + + + + + + + + + + {{ item.time }} + {{ item.disable ? disableText : undisableText }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/fenxiao/apply.vue b/pages_promotion/fenxiao/apply.vue new file mode 100644 index 0000000..b7cc509 --- /dev/null +++ b/pages_promotion/fenxiao/apply.vue @@ -0,0 +1,813 @@ + + + + + + + + + + + + + + + + + 请填写申请信息 + + + + + + + + + + + 邀请人 + {{ sourceMemberInfo.fenxiao_name }} + + + {{ fenxiaoWords.fenxiao_name }}名称 + + + + 手机号 + + + + + + 我已阅读并了解 + 【{{ fenxiaoWords.fenxiao_name }}申请协议】 + + + 申请成为{{ fenxiaoWords.fenxiao_name }} + + + + + + + 分销商申请条件 + + 申请成为{{ fenxiaoWords.fenxiao_name }},需要您的消费次数需要达到{{ fenxiaoConfig.consume_count }}次 + + + 申请成为{{ fenxiaoWords.fenxiao_name }},需要您的消费金额需要达到{{ fenxiaoConfig.consume_money }}元 + + + + + + 分销商申请条件 + 申请成为{{ fenxiaoWords.fenxiao_name }},需要购买以下指定商品(任选其一) + + + + + {{ goodsTag(item) }} + + + {{ item.goods_name }} + + + {{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} + + + + + + {{ isOpen ? '展开更多' : '收起' }} + + + + + + + + + + 申请成为{{ fenxiaoWords.fenxiao_name }},需要您的消费次数需要达到{{ fenxiaoConfig.consume_count }}次 + + 申请成为{{ fenxiaoWords.fenxiao_name }},需要您的消费金额需要达到{{ fenxiaoConfig.consume_money | moneyFormat }}元 + + + + + + 成为分销商的条件 + 成为{{ fenxiaoWords.fenxiao_name }},需要购买以下指定商品(任选其一) + + + + + {{ goodsTag(item) }} + + + {{ item.goods_name }} + + {{ $lang('common.currencySymbol') }} + {{ item.market_price > 0 ? item.market_price : item.price }} + + + + + {{ isOpen ? '展开更多' : '收起' }} + + + + + + + + + 您还不是分销商 + + + + + 您已提交{{ fenxiaoWords.fenxiao_name }}申请,等待平台审核 + + 您提交的{{ fenxiaoWords.fenxiao_name }}申请,已被拒绝,请再接再厉 + 重新申请 + + + + + + + {{ fenXiaoAgreement.document.title }} + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/fenxiao/bill.vue b/pages_promotion/fenxiao/bill.vue new file mode 100644 index 0000000..ebdb423 --- /dev/null +++ b/pages_promotion/fenxiao/bill.vue @@ -0,0 +1,147 @@ + + + + + + + + + + {{ item.type_name }} + 账单编号: {{ item.account_no }} + {{ $util.timeStampTurnTime(item.create_time) }} + + + {{ item.money > 0 ? '+' + item.money : item.money }} + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/child_fenxiao.vue b/pages_promotion/fenxiao/child_fenxiao.vue new file mode 100644 index 0000000..4fcf443 --- /dev/null +++ b/pages_promotion/fenxiao/child_fenxiao.vue @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + {{ item.nickname }} + {{ item.level_name }} + + 加入时间:{{ $util.timeStampTurnTime(item.bind_fenxiao_time).substring(0, 10) }} + + + {{ item.one_child_fenxiao_num + item.one_child_num }} 人 + {{ item.order_num }} 单 + {{ item.order_money|moneyFormat }} 元 + + + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/goods_list.vue b/pages_promotion/fenxiao/goods_list.vue new file mode 100644 index 0000000..a3eac56 --- /dev/null +++ b/pages_promotion/fenxiao/goods_list.vue @@ -0,0 +1,413 @@ + + + + + + + + + + + 全部 + + {{ item.category_name }} + + + + + + + + + + + + {{ item.sku_name }} + + {{ item.label_name }} + + + + + ¥ + {{ item.discount_price }} + + + + 分享 + 赚{{ item.commission_money }}元 + + + + + + + + + + + + + 分享好友 + | + + 生成海报 + + + + + + + + 分享 + + + + + + 分享给好友 + + + + + + + + + 分享到好物圈 + + + + + + + + 生成分享海报 + + + + + + + 复制链接 + + + + + 取消分享 + + + + + + + + + + + + + 保存图片 + + + 长按保存图片 + + + + + {{ posterMsg }} + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/index.vue b/pages_promotion/fenxiao/index.vue new file mode 100644 index 0000000..370447d --- /dev/null +++ b/pages_promotion/fenxiao/index.vue @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + {{ info.fenxiao_name }} + {{ info.level_name }} + + 上级代理商:{{ info.parent_name?info.parent_name:'总店' }} + 已邀请成功:{{ teamNum.num }}人 + + + + + + + + + + 可{{ fenxiaoWords.withdraw }}(元) + + 提现明细 + + + + {{ info.account }} + + + + + + 提现中(元) + {{ info.account_withdraw_apply | moneyFormat }} + + + 待入账(元) + {{ info.in_progress_money | moneyFormat }} + + + 提现 + + + + + + + + + + + + + + + 我的粉丝 + 邀请的用户 + + + + + + + + {{ fenxiaoWords.withdraw }}明细 + 累计{{ fenxiaoWords.account }}¥{{ info.total_commission | moneyFormat }} + + + + + + + + {{ fenxiaoWords.concept + '订单' }} + {{ fenxiaoWords.concept + '订单' }}明细 + + + + + + + + + 我的邀请码 + 邀好友赚好礼 + + + + + + + + + + + + + + + 您还不是{{ fenxiaoWords.fenxiao_name }},请先提交申请 + 立即加入 + + + + + + + + 快速升级技巧 + + + + + + {{ item.title }} + + {{ item.progress == 100 ? '已完成' : '未完成' }} + + + + + {{ item.value }} + /{{ item.condition }} + + {{ item.progress == 100 ? '已完成' : '去完成' }} + + + + + + + + + + 提示 + + + + {{ tips }} + {{ levelInfo.upgrade_type == 1 ? '满足任意一条件即可升级' : '满足全部条件才能进行升级' }} + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/fenxiao/level.vue b/pages_promotion/fenxiao/level.vue new file mode 100644 index 0000000..5a5f0d5 --- /dev/null +++ b/pages_promotion/fenxiao/level.vue @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + {{ fenxiaoInfo.nickname }} + {{ item.level_name }} + + + + 一级分佣比率 + {{ item.one_rate }}% + + + 二级分佣比率 + {{ item.two_rate }}% + + + 三级分佣比率 + {{ item.three_rate }}% + + + + + + + + + + + + + + 快速升级技巧 + + {{ levelInfo.complete > levelInfo.task_num ? levelInfo.task_num : levelInfo.complete }} + /{{ levelInfo.task_num }} + + + + + + + {{item.title}} + + + + {{ item.progress == 100 ? '已完成' : '未完成' }} + + + + + + {{item.desc}} + + {{ item.value }} + /{{ item.condition }} + + + + + + + + + + 提示 + + + + {{ tips }} + {{ levelInfo.upgrade_type == 1 ? '满足任意一条件即可升级' : '满足全部条件才能进行升级' }} + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/fenxiao/order.vue b/pages_promotion/fenxiao/order.vue new file mode 100644 index 0000000..589d0c2 --- /dev/null +++ b/pages_promotion/fenxiao/order.vue @@ -0,0 +1,203 @@ + + + + + + {{ item.name }} + + + + + + + + {{ orderItem.order_no }} + 已退款 + 已结算 + 待结算 + + + + + + + + + + {{ orderItem.sku_name }} + + 返{{ fenxiaoWords.account }} + {{ $lang('common.currencySymbol') }} + {{ parseFloat(orderItem.commission).toFixed(2).split(".")[0] }} + .{{ parseFloat(orderItem.commission).toFixed(2).split(".")[1] }} + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(orderItem.price).toFixed(2).split(".")[0] }} + .{{ parseFloat(orderItem.price).toFixed(2).split(".")[1] }} + + + + + {{ orderItem.num }} + + + + + + + + + + {{ $util.timeStampTurnTime(orderItem.create_time) }} + + + + 合计: + {{ $lang('common.currencySymbol') }} + {{ parseFloat(orderItem.real_goods_money).toFixed(2).split(".")[0] }} + .{{ parseFloat(orderItem.real_goods_money).toFixed(2).split(".")[1] }} + + + + + + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/order_detail.vue b/pages_promotion/fenxiao/order_detail.vue new file mode 100644 index 0000000..64b1888 --- /dev/null +++ b/pages_promotion/fenxiao/order_detail.vue @@ -0,0 +1,378 @@ + + + + + + + + 共{{ orderData.num }}件商品 + + 已退款 + 已结算 + 待结算 + + + + + + {{ orderData.sku_name }} + + + + ¥ + {{ parseFloat(orderData.price).toFixed(2).split(".")[0] }} + .{{ parseFloat(orderData.price).toFixed(2).split(".")[1] }} + + + + + + {{ orderData.num }} + + + + + + + + + + + 合计: + ¥{{ orderData.real_goods_money }} + + + + + + 返佣详情 + + + + + 订单编号: + {{ orderData.order_no }} + + + 分佣层级: + {{ orderData.commission_level }}级 + + + 返佣金额: + + ¥ + {{ parseFloat(orderData.commission).toFixed(2).split(".")[0] }} + .{{ parseFloat(orderData.commission).toFixed(2).split(".")[1] }} + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/promote.vue b/pages_promotion/fenxiao/promote.vue new file mode 100644 index 0000000..e234f96 --- /dev/null +++ b/pages_promotion/fenxiao/promote.vue @@ -0,0 +1,363 @@ + + + + + + + + + + 累计收益 + {{ detailData.total_commission }} + 元 + + + + + + 已邀请好友 + 已下单好友 + + + + + + + {{ item.nickname }} + + + + 暂无已邀请好友,快去邀请吧 + + + + + + + 暂无活动规则 + + 邀请好友 + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/promote_code.vue b/pages_promotion/fenxiao/promote_code.vue new file mode 100644 index 0000000..c0d5480 --- /dev/null +++ b/pages_promotion/fenxiao/promote_code.vue @@ -0,0 +1,307 @@ + + + + + + + + + + + + + + + 长按识别图中二维码 + + + + 保存海报 + + + + + 提示 + 您拒绝了保存图片到相册的授权请求,无法保存图片到相册,如需正常使用,请授权之后再进行操作。 + + 取消 + + 立即授权 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/fenxiao/public/css/follow.scss b/pages_promotion/fenxiao/public/css/follow.scss new file mode 100644 index 0000000..2a753fa --- /dev/null +++ b/pages_promotion/fenxiao/public/css/follow.scss @@ -0,0 +1,94 @@ +.ns-adv { + margin: $margin-updown $margin-both; + border-radius: $border-radius; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + } +} + +.lineheight-clear { + line-height: 1 !important; +} + +// 商品列表双列样式 +.goods-list.double-column { + display: flex; + flex-wrap: wrap; + margin: $margin-updown $margin-both; + + .goods-item { + flex: 1; + position: relative; + background-color: #fff; + flex-basis: 48%; + max-width: calc((100% - 30rpx) / 2); + margin-right: $margin-both; + margin-bottom: $margin-updown; + border-radius: $border-radius; + + &:nth-child(2n) { + margin-right: 0; + } + + .goods-img { + position: relative; + overflow: hidden; + padding-top: 100%; + border-top-left-radius: $border-radius; + border-top-right-radius: $border-radius; + + image { + width: 100%; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + + .info-wrap { + padding: 0 26rpx 26rpx 26rpx; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + margin-top: 20rpx; + height: 68rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + + .unit { + margin-right: 6rpx; + } + } + + .pro-info { + display: flex; + margin-top: 16rpx; + + & > view { + padding: 2rpx 10rpx; + border: 2rpx solid; + border-radius: 6rpx; + } + + .iconfont { + margin-right: 4rpx; + } + } + } +} diff --git a/pages_promotion/fenxiao/public/css/index.scss b/pages_promotion/fenxiao/public/css/index.scss new file mode 100644 index 0000000..ca16ad2 --- /dev/null +++ b/pages_promotion/fenxiao/public/css/index.scss @@ -0,0 +1,574 @@ +.fenxiao-index { + position: relative; + display: flex; + flex-direction: column; + align-items: center; +} +.task-popup { + .head-wrap{ + font-size: 16px; + line-height: 51px; + height: 51px; + display: block; + text-align: center; + margin-top: 30rpx; + } + .body-wrap{ + max-height: 50vh; + overflow-y: scroll; + } + .equity-content{ + width: 400rpx; + height: 200rpx; + position: relative; + margin: 0 auto; + // padding: 20rpx 0 20rpx 0rpx; + } + .subordinate-consumption{ + // margin-left: 130rpx; + font-weight: 900; + } + .incomplete{ + font-weight: normal; + color: rgb(153,153,153); + margin-left: 120rpx; + font-size: 24rpx; + } + .icon-wenhao{ + margin-left: 10rpx; + } + .to-complete-box{ + width: 100rpx; + height: 40rpx; + border-radius: 60rpx; + background: rgb(233,51,35); + position: absolute; + left: 100%; + top: 40px; + line-height: 40rpx; + text-align: center; + } + .to-complete-box{ + padding: 5rpx; + color: #fff; + } + .circle{ + width: 355rpx; + height: 12rpx; + margin: 10rpx 0rpx; + } + .zero{ + color:rgb(198,152,53); + // margin-left: 130rpx; + } + .icon-close { + position: absolute; + float: right; + right: 22px; + font-size: 16px; + } +} +.fenxiao-index-header { + width: 100%; + position: relative; + height: 180rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + + &.not-level { + height: 200rpx; + } + + .member { + width: 100%; + height: 156rpx; + display: flex; + justify-content: space-between; + align-items: center; + padding: 54rpx 32rpx 0; + box-sizing: border-box; + position: relative; + + .promote-rules { + position: absolute; + display: flex; + align-items: center; + color: #fff; + right: 40rpx; + font-size: 24rpx; + .iconfont{ + margin-right: 10rpx; + } + } + + .member-pic { + width: 108rpx; + height: 108rpx; + border-radius: 50%; + border: 4rpx solid #fff; + position: relative; + + image { + width: 100%; + height: 100%; + border-radius: 50%; + } + .level-name { + height: 32rpx; + background: linear-gradient(180deg, #FCFCFD 0%, #C8D0DD 100%); + border-radius: 32rpx; + line-height: 32rpx; + padding: 0 10rpx; + font-size: 18rpx; + font-weight: 500; + color: #666666; + position: absolute; + bottom: -4rpx; + left: 50%; + z-index: 5; + white-space: nowrap; + transform: translateX(-50%); + } + } + + .member-info { + flex: 1; + width: 0; + margin-left: 32rpx; + display: flex; + flex-direction: column; + justify-content: center; + + view { + color: #fff; + } + + .member-info-box { + display: flex; + align-items: center; + line-height: 1; + .level{ + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -webkit-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -webkit-justify-content: center; + justify-content: center; + text-align: center; + position: relative; + -webkit-flex-shrink: 0; + flex-shrink: 0; + color: #ff3c29; + font-size: 24rpx; + font-style: normal; + font-weight: 400; + margin-left: 24rpx !important; + border-radius: 0 24rpx 24rpx 0; + vertical-align: middle; + background: #fff6d1; + padding: 4rpx 24rpx; + margin: 10rpx 0 10rpx 14rpx; + .level-icon { + position: absolute; + top: 50%; + left: 0; + -webkit-transform: translate(-50%, -55%); + transform: translate(-50%, -55%); + width: 40rpx; + height: 40rpx; + margin: auto 0; + } + } + + } + .name { + font-size: 32rpx; + font-weight: 600; + color: #FFFFFF; + } + + .recommend { + font-size: $font-size-tag; + margin-top: 4rpx; + line-height: 1; + margin-bottom: 10rpx; + display: flex; + align-items: center; + } + + .copy { + width: 68rpx; + height: 30rpx; + line-height: 30rpx; + background: linear-gradient(172deg, rgba(255,255,255,0.6) 0%, rgba(255,255,255,0.8) 100%); + border-radius: 60rpx; + text-align: center; + display: inline-block; + font-size: 18rpx; + font-weight: 600; + color: #202230; + margin-left: 20rpx + } + } + + .member-tixian { + width: 120rpx; + height: 50rpx; + border: 2rpx solid #ffffff; + border-radius: $border-radius; + display: flex; + justify-content: center; + align-items: center; + font-size: $font-size-tag; + color: #ffffff; + } + .code { + width: 50rpx; + height: 50rpx; + } + } + + .fenxiao-level-wrap { + width: calc(100% - 48rpx); + height: 128rpx; + background: linear-gradient(90deg, #FDE5C2 0%, #FDC172 100%); + border-radius: 20rpx 20rpx 0px 0px; + padding: 36rpx; + box-sizing: border-box; + display: flex; + align-items: center; + + .level-icon { + width: 70rpx; + height: 70rpx; + } + + .level-wrap { + flex: 1; + width: 0; + padding: 0 30rpx; + margin-left: 30rpx; + position: relative; + + view { + color: #945100; + line-height: 1; + } + + .title { + font-weight: 600; + font-size: 30rpx; + } + + .desc { + font-size: 24rpx; + margin-top: 10rpx; + } + + &::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 2rpx; + height: 100%; + background: linear-gradient(90deg, #FDE5C2 0%, #FDC172 100%); + } + } + + .btn { + width: 118rpx; + height: 54rpx; + line-height: 54rpx; + background: #945100; + border-radius: 54rpx; + font-size: 24rpx; + color: #fff; + font-weight: 500; + text-align: center; + } + } +} + +.fenxiao_index_money { + color: #fff; + display: flex; + justify-content: center; + align-items: center; + width: 100%; + + .xian { + height: 40rpx; + border: 2rpx solid rgba(255, 255, 255, 0.5); + } + + .index-money-item { + padding: 40rpx 0; + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + .item_money { + color: #fff; + font-size: 36rpx; + line-height: 1; + } + .item_tit { + padding-top: 10rpx; + font-size: $font-size-tag; + color: #fff; + } + } +} + +.fenxiao-index-allmoney { + display: flex; + flex-direction: column; + justify-content: space-between; + margin: 20rpx 24rpx; + border-radius: 16rpx; + background-color: #ffffff; + width: calc(100% - 48rpx); + padding: 32rpx; + box-sizing: border-box; + + .allmoney-top { + display: flex; + justify-content: space-between; + align-items: center; + + view { + line-height: 1; + color: #565656; + font-size: 24rpx; + } + + .iconright { + line-height: 1; + font-size: 28rpx; + margin-left: 4rpx; + } + } + + .total-commission { + color: #fa2943; + margin-top: 20rpx; + font-size: 56rpx; + font-weight: bold; + line-height: 1; + } + + .allmoney-bottom { + display: flex; + margin-top: 50rpx; + + .allmoney-all-wrap { + flex: 1; + + .title { + font-size: 24rpx; + color: #565656; + } + + .money { + font-size: 38rpx; + } + } + } + + .withdraw-btn { + height: 78rpx; + line-height: 78rpx; + border-radius: 92rpx; + background: #fa2943; + text-align: center; + color: #fff; + font-size: 28rpx; + margin: 50rpx 10rpx 0 10rpx; + } +} + +.uni-popup__wrapper{ + width: 450rpx; + height: 400rpx; + background: rgba(0, 0, 0, 0.4); +} + +.fenxiao-team { + display: flex; + width: 100%; + + .fenxiao-index-other { + margin: 0 24rpx 20rpx 24rpx; + border-radius: 16rpx; + background-color: #ffffff; + padding: 30rpx 0; + flex: 1; + + &:last-child { + margin-left: 0; + } + + .all-money-item { + margin: 0 30rpx; + display: flex; + font-size: $font-size-tag; + align-items: center; + .img-wrap { + display: flex; + justify-content: center; + align-items: center; + width: 70rpx; + height: 70rpx; + image { + width: 100%; + height: 100%; + } + } + .all-money-tit-wrap { + flex: 1; + margin-left: 24rpx; + display: flex; + flex-direction: column; + height: 70rpx; + + .all-money-tit { + line-height: 1; + color: $color-title; + font-size: $font-size-base; + flex: 1; + } + .all-money-num { + color: $color-tip; + font-size: 24rpx; + line-height: 1; + } + } + } + } +} + +.fenxiao-menu-list { + margin: 0 24rpx 20rpx 24rpx; + border-radius: 16rpx; + background-color: #ffffff; + width: calc(100% - 48rpx); + padding: 10rpx 30rpx; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + + .menu-item { + width: 50%; + display: flex; + align-items: center; + padding: 32rpx 0; + + .icon-wrap { + width: 68rpx; + display: flex; + align-content: center; + justify-content: center; + margin-right: 20rpx; + + image { + width: 100%; + } + } + + .info { + flex: 1; + + .title { + font-size: 28rpx; + line-height: 1; + } + + .desc { + font-size: 24rpx; + margin-top: 12rpx; + color: #aaa; + line-height: 1; + } + } + } +} + +.empty { + width: 100%; + height: 400rpx; + margin-top: 200rpx; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + image { + width: 300rpx; + margin-bottom: 50rpx; + } + text { + font-size: $font-size-tag; + font-weight: 600; + } + view { + width: 300rpx; + height: 70rpx; + border-radius: $border-radius; + text-align: center; + line-height: 70rpx; + color: #ffffff; + margin-top: 30rpx; + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + border-bottom: 2rpx solid $color-line; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + height: calc(100% - 250rpx); + padding: 30rpx; + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } +} \ No newline at end of file diff --git a/pages_promotion/fenxiao/public/css/level.scss b/pages_promotion/fenxiao/public/css/level.scss new file mode 100644 index 0000000..8c8d707 --- /dev/null +++ b/pages_promotion/fenxiao/public/css/level.scss @@ -0,0 +1,293 @@ +.level-top { + width: 100%; + height: 40rpx; + position: relative; + + image { + width: 100%; + height: 260rpx; + position: absolute; + } +} + +.level-swiper { + width: 100vw; + height: 270rpx; + + .level-item { + width: calc(100% - 60rpx); + height: 100%; + display: flex; + align-items: center; + justify-content: center; + margin: 0 26rpx; + + .level-wrap { + width: 100%; + height: 90%; + background: #fff; + border-radius: 16rpx; + transition: all .5s; + display: flex; + flex-direction: column; + padding: 20rpx 30rpx; + box-sizing: border-box; + position: relative; + } + + .not-unlocked { + position: absolute; + width: 50rpx; + height: 50rpx; + background: #4B4B4B; + display: flex; + align-items: center; + justify-content: center; + right: -1rpx; + top: -1rpx; + border-top-right-radius: 16rpx; + border-bottom-left-radius: 16rpx; + + .iconfont { + color: #D3DEE6; + } + } + + &.curr { + margin: 0; + width: 100%; + + .level-wrap { + height: 100%; + } + } + + .member-info { + display: flex; + align-items: center; + .head-img { + width: 90rpx; + height: 90rpx; + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .nickname { + color: #fff; + margin: 0 20rpx; + font-size: 28rpx; + } + + .level-name { + line-height: 1; + border: 2rpx solid #fff; + padding: 4rpx 10rpx; + border-radius: 6rpx; + font-size: 26rpx; + color: #f5f5f5; + } + } + + .level-rate { + display: flex; + margin-top: 30rpx; + + .rate-item { + text-align: left; + flex: 1; + } + .title { + color: #f5f5f5; + font-size: 24rpx; + } + .rate { + margin-top: 10rpx; + color: #fff; + font-size: 38rpx; + line-height: 1; + + .percentage { + font-size: 28rpx; + margin-left: 4rpx; + } + } + } + } + + swiper-item { + &:nth-child(1) .level-wrap { + background: linear-gradient(to right, #9BA7B1, #D3DEE6); + } + &:nth-child(2) .level-wrap { + background: linear-gradient(to right, #F57E2A, #FAD494); + } + &:nth-child(3) .level-wrap { + background: linear-gradient(to right, #F85151, #FF9999); + } + &:nth-child(4) .level-wrap { + background: linear-gradient(to right, #78B8B4, #AFE6E2); + } + &:nth-child(5) .level-wrap { + background: linear-gradient(to right, #4DA1E1, #58CBF0); + } + &:nth-child(6) .level-wrap { + background: linear-gradient(to right, #81C636, #D1F677); + } + &:nth-child(7) .level-wrap { + background: linear-gradient(to right, #6D7279, #A5AAB0); + } + &:nth-child(8) .level-wrap { + background: linear-gradient(to right, #866DDB, #D49BFE); + } + &:nth-child(9) .level-wrap { + background: linear-gradient(to right, #f1c74e, #f7dc81); + } + &:nth-child(10) .level-wrap { + background: linear-gradient(to right, #418CCF, #9CC6F1); + } + } +} + +.level-condition { + margin: 30rpx 26rpx; + background: #fff; + padding: 30rpx; + border-radius: 10rpx; + + .condition-title { + display: flex; + align-items: center; + justify-content: space-between; + + .title { + font-size: 32rpx; + font-weight: bolder; + position: relative; + padding-left: 20rpx; + line-height: 1; + + &:before { + content: " "; + position: absolute; + left: 0; + top: 0; + width: 6rpx; + height: 100%; + background-color: $base-color; + border-radius: 4rpx; + } + } + } + + .rate { + .complete { + color: #E7B667; + font-size: 26rpx!important; + font-weight: normal!important; + } + .num { + color: #bbb; + font-size: 26rpx!important; + font-weight: normal!important; + } + } + + .task-item { + padding: 20rpx 30rpx; + background: #F8F8F8; + border-radius: 10rpx; + margin-top: 30rpx; + + .flex-box { + display: flex; + align-items: center; + justify-content: space-between; + } + + .status{ + color: #999; + + &.complete { + color: #000; + } + } + + .title { + font-weight: bold; + + .iconfont { + font-size: 28rpx; + color: #B7B7B7; + margin-left: 10rpx; + } + } + + .desc { + color: #999; + font-size: 24rpx; + } + + .progress { + margin: 16rpx 0; + } + + .complete { + font-size: 24rpx!important; + } + .num { + font-size: 24rpx!important; + } + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + border-bottom: 2rpx solid $color-line; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + height: calc(100% - 250rpx); + padding: 30rpx; + &.store-popup { + height: calc(100% - 120rpx); + } + &.safe-area { + height: calc(100% - 270rpx); + } + &.store-popup.safe-area { + height: calc(100% - 140rpx); + } + } +} \ No newline at end of file diff --git a/pages_promotion/fenxiao/public/css/order.scss b/pages_promotion/fenxiao/public/css/order.scss new file mode 100644 index 0000000..6a786d9 --- /dev/null +++ b/pages_promotion/fenxiao/public/css/order.scss @@ -0,0 +1,206 @@ +/deep/ .fixed { + position: relative; + top: 0; +} +/deep/ .empty { + margin-top: 0 !important; +} +.cart-empty { + padding-top: 208rpx !important; +} +.color-text-green { + color: #11bd64; +} +.color-text-orange { + color: #ffa044; +} +.withdraw-cate { + width: 100%; + height: 90rpx; + display: flex; + box-sizing: border-box; + background: #ffffff; + .cate-li { + flex: 1; + display: flex; + justify-content: center; + align-items: center; + height: 100%; + font-size: 30rpx; + + &.active { + box-sizing: border-box; + position: relative; + } + &.active::after { + position: absolute; + bottom: 0; + left: 0; + content: ''; + width: 100%; + height: 4rpx; + } + } +} +.goods_list { + width: 100%; + height: 100%; + padding: 0 24rpx; + box-sizing: border-box; + margin-top: 18rpx; + .order-item { + padding: 30rpx; + box-sizing: border-box; + border-radius: 10rpx; + background: #ffffff; + position: relative; + margin-bottom: 18rpx; + + .order-header { + display: flex; + align-items: center; + position: relative; + padding-bottom: 24rpx; + line-height: 1; + font-size: $font-size-goods-tag; + + .icon-dianpu { + display: inline-block; + line-height: 1; + margin-right: 12rpx; + } + + .status-name { + flex: 1; + text-align: right; + } + } + + .order-body { + margin-bottom: 24rpx; + .goods-wrap { + display: flex; + position: relative; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 170rpx; + height: 170rpx; + padding: 20rpx 0 0 0; + margin-right: 5rpx; + + image { + width: 100%; + height: 100%; + border-radius: $border-radius; + } + } + + .goods-info { + flex: 1; + position: relative; + padding: 20rpx 0 0 0; + max-width: calc(100% - 200rpx); + margin-left: 18rpx; + display: flex; + flex-direction: column; + + .top-wrap { + flex: 1; + } + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-goods-tag; + color: #000; + } + + .goods-sub-section { + width: 100%; + line-height: 1.5; + display: flex; + align-items: center; + font-size: $font-size-goods-tag; + margin-top: 20rpx; + + .unit { + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1; + &:last-of-type { + text-align: right; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + .order-time { + margin-top: 12rpx; + font-size: $font-size-goods-tag; + color: #838383; + + .goods-price { + font-size: $font-size-goods-tag; + float: right; + color: #000; + } + } + } + } + } + + .order-footer { + padding-top: 24rpx; + .order-base-info { + display: flex; + + .total { + text-align: right; + padding-top: 20rpx; + flex: 1; + font-size: $font-size-goods-tag; + + & > text { + line-height: 1; + } + } + + .order-type { + font-size: $font-size-goods-tag; + + & > text { + line-height: 1; + } + } + } + .order-base-info.active { + .total { + padding-top: 0; + } + .order-type { + padding-top: 0; + } + } + } + } + .order-item:last-child { + border: none; + } +} +.price-color{ + color: var(--price-color); +} \ No newline at end of file diff --git a/pages_promotion/fenxiao/public/js/goods_list.js b/pages_promotion/fenxiao/public/js/goods_list.js new file mode 100644 index 0000000..7d68c2d --- /dev/null +++ b/pages_promotion/fenxiao/public/js/goods_list.js @@ -0,0 +1,265 @@ +import { + Weixin +} from '@/common/js/wx-jssdk.js'; + +export default { + data() { + return { + categoryList: [], + goodsList: [], + categoryId: 0, + is_fenxiao: false, + currIndex: 0, + poster: '-1', //海报 + posterMsg: '', //海报错误信息 + shareUrl: '/pages_promotion/fenxiao/goods_list', + shareType: 'goods', + //海报模板id + templateId: ['default'], + } + }, + onLoad(options) { + setTimeout(() => { + if (!this.addonIsExist.fenxiao) { + this.$util.showToast({ + title: '商家未开启分销', + mask: true, + duration: 2000 + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 2000); + } + }, 1000); + if (options.templateId) { + this.templateId = options.templateId.split(','); + } + this.getGoodsCategoryTree(); + }, + onShow() { + + if (!this.storeToken) { + this.$util.redirectTo( + '/pages_tool/login/login', { + back: '/pages_promotion/fenxiao/goods_list' + }, + 'redirectTo' + ); + return; + } + + if (this.fenxiaoWords && this.fenxiaoWords.concept) this.$langConfig.title(this.fenxiaoWords.concept + '中心'); + this.is_fenxiao = Boolean(this.memberInfo.is_fenxiao); + }, + methods: { + //获取列表 + getGoodsList(mescroll) { + this.$api.sendRequest({ + url: '/fenxiao/api/goods/page', + data: { + page: mescroll.num, + page_size: mescroll.size, + category_id: this.categoryId + }, + success: res => { + let newArr = [] + let msg = res.message; + if (res.code == 0 && res.data) { + newArr = res.data.list; + } else { + this.$util.showToast({ + title: msg + }) + } + mescroll.endSuccess(newArr.length); + //设置列表数据 + if (mescroll.num == 1) this.goodsList = []; //如果是第一页需手动制空列表 + this.goodsList = this.goodsList.concat(newArr); //追加新数据 + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail: res => { + //联网失败的回调 + mescroll.endErr(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + //商品详情 + navToDetailPage(item) { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: item.goods_id + }); + }, + //查询一级商品分类 + getGoodsCategoryTree() { + this.$api.sendRequest({ + url: '/api/goodscategory/tree', + data: { + level: 1 + }, + success: res => { + if (res.code == 0) { + this.categoryList = res.data; + } + } + }); + }, + changeCategory(category_id) { + this.categoryId = category_id; + if (this.$refs.mescroll) { + this.$refs.mescroll.refresh(); + this.$refs.mescroll.myScrollTo(0); + } + }, + // 分享商品 + shareFn(type, keys) { + this.shareType = type; + if (this.shareType == "fenxiao") + this.openPosterPopup(); + else { + this.currIndex = keys; + this.$refs.sharePopup.open(); + } + }, + // #ifdef MP-WEIXIN + /** + * 将商品推荐到微信圈子 + */ + openBusinessView() { + if (wx.openBusinessView) { + wx.openBusinessView({ + businessType: 'friendGoodsRecommend', + extraData: { + product: { + item_code: this.goodsList[this.currIndex].goods_id, + title: this.goodsList[this.currIndex].sku_name, + image_list: this.$util.img(this.goodsList[this.currIndex].goods_image) + } + }, + success: function (res) { + console.log('success', res); + }, + fail: function (res) { + console.log('fail', res); + } + }) + } + }, + // #endif + //-------------------------------------海报------------------------------------- + // 打开海报弹出层 + openPosterPopup() { + this.getGoodsPoster(); + this.$refs.sharePopup.close(); + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + }, + //生成海报 + getGoodsPoster() { + uni.showLoading({ + 'title': '海报生成中...' + }); + let url = ""; + let data = {}; + if (this.shareType == "goods") { + url = "/api/goods/poster"; + data.page = "/pages/goods/detail"; + data.qrcode_param = JSON.stringify({ + goods_id: this.goodsList[this.currIndex].goods_id, + source_member: this.memberInfo.member_id + }); + } else { + url = "/fenxiao/api/fenxiao/poster"; + data.page = "/pages/index/index"; + data.qrcode_param = JSON.stringify({}); + data.template_id = this.templateId[0]; + } + + this.$api.sendRequest({ + url: url, + data: data, + success: res => { + if (res.code == 0) { + this.poster = res.data.path + "?time=" + new Date().getTime(); + this.$refs.posterPopup.open(); + } else { + this.posterMsg = res.message; + } + uni.hideLoading(); + }, + fail: err => { + uni.hideLoading(); + } + }); + }, + // #ifdef MP || APP-PLUS + //小程序中保存海报 + saveGoodsPoster() { + let url = this.$util.img(this.poster); + uni.downloadFile({ + url: url, + success: (res) => { + if (res.statusCode === 200) { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + this.$util.showToast({ + title: "保存成功" + }); + }, + fail: () => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + } + } + }); + }, + // #endif + // 打开分享弹出层 + openSharePopup() { + this.$refs.sharePopup.open(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + copyUrl() { + let text = this.$config.h5Domain + '/pages/goods/detail?goods_id=' + this.goodsList[this.currIndex].goods_id + '&source_member=' + this.memberInfo.member_id; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + imageError(index) { + this.goodsList[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + } + }, + /** + * 自定义分享内容 + * @param {Object} res + */ + onShareAppMessage(res) { + var path = this.shareUrl; + + if (this.shareType == "goods") { + path = `/pages/goods/detail?goods_id=${this.goodsList[this.currIndex].goods_id}&sku_id=${this.goodsList[this.currIndex].sku_id}&source_member=${this.memberInfo.member_id}`; + } + + return { + title: this.goodsList[this.currIndex].sku_name, + imageUrl: this.$util.img(this.goodsList[this.currIndex].goods_image, { + size: 'big' + }), + path: path, + success: res => { + }, + fail: res => { + } + }; + } +} \ No newline at end of file diff --git a/pages_promotion/fenxiao/ranking_list.vue b/pages_promotion/fenxiao/ranking_list.vue new file mode 100644 index 0000000..1f6c723 --- /dev/null +++ b/pages_promotion/fenxiao/ranking_list.vue @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + {{info.nickname}} + + 点击提现 + 我的团队 + + + + + + + + + + + + 分销佣金 + {{ info.today_commission}}元 + + + + + + + + + + 佣金排行 + 您排行第{{ ranking }}名 + + + + + + + + + + + + 推广人数 + {{ info.one_child_num}}人 + + + + + + + + + + 推广排行 + 您排行第{{ ranking }}名 + + + + + + 佣金排行 + 推广排行 + + + + {{ index + 1 }} + + + + + {{ item.nickname }} + + + ¥{{ item.total_commission|moneyFormat }} + {{ item.child_num }}人 + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/relation.vue b/pages_promotion/fenxiao/relation.vue new file mode 100644 index 0000000..b1d5b9c --- /dev/null +++ b/pages_promotion/fenxiao/relation.vue @@ -0,0 +1,152 @@ + + + + + + + + + {{ orderItem.order_no }} + 已退款 + 已结算 + 待结算 + + + + + + + + + + {{ orderItem.sku_name }} + + 返{{ fenxiaoWords.account }} + {{ $lang('common.currencySymbol') }} + {{ orderItem.commission }} + + + + + {{ $lang('common.currencySymbol') }} + {{ orderItem.price }} + + + + + {{ orderItem.num }} + + + + + + + + + + {{ $util.timeStampTurnTime(orderItem.create_time) }} + + + + 合计: + {{ $lang('common.currencySymbol') }} + {{ orderItem.real_goods_money }} + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/team.vue b/pages_promotion/fenxiao/team.vue new file mode 100644 index 0000000..878cc7e --- /dev/null +++ b/pages_promotion/fenxiao/team.vue @@ -0,0 +1,355 @@ + + + + + + {{ item.name }} + + + + + + + + + + + + + + {{ item.nickname }} + {{ fenxiaoWords.fenxiao_name }} + + 加入时间:{{ $util.timeStampTurnTime(item.bind_fenxiao_time).substring(0, 10) }} + + + + {{ item.one_child_num }} + 人 + + + {{ item.order_num }} + 单 + + + {{ item.order_money | moneyFormat }} + 元 + + + + + + + + {{ item.nickname }} + + + 加入时间:{{ $util.timeStampTurnTime(item.bind_fenxiao_time).substring(0, 10) }} + + + + 0 + 人 + + + {{ item.order_num }} + 单 + + + {{ item.order_money | moneyFormat }} + 元 + + + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/withdraw_apply.vue b/pages_promotion/fenxiao/withdraw_apply.vue new file mode 100644 index 0000000..f1e109d --- /dev/null +++ b/pages_promotion/fenxiao/withdraw_apply.vue @@ -0,0 +1,515 @@ + + + + + + 提现到 + 微信默认钱包 + {{ bankAccountInfo.bank_account }} + + + + + + + + + + + + 请添加提现账户 + + 提现到 + 余额 + + + + + + + + + 提现金额: + + {{ $lang('common.currencySymbol') }} + + + + + + + + 可提现金额:{{ $lang('common.currencySymbol') }}{{ withdrawInfo.account | moneyFormat }} + 全部提现 + + + + 最小提现金额为{{ $lang('common.currencySymbol') }}{{ withdrawConfigInfo.withdraw | moneyFormat }}, + 最大提现金额为{{ $lang('common.currencySymbol') }}{{ (withdrawConfigInfo.max > withdrawInfo.account ? withdrawInfo.account : withdrawConfigInfo.max) | moneyFormat }}, + 手续费为{{ withdrawConfigInfo.withdraw_rate + '%' }} + + + + + + + + + 提现 + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/fenxiao/withdraw_list.vue b/pages_promotion/fenxiao/withdraw_list.vue new file mode 100644 index 0000000..4c0a66f --- /dev/null +++ b/pages_promotion/fenxiao/withdraw_list.vue @@ -0,0 +1,209 @@ + + + + + + + + + + + {{ item.transfer_type=='balance'&&'余额' || item.transfer_type=='alipay'&&'支付宝' || item.transfer_type=='bank'&&'银行卡' || item.transfer_type=='wechatpay'&&'微信' }} + + {{ $util.timeStampTurnTime(item.create_time) }} + + + + ¥{{ item.money }} + {{ item.status_name }} + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/fenxiao/withdrawal_detail.vue b/pages_promotion/fenxiao/withdrawal_detail.vue new file mode 100644 index 0000000..ab18b5b --- /dev/null +++ b/pages_promotion/fenxiao/withdrawal_detail.vue @@ -0,0 +1,127 @@ + + + + + -{{ detail.money }} + + + + + + 当前状态 + {{ detail.status_name }} + + + 交易号 + {{ detail.withdraw_no }} + + + 手续费 + ¥{{ detail.withdraw_rate_money }} + + + 申请时间 + {{ $util.timeStampTurnTime(detail.create_time) }} + + + 审核时间 + {{ $util.timeStampTurnTime(detail.audit_time) }} + + + 银行名称 + {{ detail.bank_name }} + + + 收款账号 + {{ detail.account_number }} + + + 拒绝理由 + {{ detail.refuse_reason }} + + + 转账方式名称 + {{ detail.transfer_name }} + + + 转账时间 + {{ $util.timeStampTurnTime(detail.payment_time) }} + + + + + + + + + + diff --git a/pages_promotion/merch/detail.vue b/pages_promotion/merch/detail.vue new file mode 100644 index 0000000..aad7c68 --- /dev/null +++ b/pages_promotion/merch/detail.vue @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + {{merch.merch_name}} + + + + + + + + + + + + + + + 综合 + + + 销量 + + + + 价格 + + + + + + + + + + + + + + + + + {{ goodsTag(item) }} + + + + + + + + {{ item.goods_name }} + + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }} + .{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }} + + + 咨询 + + + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ showMarketPrice(item) }} + + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + + + + + {{ config.text }} + + + + + + + + + + + + + + + + + + {{ goodsTag(item) }} + + + + + + + {{ item.goods_name }} + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }} + .{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }} + + + 咨询 + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ showMarketPrice(item) }} + + + + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + + + + + {{ config.text }} + + + + + + + + + + + + + + + + + + + + + + 筛选 + + + + + + + + + + + + + 全部分类 + + + 全部 + + + {{ item.category_name }} + + + + + + 重置 + 确定 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/merch/merchcategory.vue b/pages_promotion/merch/merchcategory.vue new file mode 100644 index 0000000..13fa130 --- /dev/null +++ b/pages_promotion/merch/merchcategory.vue @@ -0,0 +1,266 @@ + + + + + + + + + + + + {{ item.category_name }} + + + + + + + + + + {{ item.category_name }} + + + + + + {{ one.merch_name }} + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/merch/public/category.scss b/pages_promotion/merch/public/category.scss new file mode 100644 index 0000000..95ed9ad --- /dev/null +++ b/pages_promotion/merch/public/category.scss @@ -0,0 +1,929 @@ + + .category-page-wrap { + width: 100vw; + // height: calc(100vh - var(--tab-bar-height, 0)); + display: flex; + flex-direction: column; + background-color: #fff; + } + + .content-box { + flex: 1; + height: 0; + display: flex; + + .tree-wrap { + width: 170rpx; + height: 100%; + background-color: #f5f5f5; + } + + .right-flex-wrap { + flex: 1; + width: 0; + height: 100%; + background: #f4f6fa; + display: flex; + flex-direction: column; + transform: translateX(0px); + + .content-wrap { + display: flex; + flex: 1; + height: 0; + width: 100%; + } + + .child-category-wrap { + width: 100%; + height: 100%; + } + } + } + + .tree-wrap .category-item-wrap { + height: auto; + background-color: #fff; + } + + .tree-wrap .category-item { + line-height: 1.5; + padding: 26rpx 28rpx; + box-sizing: border-box; + position: relative; + background-color: #f5f5f5; + + view { + color: #222222; + width: 100%; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + text-align: center; + } + + &.border-top { + border-bottom-right-radius: 12rpx; + } + + &.border-bottom { + border-top-right-radius: 12rpx; + } + + &.select { + background: #fff; + + view { + color: $base-color; + font-weight: bold; + } + + &::before { + content: ' '; + width: 8rpx; + height: 34rpx; + background: var(--base-color); + display: block; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + } + } + } + + .search-box { + position: relative; + padding: 20rpx 30rpx; + display: flex; + align-items: center; + background: #fff; + + .search-content { + position: relative; + /* #ifndef MP-WEIXIN */ + height: 64rpx; + /* #endif */ + /* #ifdef MP-WEIXIN */ + height: 100%; + /* #endif */ + border-radius: 40rpx; + flex: 1; + background-color: #f5f5f5; + + input { + box-sizing: border-box; + display: block; + height: 100%; + width: 100%; + padding: 0 20rpx 0 40rpx; + background: #f5f5f5; + color: #333; + border-radius: 40rpx; + } + + .iconfont { + position: absolute; + top: 50%; + right: 10rpx; + transform: translateY(-50%); + font-size: $font-size-toolbar; + z-index: 10; + color: #89899a; + width: 80rpx; + text-align: center; + } + } + } + + .cart-box { + height: 100rpx; + width: 100%; + background: #fff; + border-top: 1px solid #f5f5f5; + box-sizing: border-box; + padding: 0 30rpx; + display: flex; + align-items: center; + justify-content: space-between; + + .left-wrap { + display: flex; + align-items: center; + } + + .cart-icon { + width: 70rpx; + height: 70rpx; + position: relative; + + .iconfont { + color: var(--btn-text-color); + width: inherit; + height: inherit; + background-color: $base-color; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + } + + .num { + position: absolute; + top: 0; + right: 0; + transform: translate(60%, 0); + display: inline-block; + box-sizing: border-box; + color: #fff; + line-height: 1.2; + text-align: center; + font-size: 24rpx; + padding: 0 6rpx; + min-width: 30rpx; + border-radius: 16rpx; + background-color: var(--price-color); + border: 2rpx solid #fff; + } + } + + .price { + margin-left: 30rpx; + + .title { + color: #333; + } + + .money, + .unit { + font-weight: bold; + color: var(--price-color); + } + } + + .settlement-btn { + margin: 0 0 0 20rpx; + width: 200rpx; + font-weight: bold; + border-radius: 50rpx; + height: 70rpx; + line-height: 70rpx; + } + } + + .cart-point { + width: 26rpx; + height: 26rpx; + position: fixed; + z-index: 1000; + background: #f00; + border-radius: 50%; + transition: all 0.05s; + } + + .category-empty { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + + image { + width: 380rpx; + } + + .tips { + font-size: 26rpx; + font-weight: 500; + color: #999; + margin-top: 50rpx; + } + } + + .end-tips { + text-align: center; + color: #999; + font-size: 24rpx; + padding: 20rpx 0; + opacity: 0; + } + + // 风格四 + .category-template-4 { + .search-box { + .search-content input { + background-color: #f1f1f1; + } + } + + .cart-box { + position: relative; + z-index: 2; + } + + /deep/ .template-four { + position: relative; + z-index: 1; + + .template-four-wrap { + position: relative; + z-index: 1; + padding-left: 20rpx; + padding-right: 80rpx; + padding-bottom: 10rpx; + display: flex; + height: 172rpx; + align-items: baseline; + box-sizing: border-box; + box-shadow: 0 4rpx 4rpx rgba(123, 123, 123, 0.1); + } + + .template-four-popup { + display: flex; + flex-direction: column; + overflow: hidden; + + .title { + line-height: 1; + margin-bottom: 20rpx; + font-weight: bold; + } + + .template-four-scroll { + display: flex; + flex-wrap: wrap; + align-items: baseline; + align-content: baseline; + padding: 20rpx; + white-space: nowrap; + height: 380rpx; + box-sizing: border-box; + + .uni-scroll-view-content { + flex-wrap: wrap; + align-items: baseline; + align-content: baseline; + } + + .item { + display: flex; + flex-direction: column; + align-items: center; + padding: 4rpx 0; + color: #666; + margin-right: 16rpx; + border-radius: 40rpx; + margin-bottom: 10rpx; + width: calc((100% - 64rpx) / 5); + + &:nth-child(5n + 5) { + margin-right: 0; + } + + .image-warp { + margin-bottom: 6rpx; + padding: 4rpx; + display: flex; + align-items: center; + justify-content: center; + border-radius: 42rpx; + border: 4rpx solid transparent; + } + + image { + width: 84rpx; + height: 84rpx; + border-radius: 32rpx; + } + + .text { + padding: 2rpx 16rpx; + border-radius: 40rpx; + font-size: $font-size-tag; + } + + &.selected { + .text { + background-color: $base-color; + color: var(--btn-text-color); + } + } + } + } + + .pack-up { + font-size: $font-size-tag; + color: #888888; + height: 74rpx; + display: flex; + align-items: center; + justify-content: center; + border-top: 2rpx solid #f2f2f2; + + .iconfont { + font-size: 40rpx; + margin-left: -4rpx; + } + } + } + + .category-item-all { + position: absolute; + bottom: 0; + z-index: 1; + right: 0; + top: 0; + width: 72rpx; + line-height: 1; + background-color: #fff; + + .category-item-all-wrap { + position: absolute; + bottom: 0; + right: 0; + top: 0; + left: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + z-index: 2; + } + + .text { + writing-mode: tb-rl; + margin-bottom: 6rpx; + letter-spacing: 4rpx; + font-size: $font-size-tag; + font-weight: bold; + } + + .img { + width: 20rpx; + height: 20rpx; + } + + &::after { + content: ''; + // box-shadow: -4rpx 10rpx 20rpx rgba(0, 0, 0, 0.1); + position: absolute; + left: 0; + width: 10rpx; + // height: 100rpx; + top: 20%; + bottom: 20%; + // transform: translateY(-50%); + // background-color: #F0F5FF; + } + } + + .uni-scroll-view-content { + display: flex; + } + + .category-item { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + min-width: 130rpx; + flex-shrink: 0; + margin-right: 20rpx; + padding: 4rpx 0; + + &:last-of-type { + margin-right: 0; + } + + .image-warp { + margin-bottom: 6rpx; + padding: 4rpx; + display: flex; + align-items: center; + justify-content: center; + border-radius: 42rpx; + border: 4rpx solid transparent; + } + + image { + width: 84rpx; + height: 84rpx; + border-radius: 32rpx; + } + + .text { + font-size: $font-size-tag; + } + } + + .select { + .text { + padding: 8rpx 16rpx; + border-radius: 40rpx; + color: #fff; + font-size: $font-size-tag; + line-height: 1; + } + } + } + + .content-wrap .categoty-goods-wrap .goods-list { + margin-top: 30rpx; + } + + .tree-wrap .category-item.select::before { + border-top-right-radius: 8rpx; + border-bottom-right-radius: 8rpx; + } + } + + + /*商品部分*/ + .item-wrap { + width: 100%; + box-sizing: border-box; + // padding: 0 24rpx; + // padding-bottom: 80rpx; + &.goods { + height: 100%; + } + } + + .category-title { + padding: 20rpx 0; + font-size: 26rpx; + // font-weight: bold; + color: #222; + position: relative; + text-align: left; + padding-left: 30rpx; + // &::after, + // &::before { + // content: ' '; + // width: 46rpx; + // border-top: 2rpx solid #dfdfdf; + // position: absolute; + // top: 50%; + // } + + &::after { + margin-left: 40rpx; + } + + &::before { + margin-left: -80rpx; + } + } + + .category-adv { + width: 100%; + overflow: hidden; + line-height: 1; + padding: 20rpx 0; + + image { + width: 100%; + border-radius: 8rpx; + } + } + + .category-list { + display: flex; + flex-wrap: wrap; + background: #fff; + margin: 0 20rpx; + border-radius: 10rpx; + padding: 10rpx 0; + + .category-item { + width: 33.33%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 16rpx; + box-sizing: border-box; + + .img-box { + width: 80%; + padding-top: 80%; + margin: 0 auto; + overflow: hidden; + margin-bottom: 20rpx; + position: relative; + + image { + position: absolute; + width: 100%; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + } + } + + .name { + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + text-align: center; + line-height: 1; + + font-size: 24rpx; + } + } + } + + .goods-list { + .goods-item { + padding: 0 0 26rpx 0; + background: #fff; + display: flex; + position: relative; + + .goods-img { + width: 180rpx; + height: 180rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 14rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 26rpx; + left: 26rpx; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + width: 0; + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .introduction { + line-height: 1; + margin-top: 10rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + + .unit { + margin-right: 6rpx; + } + } + + .pro-info { + display: flex; + margin-top: 16rpx; + + .delete-price { + text-decoration: line-through; + flex: 1; + + .unit { + margin-right: 0rpx; + } + } + + &>view { + line-height: 1; + + &:nth-child(2) { + text-align: right; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + height: 28rpx; + + image { + width: 100%; + height: 100%; + } + } + + .footer-wrap { + display: flex; + justify-content: space-between; + + .right-wrap { + display: flex; + align-items: center; + justify-content: end; + + .num { + width: auto; + padding: 0 20rpx; + line-height: 1; + } + + .num-action { + display: flex; + align-items: center; + justify-content: center; + width: 40rpx; + height: 40rpx; + background: $base-color; + border-radius: 50%; + position: relative; + + .click-event { + position: absolute; + width: 2rpx; + height: 2rpx; + left: 0; + top: 0; + transform: translate(-50%, -50%); + z-index: 5; + } + + &.reduce { + width: 38rpx; + height: 38rpx; + background-color: transparent; + border: 2rpx solid $base-color; + box-sizing: border-box; + + .icon-jian { + color: $base-color; + } + } + } + + .icon-jian, + .icon-jia { + color: var(--btn-text-color); + font-weight: bold; + font-size: 26rpx; + line-height: 1; + } + + .select-sku { + font-weight: bold; + color: var(--btn-text-color); + font-size: 24rpx; + padding: 16rpx 24rpx; + position: relative; + // height: 40rpx; + line-height: 1; + text-align: center; + border-radius: 50rpx; + + .num-tag { + position: absolute; + top: 0; + right: 0; + transform: translateY(-50%); + display: inline-block; + box-sizing: border-box; + color: #fff; + line-height: 1.2; + text-align: center; + font-size: 24rpx; + padding: 0 6rpx; + min-width: 32rpx; + border-radius: 16rpx; + background-color: $base-color; + border: 2rpx solid #fff; + } + } + } + } + } + + &[data-template='3'] .goods-item { + flex-direction: column; + + .info-wrap { + width: 100%; + margin-top: 12rpx; + } + + .goods-img { + width: 100%; + height: auto; + margin-right: 0; + line-height: 1; + + image { + border-radius: 8rpx; + } + } + + .select-sku { + font-weight: bold; + width: 128rpx; + height: 52rpx !important; + line-height: 52rpx !important; + } + } + } + + .categoty-goods-wrap { + display: flex; + flex-direction: column; + height: 100%; + + .scroll-goods-view { + flex: 1; + height: 0; + transform: translateX(0px); + } + } + + .screen-category-wrap { + display: flex; + + .icon-unfold { + font-size: 24rpx; + color: #999; + padding: 0 0 0 20rpx; + } + } + + .screen-category { + flex: 1; + width: 0; + padding: 0 0 20rpx 0; + white-space: nowrap; + height: 60rpx; + + .item { + display: inline-block; + padding: 4rpx 24rpx; + background: #f5f5f5; + color: #666; + margin-right: 20rpx; + border-radius: 40rpx; + + &.selected { + background-color: $base-color; + color: var(--btn-text-color); + } + } + } + + /deep/ .uni-popup__wrapper-box { + border-radius: 0; + } + + .screen-category-popup { + display: flex; + + .screen-category { + white-space: break-spaces; + padding: 20rpx; + height: auto; + } + + .title { + line-height: 1; + margin-bottom: 20rpx; + font-weight: bold; + } + + .item { + margin-bottom: 20rpx; + } + } + + .end-tips { + text-align: center; + color: #999; + font-size: 24rpx; + padding: 30rpx 0 30rpx 0; + display: flex; + align-items: center; + justify-content: center; + } + + /deep/ .loading-layer { + background: #fff !important; + } + + .category-empty { + flex: 1; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + padding-top: 100rpx; + + image { + width: 280rpx; + height: 252rpx; + } + + .tips { + font-size: 26rpx; + font-weight: 500; + color: #999; + margin-top: 50rpx; + } + } + + .screen-category-4 .item { + background-color: #f2f2f2 !important; + padding: 10rpx 24rpx; + line-height: 1; + font-size: $font-size-tag; + + &.selected { + background-color: var(--main-color-shallow) !important; + color: var(--main-color); + } + } + \ No newline at end of file diff --git a/pages_promotion/merch/public/css/list.scss b/pages_promotion/merch/public/css/list.scss new file mode 100644 index 0000000..2e40653 --- /dev/null +++ b/pages_promotion/merch/public/css/list.scss @@ -0,0 +1,647 @@ +.head-wrap { + background: #fff; + position: fixed; + width: 100%; + left: 0; + z-index: 1; + + .search-wrap { + flex: 0.5; + padding: 30rpx 30rpx 0; + font-size: $font-size-tag; + display: flex; + align-items: center; + .iconfont { + margin-left: 16rpx; + font-size: 36rpx; + } + .input-wrap { + flex: 1; + display: flex; + justify-content: space-between; + align-items: center; + background: $color-bg; + height: 64rpx; + padding-left: 10rpx; + border-radius: 70rpx; + input { + width: 90%; + background: $color-bg; + font-size: $font-size-tag; + height: 100%; + padding: 0 25rpx 0 40rpx; + line-height: 50rpx; + border-radius: 40rpx; + } + text { + font-size: $font-size-toolbar; + color: $color-tip; + width: 80rpx; + text-align: center; + margin-right: 20rpx; + } + } + .category-wrap, + .list-style { + display: flex; + justify-content: center; + align-items: center; + .iconfont { + font-size: 50rpx; + color: $color-tip; + } + text { + display: block; + margin-top: 60rpx; + } + } + } + + .sort-wrap { + display: flex; + padding: 10rpx 20rpx 10rpx 0; + > view { + flex: 1; + text-align: center; + font-size: $font-size-base; + height: 60rpx; + line-height: 60rpx; + font-weight: bold; + } + .comprehensive-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: inline-block; + margin-left: 10rpx; + width: 40rpx; + .iconfont { + font-size: $font-size-toolbar; + line-height: 1; + margin-bottom: 5rpx; + } + } + } + .price-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + width: 40rpx; + .iconfont { + position: relative; + float: left; + font-size: 32rpx; + line-height: 1; + height: 20rpx; + color: #909399; + &.asc { + top: -2rpx; + } + &.desc { + top: -6rpx; + } + } + } + } + .screen-wrap { + display: flex; + justify-content: center; + align-items: center; + .iconfont-wrap { + display: inline-block; + margin-left: 10rpx; + width: 40rpx; + .iconfont { + font-size: $font-size-toolbar; + line-height: 1; + } + } + } + } +} + +.category-list-wrap { + height: 100%; + .class-box { + display: flex; + flex-wrap: wrap; + padding: 0 $padding; + view { + width: calc((100% - 60rpx) / 3); + font-size: $font-size-goods-tag; + margin-right: 20rpx; + height: 60rpx; + line-height: 60rpx; + text-align: center; + margin-bottom: 12rpx; + flex-shrink: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + background: rgba(245, 245, 245, 1); + border-radius: 5rpx; + &:nth-of-type(3n) { + margin-right: 0; + } + } + } + .first { + font-size: $font-size-tag; + display: block; + // background: $page-color-base; + padding: 20rpx; + } + .second { + border-bottom: 2rpx solid $color-line; + padding: 20rpx; + display: block; + font-size: $font-size-tag; + } + .third { + padding: 0 20rpx 20rpx; + overflow: hidden; + font-size: $font-size-tag; + > view { + display: inline-block; + margin-right: 20rpx; + margin-top: 20rpx; + } + .uni-tag { + padding: 0 20rpx; + } + } +} + +.screen-wrap { + .title { + font-size: $font-size-tag; + padding: $padding; + background: #f6f4f5; + } + scroll-view { + height: 85%; + .item-wrap { + border-bottom: 1px solid #f0f0f0; + .label { + font-size: $font-size-tag; + padding: $padding; + view { + display: inline-block; + font-size: 60rpx; + height: 40rpx; + vertical-align: middle; + line-height: 40rpx; + } + } + + .list { + margin: $margin-updown $margin-both; + overflow: hidden; + > view { + display: inline-block; + margin-right: 25rpx; + margin-bottom: 25rpx; + } + .uni-tag { + padding: 0 $padding; + font-size: $font-size-goods-tag; + background: #f5f5f5; + height: 52rpx; + line-height: 52rpx; + border: 0; + } + } + .price-wrap { + display: flex; + justify-content: center; + align-items: center; + padding: $padding; + input { + flex: 1; + background: #f5f5f5; + height: 52rpx; + width: 182rpx; + line-height: 50rpx; + font-size: $font-size-goods-tag; + border-radius: 50rpx; + text-align: center; + &:first-child { + margin-right: 10rpx; + } + &:last-child { + margin-left: 10rpx; + } + } + } + } + } + .footer { + height: 90rpx; + display: flex; + justify-content: center; + align-items: flex-start; + display: flex; + //position: absolute; + bottom: 0; + width: 100%; + .footer-box { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + margin: 0; + width: 40%; + } + .footer-box1 { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + margin: 0; + width: 40%; + } + } +} +.safe-area { + bottom: 68rpx !important; +} +.empty { + margin-top: 100rpx; +} +.buy-num { + font-size: $font-size-activity-tag; +} +.icon { + width: 34rpx; + height: 30rpx; +} +.list-style-new { + display: flex; + align-items: center; + .line { + width: 4rpx; + height: 28rpx; + background-color: rgba(227, 227, 227, 1); + margin-right: 60rpx; + } +} +.h-line { + width: 37rpx; + height: 2rpx; + background-color: $color-tip; +} + +.lineheight-clear { +} + +// 商品列表单列样式 +.goods-list.single-column { + display: none; + + &.show { + display: block; + } + + .goods-item { + padding: 26rpx; + background: #fff; + margin: $margin-updown $margin-both; + border-radius: $border-radius; + display: flex; + position: relative; + + .goods-img { + position: relative; + width: 200rpx; + height: 200rpx; + // overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + overflow: hidden; + + image { + width: 200rpx; + height: 200rpx; + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 26rpx; + left: 26rpx; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + + .introduction { + line-height: 1; + margin-top: 10rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + + .unit { + margin-right: 6rpx; + color: var(--price-color); + } + .price { + color: var(--price-color); + } + } + + .pro-info { + display: flex; + margin-top: auto; + align-items: center; + position: relative; + + .delete-price { + text-decoration: line-through; + font-size: $font-size-tag !important; + flex: 1; + + .unit { + margin-right: 0; + } + } + .block-wrap { + flex: 1; + line-height: 1; + margin-right: 20rpx; + .sale { + font-size: $font-size-tag !important; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + display: flex; + max-height: 30rpx; + } + } + .sell-out{ + position: absolute; + z-index: 1; + width: 100%; + height: 100%; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); + text{ + color: #fff; + font-size: 150rpx; + } + } + } +} +// 商品列表双列样式 +.goods-list.double-column { + display: none; + margin: 0 24rpx; + padding-top: $margin-updown; + position: relative; + flex-wrap: wrap; + justify-content: space-between; + + &.show { + display: flex; + } + + .goods-item { + display: flex; + flex-direction: column; + width: calc(50% - 10rpx); + border-radius: $border-radius; + overflow: hidden; + background-color: #fff; + + &:nth-child(2n + 2) { + margin-right: 0; + } + + .goods-img { + position: relative; + overflow: hidden; + padding-top: 100%; + border-top-left-radius: $border-radius; + border-top-right-radius: $border-radius; + + image { + width: 100%; + position: absolute !important; + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + + .goods-tag { + color: #fff; + line-height: 1; + padding: 8rpx 16rpx; + position: absolute; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 0; + left: 0; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + padding: 20rpx; + display: flex; + flex-direction: column; + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + margin-top: 20rpx; + } + + .lineheight-clear { + margin-top: 16rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + + .unit { + margin-right: 6rpx; + color: var(--price-color); + } + .price { + color: var(--price-color); + } + } + + .pro-info { + display: flex; + margin-top: auto; + align-items: center; + + .block-wrap { + flex: 1; + line-height: 1; + margin-right: 20rpx; + .sale { + font-size: $font-size-tag !important; + } + } + } + + .delete-price { + // display: inline-block; + // margin-left: 6rpx; + // float: right; + .unit { + margin-right: 6rpx; + } + text { + line-height: 1; + font-size: $font-size-tag !important; + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + .sell-out{ + position: absolute; + z-index: 1; + width: 100%; + height: 100%; + top: 0; + left: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); + text{ + color: #fff; + font-size: 250rpx; + } + } + } +} + +.cart-action-wrap { + position: relative; + + .shopping-cart-btn { + font-size: 36rpx; + border: 2rpx solid $base-color; + border-radius: 50%; + padding: 10rpx; + color: $base-color; + width: 36rpx; + height: 36rpx; + text-align: center; + line-height: 36rpx; + } + + .plus-sign-btn { + font-size: 36rpx; + border: 2rpx solid $base-color; + border-radius: 50%; + padding: 10rpx; + color: $base-color; + width: 36rpx; + height: 36rpx; + text-align: center; + line-height: 36rpx; + } + + .buy-btn { + background-color: $base-color; + color: var(--btn-text-color); + border-radius: 50rpx; + font-size: $font-size-tag; + padding: 12rpx 30rpx; + line-height: 1; + } + .icon-diy { + font-size: 80rpx; + } +} diff --git a/pages_promotion/merch/public/edit.js b/pages_promotion/merch/public/edit.js new file mode 100644 index 0000000..a4a4817 --- /dev/null +++ b/pages_promotion/merch/public/edit.js @@ -0,0 +1,952 @@ +// import {getGoodsInfoById,getCategoryTree,addGoods,editGoods,addVirtualGoods,editVirtualGoods,addVirtualCardGoods,editVirtualCardGoods} from '@/api/goods' +// import {getOrderFormList} from '@/api/form' +// import {getSupplyList} from '@/api/supply' +export default { + data() { + return { + repeatFlag: false, + isIphoneX: false, + goodsImgHeight: 165, // 商品图片高度 + isAWait: false, + albumPage: 'goodsEdit', + //店内分类 + shopCategoryNumber: 1, + shopCategoryData: { + store_0: {} + }, + shopCategoryIndex: '', + + categoryList: [], + secondCategory: [], + thirdCategory: [], + categoryId: [0, 0, 0], + categoryName: ['', '', ''], + currentLevel: 1, + lastLevel: 1, + showFisrt: true, + showSecond: false, + showThird: false, + + goodsData: { + id: 0,//商品id + goodsname:'',//商品名称 + subtitle:'',//商品简介 + is_show_arrive:1,//默认商品预达简介0关闭1开启 + diy_arrive_switch:0,//商品自定义预达简介0关闭1开启 + goods_start_count:1,//起售数量 + grounding:1,//0下架1上架 + is_index_show:1,//0首页不推荐1推荐 + price:0,//售价 + productprice:0,//原价 + costprice:0,//成本价 + total:0,//库存 + pick_up_type:0,//提货时,0当日达1次日达2隔日达3自定义 + dispatchtype:1,//1统一运费 + dispatchprice:0,//统一运费金额 + begin_time:'',//团购开始时间 + end_time:'',//团购结束时间 + oneday_limit_count:0,//每天限购 + one_limit_count:0,//单次限购 + total_limit_count:0,//历史限购 + is_all_sale:0,//所有团长1部分团长0 + goods_image:[], + begin_time:'',//团购开始时间 + end_time:''//团购结束时间 + }, + groundingArray: ['下架', '上架'], + + pickuptypeArray: ['当日达', '次日达', '隔日达'],//, '自定义' + + + currCategory: 0, // 当前所设置的商品分类 + virtualDeliverArray: [{ + name: '自动发货', + value: 'auto_deliver', + }, + { + name: '手动发货', + value: 'artificial_deliver', + }, + { + name: '到店核销', + value: 'verify', + } + ], + virtualDeliverValue: { + 'auto_deliver': '自动发货', + 'artificial_deliver': '手动发货', + 'verify': '到店核销' + }, + virtualReceiveArray: [{ + name: '自动收货', + value: 'auto_receive', + }, + { + name: '买家确认收货', + value: 'artificial_receive', + }, + ], + virtualReceiveValue: { + 'auto_receive': '自动收货', + 'artificial_receive': '买家确认收货', + }, + validityTypeArray: ['永久', '购买后几日有效', '指定过期日期'], + virtualIndate: 0, + minDate: '', + carmiLength: '添加卡密', + limitLength: [ //限购 + { + name: '单次限购', + value: '1' + }, + { + name: '长期限购', + value: '2' + } + ], + current: 0, + goodsFormArray: [], + goodsForm: [], + + supplyFormArray: [], + supplyForm: [] + }; + }, + async onLoad(option) { + this.goodsData.id = option.id || 0; + + // if (!this.$util.checkToken('/pages/goods/edit/index?id=' + this.goodsData.id)) return; + + // this.clearStoreage(); + + // this.getCategoryTreeFn(); + if (this.goodsData.id) { + this.isAWait = true; + uni.setNavigationBarTitle({ + title: '编辑商品' + }); + await this.editGetGoodsInfo(); + } else { + + this.isAWait = false; + uni.setNavigationBarTitle({ + title: '添加商品' + }); + } + + let date = new Date(); + this.minDate = date.getFullYear() + '-' + date.getMonth() + '-' + date.getUTCDate(); + + // if (this.addonIsExit.form) this.getGoodsForm(); + + // if (this.addonIsExit.supply) this.getSupplyList(); + + }, + onShow() { + this.isIphoneX = this.$util.uniappIsIPhoneX(); + //this.refreshData(); + }, + methods: { + + groundingChange(e) { + this.goodsData.grounding = e.detail.value; + }, + + pickuptypeChange(e) { + this.goodsData.pick_up_type = e.detail.value; + }, + + // 获取编辑商品数据 + async editGetGoodsInfo() { + this.$api.sendRequest({ + url: 'app.getgoodsinfo', + data:{ + id:this.goodsData.id + }, + success: res => { + console.log(res) + if(res.result.detail){ + this.goodsData = res.result.detail + console.log(this.goodsData.goods_image) + }else{ + this.$util.showToast({ + title: '商品不存在', + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/list', {}, 'redirectTo'); + }, 1000); + } + // if (res.status == 0) { + // setTimeout(() => { + // this.$util.redirectTo('/pages/goods/list', {}, 'redirectTo'); + // }, 1000); + // } + } + }) + /*var res = await getGoodsInfoById(this.goodsData.goods_id); + if (res.code == 0 && res.data) { + var data = res.data; + + data.goods_category.forEach((item, index) => { + this.shopCategoryData['store_' + index] = { + category_id: item.id, + category_name: item.category_name + } + }) + this.shopCategoryNumber = data.goods_category.length; + + // 商品分类 + data.category_id = data.goods_category[0].id; + data.category_name = data.goods_category[0].category_name.replace(/\//g, " / "); + + if (typeof data.category_id == 'string') { + this.categoryId = data.category_id.split(","); + this.categoryName = data.category_name.split(" / "); + } else { + this.categoryId = data.category_id; + this.categoryName = data.category_name; + } + + delete data.category_json; + delete data.goods_category; + + data.goods_image = data.goods_image.split(","); + + data.goods_sku_data.forEach((item) => { + if (item.sku_spec_format) item.sku_spec_format = JSON.parse(item.sku_spec_format); + }); + + if (data.goods_spec_format) { + uni.setStorageSync("editGoodsSpecFormat", data.goods_spec_format); + uni.setStorageSync("editGoodsSkuData", JSON.stringify(data.goods_sku_data)); + data.goods_spec_format = JSON.parse(data.goods_spec_format); + } else { + data.sku_id = data.goods_sku_data[0].sku_id; + data.price = data.goods_sku_data[0].price; + data.market_price = data.goods_sku_data[0].market_price; + data.cost_price = data.goods_sku_data[0].cost_price; + data.weight = data.goods_sku_data[0].weight; + data.volume = data.goods_sku_data[0].volume; + data.sku_no = data.goods_sku_data[0].sku_no; + } + + if (data.goods_class == 1) { + // 实物商品 + delete data.virtual_indate; + uni.setStorageSync("editGoodsShippingTemplateId", data.shipping_template); + uni.setStorageSync("editGoodsShippingTemplateName", data.template_name ? data.template_name : ''); + } else { + // 虚拟商品 + delete data.shipping_template; + delete data.is_free_shipping; + } + + // 商品参数 + if (data.goods_attr_format) { + uni.setStorageSync("editGoodsAttrClass", data.goods_attr_class); + uni.setStorageSync("editGoodsAttrName", data.goods_attr_name); + uni.setStorageSync("editGoodsAttrFormat", data.goods_attr_format); + data.goods_attr_format = JSON.parse(data.goods_attr_format); + } + + uni.setStorageSync("editGoodsState", data.goods_state); + uni.setStorageSync("editGoodsContent", data.goods_content); + + if (data.verify_validity_type == 1) { + this.virtualIndate = data.virtual_indate; + } else if (data.verify_validity_type == 2) { + this.virtualTime = this.$util.timeStampTurnTime(data.virtual_indate, 'Y-m-d'); + } + data.verify_num = data.goods_sku_data[0].verify_num + + this.goodsData = data; + + this.goodsData.goods_form_index = 0; + + this.goodsData.supply_index = 0; + + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: '商品不存在', + }); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/list', {}, 'redirectTo'); + }, 1000); + }*/ + }, + // 选择商品分类 + openGoodsCategoryPop(index) { + this.currCategory = index; + if (this.shopCategoryData['store_' + index].category_id) { + this.categoryId = this.shopCategoryData['store_' + index].category_id.split(','); + this.categoryName = this.shopCategoryData['store_' + index].category_name.split(' / '); + + this.categoryList.forEach((item, index) => { + item.selected = this.categoryId.indexOf(item.category_id.toString()) != -1; + if (item.selected) { + this.secondCategory = item.child_list; + } + if (item.child_list) { + if (item.selected) this.lastLevel = 2; + item.child_list.forEach(secondItem => { + secondItem.selected = this.categoryId.indexOf(secondItem.category_id.toString()) != -1; + if (secondItem.selected) { + this.thirdCategory = secondItem.child_list; + } + }); + } + }); + this.changeShow(this.categoryId.length); + } else { + this.categoryId = [0]; + this.categoryName = ['']; + this.changeShow(1); + } + this.$refs.categoryPopup.open(); + }, + closeGoodsCategoryPop() { + this.$refs.categoryPopup.close(); + }, + // 编辑规格类型 + openGoodsSpec() { + this.$util.redirectTo('/pages/goods/edit/spec'); + }, + // 编辑多规格 + openGoodsSpecEdit() { + this.$util.redirectTo('/pages/goods/edit/spec_edit', { + goods_class: this.goodsData.goods_class, + virtual_deliver_type: this.goodsData.virtual_deliver_type + }); + }, + //编辑卡密 + openCarmichaelEdit() { + this.$util.redirectTo('/pages/goods/edit/carmichael_edit', { + goods_class: this.goodsData.goods_class + }); + }, + // 编辑商品状态 + openGoodsState() { + this.$util.redirectTo('/pages/goods/edit/state', { + goods_state: this.goodsData.goods_state + }); + }, + // 编辑快递运费 + openExpressFreight() { + this.$util.redirectTo('/pages/goods/edit/express_freight', { + template_id: this.goodsData.shipping_template + }); + }, + // 编辑商品详情 + openGoodsContent() { + this.$util.redirectTo('/pages/goods/edit/content'); + }, + // 编辑商品参数 + openAttr() { + this.$util.redirectTo('/pages/goods/edit/attr'); + }, + /** + * 刷新商品图片高度 + * @param {Object} data + */ + refreshGoodsImgHeight(data) { + if (data.height == '') return; + var height = parseFloat(data.height.replace('px', '')); + this.goodsImgHeight = height + 80; + this.$forceUpdate(); + if (data.isLoad && this.$refs.loadingCover) { + // 数据渲染留点时间 + setTimeout(() => { + this.$refs.loadingCover.hide(); + }, 100); + } + uni.removeStorageSync("selectedAlbumImg"); + + }, + // 获取商品分类树状结构 + getCategoryTreeFn() { + getCategoryTree().then(res=>{ + if (res.data) { + this.categoryList = res.data; + this.categoryList.forEach((item, index) => { + item.selected = this.categoryId.indexOf(item.category_id.toString()) != -1; + if (item.selected) { + this.secondCategory = item.child_list; + this.currentLevel = 1; + } + if (item.child_list) { + if (item.selected) this.lastLevel = 2; + item.child_list.forEach(secondItem => { + secondItem.selected = this.categoryId.indexOf(secondItem.category_id.toString()) != -1; + if (secondItem.selected) { + this.thirdCategory = secondItem.child_list; + this.currentLevel = 2; + } + if (secondItem.child_list) { + if (secondItem.selected) this.lastLevel = 3; + secondItem.child_list.forEach(thirdItem => { + thirdItem.selected = this.categoryId.indexOf(thirdItem.category_id.toString()) != -1; + if (thirdItem.selected) this.currentLevel = 3; + }); + } + }); + } + }); + this.changeShow(this.lastLevel); + if (this.goodsData.goods_id == 0 && this.$refs.loadingCover) { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + } + }); + }, + changeShow(index) { + if (index == 1) { + this.showFisrt = true; + this.showSecond = false; + this.showThird = false; + } else if (index == 2) { + this.showFisrt = false; + this.showSecond = true; + this.showThird = false; + } else if (index == 3) { + this.showFisrt = false; + this.showSecond = false; + this.showThird = true; + } + this.currentLevel = index; + this.$forceUpdate(); + }, + selectCategory(category) { + this.currentLevel = category.level; + + // 如果当前选中跟上次不一样,则 要清空下级数据 + if (category.level == 1 && this.categoryId[0] > 0 && this.categoryId[0] != category.captcha_id) { + this.categoryId[1] = 0; + this.categoryName[1] = ''; + this.categoryId[2] = 0; + this.categoryName[2] = ''; + } else if (category.level == 2 && this.categoryId[1] > 0 && this.categoryId[1] != category.captcha_id) { + this.categoryId[2] = 0; + this.categoryName[2] = ''; + } + + this.categoryId[category.level - 1] = category.category_id; + this.categoryName[category.level - 1] = category.category_name; + if (category.level == 1) { + if (category.child_list) { + this.secondCategory = category.child_list; + } else { + this.categoryId[1] = 0; + this.categoryName[1] = ''; + this.categoryId[2] = 0; + this.categoryName[2] = ''; + } + } else if (category.level == 2) { + if (category.child_list) { + this.thirdCategory = category.child_list; + } else { + this.categoryId[2] = 0; + this.categoryName[2] = ''; + } + } + + this.lastLevel = 1; + this.categoryList.forEach((item, index) => { + item.selected = this.categoryId[0] == item.category_id; + if (item.child_list) { + if (item.selected) this.lastLevel = 2; + item.child_list.forEach((secondItem, secondIndex) => { + secondItem.selected = this.categoryId[1] == secondItem.category_id; + if (secondItem.child_list) { + if (secondItem.selected) this.lastLevel = 3; + } + }); + } + }); + + this.changeShow(this.lastLevel); + + this.goodsData.category_id = []; + this.goodsData.category_name = []; + + for (var i = 0; i < this.categoryId.length; i++) { + if (this.categoryId[i]) this.goodsData.category_id.push(this.categoryId[i]); + } + for (var i = 0; i < this.categoryName.length; i++) { + if (this.categoryName[i]) this.goodsData.category_name.push(this.categoryName[i]); + } + + this.goodsData.category_id = this.goodsData.category_id.toString(); + this.goodsData.category_name = this.goodsData.category_name.join(" / "); + + if ( + (this.lastLevel == 3 && this.categoryId[2]) || + (this.lastLevel == 2 && this.categoryId[1]) || + (this.lastLevel == 1 && this.categoryId[0]) + ) { + this.shopCategoryData['store_' + this.currCategory] = { + category_id: this.goodsData.category_id, + category_name: this.goodsData.category_name + }; + this.closeGoodsCategoryPop(); + } + + this.$forceUpdate(); + }, + addShopCategory() { + if (this.shopCategoryNumber == 10) { + this.$util.showToast({ + title: '商品可以属于多个分类,最多10个' + }); + return; + } + this.shopCategoryData['store_' + this.shopCategoryNumber] = {}; + ++this.shopCategoryNumber; + }, + deleteShopCategory(index) { + delete this.shopCategoryData['store_' + index]; + --this.shopCategoryNumber; + + //重置数据 + let i = 0; + let obj = {}; + for (let key in this.shopCategoryData) { + obj['store_' + i] = this.shopCategoryData[key]; + i++; + } + this.shopCategoryData = {}; + this.shopCategoryData = Object.assign(this.shopCategoryData, obj); + }, + // 刷新数据 + refreshData() { + var selectedAlbumImg = uni.getStorageSync('selectedAlbumImg'); + if (selectedAlbumImg) { + uni.setStorageSync('selectedAlbumImgTemp', selectedAlbumImg); + selectedAlbumImg = JSON.parse(selectedAlbumImg); + this.goodsData.goods_image = selectedAlbumImg.list.split(","); + this.$refs.goodsShmilyDragImg.refresh(); + } + + // 规格项 + this.goodsData.goods_spec_format = uni.getStorageSync('editGoodsSpecFormat') ? JSON.parse(uni.getStorageSync('editGoodsSpecFormat')) : []; + if (this.goodsData.goods_spec_format.length <= 0) { + + this.goodsData.carmichael = uni.getStorageSync('editGoodsCarmichael') ? JSON.parse(uni.getStorageSync('editGoodsCarmichael')) : []; + if (this.goodsData.carmichael.length > 0) { + this.carmiLength = '添加卡密【' + this.goodsData.carmichael.length + '】' + } + } + + // 多规格数据 + this.goodsData.goods_sku_data = uni.getStorageSync('editGoodsSkuData') ? JSON.parse(uni.getStorageSync('editGoodsSkuData')) : []; + if (this.goodsData.goods_sku_data.length > 0) { + this.goodsData.goods_stock = 0; + this.goodsData.goods_stock_alarm = 0; + this.goodsData.goods_sku_data.forEach((item) => { + if (item.stock) this.goodsData.goods_stock += parseInt(item.stock); + if (item.stock_alarm) this.goodsData.goods_stock_alarm += parseInt(item.stock_alarm); + }); + } + + // 快递运费 + this.goodsData.shipping_template = uni.getStorageSync('editGoodsShippingTemplateId') || 0; + this.goodsData.is_free_shipping = this.goodsData.shipping_template > 0 ? 0 : 1; + this.goodsData.template_name = uni.getStorageSync('editGoodsShippingTemplateName') || ''; + + if (uni.getStorageSync('editGoodsState') !== undefined && uni.getStorageSync('editGoodsState') !== '') { + this.goodsData.goods_state = uni.getStorageSync('editGoodsState'); + } + + if (uni.getStorageSync('editGoodsContent') != undefined && uni.getStorageSync('editGoodsContent') != '') { + this.goodsData.goods_content = uni.getStorageSync('editGoodsContent'); + } + // 商品参数 + this.goodsData.goods_attr_class = uni.getStorageSync('editGoodsAttrClass') || 0; + this.goodsData.goods_attr_name = uni.getStorageSync('editGoodsAttrName') || ''; + this.goodsData.goods_attr_format = uni.getStorageSync('editGoodsAttrFormat') ? JSON.parse(uni.getStorageSync('editGoodsAttrFormat')) : []; + this.$forceUpdate(); + }, + // 验证 + verify() { + + if (this.goodsData.goodsname.length == 0) { + this.$util.showToast({ + title: '请输入商品名称' + }); + return false; + } + + if (this.goodsData.subtitle.length > 100) { + this.$util.showToast({ + title: '商品简介不能超过100个字符' + }); + return false; + } + + if (this.goodsData.goods_image.length == 0) { + this.$util.showToast({ + title: '请上传商品图片' + }); + return false; + } + + + // if (!this.shopCategoryData.store_0.category_id) { + // this.$util.showToast({ + // title: `请选择商品分类` + // }); + // return false; + // } + + // if (this.goodsData.goods_class == 2 && this.goodsData.virtual_deliver_type == 'verify') { + // if (this.goodsData.verify_validity_type == 1) { + // if (this.virtualIndate.length == 0) { + // this.$util.showToast({ + // title: '请输入有效期' + // }); + // return false; + // } + // if (isNaN(this.virtualIndate) || !this.$util.data().regExp.number.test(this.virtualIndate)) { + // this.$util.showToast({ + // title: '[有效期]格式输入错误' + // }); + // return false; + // } + // if (this.virtualIndate < 1) { + // this.$util.showToast({ + // title: '有效期不能小于1天' + // }); + // return false; + // } + // } + + // if (this.goodsData.verify_validity_type == 2) { + // if (this.virtualTime.length == 0) { + // this.$util.showToast({ + // title: '请设置有效期' + // }); + // return false; + // } + // } + + // } + + // 单规格 + if (this.goodsData.price == 0) { + + this.$util.showToast({ + title: '请输入销售价' + }); + return false; + } + if (isNaN(this.goodsData.price) || !this.$util.data().regExp.digit.test(this.goodsData.price)) { + this.$util.showToast({ + title: '[销售价]格式输入错误' + }); + return false; + } + + if (this.goodsData.productprice.length > 0 && (isNaN(this.goodsData.productprice) || !this.$util.data().regExp.digit.test(this.goodsData.productprice))) { + this.$util.showToast({ + title: '[原价价]格式输入错误' + }); + return false; + } + + + + // 总库存 + if (this.goodsData.total == 0) { + this.$util.showToast({ + title: '请输入库存' + }); + return false; + } + + if (isNaN(this.goodsData.total) || !this.$util.data().regExp.number.test(this.goodsData.total)) { + this.$util.showToast({ + title: '[库存]格式输入错误' + }); + return false; + } + if (isNaN(this.goodsData.goods_start_count) || !this.$util.data().regExp.number.test(this.goodsData.goods_start_count)) { + this.$util.showToast({ + title: '[起售]格式输入错误' + }); + return false; + } + if (this.goodsData.goods_start_count < 0) { + this.$util.showToast({ + title: '起售数量不能小于0' + }); + return false; + } + + return true; + + }, + // 删除本地缓存 + clearStoreage() { + + // 临时选择的商品图片 + uni.removeStorageSync("selectedAlbumImg"); + uni.removeStorageSync("selectedAlbumImgTemp"); + + // 商品规格 + uni.removeStorageSync("editGoodsSpecFormat"); + uni.removeStorageSync("editGoodsSkuData"); + + //电子卡密 + uni.removeStorageSync("editGoodsCarmichael"); + uni.removeStorageSync("specName"); + + // 物流公司 + uni.removeStorageSync("editGoodsShippingTemplateId"); + uni.removeStorageSync("editGoodsShippingTemplateName"); + + // 商品状态 + uni.removeStorageSync("editGoodsState"); + + // 商品详情 + uni.removeStorageSync("editGoodsContent"); + + // 商品参数 + uni.removeStorageSync("editGoodsAttrClass"); + uni.removeStorageSync("editGoodsAttrName"); + uni.removeStorageSync("editGoodsAttrFormat"); + }, + save() { + if (!this.verify()) return; + if (this.repeatFlag) return; + this.repeatFlag = true; + this.$api.sendRequest({ + url: 'app.addgoods', + data:this.goodsData, + success: res => { + this.$util.showToast({ + title: res.result.message + }); + if (res.status == 1) { + setTimeout(() => { + this.$util.redirectTo('/pages/goods/list', {}, 'redirectTo'); + }, 1000); + } else { + this.repeatFlag = false; + } + } + }) + + // 清空规格的图片 + console.log(this.goodsData) + return false + for (var i = 0; i < this.goodsData.goods_sku_data.length; i++) { + if (this.goodsData.goods_sku_data[i].sku_images.length == 0) this.goodsData.goods_sku_data[i].sku_image = ''; + } + var data = JSON.parse(JSON.stringify(this.goodsData)); + delete data.category_name; + + data.category_json = []; + data.category_id = ''; + + for (var key in this.shopCategoryData) { + if (this.shopCategoryData[key].category_id) { + data.category_id += ',' + this.shopCategoryData[key].category_id; + data.category_json.push(this.shopCategoryData[key].category_id); + } + } + data.category_id += ','; + data.category_json = JSON.stringify(data.category_json); + if (data.goods_spec_format.length == 0) { + // 单规格数据 + var singData = { + sku_id: (data.goods_id ? data.sku_id : 0), + sku_name: data.goods_name, + spec_name: '', + sku_no: data.sku_no, + sku_spec_format: '', + price: data.price, + market_price: data.market_price, + cost_price: data.cost_price, + stock: data.goods_stock, + stock_alarm: data.goods_stock_alarm, + weight: data.weight, + volume: this.goodsData.volume, + sku_image: data.goods_image[0], + sku_images: data.goods_image.toString(), + // verify_num: data.goods_sku_data.length > 0 ? data.goods_sku_data[0].verify_num : this.goodsData.verify_num + verify_num: data.verify_num + } + var singleSkuData = JSON.stringify([singData]); + } + data.goods_image = data.goods_image.toString(); + // 商品规格json格式 + data.goods_spec_format = data.goods_spec_format.length > 0 ? JSON.stringify(data.goods_spec_format) : ''; + + // SKU商品数据 + data.goods_sku_data = data.goods_spec_format.length > 0 ? JSON.stringify(data.goods_sku_data) : + singleSkuData; + + // 商品参数json格式 + data.goods_attr_format = data.goods_attr_format.length > 0 ? JSON.stringify(data.goods_attr_format) : ''; + + data.spec_type_status = data.goods_spec_format.length > 0 ? 1 : 0; + + if (this.goodsData.verify_validity_type == 1) { + data.virtual_indate = this.virtualIndate; + } else if (this.goodsData.verify_validity_type == 2) { + data.virtual_indate = this.virtualTime; + } + + // console.log(this.goodsData.goods_spec_format,'format') + // if(this.goodsData.goods_spec_format == '[]'){ + // data.carmichael= data.carmichael + // } + var save = null; + if (data.goods_class == 3) { + save = addVirtualCardGoods; + if (data.goods_id) save = editVirtualCardGoods; + }else if (data.goods_class == 2){ + save = addVirtualGoods; + if (data.goods_id) save = editVirtualGoods; + }else { + save = addGoods; + if (data.goods_id) save = editGoods; + } + data.goods_form = this.goodsData.goods_form_index ? this.goodsForm[this.goodsData.goods_form_index - 1].id : 0; + + data.supplier_id = this.goodsData.supply_index ? this.supplyForm[this.goodsData.supply_index - 1].supplier_id : 0; + if (this.repeatFlag) return; + this.repeatFlag = true; + save(data).then(res=>{ + this.$util.showToast({ + title: res.message + }); + if (res.code == 0) { + this.clearStoreage(); + setTimeout(() => { + this.$util.redirectTo('/pages/goods/list', {}, 'tabbar'); + }, 1000); + } else { + this.repeatFlag = false; + } + }); + }, + //是否开启限购 + onLimit() { + this.goodsData.is_limit = this.goodsData.is_limit == 1 ? 0 : 1 + }, + + //限购类型 + limitChange(e) { + this.goodsData.limit_type = e + }, + /** + * 是否参与会员折扣 + */ + joinMemberDiscount() { + this.goodsData.is_consume_discount = this.goodsData.is_consume_discount == 1 ? 0 : 1; + }, + switchBtn(type) { + this.goodsData[type] = this.goodsData[type] == 1 ? 0 : 1; + }, + /** + * 推荐方式选择 + * @param {Object} e + */ + recommendWayChange(e) { + this.goodsData.recommend_way = e.detail.value; + }, + /** + * 发货选择 + * @param {Object} e + */ + virtualDeliverTypeChange(e) { + this.goodsData.virtual_deliver_type = this.virtualDeliverArray[e.detail.value]['value']; + }, + /** + * 收货选择 + * @param {Object} e + */ + virtualReceiveTypeChange(e) { + this.goodsData.virtual_receive_type = this.virtualReceiveArray[e.detail.value]['value']; + }, + /** + * 核销有效期类型 + * @param {Object} e + */ + validityTypeChange(e) { + this.goodsData.verify_validity_type = e.detail.value; + }, + /** + * 核销有效期选择 + * @param {Object} e + */ + virtualTimeChange(e) { + this.virtualTime = e.detail.value; + }, + + /** + * 团购开始时间选择 + * @param {Object} e + */ + beginChange(e) { + this.goodsData.begin_time = e.detail.value; + }, + /** + * 团购结束时间选择 + * @param {Object} e + */ + endChange(e) { + this.goodsData.end_time = e.detail.value; + }, + + /** + * 是否需要核销 + */ + isNeedVerify() { + this.goodsData.is_need_verify = this.goodsData.is_need_verify == 1 ? 0 : 1; + }, + /** + * 获取商品表单 + */ + getGoodsForm() { + getOrderFormList().then(res=>{ + if (res.data) { + let goodsForm = ['请选择商品表单']; + res.data.forEach((item, index) => { + goodsForm.push(item.form_name); + if (this.goodsData.form_id && this.goodsData.form_id == item.id) this.goodsData.goods_form_index = index + 1; + }) + this.goodsForm = res.data; + this.goodsFormArray = goodsForm; + this.$forceUpdate(); + } + }) + }, + goodsFormChange(e) { + this.goodsData.goods_form_index = e.detail.value; + this.$forceUpdate(); + }, + /** + * 获取供应商 + */ + getSupplyList() { + getSupplyList().then(res=>{ + if (res.data) { + let supplyForm = ['请选择供应商']; + res.data.forEach((item, index) => { + supplyForm.push(item.title); + if (this.goodsData.supplier_id && this.goodsData.supplier_id == item.supplier_id) this.goodsData.supply_index = index + 1; + }) + this.supplyForm = res.data; + this.supplyFormArray = supplyForm; + this.$forceUpdate(); + } + }) + }, + supplyChange(e) { + this.goodsData.supply_index = e.detail.value; + this.$forceUpdate(); + } + } +}; \ No newline at end of file diff --git a/pages_promotion/merch/public/edit.scss b/pages_promotion/merch/public/edit.scss new file mode 100644 index 0000000..37ad7b4 --- /dev/null +++ b/pages_promotion/merch/public/edit.scss @@ -0,0 +1,275 @@ +.container{ + padding-bottom: 40rpx; +} +.safe-area{ + padding-bottom: calc(constant(safe-area-inset-bottom) + 100rpx); + padding-bottom: calc(env(safe-area-inset-bottom) + 100rpx); +} +.goods-edit-wrap { + margin-bottom: 160rpx; +} +.form-title { + display: flex; + justify-content: space-between; + margin: $margin-updown $margin-both; + // padding: 0 $padding; + color: $color-tip; +} +.item-wrap uni-radio .uni-radio-input { + width: 30rpx !important; + height: 30rpx !important; +} +.item-wrap { + background: #fff; + // padding: $padding; + margin-top: $margin-updown; + .goods-type { + display: flex; + margin: 0 40rpx $margin-updown 40rpx; + flex-wrap: wrap; + view { + flex: 1; + text-align: center; + border: 1px solid $color-disabled; + color: $color-tip; + margin-right: 40rpx; + margin-top: 30rpx; + position: relative; + height: 80rpx; + line-height: 80rpx; + white-space: nowrap; + min-width: calc((100% - 100rpx) / 3); + max-width: calc((100% - 100rpx) / 3); + &:nth-child(3n+3) { + margin-right: 0; + } + .iconfont { + display: none; + } + &.selected { + .iconfont { + display: block; + position: absolute; + bottom: -22rpx; + right: -22rpx; + font-size: 80rpx; + } + } + } + } + .form-wrap { + display: flex; + align-items: center; + margin: 0 $margin-both; + border-bottom: 1px solid $color-line; + height: 100rpx; + line-height: 100rpx; + &:last-child { + border-bottom: none; + } + .required { + font-weight: bold; + } + .label { + vertical-align: middle; + margin-right: $margin-both; + } + input { + vertical-align: middle; + display: inline-block; + flex: 1; + text-align: right; + } + &.more-wrap { + .selected { + vertical-align: middle; + display: inline-block; + flex: 1; + text-align: right; + color: $color-tip; + overflow: hidden; + white-space: pre; + text-overflow: ellipsis; + &.have { + color: $color-title; + } + } + .iconfont { + color: $color-tip; + margin-left: 20rpx; + } + .action { + background-color: $color-disabled; + border-radius: 50%; + color: #fff; + width: 36rpx; + height: 36rpx; + line-height: 36rpx; + display: inline-block; + text-align: center; + font-weight: bold; + margin-right: 20rpx; + } + } + &.goods-img { + height: 200rpx; + line-height: 200rpx; + display: block; + position: relative; + .label{ + display: inline-block; + } + .img-list { + position: absolute; + width: 80%; + top: 0; + left: 100rpx; + margin-top: 40rpx; + margin-left: 40rpx; + } + .tips { + color: $color-tip; + font-size: $font-size-activity-tag; + margin-top: 20rpx; + } + } + .unit { + margin-left: 20rpx; + width: 40rpx; + } + &.join-member-discount { + .label{ + flex: 1; + } + } + + &.validity-type { + border-bottom: 1px solid $color-line!important; + } + } +} +.footer-wrap { + position: fixed; + width: 100%; + bottom: 0; + padding: 40rpx 0; + z-index: 10; + background-color: #fff; +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + display: flex; + border-bottom: 2rpx solid $color-line; + position: relative; + padding: 40rpx; + + .tit { + flex: 1; + font-size: $font-size-toolbar; + line-height: 1; + text-align: center; + } + .iconfont { + line-height: 1; + position: absolute; + right: 30rpx; + top: 50%; + transform: translate(0, -50%); + color: $color-tip; + font-size: $font-size-toolbar; + } + } + + .popup-body { + height: calc(100% - 250rpx); + &.safe-area { + height: calc(100% - 270rpx); + } + } + &.category { + height: 50vh; + .popup-header { + border-bottom: none; + } + .popup-body { + padding: 0 30rpx; + .nav { + border-bottom: 2rpx solid $color-line; + font-weight: bold; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text { + padding: 0 0 20rpx 0; + margin-right: 20rpx; + display: inline-block; + &:last-child { + padding-right: 0; + } + &.selected { + border-bottom: 2px solid; + } + } + } + .category { + height: 100%; + .item { + display: block; + margin: 20rpx 0 0; + text { + &:first-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: pre; + width: 90%; + display: inline-block; + vertical-align: middle; + } + } + .iconfont { + float: right; + } + } + .child-item{ + display: flex; + justify-content: space-between; + margin-left: 40rpx; + } + } + } + } + + &.choose-picture { + background-color: $color-bg; + .popup-header { + border-bottom: none; + background-color: #fff; + } + .popup-body { + background-color: $color-bg; + height: initial; + .select-wrap{ + background-color: #fff; + padding: 0 30rpx; + } + .item { + text-align: center; + padding: 20rpx; + background-color: #fff; + border-bottom: 1px solid $color-line; + &:last-child { + border-bottom: none; + } + &.cancle { + margin-top: 20rpx; + } + } + } + } +} diff --git a/pages_promotion/merch/public/js/list.js b/pages_promotion/merch/public/js/list.js new file mode 100644 index 0000000..5496bc4 --- /dev/null +++ b/pages_promotion/merch/public/js/list.js @@ -0,0 +1,475 @@ +export default { + data() { + return { + listStyle: '', + loadingType: 'loading', //加载更多状态 + orderType: '', + priceOrder: 'desc', //1 价格从低到高 2价格从高到低 + categoryList: [], //排序类型 + goodsList: [], + order: '', + sort: 'desc', + showScreen: false, + keyword: '', + categoryId: 0, + minPrice: '', + maxPrice: '', + isFreeShipping: false, //是否免邮 + isIphoneX: false, + coupon: 0, + emptyShow: false, + isList: true, //列表样式 + //分享所需标题 + share_title: '', + //搜索到多少件商品 + count: 0, + //当前分类名称 + category_title: '', + //优惠券数据 + coupon_name: '', + //列表瀑布流数据 + listHeight: [], + listPosition: [], + debounce: null, + brandId: 0, + merch_id:0, + merch:{}, + brandList: [], //品牌筛选项 + config: { + fontWeight: false, + padding: 0, + cartEvent: "detail", + text: "购买", + textColor: "#FFFFFF", + theme: "default", + aroundRadius: 25, + control: true, + bgColor: "#FF6A00", + style: "button", + iconDiy: { + iconType: "icon", + icon: "", + style: { + fontSize: "60", + iconBgColor: [], + iconBgColorDeg: 0, + iconBgImg: "", + bgRadius: 0, + iconColor: [ + "#000000" + ], + iconColorDeg: 0 + } + } + }, + } + }, + + onLoad(options) { + this.categoryId = options.category_id || 0; + this.keyword = options.keyword || ''; + this.coupon = options.coupon || 0; + this.goods_id_arr = options.goods_id_arr || 0; + this.brandId = options.brand_id || 0; + this.merch_id = options.merch_id || 0; + if(this.merch_id > 0){ + this.getMerch() + }else{ + uni.showModal({ + title:'提示', + content:'商家不存在', + showCancel:false, + success(e){ + uni.navigateBack({}) + } + }) + } + this.loadCategoryList(this.categoryId); + this.getBrandList(); + this.isIphoneX = this.$util.uniappIsIPhoneX(); + + //小程序分享接收source_member + if (options.source_member) { + uni.setStorageSync('source_member', options.source_member); + } + // 小程序扫码进入,接收source_member + if (options.scene) { + var sceneParams = decodeURIComponent(options.scene); + sceneParams = sceneParams.split('&'); + if (sceneParams.length) { + sceneParams.forEach(item => { + if (item.indexOf('sku_id') != -1) this.skuId = item.split('-')[1]; + if (item.indexOf('m') != -1) uni.setStorageSync('source_member', item.split('-')[1]); + if (item.indexOf('is_test') != -1) uni.setStorageSync('is_test', 1); + }); + } + } + + uni.onWindowResize(res => { + if (this.debounce) clearTimeout(this.debounce); + this.waterfallflow(0); + }) + }, + onShow() { + //记录分享关系 + if (this.storeToken && uni.getStorageSync('source_member')) { + this.$util.onSourceMember(uni.getStorageSync('source_member')); + } + }, + /** + * 转发分享 + */ + onShareAppMessage(res) { + var title = '搜索到' + this.count + '件“' + this.keyword + this.category_title + this.coupon_name + '”相关的优质商品'; + let route = this.$util.getCurrentShareRoute(this.memberInfo ? this.memberInfo.member_id : 0); + var path = route.path; + return { + title: title, + path: path, + success: res => { + }, + fail: res => { + } + }; + }, + // 分享到微信朋友圈 + onShareTimeline() { + var title = '搜索到' + this.count + '件“' + this.keyword + this.category_title + this.coupon_name + '”相关的优质商品'; + let route = this.$util.getCurrentShareRoute(this.memberInfo ? this.memberInfo.member_id : 0); + var query = route.query; + return { + title: title, + query: query, + imageUrl: '' + }; + }, + methods: { + getMerch(){ + this.$api.sendRequest({ + url: '/merch/api/merch/merchinfo', + data: { + merch_id:this.merch_id + }, + success: res => { + console.log(res) + this.merch = res.data + } + }); + }, + /** + * 获取优惠券数据 + */ + couponInfo(id) { + return new Promise(resolve => { + this.$api.sendRequest({ + url: '/coupon/api/coupon/typeinfo', + data: { + coupon_type_id: id + }, + success: res => { + if (res.code >= 0) { + resolve(res.data.coupon_name); + } + } + }); + }) + }, + /** + * 获取分类名称 + */ + share_select(data, id) { + return new Promise((resolve) => { + data.forEach((item) => { + if (item.category_id == id) { + resolve(item.category_name) + } + if (item.child_list && item.child_list.length > 0) { + item.child_list.forEach((v) => { + if (v.category_id == id) { + resolve(v.category_name) + } + if (v.child_list && v.child_list.length > 0) { + v.forEach((m) => { + if (m.category_id == id) { + resolve(m.category_name) + } + }) + + } + }) + } + }) + }) + }, + //加载分类 + loadCategoryList(fid, sid) { + this.$api.sendRequest({ + url: '/api/goodscategory/tree', + data: {}, + success: res => { + if (res.data != null) { + this.categoryList = res.data + } + } + }); + }, + getGoodsList(mescroll) { + this.$api.sendRequest({ + url: '/api/goodssku/page', + data: { + page: mescroll.num, + page_size: mescroll.size, + keyword: this.keyword, + category_id: this.categoryId, + brand_id: this.brandId, + min_price: this.minPrice, + max_price: this.maxPrice, + is_free_shipping: (this.isFreeShipping ? 1 : 0), + order: this.order, + sort: this.sort, + coupon: this.coupon, + goods_id_arr: this.goods_id_arr, + merch_id:this.merch_id + }, + success: res => { + let newArr = [] + let msg = res.message; + if (res.code == 0 && res.data) { + this.count = res.data.count; + if (res.data.page_count == 0) { + this.emptyShow = true + } + newArr = res.data.list; + newArr = newArr.map(item => { + item.id = this.genNonDuplicate(); + return item; + }); + } else { + this.$util.showToast({ + title: msg + }) + } + this.category_title = ''; + this.coupon_name = ''; + if (res.data.config) this.config = res.data.config; + if (this.categoryId) { + this.share_select(this.categoryList, this.categoryId).then(resolve => { + this.category_title = resolve + }); + } + if (this.coupon) { + this.couponInfo(this.coupon).then(resolve => { + this.coupon_name = resolve + }); + } + mescroll.endSuccess(newArr.length); + //设置列表数据 + if (mescroll.num == 1) this.goodsList = []; //如果是第一页需手动制空列表 + this.goodsList = this.goodsList.concat(newArr); //追加新数据 + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + + this.waterfallflow((mescroll.num - 1) * 10); + }, + fail: res => { + //联网失败的回调 + mescroll.endErr(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + changeListStyle() { + this.isList = !this.isList; + this.waterfallflow(0); + }, + //筛选点击 + sortTabClick(tag) { + if (tag == 'sale_num') { + this.order = 'sale_num'; + this.sort = 'desc'; + } else if (tag == 'discount_price') { + this.order = 'discount_price'; + this.sort = 'desc'; + } else if (tag == 'screen') { + //筛选 + this.showScreen = true; + return; + } else { + this.order = ''; + this.sort = ''; + } + + if (this.orderType === tag && tag !== 'discount_price') return; + + this.orderType = tag; + if (tag === 'discount_price') { + this.priceOrder = this.priceOrder === 'asc' ? 'desc' : 'asc'; + this.sort = this.priceOrder; + } else { + this.priceOrder = ''; + } + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + }, + //商品详情 + toDetail(item) { + this.$util.redirectTo('/pages/goods/detail', { + goods_id: item.goods_id + }); + }, + search() { + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + }, + selectedCategory(categoryId) { + this.categoryId = categoryId; + }, + screenData() { + if (this.minPrice != '' || this.maxPrice != '') { + // if (!Number(this.minPrice) && this.minPrice) { + // this.$util.showToast({ + // title: '请输入最低价' + // }); + // return; + // } + if (!Number(this.maxPrice) && this.maxPrice) { + this.$util.showToast({ + title: '请输入最高价' + }); + return; + } + if (Number(this.minPrice) < 0 || Number(this.maxPrice) < 0) { + this.$util.showToast({ + title: '筛选价格不能小于0' + }); + return; + } + if (this.minPrice != '' && Number(this.minPrice) > Number(this.maxPrice) && this.maxPrice) { + + this.$util.showToast({ + title: '最低价不能大于最高价' + }); + return; + } + if (this.maxPrice != '' && Number(this.maxPrice) < Number(this.minPrice)) { + this.$util.showToast({ + title: '最高价不能小于最低价' + }); + return; + } + } + this.emptyShow = false; + this.goodsList = []; + this.$refs.mescroll.refresh(); + this.showScreen = false; + }, + //重置数据 + resetData() { + this.categoryId = 0 + this.minPrice = '' + this.maxPrice = '' + this.isFreeShipping = false + }, + goodsImg(imgStr) { + let imgs = imgStr.split(','); + return imgs[0] ? this.$util.img(imgs[0], { + size: 'mid' + }) : this.$util.getDefaultImage().goods; + }, + imgError(index) { + this.goodsList[index].goods_image = this.$util.getDefaultImage().goods; + }, + showPrice(data) { + let price = data.discount_price; + if (data.member_price && parseFloat(data.member_price) < parseFloat(price)) price = data.member_price; + return price; + }, + showMarketPrice(item) { + if (item.market_price_show) { + let price = this.showPrice(item); + if (item.market_price > 0) { + return item.market_price; + } else if (parseFloat(item.price) > parseFloat(price)) { + return item.price; + } + } + return ''; + }, + goodsTag(data) { + return data.label_name || ''; + }, + /** + * 瀑布流 + */ + waterfallflow(start = 0) { + if (!this.isList) { + //页面渲染完成后的事件 + this.$nextTick(() => { + setTimeout(() => { + let listHeight = []; + let listPosition = []; + if (start != 0) { + listHeight = this.listHeight; + listPosition = this.listPosition; + } + let column = 2; + const query = uni.createSelectorQuery().in(this); + query.selectAll('.double-column .goods-item').boundingClientRect(data => { + for (let i = start; i < data.length; i++) { + if (i < column) { + let position = {}; + position.top = uni.upx2px(20) + 'px'; + if (i % column == 0) { + position.left = data[i].width * i + "px"; + } else { + position.left = data[i].width * i + (i % column * uni + .upx2px(30)) + "px"; + } + listPosition[i] = position; + listHeight[i] = data[i].height + uni.upx2px(20); + } else { + let minHeight = Math.min(...listHeight); // 找到第一列的最小高度 + let minIndex = listHeight.findIndex(item => item === minHeight) // 找到最小高度的索引 + //设置当前子元素项的位置 + let position = {}; + position.top = minHeight + uni.upx2px(20) + "px"; + position.left = listPosition[minIndex].left; + listPosition[i] = position; + //重新定义数组最小项的高度 进行累加 + listHeight[minIndex] += data[i].height + uni.upx2px(20); + } + } + this.listHeight = listHeight; + this.listPosition = listPosition; + }).exec(); + }, 50) + }) + } + }, + getBrandList() { + var data = { + page: 1, + page_size: 0 + }; + this.$api.sendRequest({ + url: '/api/goodsbrand/page', + data: data, + success: res => { + if (res.code == 0 && res.data) { + let data = res.data; + this.brandList = data.list; + } + } + }); + }, + /** + * 添加购物车回调 + */ + addCart(id) { + }, + genNonDuplicate(len = 6) { + return Number(Math.random().toString().substr(3, len) + Date.now()).toString(36); + } + } +} \ No newline at end of file diff --git a/pages_promotion/merch/public/list.scss b/pages_promotion/merch/public/list.scss new file mode 100644 index 0000000..a91416e --- /dev/null +++ b/pages_promotion/merch/public/list.scss @@ -0,0 +1,308 @@ +page { + overflow: hidden; +} +.alarm-red{ + color: red; +} +.search-wrap { + display: flex; + justify-content: space-between; + padding: 30rpx 30rpx 0; + background-color: #fff; + .search-input-inner { + display: flex; + align-items: center; + width: 460rpx; + height: 70rpx; + padding: 0 30rpx; + background-color: $color-bg; + border-radius: 100rpx; + box-sizing: border-box; + .search-input-icon { + margin-right: 10rpx; + color: $color-tip; + } + } + .search-btn { + display: flex; + justify-content: center; + align-items: center; + width: 200rpx; + height: 70rpx; + color: #fff; + border-radius: 100rpx; + margin-left: 30rpx; + text { + margin-right: 10rpx; + } + } +} +.tab-block { + // position: relative; + display: flex; + flex-direction: row; + justify-content: space-between; + background: #fff; + // margin: 0 30rpx; + .choose { + // position: absolute; + // right: 0; + min-width: 50px; + background-color: #fff; + padding: 20rpx 0rpx 0 20rpx; + height: 66rpx; + } + .tab-wrap { + // width: calc(100% - 120rpx); + width: 100%; + // position: relative; + // overflow-x: scroll; + padding: 24rpx 0rpx 0 20rpx; + height: 66rpx; + background-color: #fff; + // white-space: nowrap; + // overflow: hidden; + // text-overflow: ellipsis; + display: flex; + flex-direction: row; + justify-content: space-around; + } + .tab-item { + // display: inline-block; + } + .active { + position: relative; + // margin-right: 32rpx; + font-weight: 600; + &::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + height:6rpx; + width: 100%; + } + } +} +.item-inner { + position: relative; + margin: 0 30rpx 20rpx; + background-color: #fff; + border-radius: $border-radius; + .item-wrap { + display: flex; + padding: 30rpx; + .item-img { + margin-right: 20rpx; + width: 160rpx; + height: 160rpx; + border-radius: $border-radius; + } + .item-desc { + flex: 1; + .item-name { + width: 450rpx; + line-height: 1.6; + color: $color-title; + display: flex; + // white-space: nowrap; + align-items: center; + font-weight: 600; + .name { + flex: 1; + width: 0; + line-height: 1.4; + } + .goods-class { + font-size: 24rpx; + } + } + .item-num-wrap { + margin-top: 3px; + font-size: $font-size-tag; + color: $color-tip; + text:first-of-type { + margin-right: 30rpx; + } + view{ + font-size: 26rpx; + line-height: 1.4; + color:#999 + } + } + .item-operation { + display: flex; + align-items: center; + justify-content: space-between; + line-height: 1; + padding-top: 10rpx; + .item-price { + font-weight: bold; + } + .iconshenglve { + font-size: 48rpx; + color: $color-tip; + } + } + .promotion-ident { + line-height: 1; + padding: 6rpx 0; + text{ + font-size: $font-size-activity-tag; + padding: 2rpx 12rpx; + border-radius: 4rpx; + color: #fff; + margin-right:10rpx; + border-radius: 50rpx; + } + } + } + } + .operation { + overflow: hidden; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.6); + display: flex; + justify-content: space-around; + align-items: center; + border-radius: 10rpx; + .operation-item { + display: flex; + flex-direction: column; + align-items: center; + image { + width: 64rpx; + height: 64rpx; + } + text { + margin-top: 10rpx; + line-height: 1; + color: #fff; + } + } + } +} +.screen-wrap { + .title { + font-size: $font-size-tag; + padding: $padding; + background: $color-bg; + } + scroll-view { + height: 85%; + .item-wrap { + border-bottom: 1px solid $color-line; + &:last-child { + border-bottom: none; + } + .label { + font-size: $font-size-tag; + padding: $padding 30rpx 0 $padding; + display: flex; + justify-content: space-between; + align-items: center; + .more { + font-size: $font-size-tag; + picker { + display: inline-block; + vertical-align: middle; + view { + font-size: $font-size-tag; + } + } + .iconfont { + display: inline-block; + vertical-align: middle; + color: $color-tip; + font-size: $font-size-base; + } + } + .uni-tag { + padding: 0 $padding; + font-size: $font-size-goods-tag; + background: $color-bg; + height: 40rpx; + line-height: 40rpx; + border: 0; + margin-left: $margin-updown; + } + } + + .list { + margin: $margin-updown $margin-both; + overflow: hidden; + .uni-tag { + padding: 0 $padding; + font-size: $font-size-goods-tag; + background: $color-bg; + height: 52rpx; + line-height: 52rpx; + border: 0; + margin-right: 20rpx; + margin-bottom: 20rpx; + &:nth-child(3n) { + margin-right: 0; + } + } + } + .value-wrap { + display: flex; + justify-content: center; + align-items: center; + padding: $padding; + .h-line { + width: 40rpx; + height: 2rpx; + background-color: $color-tip; + } + input { + flex: 1; + background: $color-line; + height: 60rpx; + line-height: 60rpx; + font-size: $font-size-goods-tag; + border-radius: 50rpx; + text-align: center; + &:first-child { + margin-right: 10rpx; + } + &:last-child { + margin-left: 10rpx; + } + } + picker { + display: inline-block; + vertical-align: middle; + view { + font-size: $font-size-tag; + } + } + } + } + } + .footer { + height: 90rpx; + display: flex; + justify-content: center; + align-items: flex-start; + //position: absolute; + bottom: 0; + width: 100%; + button { + margin: 0; + width: 40%; + &:first-child { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + &:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + } + } +} diff --git a/pages_promotion/point/detail.vue b/pages_promotion/point/detail.vue new file mode 100644 index 0000000..48065c5 --- /dev/null +++ b/pages_promotion/point/detail.vue @@ -0,0 +1,506 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ pointInfo.point }}积分 + + +{{ $lang('common.currencySymbol') }}{{ pointInfo.exchange_price }} + + + + {{ $lang('common.currencySymbol') }} + {{ pointInfo.price }} + + + + 库存:{{ pointInfo.stock }}{{ pointInfo.stock >= 0 ? pointInfo.unit : '' }} + 库存:无限{{ pointInfo.stock >= 0 ? pointInfo.unit : '' }} + + + + {{ pointInfo.goods_name }} + {{ pointInfo.name }} + + + 内含{{ pointInfo.balance }}元 + 无门槛优惠券 + {{ '满' + pointInfo.at_least + '减' + pointInfo.money }} + + 满{{ pointInfo.at_least }}元 + {{ pointInfo.discount }}折 + + 最多优惠{{ pointInfo.discount_limit }}元 + + {{ pointInfo.validity_type == 1 ? '领取之日起' + pointInfo.fixed_term + '天内有效' : $util.timeStampTurnTime(pointInfo.end_time) + '到期' }} + + + + + + + + + {{ pointInfo.qr_data.qr_name }} + {{ pointInfo.qr_data.community_describe }} + + + 添加 + + + + + + 添加社群 + + + + 长按识别二维码,添加社群 + + + + + + + + + 选择 + + {{ item.spec_name }}/{{ item.spec_value_name }} + + + + + + 属性 + + {{ item.attr_name }}: {{ item.attr_value_name }} + + + + + + + + + + + 商品属性 + + + + + {{ item.attr_name }} + {{ item.attr_value_name }} + + + 确定 + + + + + + + + + 商品服务 + + + + + + + {{ item.service_name }} + {{ item.desc }} + + + + 确定 + + + + + + + + 兑换详情 + + + + + 暂无兑换详情! + + + + + + + + + + 登录之后方可兑换 + + 库存不足 + 积分不足 + 兑换 + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/point/goods_list.vue b/pages_promotion/point/goods_list.vue new file mode 100644 index 0000000..6faea6c --- /dev/null +++ b/pages_promotion/point/goods_list.vue @@ -0,0 +1,894 @@ + + + + + + + + + + + + + + + + 综合 + + + 积分 + + + + + + + 上新时间 + + + + + + + 筛选 + + + + + + + + + + + + + + + + + + {{ item.name }} + + + + {{ item.point }} + 积分 + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(item.price).toFixed(2).split(".")[0] }} + .{{ parseFloat(item.price).toFixed(2).split(".")[1] }} + + + + + 库存{{ item.stock }} + + + + + + + + + + + + + + + + + 筛选 + + + + 积分区间 + + + + + + + + + 全部分类 + + 全部 + + {{ item.category_name }} + + + + + + 重置 + 确定 + + + + + + + + + + + + + + diff --git a/pages_promotion/point/list.vue b/pages_promotion/point/list.vue new file mode 100644 index 0000000..9c033d2 --- /dev/null +++ b/pages_promotion/point/list.vue @@ -0,0 +1,594 @@ + + + + + + + + + + + + 搜索商品 + + + + + + + + + + + + + + + + 我的积分 + + + {{point}} + 积分 + + + + + 提醒 + 积分兑好礼,每日上新换不停! + + + + + + + + + 储值{{ parseFloat(item.buy_price) }}元 + 可得{{ item.point }}积分 + 去储值 + + + + + + + + 积分换券 + + + + + + + + + + + + + + + ¥ + {{ parseFloat(couponItem.money) }} + + + + {{ parseFloat(couponItem.discount) }}折 + + + + + + {{ couponItem.at_least == 0 ? '无门槛优惠券' : '满' + parseFloat(couponItem.at_least).toFixed(0) + '可用' }} + + 全场券 + 指定券 + + + + {{ couponItem.point }}积分 + 兑换 + + + + + + + + + + + + 积分换红包 + + + + + + + + + + + + + ¥ + {{ parseFloat(hongbaoItem.balance).toFixed(0) }} + + + + + {{ hongbaoItem.point }}积分 + 兑换 + + + + + + + + + + + 积分换礼品 + + + + + + + + + + + + {{ item.name }} + + + + + {{ item.point }} + 积分 + + + + + + {{ parseFloat(item.price).toFixed(2).split(".")[0] }} + .{{ parseFloat(item.price).toFixed(2).split(".")[1] }}元 + + + + 兑换 + + + + 库存:{{ isNaN(parseInt(item.stock)) ? 0 : parseInt(item.stock) }} + + 已兑:{{ isNaN(parseInt(item.sale_num)) ? 0 : parseInt(item.sale_num) }} + + + + + + + + + + + + + + + + + 积分说明 + + + + + 积分的获取 + 1、积分可在注册、签到、分享、消费、充值时获得。 + 2、在购买部分商品时可获得积分。 + 积分的使用 + 1、积分可用于兑换积分中心的商品。 + 2、积分可在参与某些活动时使用。 + 3、积分不得转让,出售,不设有效期。 + 积分的查询 + 1、积分可在会员中心中查询具体数额以及明细。 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/point/order_list.vue b/pages_promotion/point/order_list.vue new file mode 100644 index 0000000..02ddac7 --- /dev/null +++ b/pages_promotion/point/order_list.vue @@ -0,0 +1,575 @@ + + + + + + + {{ statusItem.name }} + + + + + + + + + + 订单号:{{ orderItem.order_no }} + + {{ orderItem.order_status == 0 ? '待支付' : orderItem.order_status == 1 ? '已完成' : orderItem.order_status == -1 ? '已关闭' : '' }} + + + + + + + + + + + + + + + + + + {{ orderItem.exchange_name }} + + + {{ orderItem.point }} + 积分 + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(orderItem.price).toFixed(2).split(".")[0] }} + .{{ parseFloat(orderItem.price).toFixed(2).split(".")[1] }} + + + + + {{ orderItem.num }} + + + + + + + + + 关闭 + 支付 + + + 查看详情 + + + + + + + + + + + + + + + + + + + + + + diff --git a/pages_promotion/point/payment.vue b/pages_promotion/point/payment.vue new file mode 100644 index 0000000..780f7e3 --- /dev/null +++ b/pages_promotion/point/payment.vue @@ -0,0 +1,309 @@ + + + + + + + + 确认订单 + + + + + + + + + + + + + + {{ deliveryItem.title }} + + + + + + + + + + + 由 {{ storeInfo.currStore.store_name }} 提供配送 + + + 点击切换 + + + + + + 您的附近没有可配送的门店,请选择其他配送方式 + + + + + + {{ orderCreateData.member_address.name ? orderCreateData.member_address.name : '' }} + {{ orderCreateData.member_address.mobile ? orderCreateData.member_address.mobile : '' }} + + + {{ orderCreateData.member_address.full_address ? orderCreateData.member_address.full_address : '' }} + {{ orderCreateData.member_address.address ? orderCreateData.member_address.address : '' }} + + + + + 请设置收货地址 + + + + + + + + + + 送达时间 + + {{ orderCreateData.buyer_ask_delivery_title ? orderCreateData.buyer_ask_delivery_title : '请选择送达时间' }} + + + + + + + + + + + + + + + {{ storeInfo.currStore.store_name }} + + + + + 营业时间:{{ storeInfo.currStore.open_date }} + 地址:{{ storeInfo.currStore.full_address }} + {{ storeInfo.currStore.address }} + + + + + + + + 姓名 + + + + + + 预留手机 + + + + + 自提时间 + + {{orderCreateData.buyer_ask_delivery_title}} + + + + + 当前无自提门店,请选择其它配送方式 + + + + + + + + + + 购买虚拟类商品需填写手机号,方便商家与您联系 + + + + 手机号码 + + + + + + + + + + + + + + + + + + + + + + + + + {{ orderPaymentData.exchange_info.name }} + + + {{ orderPaymentData.exchange_info.point }} + 积分 + + +{{ $lang('common.currencySymbol') }} + {{ orderPaymentData.exchange_info.price }} + + + + x + {{ orderPaymentData.goods_num }} + + + + + + + + 买家留言 + + + + + + + + + 所需积分 + + {{ orderPaymentData.point }} + 积分 + + + + 运费 + + {{ $lang('common.currencySymbol') }} + {{ orderPaymentData.delivery_money | moneyFormat }} + + + + + + + {{orderPaymentData.delivery.error_msg}} + + + + 共{{ orderPaymentData.goods_num }}件 + 合计: + {{ orderPaymentData.point }} + 积分 + + +{{ $lang('common.currencySymbol') }} + {{ orderPaymentData.order_money | moneyFormat }} + + + + 提交订单 + + + 差{{ orderPaymentData.delivery.start_money-orderPaymentData.price | moneyFormat }}起送 + + 提交订单 + + + + + + + + + + 已为您甄选出附近所有相关门店 + + + + + + + + {{ item.store_name }} + ({{ item.distance }}km) + + + + 营业时间:{{ item.open_date }} + + + 地址:{{ item.full_address }}{{ item.address }} + + + + + + 所选择收货地址附近没有可以自提的门店 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_promotion/point/public/css/list.scss b/pages_promotion/point/public/css/list.scss new file mode 100644 index 0000000..1c19734 --- /dev/null +++ b/pages_promotion/point/public/css/list.scss @@ -0,0 +1,987 @@ +.conteiner { + width: 100vw; + height: 100vh; + display: flex; + flex-direction: column; + + .point-scroll-view { + flex: 1; + height: 0; + } +} + +.point-navbar { + width: 100vw; + padding-bottom: 20rpx; + display: flex; + align-items: center; + position: fixed; + left: 0; + top: 0; + z-index: 100; + background-image: linear-gradient(360deg, #F8F8F8 0%, #E74A32 100%); + background-size: 100% 400rpx; + background-position-y: top; + background-repeat: no-repeat; + + .nav-wrap { + height: 100%; + display: flex; + padding: 0 24rpx; + box-sizing: border-box; + } + + .back { + background: rgba(255, 255, 255, .4); + display: flex; + align-items: center; + justify-content: center; + border-radius: 50%; + + .iconfont { + color: #222222; + font-size: 36rpx; + font-weight: bold; + } + } + + .search { + flex: 1; + background: #fff; + margin: 0 15rpx; + border-radius: 30rpx; + display: flex; + align-items: center; + box-sizing: border-box; + padding: 20rpx; + + .tips { + color: #4A4A4A; + font-size: 24rpx; + margin-left: 20rpx; + } + } + + .sign { + image { + width: 100%; + height: 100%; + } + } +} + +.point-navbar-block { + padding-bottom: 20rpx; +} + +.point-wrap { + background-image: linear-gradient(360deg, #F8F8F8 0%, #E74A32 100%); + background-size: 100% 380rpx; + background-repeat: no-repeat; + // #ifndef MP-WEIXIN + padding-top: 20rpx + // #endif +} + +/* 说明弹框 */ +.tips-layer { + background: #fff; + z-index: 999; + height: 40%; + width: 100%; + + .head { + position: relative; + } + + .title { + height: 80rpx; + line-height: 80rpx; + text-align: center; + font-size: $font-size-toolbar; + font-weight: 700; + } + + text { + position: absolute; + top: 8rpx; + right: 22px; + font-size: $font-size-toolbar; + font-weight: 500; + } + + .body { + width: 100%; + height: calc(100% - 80rpx); + overflow-y: scroll; + + .detail { + padding: 20rpx; + + .font-size-base { + margin-bottom: 10rpx; + } + } + + } +} + +.lineheight-clear { + line-height: 1!important; +} + +// 商品列表双列样式 +.goods-list.double-column { + display: flex; + flex-wrap: wrap; + margin-top: 20rpx; + + .goods-item { + flex: 1; + position: relative; + background-color: #fff; + flex-basis: 48%; + max-width: calc((100% - 24rpx) / 2); + margin-right: 24rpx; + margin-bottom: 24rpx; + border-radius: 18rpx; + + &:nth-child(2n) { + margin-right: 0; + } + + .goods-img { + position: relative; + overflow: hidden; + padding-top: 100%; + border-top-left-radius: 18rpx; + border-top-right-radius: 18rpx; + + image { + width: 100%; + position: absolute; + top: 50%; + left: 0; + transform: translateY(-50%); + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 16rpx; + position: absolute; + border-bottom-right-radius: $border-radius; + top: 0; + left: 0; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 0; + left: 0; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + padding: 0 20rpx 24rpx 20rpx; + } + + .goods-name { + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + margin-top: 20rpx; + font-size: 26rpx; + color: #333; + font-weight: 600; + } + + .discount-price { + display: flex; + flex-wrap: wrap; + align-items: center; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + overflow: hidden; + flex: 1; + width: 0; + margin-right: 20rpx; + view{ + line-height: 1; + color: var(--price-color); + } + .unit { + margin-right: 6rpx; + } + .point{ + font-size: 32rpx; + } + } + + .pro-info { + display: flex; + margin-top: 16rpx; + justify-content: flex-start; + & > view { + line-height: 1; + display: flex; + align-items: center; + + button { + padding: 0 16rpx; + line-height: 2; + } + &:nth-child(2) { + &:before{ + content: ' '; + width: 2rpx; + background-color: #D8D8D8; + height: 20rpx; + margin: 0 16rpx; + } + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + } + } + + .lineheight-clear { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + + .btn { + width: 96rpx; + height: 50rpx; + line-height: 50rpx; + background: #FF6C24; + border-radius: 50rpx; + text-align: center; + color: #fff; + font-size: 26rpx; + margin-top: 20rpx; + } + } + } +} + +.head-wrap { + width: 100vw; + line-height: 1; + position: relative; + height: 270rpx; + + & > image { + width: 100%; + } + + .wrap { + width: 100%; + height: 100%; + position: absolute; + z-index: 5; + top: 0; + left: 0; + } + + .member-wrap { + height: 190rpx; + padding: 50rpx 30rpx 30rpx 30rpx; + display: flex; + align-items: center; + box-sizing: border-box; + + .headimg { + width: 100rpx; + height: 100rpx; + background: #fff; + border: 2px solid #fff; + border-radius: 50%; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .point { + margin-left: 30rpx; + color: var(--btn-text-color); + font-size: 36rpx; + } + + .point-name { + font-size: $font-size-tag; + color: var(--btn-text-color); + margin-left: 4rpx; + margin-top: 5rpx; + + } + + .rule { + flex: 1; + text-align: right; + color: var(--btn-text-color); + } + + .icon-wenhao { + font-size: 24rpx; + color: var(--btn-text-color); + margin-right: 6rpx; + } + + } + + .action-wrap { + // margin: 0 30rpx; + display: flex; + justify-content: space-between; + align-items: center; + height: 80rpx; + background-color: rgba(255, 255, 255, .1); + + view { + line-height: 1; + text-align: center; + width: calc((100vw - 1rpx) / 2); + color: var(--btn-text-color); + + text { + font-size: $font-size-tag; + margin-left: 8rpx; + } + + // &:first-child { + // margin-right: 30rpx; + // } + + &.split { + width: 1rpx; + height: 50rpx; + background-color: rgba(238, 238, 238, .3); + flex-shrink: 0; + } + + image { + width: 100%; + } + } + } + + .no-login { + display: flex; + align-items: center; + justify-content: center; + text-align: center; + + text { + color: #fff; + } + + .login-btn { + display: inline-block; + height: 70rpx; + line-height: 70rpx; + width: 200rpx; + border: 1px solid #fff; + border-radius: $border-radius; + margin-bottom: 20rpx; + } + } +} + +.ns-adv { + margin: 0; + border-radius: 0; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + border-radius: 0!important; + } +} +.body-wrap { + margin-top: 20rpx; + + &.no-login{ + margin-top: 20rpx; + } + + .point-exchange-wrap { + padding: 0 24rpx; + margin-top: 30rpx; + } + + .type-wrap { + display: flex; + align-items: center; + + .type-name { + font-size: 30rpx; + color: $color-title; + line-height: 1; + } + + >view { + width: 2rpx; + height: 23rpx; + background-color: $color-tip; + margin: 0 20rpx; + } + + .type-sub { + font-size: $font-size-tag; + color: $color-tip; + line-height: 1; + } + } + + .list-wrap { + width: 100%; + + .list-wrap-scroll { + width: 100%; + flex-direction: row; + // white-space: nowrap; + line-height: 1; + } + + .list-wrap-item { + display: inline-block; + width: 330rpx; + overflow: hidden; + margin-right: 30rpx; + margin-top: 20rpx; + position: relative; + + &.coupon-list-wrap-item { + // height: 170rpx; + } + + &.hongbao-list-wrap-item { + height: 141rpx; + } + + &:nth-child(2n+2){ + margin-right: 0; + } + + .img-box { + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + + image { + width: 100%; + height: 100%; + } + } + + .content { + position: relative; + z-index: 9; + + //优惠券样式 + .coupon{ + // background-color: #FFEAEA; + background-size: 100% 100%; + background-repeat: no-repeat; + border-radius: $border-radius; + display: flex; + padding:$margin-updown 0; + .coupon_right{ + position:relative; + width:156rpx; + max-width: 156rpx; + + .coupon_btn{ + margin: 10rpx auto 0; + width:80rpx; + height:40rpx; + line-height: 40rpx; + font-size: $font-size-tag; + text-align: center; + border-radius: 10rpx; + border-width: 1px; + border-style: solid; + background: #FF3D3D; + color: #fff; + } + .coupon_num { + margin-top:10rpx; + text-align: center; + color: #FF3D3D; + } + + &::after{ + position :absolute; + top:50%; + margin-left: 0; + content:""; + width:0; + height:96%; + border-left: 2px dashed #FD463E; + transform: translateY(-50%); + } + } + .coupon_left{ + flex:1; + width: 0; + text-align: left; + padding:0 $padding; + display: flex; + align-items: center; + .price{ + margin-top: 0 !important; + padding:0; + font-weight: 600; + flex: 1; + width: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + color: #FD463E; + font-size: 56rpx; + text{ + font-size: $font-size-tag; + color: #FD463E; + } + } + .coupon-info { + flex:1; + width: 0; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-between; + height: 80%; + } + .coupon_condition{ + line-height: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-size: 26rpx; + font-weight: bold; + color: #FD463E; + } + .coupon_type { + color: #FD463E; + font-size: 24rpx; + } + } + } + + .hongbao { + .coupon_left { + .price, .coupon_condition { + color: #FFFFFF; + } + } + + .coupon_right { + .coupon_num { + color: #FFFFFF; + } + + .coupon_btn { + color: #fff; + border-color: #fff; + } + &::after{ + position :absolute; + top:0; + margin-left: 0; + content:""; + width:0; + height:100%; + border-left:0 ; + opacity: 0.2; + } + } + } + + .coupon-price-wrap { + width: 100%; + height: 105rpx; + display: flex; + justify-content: space-between; + + .coupon-price { + font-size: 48rpx; + margin-top: 10rpx; + margin-left: 20rpx; + + text { + font-size: $font-size-tag; + } + } + } + + .coupon-point { + .coupon-point-num { + width: 160rpx; + height: 44rpx; + position: relative; + + image { + width: 100%; + height: 100%; + position: absolute; + } + + text { + position: relative; + z-index: 9; + color: #FFFFFF; + font-size: 24rpx; + display: inline-block; + width: 100%; + line-height: 44rpx; + text-align: center; + vertical-align: top; + } + } + + .coupon-conditions { + font-size: $font-size-activity-tag; + color: $color-tip; + line-height: 1; + margin-top: $font-size-tag; + } + } + + .coupon-name { + font-size: $font-size-tag; + color: $color-title; + margin-top: 23rpx; + line-height: 1; + padding: 0 22rpx; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + // 红包 + &.hongbao-content { + background-color: #FFFFFF; + border-radius: 20rpx; + padding-bottom: 30rpx; + } + + .hongbao-img { + height: 330rpx; + + image { + width: 100%; + height: 100%; + } + } + + .price { + font-size: $font-size-base; + color: $color-title; + line-height: 1; + padding-left: 26rpx; + margin-top: 20rpx; + } + + .point { + font-size: $font-size-toolbar; + padding-left: 26rpx; + margin-top: 17rpx; + line-height: 1; + text { + font-size: $font-size-tag; + } + } + + .stock { + font-size: $font-size-activity-tag; + color: $color-tip; + line-height: 1; + padding-left: 26rpx; + margin-top: 20rpx; + } + } + } + } +} + +.exchange-coupon { + .list-wrap { + width: 100%; + overflow-x: scroll; + + .list-wrap-scroll { + flex-direction: column; + display: flex; + max-height: 388rpx; + flex-wrap: wrap; + + &.single-row { + max-height: 192rpx; + } + } + + .list-wrap-item { + width: 424rpx; + margin-right: 16rpx; + margin-top: 18rpx; + } + } +} + +.type-wrap-box { + display: flex; + justify-content: space-between; + + .more { + color: #ff5251; + cursor: pointer; + } +} +.card-category-title{ + display: flex; + align-items: center; + justify-content: center; + font-size: 30rpx; + color: #222; + padding: 0; + font-weight: bold; + + .before-line,.after-line{ + width: 30rpx; + height: 4rpx; + margin: 0 10rpx; + background-color: #222; + } + +} +.head-box{ + display: flex; + flex-direction: column; + background-color: #FFFFFF; + border-radius: 16rpx; + padding: 24rpx; + box-sizing: border-box; + width: calc(100% - 48rpx); + margin: 0 24rpx 20rpx 24rpx; + position: relative; + + .account-content{ + display: flex; + justify-content: space-between; + align-items: center; + + .left{ + display: flex; + align-items: center; + image{ + width: 88rpx; + height: 88rpx; + } + view{ + font-size: 32rpx; + font-weight: bold; + margin-left: 25rpx; + } + } + .right{ + display: flex; + align-items: baseline; + .point{ + font-weight: bold!important; + font-size: 38rpx; + color: #FF002D ; + } + .text{ + font-size: 28rpx; + font-weight: bold; + margin: 0 10rpx; + } + } + } + .remark{ + display: flex; + align-items: center; + margin-top: 30rpx; + padding: 25rpx 0 0; + border-top: 2rpx solid #F2F2F2; + + .label{ + border-radius: 4rpx; + border: 2rpx solid #FE172E; + color: #FE172E; + padding: 2rpx 8rpx; + font-size: 22rpx; + line-height: 1; + font-weight: bold; + } + .text{ + font-size: 24rpx; + font-weight: bold; + margin-left: 30rpx; + line-height: 1; + } + } +} + +.menu-wrap { + background: #fff; + border-radius: 24rpx; + margin: 20rpx 24rpx; + padding: 40rpx 0 30rpx 0; + + .menu-list { + display: flex; + + .menu-item { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + + .menu-tag { + position: absolute; + z-index: 2; + right: 0; + width: 58rpx; + height: 26rpx; + } + + .menu-img { + width: 86rpx; + height: 86rpx; + } + + .title { + margin-top: 16rpx; + font-size: 26rpx; + color: #222; + } + } + } +} + +.poster-wrap { + margin: 20rpx 24rpx; + display: flex; + + .poster-item { + flex: 1; + border-radius: 16rpx; + overflow: hidden; + line-height: 1; + + image { + width: 100%; + height: auto; + will-change: transform; + line-height: 1; + } + + &:last-child { + margin-left: 20rpx; + } + } +} + +.recharge-list-wrap { + margin: 20rpx 24rpx; + display: flex; + + .item-wrap { + overflow: hidden; + background: linear-gradient(321deg, #F4402B 0%, #FD7C40 100%); + border-radius: 16rpx; + position: relative; + padding-top: 40rpx; + width: calc((100% - 60rpx) / 4); + margin-right: 20rpx; + text-align: center; + + &:nth-child(4) { + margin-right: 0; + } + + &:before { + content: " "; + display: block; + position: absolute; + left: 50%; + top: 0; + transform: translate(-50%, -50%); + background: #f8f8f8; + width: 30rpx; + height: 30rpx; + border-radius: 50%; + } + + .recharge { + font-size: 26rpx; + color: #FFF20C; + white-space: nowrap; + padding: 0 10rpx; + overflow: hidden; + } + .point { + font-size: 20rpx; + color: #fff; + white-space: nowrap; + padding: 0 10rpx; + overflow: hidden; + } + .btn { + margin-top: 30rpx; + line-height: 60rpx; + font-size: 24rpx; + font-weight: 600; + color: #FFFFFF; + border-top: 2rpx dashed #fff; + } + } +} + +.exchange-hongbao { + .coupon_left { + .price text { + color: #fff!important; + } + } + .coupon_right { + width: 120rpx!important; + max-width: 120rpx; + } +} \ No newline at end of file diff --git a/pages_promotion/point/public/js/payment.js b/pages_promotion/point/public/js/payment.js new file mode 100644 index 0000000..9260bdf --- /dev/null +++ b/pages_promotion/point/public/js/payment.js @@ -0,0 +1,581 @@ +export default { + data() { + return { + isIphoneX: false, + orderCreateData: { + member_address: { + name: '', + mobile: '' + } + }, + orderPaymentData: { + exchange_info: { + type: 0 + }, + delivery: { + delivery_type: '', + express_type: [], + member_address: { + name: '', + mobile: '' + }, + local: { + info: { + start_time: 0, + end_time: 0, + time_week: [] + } + }, + }, + }, + isSub: false, + tempData: null, + // 门店信息 + storeInfo: { + storeList: [], //门店列表 + currStore: {} //当前选择门店 + }, + // 自提地址 + member_address: { + name: '', + mobile: '' + }, + // 当前时间 + timeInfo: { + week: 0, + start_time: 0, + end_time: 0, + showTime: false, + showTimeBar: false + }, + deliveryWeek: "", + // 选择自提、配送防重判断 + judge: true, + menuButtonBounding: {} + }; + }, + methods: { + // 显示弹出层 + openPopup(ref) { + this.$refs[ref].open(); + }, + // 关闭弹出层 + closePopup(ref) { + if (this.tempData) { + Object.assign(this.orderCreateData, this.tempData); + Object.assign(this.orderPaymentData, this.tempData); + this.tempData = null; + this.$forceUpdate(); + } + this.$refs[ref].close(); + }, + // 选择收货地址 + selectAddress() { + var params = { + back: '/pages_promotion/point/payment', + local: 0, + type: 1 + } + // 外卖配送需要定位地址 + if (this.orderPaymentData.delivery.delivery_type == 'local') { + params.local = 1; + params.type = 2; + } + this.$util.redirectTo('/pages_tool/member/address', params); + }, + // 获取订单初始化数据 + getOrderPaymentData() { + this.orderCreateData = uni.getStorageSync('exchangeOrderCreateData'); + var pay_flag = uni.getStorageSync("pay_flag"); // 支付中标识,防止返回时,提示,跳转错误 + if (!this.orderCreateData) { + if (pay_flag == 1) { + uni.removeStorageSync("pay_flag"); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + return; + } + + // 获取经纬度 + if (this.location) { + this.orderCreateData.latitude = this.location.latitude; + this.orderCreateData.longitude = this.location.longitude; + } + + this.$api.sendRequest({ + url: '/pointexchange/api/ordercreate/payment', + data: this.orderCreateData, + success: res => { + if (res.code >= 0) { + this.orderPaymentData = res.data; + this.orderPaymentData.timestamp = res.timestamp; + + this.handlePaymentData(); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } else { + this.$util.showToast({ + title: '未获取到创建订单所需数据!' + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 1500); + } + }, + fail: res => { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }) + }, + // 处理结算订单数据 + handlePaymentData() { + this.orderCreateData.delivery = {}; + this.orderCreateData.buyer_message = ''; + + var data = JSON.parse(JSON.stringify(this.orderPaymentData)); + this.orderCreateData.order_key = data.order_key; + + this.orderCreateData.delivery.store_id = 0; + this.orderCreateData.member_address = data.delivery.member_address; + + // 店铺配送方式 + if (data.delivery.express_type != undefined && data.delivery.express_type[0] != undefined) { + + let deliveryStorage = uni.getStorageSync('delivery'); + let delivery = data.delivery.express_type[0]; + data.delivery.express_type.forEach(item => { + if (deliveryStorage && item.name == deliveryStorage.delivery_type) { + delivery = item; + } + }); + + this.selectDeliveryType(delivery); + + } + + if (this.orderPaymentData.is_virtual) this.orderCreateData.member_address = { + mobile: data.member_account.mobile != '' ? data.member_account.mobile : '' + }; + + // Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + }, + // 转化时间字符串 + getTimeStr(val) { + var h = parseInt(val / 3600).toString(); + var m = parseInt((val % 3600) / 60).toString(); + if (m.length == 1) { + m = '0' + m; + } + if (h.length == 1) { + h = '0' + h; + } + return h + ':' + m; + }, + // 订单计算 + orderCalculate() { + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + if (this.orderCreateData.delivery.delivery_type == 'store') { + data.member_address = JSON.stringify(this.member_address); + } else { + data.member_address = JSON.stringify(data.member_address); + } + + this.$api.sendRequest({ + url: '/pointexchange/api/ordercreate/calculate', + data, + success: res => { + if (res.code >= 0) { + this.orderPaymentData.member_address = res.data.member_address; + this.orderPaymentData.delivery_money = res.data.delivery_money; + this.orderPaymentData.order_money = res.data.order_money; + + Object.assign(this.orderPaymentData.delivery, res.data.delivery); + + if (res.data.local_config) this.orderPaymentData.local_config = res.data + .config.local; + + //时间选择判断 + if (res.data.delivery.delivery_store_info) { + this.orderPaymentData.delivery_store_info = JSON.parse(res.data.delivery.delivery_store_info); + if (this.judge) { + if (this.orderPaymentData.delivery.delivery_type == "store") { + this.storetime('no'); + } else if (this.orderPaymentData.delivery.delivery_type == 'local') { + this.localtime('no'); + } + this.judge = false; + } + } + + this.createBtn(); + this.$forceUpdate(); + } else { + this.$util.showToast({ + title: res.message + }); + } + }, + }) + }, + /** + * 订单创建验证 + */ + createBtn() { + if (this.orderPaymentData.delivery && + this.orderPaymentData.delivery.delivery_type == 'local' && + this.orderPaymentData.delivery && + this.orderPaymentData.delivery.error && + this.orderPaymentData.delivery.start_money > this.orderPaymentData.price) { + return false; + } + if (this.orderPaymentData.delivery && + this.orderPaymentData.delivery.delivery_type == 'local' && + this.orderPaymentData.delivery && + this.orderPaymentData.delivery.error && + this.orderPaymentData.delivery.error !== '') { + return false; + } + return true; + }, + // 订单创建 + orderCreate() { + if (this.verify()) { + if (this.isSub) return; + this.isSub = true; + + uni.setStorageSync('paySource', 'pointexchange'); + + var data = this.$util.deepClone(this.orderCreateData); + data.delivery = JSON.stringify(data.delivery); + if (this.orderCreateData.delivery.delivery_type == 'store') { + data.member_address = JSON.stringify(this.member_address); + } else { + data.member_address = JSON.stringify(data.member_address); + } + + this.$api.sendRequest({ + url: '/pointexchange/api/ordercreate/create', + data, + success: res => { + uni.hideLoading(); + if (res.code >= 0) { + if (this.orderPaymentData.exchange_info.type == 1 && this.orderPaymentData.order_money != '0.00') { + + let orderCreateData = uni.getStorageSync('exchangeOrderCreateData'); + orderCreateData.out_trade_no = res.data; + uni.setStorageSync('exchangeOrderCreateData', orderCreateData); + + this.$refs.choosePaymentPopup.getPayInfo(res.data); + this.isSub = false; + } else { + this.$util.redirectTo('/pages_promotion/point/result', {}, 'redirectTo'); + } + } else { + this.isSub = false; + if (res.data.error_code == 10 || res.data.error_code == 12) { + uni.showModal({ + title: '订单未创建', + content: res.message, + confirmText: '去设置', + success: res => { + if (res.confirm) { + this.selectAddress(); + } + } + }) + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }, + fail: res => { + uni.hideLoading(); + this.isSub = false; + } + }) + } + }, + // 订单验证 + verify() { + if (this.orderPaymentData.exchange_info.type == 1) { + if (this.orderPaymentData.is_virtual == 1) { + if (!this.orderCreateData.member_address.mobile.length) { + this.$util.showToast({ + title: '请输入您的手机号码' + }); + return false; + } + if (!this.$util.verifyMobile(this.orderCreateData.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的手机号码' + }); + return false; + } + } + + if (this.orderPaymentData.is_virtual == 0) { + if (!this.orderCreateData.delivery || !this.orderCreateData.delivery.delivery_type) { + this.$util.showToast({ + title: '商家未设置配送方式' + }); + return false; + } + + if (this.orderCreateData.delivery.delivery_type != 'store') { + if (!this.orderCreateData.member_address) { + this.$util.showToast({ + title: '请先选择您的收货地址' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'store') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可提货的门店,请选择其他配送方式' + }); + return false; + } + if (!this.member_address.mobile) { + this.$util.showToast({ + title: '请输入预留手机' + }); + return false; + } + if (!this.$util.verifyMobile(this.member_address.mobile)) { + this.$util.showToast({ + title: '请输入正确的预留手机' + }); + return false; + } + + if (!this.orderCreateData.delivery.buyer_ask_delivery_time.start_date || !this.orderCreateData.delivery.buyer_ask_delivery_time.end_date) { + this.$util.showToast({ + title: '请选择自提时间' + }); + return false; + } + } + + if (this.orderCreateData.delivery.delivery_type == 'local') { + if (!this.orderCreateData.delivery.store_id) { + this.$util.showToast({ + title: '没有可配送的门店,请选择其他配送方式' + }); + return false; + } + if (this.orderPaymentData.config.local.is_use && this.orderPaymentData.delivery.local.info && this.orderPaymentData.delivery.local.info.time_is_open == 1 && (!this.orderCreateData.delivery.buyer_ask_delivery_time.start_date || !this.orderCreateData.delivery.buyer_ask_delivery_time.end_date)) { + this.$util.showToast({ + title: '请选择配送时间' + }); + return false; + } + } + } + + } + return true; + }, + // 显示店铺配送信息 + openSiteDelivery() { + this.tempData = { + delivery: this.$util.deepClone(this.orderPaymentData.delivery) + }; + this.$refs.deliveryPopup.open(); + }, + // 选择配送方式 + selectDeliveryType(data) { + uni.setStorageSync('delivery', { + delivery_type: data.name, + delivery_type_name: data.title + }); + this.orderCreateData.delivery.delivery_type = data.name; + this.orderCreateData.delivery.delivery_type_name = data.title; + + // 如果是门店配送 + if (data.name == 'store') { + this.storeSelected(data); + this.member_address.name = this.orderPaymentData.member_account.nickname; + if (!this.member_address.mobile) this.member_address.mobile = this.orderPaymentData.member_account.mobile != '' ? this.orderPaymentData.member_account.mobile : ''; + } + if (data.name == 'local') { + this.storeSelected(data); + } + // Object.assign(this.orderPaymentData, this.orderCreateData); + + this.judge = true; + + this.orderCalculate(); + this.$forceUpdate(); + }, + // 切换到门店 + storeSelected(data) { + // 门店列表 + this.storeInfo.storeList = data.store_list; + let store = data.store_list[0] ? data.store_list[0] : null; + this.selectPickupPoint(store); + }, + // 选择自提点 + selectPickupPoint(store_item) { + if (store_item) { + this.orderCreateData.delivery.store_id = store_item.store_id; + this.storeInfo.currStore = store_item; + // 存储所选门店 + let delivery = uni.getStorageSync('delivery') || { + name: this.orderCreateData.delivery.delivery_type, + title: this.orderCreateData.delivery.delivery_type_name + }; + delivery.store_id = store_item.store_id; + uni.setStorageSync('delivery', delivery) + } else { + this.orderCreateData.delivery.store_id = 0; + this.storeInfo.currStore = {}; + } + this.orderCreateData.delivery.buyer_ask_delivery_time = { + start_date: '', + end_date: '' + }; + this.orderCreateData.buyer_ask_delivery_title = ''; + // Object.assign(this.orderPaymentData, this.orderCreateData); + this.orderCalculate(); + this.$forceUpdate(); + this.$refs['deliveryPopup'].close(); + }, + imageError() { + let imageUrl = '' + if (this.orderPaymentData.exchange_info.type == 1) { + imageUrl = this.$util.img('public/uniapp/point/gift.png'); + } else if (this.orderPaymentData.exchange_info.type == 2) { + imageUrl = this.$util.img('public/uniapp/point/coupon.png'); + } else if (this.orderPaymentData.exchange_info.type == 3) { + imageUrl = this.$util.img('public/uniapp/point/hongbao.png'); + } else { + imageUrl = this.$util.getDefaultImage().goods; + } + this.orderPaymentData.exchange_info.image = imageUrl; + this.$forceUpdate(); + }, + // 获取时间 + getTime() { + // 必须是字符串,跟后端一致 + let weeks = ['0', '1', '2', '3', '4', '5', '6']; + let week = new Date().getDay(); + this.timeInfo.week = weeks[week]; + }, + navigateTo(sku_id) { + this.$util.redirectTo('/pages/goods/detail', { + sku_id + }); + }, + // 显示选择支付方式弹框 + openChoosePayment() { + if (this.verify() && this.orderPaymentData.exchange_info.type == 1 && this.orderPaymentData.order_money != '0.00') this.$refs.choosePaymentPopup.open(); + else this.orderCreate(); + }, + /** + * 同城配送数据处理 + */ + localtime(type = '') { + let data = this.$util.deepClone(this.orderPaymentData.delivery.local.info); + if (data.delivery_time) { + data.end_time = data.delivery_time[(data.delivery_time.length - 1)].end_time; + } + let obj = { + delivery: this.orderCreateData.delivery, + dataTime: data + } + this.$refs.TimePopup.open(obj, type); + }, + /** + * 门店自提数据处理 + */ + storetime(type = '') { + if (this.orderPaymentData.delivery.delivery_store_info) { + let data = this.$util.deepClone(this.storeInfo.currStore); + data.delivery_time = typeof data.delivery_time == 'string' && data.delivery_time ? JSON.parse(data + .delivery_time) : data.delivery_time; + if (!data.delivery_time || data.delivery_time.length == undefined && !data.delivery_time.length) { + data.delivery_time = [{ + start_time: data.start_time, + end_time: data.end_time + }] + } + let obj = { + delivery: this.orderCreateData.delivery, + dataTime: data + } + this.$refs.TimePopup.open(obj, type); + this.$forceUpdate(); + } + }, + /** + * 弹窗返回数据 + */ + selectTime(data) { + if (data.data && data.data.month) { + this.orderCreateData.delivery.buyer_ask_delivery_time = { + start_date:data.data.start_date, + end_date:data.data.end_date + }; + if (data.data.title == '今天' || data.data.title == '明天') { + this.orderCreateData.buyer_ask_delivery_title = data.data.title + '(' + data.data.time + ')' + } else { + this.orderCreateData.buyer_ask_delivery_title = data.data.month + '(' + data.data.time + ')' + } + this.orderCalculate(); + this.$forceUpdate(); + } + }, + back() { + uni.navigateBack({ + delta: 1 + }); + } + }, + onShow() { + if (uni.getStorageSync('addressBack')) { + uni.removeStorageSync('addressBack'); + } + // 判断登录 + if (!this.storeToken) { + this.$util.redirectTo('/pages_tool/login/login'); + } else { + this.getOrderPaymentData(); + } + this.judge = true; + + this.getTime(); + this.isIphoneX = this.$util.uniappIsIPhoneX() + }, + onHide() { + if (this.$refs.loadingCover) this.$refs.loadingCover.show(); + }, + onLoad() { + if (!this.location) this.$util.getLocation(); + // #ifdef MP + this.menuButtonBounding = uni.getMenuButtonBoundingClientRect(); + // #endif + }, + watch: { + location: function(nVal) { + if (nVal) { + this.getOrderPaymentData(); + } + } + }, + filters: { + // 金额格式化输出 + moneyFormat(money) { + return parseFloat(money).toFixed(2); + } + } +} \ No newline at end of file diff --git a/pages_promotion/point/result.vue b/pages_promotion/point/result.vue new file mode 100644 index 0000000..f109295 --- /dev/null +++ b/pages_promotion/point/result.vue @@ -0,0 +1,93 @@ + + + + + + + {{ $lang('exchangeSuccess') }} + + {{ $lang('see') }} + {{ $lang('goHome') }} + + + + + + + diff --git a/pages_tool/agreement/contenr.vue b/pages_tool/agreement/contenr.vue new file mode 100644 index 0000000..41b7087 --- /dev/null +++ b/pages_tool/agreement/contenr.vue @@ -0,0 +1,55 @@ + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/article/detail.vue b/pages_tool/article/detail.vue new file mode 100644 index 0000000..e86ed84 --- /dev/null +++ b/pages_tool/article/detail.vue @@ -0,0 +1,159 @@ + + + + {{ detail.article_title }} + + 发表时间: {{ $util.timeStampTurnTime(detail.create_time) }} + + + + + 阅读: + {{ detail.read_num + detail.initial_read_num }} + + + {{ detail.dianzan_num + detail.initial_dianzan_num }} + 人已赞 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/article/list.vue b/pages_tool/article/list.vue new file mode 100644 index 0000000..499d256 --- /dev/null +++ b/pages_tool/article/list.vue @@ -0,0 +1,221 @@ + + + + + + + + + + + + + {{ item.article_title }} + + + + {{ item.category_name }} + + {{ $util.timeStampTurnTime(item.create_time, 'date') }} + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/components/chat-message/chat-message.vue b/pages_tool/components/chat-message/chat-message.vue new file mode 100644 index 0000000..de52ecd --- /dev/null +++ b/pages_tool/components/chat-message/chat-message.vue @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 客服不在线 + + + 客服在线 + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/components/img-cropping/cropping.vue b/pages_tool/components/img-cropping/cropping.vue new file mode 100644 index 0000000..bc32eec --- /dev/null +++ b/pages_tool/components/img-cropping/cropping.vue @@ -0,0 +1,1484 @@ + + + + + + + + + + 取消 + + + + 上传 + + + + 上传 + + + + + + + + + diff --git a/pages_tool/components/myp-one/myp-one.vue b/pages_tool/components/myp-one/myp-one.vue new file mode 100644 index 0000000..4b97fc6 --- /dev/null +++ b/pages_tool/components/myp-one/myp-one.vue @@ -0,0 +1,234 @@ + + + + + + + + + ● + + {{ codeArr[index] ? codeArr[index] : '' }} + + + + + + + + + + diff --git a/pages_tool/components/ns-chat/ns-chat-goods.vue b/pages_tool/components/ns-chat/ns-chat-goods.vue new file mode 100644 index 0000000..cfc0cea --- /dev/null +++ b/pages_tool/components/ns-chat/ns-chat-goods.vue @@ -0,0 +1,142 @@ + + + + + + {{ goodsInfo.sku_name ? goodsInfo.sku_name : goodsInfo.goods_name }} + + + ¥ + {{ goodsInfo.price }} + + 已发送 + + + + + + + {{ goodsDetail.sku_name ? goodsDetail.sku_name : goodsDetail.goods_name }} + + + ¥ + {{ goodsDetail.price }} + + 发送 + + + + + + + + + diff --git a/pages_tool/components/ns-chat/ns-chat-order.vue b/pages_tool/components/ns-chat/ns-chat-order.vue new file mode 100644 index 0000000..334c9fd --- /dev/null +++ b/pages_tool/components/ns-chat/ns-chat-order.vue @@ -0,0 +1,149 @@ + + + + + + {{ orderdetails.order_goods ? orderdetails.order_goods[0].sku_name : '' }} + 订单状态:{{ orderdetails.order_status_name }} + 配送方式:{{ orderdetails.delivery_type_name }} + + + ¥ + {{ orderdetails.order_goods ? orderdetails.order_goods[0].price : '' }} + + 发送 + + + + + + + {{ orderInfo.order_goods ? orderInfo.order_goods[0].sku_name : '' }} + 订单状态:{{ orderInfo.order_status_name }} + 配送方式:{{ orderInfo.delivery_type_name }} + + + ¥ + {{ orderInfo.order_goods ? orderInfo.order_goods[0].price : '' }} + + 已发送 + + + + + + + + + diff --git a/pages_tool/components/ns-chat/ns-chat-receiveGoods.vue b/pages_tool/components/ns-chat/ns-chat-receiveGoods.vue new file mode 100644 index 0000000..96edabb --- /dev/null +++ b/pages_tool/components/ns-chat/ns-chat-receiveGoods.vue @@ -0,0 +1,142 @@ + + + + + + {{ goodsInfo.goods_name }} + + 库存:{{ goodsInfo.stock }} + 销量:{{ goodsInfo.sale_num }} + + + + ¥ + {{ goodsInfo.price }} + + + 查看商品 + + + + + + + + + + + diff --git a/pages_tool/components/ns-progress/ns-progress.vue b/pages_tool/components/ns-progress/ns-progress.vue new file mode 100644 index 0000000..e3afc36 --- /dev/null +++ b/pages_tool/components/ns-progress/ns-progress.vue @@ -0,0 +1,37 @@ + + + + + + + diff --git a/pages_tool/components/sx-rate/common.js b/pages_tool/components/sx-rate/common.js new file mode 100644 index 0000000..6e559dc --- /dev/null +++ b/pages_tool/components/sx-rate/common.js @@ -0,0 +1,6 @@ +export function getClientRect(selector, component) { + return new Promise((resolve, reject) => { + let query = component ? uni.createSelectorQuery().in(component) : uni.createSelectorQuery(); + return query.select(selector).boundingClientRect(resolve).exec() + }) +} diff --git a/pages_tool/components/sx-rate/index.vue b/pages_tool/components/sx-rate/index.vue new file mode 100644 index 0000000..6f99821 --- /dev/null +++ b/pages_tool/components/sx-rate/index.vue @@ -0,0 +1,218 @@ + + + + + + + + + + + + + diff --git a/pages_tool/components/sx-rate/sx-rate/iconfont.css b/pages_tool/components/sx-rate/sx-rate/iconfont.css new file mode 100644 index 0000000..48200e0 --- /dev/null +++ b/pages_tool/components/sx-rate/sx-rate/iconfont.css @@ -0,0 +1,21 @@ +@font-face {font-family: "iconfont"; + src: url('~@/pages_tool/components/sx-rate/sx-rate/iconfont.eot?t=1574760464482'); /* IE9 */ + src: url('~@/pages_tool/components/sx-rate/sx-rate/iconfont.eot?t=1574760464482#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAK8AAsAAAAABnAAAAJwAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAp8gQgBNgIkAwgLBgAEIAWEbQcuG6wFyA4lTcHACOEZBUg8fL/2O3f3fTHEkoh28SSayCSxkkgQG6Uz3UvYITu9Qr5K0Vh6Ij6f+8CXKzVBHDvWa6d0lSfK57mc3gQ6kGt8oBz3ojUG9QLqxYEU6B4YRVYqecPYBS7hMYG6QWF0dlOycoGxxFoViFuxkALGuYAksXRVKNccTOJdSTV7zbSAt/D78Y8XxmRKOavq5CZZAOK+7u2svLVode0TggR0vIQc84BEXNQmjugJxumpJ/SNAvsqD77ui8K3i71aBPvrrNIm6IfSe5K58ltNZ3BbU40Blkf9OmKsIW/Un1qddc4dcSma3ArIX7PPXdlxK5l2zJ+aD6TXnQqmu330wqpeWkYN/OnNm/0trU+YvqNR4UN99f+x/tApIFTfR7u39X4gKPnb9pOX5RAQB6DYyc/zOKCD4OUp6KiiPeqnapbAp56NdegrdhLo5wKq+3UG/0fWcyDpCsuWJVVWO5oZO29bXR0FwJ4uV2ONvTeTCVW9I1wVAylyVeNkYudR0rCOsqoN1M1JPd7QDdMTqYZZXQChwwYybT6Q63BIJvYSJX1eUNYReqi7CrsLGyZDbJqIEUWQAPLroJhWKhjHQUyj8mwkrJJROKsI+XyENeIw5LI4xXQqUiA8xxZNtZBHCAMZrJTDFPAcksmUUIWVEkQTlogQVQSbzdS9iUUr5cDUDgyhEIgAxFcHEqMpKTD+eMK09PlsiFAVGQpu6atJ5kMwDfHsEBcLpweZqlX06ruXVzSqCfEQBANiYEpyUAqYh8jIKEGq+nkSCI1gEY2IqURg28OYvlrW+nr5152AOsuUhV2fSy+EwgAAAA==') format('woff2'), + url('~@/pages_tool/components/sx-rate/sx-rate/iconfont.woff?t=1574760464482') format('woff'), + url('~@/pages_tool/components/sx-rate/sx-rate/iconfont.ttf?t=1574760464482') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ + url('~@/pages_tool/components/sx-rate/sx-rate/iconfont.svg?t=1574760464482#iconfont') format('svg'); /* iOS 4.1- */ +} + +.iconfont { + font-family: "iconfont" !important; + font-size: inherit; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-star:before { + content: "\e6e3"; +} + diff --git a/pages_tool/components/sx-rate/sx-rate/iconfont.eot b/pages_tool/components/sx-rate/sx-rate/iconfont.eot new file mode 100644 index 0000000..d9e6944 Binary files /dev/null and b/pages_tool/components/sx-rate/sx-rate/iconfont.eot differ diff --git a/pages_tool/components/sx-rate/sx-rate/iconfont.svg b/pages_tool/components/sx-rate/sx-rate/iconfont.svg new file mode 100644 index 0000000..8e29477 --- /dev/null +++ b/pages_tool/components/sx-rate/sx-rate/iconfont.svg @@ -0,0 +1,29 @@ + + + + + +Created by iconfont + + + + + + + + + + + + + + diff --git a/pages_tool/components/sx-rate/sx-rate/iconfont.ttf b/pages_tool/components/sx-rate/sx-rate/iconfont.ttf new file mode 100644 index 0000000..51da8df Binary files /dev/null and b/pages_tool/components/sx-rate/sx-rate/iconfont.ttf differ diff --git a/pages_tool/components/sx-rate/sx-rate/iconfont.woff b/pages_tool/components/sx-rate/sx-rate/iconfont.woff new file mode 100644 index 0000000..e93b03f Binary files /dev/null and b/pages_tool/components/sx-rate/sx-rate/iconfont.woff differ diff --git a/pages_tool/components/sx-rate/sx-rate/iconfont.woff2 b/pages_tool/components/sx-rate/sx-rate/iconfont.woff2 new file mode 100644 index 0000000..982419b Binary files /dev/null and b/pages_tool/components/sx-rate/sx-rate/iconfont.woff2 differ diff --git a/pages_tool/components/uni-calendar/calendar.js b/pages_tool/components/uni-calendar/calendar.js new file mode 100644 index 0000000..2331f75 --- /dev/null +++ b/pages_tool/components/uni-calendar/calendar.js @@ -0,0 +1,623 @@ +/** + * @1900-2100区间内的公历、农历互转 + * @charset UTF-8 + * @github https://github.com/jjonline/calendar.js + * @Author Jea杨(JJonline@JJonline.Cn) + * @Time 2014-7-21 + * @Time 2016-8-13 Fixed 2033hex、Attribution Annals + * @Time 2016-9-25 Fixed lunar LeapMonth Param Bug + * @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year + * @Version 1.0.3 + * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] + * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] + */ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, + 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520 + ], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', + '\u620c', + '\u4ea5' + ], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', + '\u72d7', '\u732a' + ], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', + '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', + '\u5c0f\u6691', + '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', + '\u971c\u964d', + '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3' + ], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722' + ], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', + '\u5341' + ], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', + '\u51ac', + '\u814a' + ], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function(y) { + var i; + var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { + sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 + } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function(y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function(y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function(y, m) { + if (m > 12 || m < 1) { + return -1 + } // 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function(y, m) { + if (m > 12 || m < 1) { + return -1 + } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function(lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10 // 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12 // 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function(cMonth, cDay) { + var s = + '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7' // 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function(offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function(y, n) { + if (y < 1900 || y > 2100) { + return -1 + } + if (n < 1 || n > 24) { + return -1 + } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function(m) { // 月 => \u6708 + if (m > 12 || m < 1) { + return -1 + } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708' // 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function(d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; + break + case 20: + s = '\u4e8c\u5341'; + break + break + case 30: + s = '\u4e09\u5341'; + break + break + default: + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function(y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function(y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1 // undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; + var leap = 0; + var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, + 31)) / + 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; + i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; + temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i) // 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { + isLeap = false + } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; + --i + } + } + if (offset < 0) { + offset += temp; + --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1)) // 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2)) // 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { + 'lYear': year, + 'lMonth': month, + 'lDay': day, + 'Animal': this.getAnimal(year), + 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), + 'IDayCn': this.toChinaDay(day), + 'cYear': y, + 'cMonth': m, + 'cDay': d, + 'gzYear': gzY, + 'gzMonth': gzM, + 'gzDay': gzD, + 'isToday': isToday, + 'isLeap': isLeap, + 'nWeek': nWeek, + 'ncWeek': '\u661f\u671f' + cWeek, + 'isTerm': isTerm, + 'Term': Term, + 'astro': astro + } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function(y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { + return -1 + } // 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { + return -1 + } // 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { + return -1 + } // 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; + var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); + isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { + offset += day + } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/pages_tool/components/uni-calendar/uni-calendar-item.vue b/pages_tool/components/uni-calendar/uni-calendar-item.vue new file mode 100644 index 0000000..b776366 --- /dev/null +++ b/pages_tool/components/uni-calendar/uni-calendar-item.vue @@ -0,0 +1,186 @@ + + + + + + {{ weeks.date }} + + + + {{ weeks.isDay ? '今天' : weeks.lunar.IDayCn === '初一' ? weeks.lunar.IMonthCn : weeks.lunar.IDayCn }} + + + {{ weeks.extraInfo.info }} + + + + + + + + diff --git a/pages_tool/components/uni-calendar/uni-calendar.vue b/pages_tool/components/uni-calendar/uni-calendar.vue new file mode 100644 index 0000000..6234826 --- /dev/null +++ b/pages_tool/components/uni-calendar/uni-calendar.vue @@ -0,0 +1,476 @@ + + + + + + 取消 + 确定 + + + + + + + + {{ (nowDate.year || '') + '年' + (nowDate.month || '') + '月' }} + + + + + + + + + {{ nowDate.month }} + + + 日 + 一 + 二 + 三 + 四 + 五 + 六 + + + + + + + + + + + + + + diff --git a/pages_tool/components/uni-calendar/util.js b/pages_tool/components/uni-calendar/util.js new file mode 100644 index 0000000..4b423f2 --- /dev/null +++ b/pages_tool/components/uni-calendar/util.js @@ -0,0 +1,354 @@ +import CALENDAR from './calendar.js' + +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + lunar: this.getlunar(full.year, full.month - 1, beforeDate), + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + let dateCompBefore = this.dateCompare(this.startDate, fullDate) + disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + } + + if (this.endDate) { + let dateCompAfter = this.dateCompare(fullDate, this.endDate) + disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate), + afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate), + month: full.month, + lunar: this.getlunar(full.year, full.month, i), + disable: !disableBefore || !disableAfter, + isDay + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + lunar: this.getlunar(full.year, Number(full.month) + 1, i), + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + /** + * 计算阴历日期显示 + */ + getlunar(year, month, date) { + return CALENDAR.solar2lunar(year, month, date) + } + /** + * 设置打点 + */ + setSelectInfo(data, value) { + this.selected = value + this._getWeek(data) + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (before && after) { + this.multipleStatus.before = '' + this.multipleStatus.after = '' + this.multipleStatus.data = [] + } else { + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus + .after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus + .before); + } + } + } + this._getWeek(fullDate) + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/pages_tool/components/uni-nav-bar/uni-nav-bar.vue b/pages_tool/components/uni-nav-bar/uni-nav-bar.vue new file mode 100644 index 0000000..5747c52 --- /dev/null +++ b/pages_tool/components/uni-nav-bar/uni-nav-bar.vue @@ -0,0 +1,220 @@ + + + + + + + + + {{ leftText }} + + + + + + {{ title }} + + + + + + + + + {{ rightText }} + + + + + + + + + + + + + + + diff --git a/pages_tool/components/uni-status-bar/uni-status-bar.vue b/pages_tool/components/uni-status-bar/uni-status-bar.vue new file mode 100644 index 0000000..da1f445 --- /dev/null +++ b/pages_tool/components/uni-status-bar/uni-status-bar.vue @@ -0,0 +1,23 @@ + + + + + + + diff --git a/pages_tool/form/form.vue b/pages_tool/form/form.vue new file mode 100644 index 0000000..1f3c543 --- /dev/null +++ b/pages_tool/form/form.vue @@ -0,0 +1,148 @@ + + + + + + + + + 请填写表单所需信息 + + 提交 + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/goods/brand.vue b/pages_tool/goods/brand.vue new file mode 100644 index 0000000..35322fb --- /dev/null +++ b/pages_tool/goods/brand.vue @@ -0,0 +1,125 @@ + + + + + + + + + + {{ item.brand_name }} + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/goods/coupon.vue b/pages_tool/goods/coupon.vue new file mode 100644 index 0000000..e8d99a8 --- /dev/null +++ b/pages_tool/goods/coupon.vue @@ -0,0 +1,460 @@ + + + + + + 全部 + 满减券 + 折扣券 + + + + + + + + + + + + + ¥ + {{ parseFloat(item.money) }} + + + {{ parseFloat(item.discount) }} + 折 + + 满{{ item.at_least }}元可用 + 无门槛优惠券 + + + + + {{ item.coupon_name }} + 指定商品 + 全场商品 + + (最大优惠{{ item.discount_limit }}元) + + {{ item.use_channel_name }} + + + + 有效期:{{ $util.timeStampTurnTime(item.end_time) }} + + 有效期:领取之日起{{ item.fixed_term }}日内有效 + 有效期:长期有效 + + + 领取 + 去使用 + 已抢光 + 已过期 + 已达上限 + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/goods/coupon_receive.vue b/pages_tool/goods/coupon_receive.vue new file mode 100644 index 0000000..7fc4b73 --- /dev/null +++ b/pages_tool/goods/coupon_receive.vue @@ -0,0 +1,352 @@ + + + + + + + + + {{ info.coupon_name }} + ¥{{ info.money }} + {{ info.discount }}折 + 满{{ info.at_least }}元使用 + 无门槛优惠券 + 有效期至 {{ $util.timeStampTurnTime(info.end_time) }} + 领取之日起{{ info.fixed_term }}天内有效 + 长期有效 + + {{ info.use_channel_name }} + + + 适用门店:{{ info.use_store_name}} + + + {{ button }} + {{ button }} + + + 注:扫描二维码或点击右上角进行分享 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/goods/evaluate.vue b/pages_tool/goods/evaluate.vue new file mode 100644 index 0000000..254dc6b --- /dev/null +++ b/pages_tool/goods/evaluate.vue @@ -0,0 +1,342 @@ + + + + + + {{ item.name }}({{ item.count }}) + + + + + + + + + + + + + + + + {{ item.member_name[0] }}***{{ item.member_name[item.member_name.length - 1] }} + + {{ item.member_name }} + {{ $util.timeStampTurnTime(item.create_time) }} + + + + + + {{ item.content }} + + + + + + + + + + 商家回复: + {{ item.explain_first }} + + + + 追加评价 + {{ item.again_content }} + + + + + + + + + + 商家回复: + {{ item.again_explain }} + + + + + + + + + + + + + diff --git a/pages_tool/goods/not_exist.vue b/pages_tool/goods/not_exist.vue new file mode 100644 index 0000000..0dc8b4a --- /dev/null +++ b/pages_tool/goods/not_exist.vue @@ -0,0 +1,43 @@ + + + + + + 您查看的商品不存在,可能已下架或被删除 + + + + + + + diff --git a/pages_tool/goods/search.vue b/pages_tool/goods/search.vue new file mode 100644 index 0000000..72bcd9c --- /dev/null +++ b/pages_tool/goods/search.vue @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + + + 历史搜索 + + + + + {{ item }} + + + + + + + + + + + + + 热门搜索 + + + + {{ item }} + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/help/detail.vue b/pages_tool/help/detail.vue new file mode 100644 index 0000000..4eabe01 --- /dev/null +++ b/pages_tool/help/detail.vue @@ -0,0 +1,141 @@ + + + + {{ detail.title }} + + + 发表时间: {{ $util.timeStampTurnTime(detail.create_time) }} + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/help/list.vue b/pages_tool/help/list.vue new file mode 100644 index 0000000..77efc6c --- /dev/null +++ b/pages_tool/help/list.vue @@ -0,0 +1,135 @@ + + + + + + {{ item.class_name }} + {{ s_item.title }} + + + + + + + + + + + + + + + + diff --git a/pages_tool/index/diy.vue b/pages_tool/index/diy.vue new file mode 100644 index 0000000..ca7371e --- /dev/null +++ b/pages_tool/index/diy.vue @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 我知道了 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/index/public/js/diy.js b/pages_tool/index/public/js/diy.js new file mode 100644 index 0000000..c5db99d --- /dev/null +++ b/pages_tool/index/public/js/diy.js @@ -0,0 +1,12 @@ +export default { + data() { + return { + diyRoute: '/pages_tool/index/diy' + }; + }, + onLoad(option) { + }, + onShow() { + }, + methods: {}, +} diff --git a/pages_tool/login/find.vue b/pages_tool/login/find.vue new file mode 100644 index 0000000..ab04b00 --- /dev/null +++ b/pages_tool/login/find.vue @@ -0,0 +1,439 @@ + + + + + + + 请输入手机号 + 请确认您的账号已绑定此手机号 + + + + 请输入验证码 + + 已将验证码发送至手机号:{{ formData.mobile }} + + + + + 请设置新的密码 + 建议您的新密码以简单好记为标准 + + + + + + + + + + + + + + + {{ $lang('next') }} + + + + + + {{ codeText }} + + + + + + + + + + + + {{ $lang('save') }} + + + + + + + + diff --git a/pages_tool/login/login.vue b/pages_tool/login/login.vue new file mode 100644 index 0000000..175c51e --- /dev/null +++ b/pages_tool/login/login.vue @@ -0,0 +1,484 @@ + + + + + + 您好, + + 欢迎使用 + + + + + + + + + + + + + + + + + + + + 忘记密码? + + + + + + + {{ dynacodeData.codeText }} + + + + + + 登录 + + + + 若您未注册,则登录后将自动帮您注册。注册即视为同意 《隐私条款》 《用户服务协议》 + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/login/public/css/common.scss b/pages_tool/login/public/css/common.scss new file mode 100644 index 0000000..3977688 --- /dev/null +++ b/pages_tool/login/public/css/common.scss @@ -0,0 +1,209 @@ +/deep/.uni-scroll-view { + background-color: #fff; +} + +/deep/.uni-scroll-view::-webkit-scrollbar { + /* 隐藏滚动条,但依旧具备可以滚动的功能 */ + display: none; +} +page { + width: 100%; + background: #fff !important; +} +.align-right { + color: #838383; +} + +.container { + width: 100vw; + height: 100vh; +} +.t-b { + text-align: left; + font-size: 42rpx; + color: #ffffff; + padding: 130rpx 0 50rpx 70rpx; + font-weight: bold; + line-height: 70rpx; +} +.header-wrap { + // width: 80%; + // margin: calc(120rpx + 44px) auto 0; + background-repeat: no-repeat; + background-size: contain; + background-position: bottom; + position: relative; + // margin-top:80rpx; + background-size: 100% 100%; + .title { + font-size: 60rpx; + font-weight: bold; + } +} + +.body-wrap { + margin-top: 100rpx; + padding-bottom: 100rpx; + + .form-wrap { + width: 80%; + margin: 0 auto; + + .input-wrap { + position: relative; + width: 100%; + box-sizing: border-box; + height: 60rpx; + margin-top: 60rpx; + + .iconfont { + width: 60rpx; + height: 60rpx; + position: absolute; + left: 0; + right: 0; + line-height: 60rpx; + font-size: $font-size-toolbar; + color: $color-title; + font-weight: 600; + } + + .content { + display: flex; + height: 60rpx; + border-bottom: 2rpx solid $color-line; + align-items: center; + + .input { + flex: 1; + height: 60rpx; + line-height: 60rpx; + font-size: $font-size-base; + } + + .input-placeholder { + font-size: $font-size-base; + color: #bfbfbf; + line-height: 60rpx; + } + + .captcha { + margin: 4rpx; + height: 52rpx; + width: 140rpx; + } + + .dynacode { + line-height: 60rpx; + font-size: $font-size-tag; + } + + .area-code { + line-height: 60rpx; + margin-right: 20rpx; + font-size: $font-size-base; + } + } + } + } + + .forget-section { + display: flex; + width: 80%; + margin: 40rpx auto; + + view { + flex: 1; + font-size: $font-size-tag; + line-height: 1; + } + } + .btn_view { + width: 100%; + margin: 94rpx auto auto; + padding: 0 $margin-both; + box-sizing: border-box; + } + .login-btn { + height: 90rpx; + line-height: 90rpx; + border-radius: $border-radius; + text-align: center; + border: 2rpx solid; + width: 100%; + margin: 0; + } + .auth-login { + margin-top: 20rpx; + width: calc(100% - 4rpx); + height: 90rpx; + line-height: 90rpx; + border-radius: $border-radius; + border: 2rpx solid; + color: #fff; + text-align: center; + margin-left: 0; + background-color: #fff; + text { + color: #d0d0d0; + } + .iconfont { + font-size: 70rpx; + } + .icon-weixin { + color: #1aad19; + } + } + + // .auth-login{ + + // background-color: #fff; + // display: flex; + // justify-content: center; + // align-items: center; + // text-align: center; + // padding: 0; + // text{ + // color: #D0D0D0; + // } + // .iconfont{ + // font-size: 70rpx; + // } + // } + + .regisiter-agreement { + // text-align: center; + margin-top: 30rpx; + color: #838383; + line-height: 60rpx; + font-size: $font-size-tag; + .tips{ + margin:0 10rpx; + } + } +} + +.login-btn-box { + margin-top: 50rpx; +} +.login-btn-box.active { + margin: 30rpx 0 50rpx; +} + +.back-btn { + font-size: 52rpx; + position: fixed; + left: 24rpx; + top: 72rpx; + z-index: 9; + color: #000; +} +.login-mode-box { + display: flex; + justify-content: flex-end; + color: $color-tip; + margin: auto; + margin-top: 44rpx; + font-size: 26rpx; + width: 80%; +} diff --git a/pages_tool/member/account.vue b/pages_tool/member/account.vue new file mode 100644 index 0000000..0d3a084 --- /dev/null +++ b/pages_tool/member/account.vue @@ -0,0 +1,449 @@ + + + + + + + + + + 提现到余额 + + + + + + + + {{ item.withdraw_type_name }} + + {{ item.realname }} + {{ item.mobile }} + + + + 提现账号:{{ item.bank_account }} + + + 银行名称 :{{ item.branch_bank_name }} + + + + 修改 + + + + + 设为默认账户 + + + + + + + + + + + + + + + 暂无账户信息,请添加 + {{ $lang('newAddAccount') }} + + + + + {{ $lang('newAddAccount') }} + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/account_edit.vue b/pages_tool/member/account_edit.vue new file mode 100644 index 0000000..1ff5f5a --- /dev/null +++ b/pages_tool/member/account_edit.vue @@ -0,0 +1,324 @@ + + + + + {{ $lang('name') }} + + + + {{ $lang('mobilePhone') }} + + + + {{ $lang('accountType') }} + + {{ payList[index] }} + + + + + 银行名称 + + + + 提现账号 + + + + {{ $lang('save') }} + + + + + + + + diff --git a/pages_tool/member/address.vue b/pages_tool/member/address.vue new file mode 100644 index 0000000..d3cfae4 --- /dev/null +++ b/pages_tool/member/address.vue @@ -0,0 +1,599 @@ + + + + + + + + + + + + {{ item.name }} + {{ item.mobile }} + {{ item.local_data }} + + {{ item.full_address }}{{ item.address }} + + + {{ $lang('modify') }} + + + + + + + {{ item.name }} + {{ item.mobile }} + + {{ item.full_address }}{{ item.address }} + + + {{ $lang('modify') }} + + + + + + 设为默认地址 + 设为默认地址 + + + + + + + + + + + + + + + + 暂无收货地址,请添加 + + {{ $lang('newAddAddress') }} + + + {{ $lang('getAddress') }} + + + {{ $lang('getAddress') }} + + + + + + + + + + {{ $lang('getAddress') }} + + + + {{ $lang('getAddress') }} + + + + {{ $lang('newAddAddress') }} + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/address_edit.vue b/pages_tool/member/address_edit.vue new file mode 100644 index 0000000..4cdfccf --- /dev/null +++ b/pages_tool/member/address_edit.vue @@ -0,0 +1,502 @@ + + + + + 地址信息 + + + {{ $lang('consignee') }} + * + + + + + + {{ $lang('mobile') }} + * + + + + + {{ $lang('telephone') }} + + + + + + + {{ $lang('receivingCity') }} + * + + + {{ formData.full_address ? formData.full_address : '请选择省市区县' }} + + + + + + + + + {{ $lang('receivingCity') }} + * + + + + {{ formData.full_address ? formData.full_address : '请选择省市区县' }} + + + + + + + + {{ $lang('address') }} + * + + + + + + + {{ $lang('save') }} + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/apply_withdrawal.vue b/pages_tool/member/apply_withdrawal.vue new file mode 100644 index 0000000..97b0762 --- /dev/null +++ b/pages_tool/member/apply_withdrawal.vue @@ -0,0 +1,426 @@ + + + + + + 提现到 + 微信默认钱包 + {{ bankAccountInfo.bank_account }} + + + + + + + + + + + + 请添加提现方式 + + + + + 提现金额 + + {{ $lang('common.currencySymbol') }} + + + + + + + + 可提现余额:{{ $lang('common.currencySymbol') }}{{ withdrawInfo.member_info.balance_money | moneyFormat }} + 全部提现 + + + + 最小提现金额为{{ $lang('common.currencySymbol') }}{{ withdrawInfo.config.min | moneyFormat }} + ,手续费为{{ withdrawInfo.config.rate + '%' }} + + + + + 提现 + + + + 提现记录 + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/assets.vue b/pages_tool/member/assets.vue new file mode 100644 index 0000000..bf72e84 --- /dev/null +++ b/pages_tool/member/assets.vue @@ -0,0 +1,250 @@ + + + + + + 风险提示:确认申请后您的资产将被清空且不可找回! + + + + 账户资产 + + + + {{ member_info.point }} + 积分 + + + ¥{{ member_info.balance_money }} + 现金余额 + + + ¥{{ member_info.balance }} + 储值余额 + + + {{ accountInfo.member_coupon_count }} + 优惠券 + + + + + + + 订单资产 + + + + {{ accountInfo.order_pay_count }} + 待发货 + + + {{ accountInfo.order_delivery_count }} + 待收货 + + + {{ accountInfo.order_refund_count }} + 退款中 + + + + + + + + 分销资产 + + + + ¥{{ fenxiao_info.account }} + 可提现佣金 + + + ¥{{ fenxiao_info.account_withdraw_apply }} + 提现中佣金 + + + {{ accountInfo.fenxiao_order_count }} + 待结算订单 + + + + + + 上一步 + 确认申请 + + + + + + + + diff --git a/pages_tool/member/balance.vue b/pages_tool/member/balance.vue new file mode 100644 index 0000000..1a70523 --- /dev/null +++ b/pages_tool/member/balance.vue @@ -0,0 +1,189 @@ + + + + + + + + + 账户余额 + + + + + + + + 账户余额(元) + {{ (parseFloat(balanceInfo.balance) + parseFloat(balanceInfo.balance_money)).toFixed(2) }} + + + 提现 + 充值 + + + + + + + + + 提现记录 + + + + + + + 余额明细 + + + + + + + + + + + + + + diff --git a/pages_tool/member/balance_detail.vue b/pages_tool/member/balance_detail.vue new file mode 100644 index 0000000..674e0f7 --- /dev/null +++ b/pages_tool/member/balance_detail.vue @@ -0,0 +1,359 @@ + + + + + + + + + + + + + + + {{ item.remark }} + + {{ $util.timeStampTurnTime(item.create_time) }} + + + {{ item.account_data > 0 ? '+' + item.account_data : item.account_data }}元 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/cancellation.vue b/pages_tool/member/cancellation.vue new file mode 100644 index 0000000..0212f3d --- /dev/null +++ b/pages_tool/member/cancellation.vue @@ -0,0 +1,130 @@ + + + + + + {{ agreement.title }} + + + + + + + + 勾选即表示您已阅读并同意本协议 + + 下一步 + + + + + + + + diff --git a/pages_tool/member/cancelrefuse.vue b/pages_tool/member/cancelrefuse.vue new file mode 100644 index 0000000..7e60f38 --- /dev/null +++ b/pages_tool/member/cancelrefuse.vue @@ -0,0 +1,114 @@ + + + + + + 您的申请已拒绝 + 拒绝理由:{{ reason }} + + 返回 + 重新申请 + + + + + + + + diff --git a/pages_tool/member/cancelstatus.vue b/pages_tool/member/cancelstatus.vue new file mode 100644 index 0000000..4c97bfa --- /dev/null +++ b/pages_tool/member/cancelstatus.vue @@ -0,0 +1,190 @@ + + + + + + + 1 + + 提交申请 + 您已提交申请,请耐心等待~ + + + + + 2 + + 等待审核 + 等待审核中,审核通过后您的账号将直接被删除 + + + + + + 3 + + + 审核通过,注销完成 + 您已成功注销账号,期待下一次与您相遇 + + + + + 返回 + 撤销申请 + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/cancelsuccess.vue b/pages_tool/member/cancelsuccess.vue new file mode 100644 index 0000000..1e362e5 --- /dev/null +++ b/pages_tool/member/cancelsuccess.vue @@ -0,0 +1,100 @@ + + + + + + + + 您已成功注销账号 + 待下次与您更好的相遇,如需再次使用,请重新注册 + 完成 + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/card.vue b/pages_tool/member/card.vue new file mode 100644 index 0000000..a168fa9 --- /dev/null +++ b/pages_tool/member/card.vue @@ -0,0 +1,229 @@ + + + + + + + + + + + + {{ memberInfo.nickname }} + + 有效期至:{{ $util.timeStampTurnTime(memberInfo.level_expire_time, true) }} + + + + + + + + + {{ levelInfo.level_name }} + {{ levelInfo.level_name }}可享受消费折扣和 + 会员大礼包等权益 + + + + 立即续费 + + + + + + + + + + 会员权益 + + + + + + + + + + 全场包邮 + 享受商品包邮服务 + + + + 消费折扣 + 部分商品下单可享{{ levelInfo.consume_discount / 10 }}折优惠 + + + + 积分回馈 + 下单享{{ parseFloat(levelInfo.point_feedback) }}倍积分回馈 + + + + + + + + + 开卡礼包 + + + + + + + + + 积分礼包 + 赠送{{ levelInfo.send_point }}积分 + + + + 红包礼包 + 赠送{{ parseFloat(levelInfo.send_balance) }}元红包 + + + + 优惠券礼包 + 赠送{{ levelInfo.send_coupon.split(',').length }}张优惠券 + + + + + + + + + + + + 会员卡说明 + + + + + + 会员卡说明 + {{ levelInfo.remark }} + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/card_agreement.vue b/pages_tool/member/card_agreement.vue new file mode 100644 index 0000000..7c378c9 --- /dev/null +++ b/pages_tool/member/card_agreement.vue @@ -0,0 +1,67 @@ + + + + {{ title }} + + + + + + + diff --git a/pages_tool/member/card_buy.vue b/pages_tool/member/card_buy.vue new file mode 100644 index 0000000..86b07b9 --- /dev/null +++ b/pages_tool/member/card_buy.vue @@ -0,0 +1,422 @@ + + + + + + + + + + + + + {{ memberInfo.nickname }} + + 有效期至:{{ $util.timeStampTurnTime(memberInfo.level_expire_time, true) }} + + + + + + + + + + + + + + {{ levelList[curIndex].level_name }} + {{ levelList[curIndex].level_name }}可享受消费折扣和 + 会员大礼包等权益 + + + + + + + + + + + + + + + 卡种选择 + + + + + + + + + + {{ cardType[item.key].name }} + + {{ $lang('common.currencySymbol') }} + {{ item.value }} + /{{ cardType[item.key].unit }} + + + + + + + + + + + + 会员权益 + + + + + + + + + + + 全场包邮 + 享受商品包邮服务 + + + + 消费折扣 + 部分商品下单可享{{ currCard.consume_discount / 10 }}折优惠 + + + + 积分回馈 + 下单享{{ parseFloat(currCard.point_feedback) }}倍积分回馈 + + + + + + + + + 开卡礼包 + + + + + + + + + 积分礼包 + 赠送{{ currCard.send_point }}积分 + + + + 红包礼包 + 赠送{{ parseFloat(currCard.send_balance) }}元红包 + + + + 优惠券礼包 + 赠送{{ currCard.send_coupon.split(',').length }}张优惠券 + + + + + + + + + + + + 立即续费 + + 充值开通 + 立即开通 + + {{ $lang('common.currencySymbol') }} + {{ currCard.charge_rule_arr[choiceIndex].value }} + /{{ cardType[currCard.charge_rule_arr[choiceIndex].key].unit }} + + + 购买既视为同意 + 《{{ agreement.title }}》 + + + + + + + + + + + 会员卡说明 + + + + + + 会员卡说明 + {{ currCard.remark }} + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/collection.vue b/pages_tool/member/collection.vue new file mode 100644 index 0000000..064edc2 --- /dev/null +++ b/pages_tool/member/collection.vue @@ -0,0 +1,86 @@ + + + + + + + + + + + + {{ item.sku_name }} + + + ¥ + {{ parseFloat(item.discount_price).toFixed(2).split('.')[0] }} + .{{ parseFloat(item.discount_price).toFixed(2).split('.')[1] }} + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/contact.vue b/pages_tool/member/contact.vue new file mode 100644 index 0000000..1a2abaf --- /dev/null +++ b/pages_tool/member/contact.vue @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/pages_tool/member/coupon.vue b/pages_tool/member/coupon.vue new file mode 100644 index 0000000..b646bc9 --- /dev/null +++ b/pages_tool/member/coupon.vue @@ -0,0 +1,401 @@ + + + + + + 未使用 + 已使用 + 已过期 + + + + + + + + + + + + + ¥ + {{ parseFloat(item.money) }} + + + ¥ + {{ parseFloat(item.money) }} + + + {{ parseFloat(item.discount) }} + 折 + + + 满{{ item.at_least }}元可用 + 无门槛优惠券 + + + + + {{ item.coupon_name }} + 指定商品 + (最大优惠{{ item.discount_limit }}元) + {{ item.use_channel_name }} + + + 有效期:{{ $util.timeStampTurnTime(item.end_time) }} + + 有效期:长期有效 + + + 去使用 + 已使用 + 已过期 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/footprint.vue b/pages_tool/member/footprint.vue new file mode 100644 index 0000000..3938105 --- /dev/null +++ b/pages_tool/member/footprint.vue @@ -0,0 +1,253 @@ + + + + + {{ manage ? '完成' : '管理' }} + + + + + + {{ datetime(item) }} + + + + + + + {{ goodsTag(item) }} + + + + {{ item.goods_name }} + + + + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(showPrice(item)).toFixed(2).split('.')[0] }} + .{{ parseFloat(showPrice(item)).toFixed(2).split('.')[1] }} + + + + + + + + + + + {{ $lang('common.currencySymbol') }} + {{ showMarketPrice(item) }} + + 已售{{ item.sale_num }}{{ item.unit ? item.unit : '件' }} + + + + + + + + + + + 全选 + + 删除 + + + + + + + + + + + + diff --git a/pages_tool/member/info.vue b/pages_tool/member/info.vue new file mode 100644 index 0000000..066494d --- /dev/null +++ b/pages_tool/member/info.vue @@ -0,0 +1,334 @@ + + + + + + + 头像 + + + + + + + + + + + + 昵称 + {{ memberInfoformData.nickName }} + + + + + 姓名 + {{ memberInfoformData.realName }} + + + + + 性别 + {{ memberInfoformData.sex }} + + + + + 生日 + {{ memberInfoformData.birthday }} + + + + + 手机号 + 密码 + {{ memberInfoformData.mobile }} + + + + + + + + + + + + 注销账号 + + + + + + + + + + + + + + 退出登录 + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/info_edit.vue b/pages_tool/member/info_edit.vue new file mode 100644 index 0000000..bf3de74 --- /dev/null +++ b/pages_tool/member/info_edit.vue @@ -0,0 +1,394 @@ + + + + + + + + 用户名 + + + 用户名仅可修改一次,请谨慎设置 + + 保存 + + + + + + 昵称 + + + + 保存 + + + + + + 姓名 + + + + 保存 + + + + + + 性别 + + + + + + {{ item.name }} + + + + + 保存 + + + + + + 生日 + + {{ formData.birthday ? formData.birthday : '请选择生日' }} + + + + 保存 + + + + + + + + + + 请先绑定手机再执行该操作 + 立即绑定 + + + + + 原密码 + + + + + 新密码 + + + + + 再次输入 + + {{ formData.mobileCodeText }} + + + 点击“获取动态码”,将会向您已绑定的手机号{{ memberInfoformData.mobile | mobile }}发送验证码 + + + 新密码 + + + + 再次输入 + + + + + 保存 + + + + + + + 手机号 + + + + 验证码 + + + + + 短信验证码 + + {{ formData.mobileCodeText }} + + + 保存 + + + + + + 一键授权绑定 + + + 手动绑定 + + + + + 所在地区 + + + {{ formData.fullAddress ? formData.fullAddress : '请选择省市区县' }} + + + + + 详细地址 + + + + 保存 + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/invite_friends.vue b/pages_tool/member/invite_friends.vue new file mode 100644 index 0000000..04ba327 --- /dev/null +++ b/pages_tool/member/invite_friends.vue @@ -0,0 +1,276 @@ + + + + + + + + + + + 活动说明 + + + + 活动时间:{{ $util.timeStampTurnTime(info.start_time, 1) }}至{{ $util.timeStampTurnTime(info.end_time, 1) }} + + + 立即邀请 + + + 我的好友 + + + + + + + + + + {{ item.source_member_nickname }} + + {{ $util.timeStampTurnTime(item.create_time) }} + + + + {{ item.balance }}元现金红包 + + + {{ parseInt(item.point) }}积分 + + + + {{ item.coupon_num }}张优惠券 + + + + + + 查看更多 + + + 没有更多数据了 + + + + + 您还没有邀请到新朋友哦 + 邀请好友,赚取好礼。赶紧去试试吧~ + + + + + 邀请好友奖励 + + + + + + + {{ $lang('common.currencySymbol') }} + {{ info.balance }} + + 现金红包 + + + + + + + + {{ parseInt(info.point) }} + + 积分 + + + + + + + + + {{ info.coupon.split(',').length }} + 张 + + 优惠券 + + + + + 分享给好友,让好友通过你的分享链接进入并注册登录,可获得以下奖励: + + + ● + 可得{{ info.balance }}元红包奖励 + + + ● + 可得{{ info.point }}积分 + + + ● + 可得{{ info.coupon.split(',').length }}张优惠券 + + + + ● + 可得奖励不受限制 + + + ● + 奖励上限为{{ info.max_fetch }}人 + + + + + + + 如何邀请好友 + + + + + + + 分享链接给好友 + + + + + + + + + 好友进入 + + + + + + + + + 好友注册成功获得奖励 + + + + + + + + + + + + + + + 保存图片 + + + 长按保存图片 + + + + + {{ posterMsg }} + + + + + + + + 分享 + + + + + + 分享给好友 + + + + + + + 生成分享海报 + + + + + + + 复制链接 + + + + + 取消分享 + + + + + + + + + + 活动说明 + + + + {{ info.remark }} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/level.vue b/pages_tool/member/level.vue new file mode 100644 index 0000000..899fe0d --- /dev/null +++ b/pages_tool/member/level.vue @@ -0,0 +1,381 @@ + + + + + + + + + + + + {{ memberInfo.nickname }} + 当前等级:{{ memberInfo.member_level_name }} + + + + 成长规则 + + + + + + + + + + + + {{ levelList[curIndex].level_name }} + 当前等级 + + 当前成长值 + {{ growth }} + + + + + 再获得{{ levelList[curIndex + 1].needGrowth > 0 ? levelList[curIndex + 1].needGrowth : 0 }}成长值成为{{ + levelList[curIndex + 1].level_name + }} + + + + 您现在已经是最高等级 + + + + + + 再获得{{ levelList[curIndex].needGrowth }}成长值成为{{ levelList[curIndex].level_name }} + + + + + + + + + 会员权益 + + + + 包邮服务 + 提供商品包邮服务 + + + + + + 享受消费折扣服务 + 不享受任何消费折扣和其他权益 + 提供{{ levelList[curIndex].consume_discount }}折消费折扣 + + + + + + 享受积分回馈服务 + 提供{{ levelList[curIndex].point_feedback }}倍积分回馈倍率 + + + + + + 会员礼包 + + + + 积分礼包 + 赠送{{ levelList[curIndex].send_point }}积分 + + + + + + 红包礼包 + 赠送{{ levelList[curIndex].send_balance }}元红包 + + + + + + 优惠券礼包 + 赠送{{ levelList[curIndex].coupon_length }}张优惠券 + + + + + + + + + + 优惠券 + + + + + + {{ item.coupon_name }} + + + + {{ item.money }} + 元 + + + {{ $util.numberFixed(item.discount, 1) }} + 折 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/level_growth_rules.vue b/pages_tool/member/level_growth_rules.vue new file mode 100644 index 0000000..14bdadf --- /dev/null +++ b/pages_tool/member/level_growth_rules.vue @@ -0,0 +1,275 @@ + + + + + + + 成长值说明 + + + + + 等级 + 成长值 + + + {{ item.level_name }} + {{ item.growth }} + + + + + + + 什么是成长值 + + 成长值是消费者在店铺成为会员后,通过消费计算出来的值。成长值决定会员等级,会员等级越高,所享受的会员权益和会员礼包就越多。 + + + + + 如何获得成长值 + + + 1、注册会员送x成长值。 + 2、会员充值到余额送x成长值。 + 3、会员签到送x成长值。 + 4、会员消费x元,交易完成即可获得x个成长值。 + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/modify_face.vue b/pages_tool/member/modify_face.vue new file mode 100644 index 0000000..7a2f258 --- /dev/null +++ b/pages_tool/member/modify_face.vue @@ -0,0 +1,195 @@ + + + + + + + + + + + + + 点击上传 + + + 点击上传 + + + + + 确认保存 + 重新上传 + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/pay_password.vue b/pages_tool/member/pay_password.vue new file mode 100644 index 0000000..53989b9 --- /dev/null +++ b/pages_tool/member/pay_password.vue @@ -0,0 +1,279 @@ + + + + 请输入6位支付密码,建议不要使用重复或连续数字 + 验证码已发送至{{ memberInfo.mobile | mobile }}请在下方输入4位数字验证码 + + + + {{ dynacodeData.codeText }} + + 输入短信验证码 + 请设置支付密码 + 请再次输入 + 确认 + + + + + + + \ No newline at end of file diff --git a/pages_tool/member/point.vue b/pages_tool/member/point.vue new file mode 100644 index 0000000..f226aab --- /dev/null +++ b/pages_tool/member/point.vue @@ -0,0 +1,161 @@ + + + + + + + + + 我的积分 + + + + + + + {{ pointInfo.point }} + 当前积分 + + + {{ pointInfo.totalPoint }} + 累计积分 + + + {{ pointInfo.totalConsumePoint }} + 累计消费 + + + {{ pointInfo.todayPoint }} + 今日获得 + + + + + + + + + + 积分明细 + + + + + + 积分商城 + + + + + + + + + + + + diff --git a/pages_tool/member/point_detail.vue b/pages_tool/member/point_detail.vue new file mode 100644 index 0000000..fd52a39 --- /dev/null +++ b/pages_tool/member/point_detail.vue @@ -0,0 +1,342 @@ + + + + + + + + + + + + + {{ item.type_name }} + + {{ $util.timeStampTurnTime(item.create_time) }} + + + +{{ parseInt(item.account_data) }} + {{ parseInt(item.account_data) }} + + + + + + + + + + + + + + + + diff --git a/pages_tool/member/public/css/balance.scss b/pages_tool/member/public/css/balance.scss new file mode 100644 index 0000000..09e4fd5 --- /dev/null +++ b/pages_tool/member/public/css/balance.scss @@ -0,0 +1,212 @@ +.custom-navbar { + width: 100vw; + padding-bottom: 20rpx; + position: fixed; + left: 0; + top: 0; + z-index: 100; + background: unset; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .navbar-wrap { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + } + + .navbar-title { + color: #fff; + font-size: 32rpx; + font-weight: 600; + } + + .back { + position: absolute; + color: #fff; + left: 30rpx; + font-size: 40rpx; + } +} + +.custom-navbar-block { + padding-bottom: 20rpx; +} + +.head-wrap { + // width: 100vw; + background-size: 100%; + padding: 32rpx 28rpx; + box-sizing: border-box; + // border-radius: 0 0 100% 100%/0 0 70rpx 70rpx; + overflow: hidden; + margin: 24rpx 28rpx; + border-radius: 24rpx; + // #ifdef MP-WEIXIN + padding-top: 160rpx; + // #endif + height: 352rpx; + .title { + text-align: left; + line-height: 1; + color: #F6F6F6; + margin-bottom: 24rpx; + } + + .balance { + color: var(--btn-text-color); + text-align: left; + line-height: 1; + margin-bottom: 20rpx; + // font-size: 64rpx; + font-size: 80rpx; + line-height: 112rpx; + font-weight: 500 !important; + + font-family: PingFang SC; + } + + .flex-box { + display: flex; + margin-top: 56rpx; + + .flex-item { + flex: 1; + + .num { + font-size: 34rpx; + margin-bottom: 20rpx; + color: #fff; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + + view { + text-align: left; + color: #F6F6F6; + line-height: 1; + } + } + } + .btns{ + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-flex-wrap: nowrap; + flex-wrap: nowrap; + position: relative; + gap: 22rpx; + margin-top: 32rpx; + .btn{ + -webkit-box-flex: 1; + -webkit-flex: 1; + flex: 1; + display: -webkit-box; + display: -webkit-flex; + display: flex; + -webkit-box-pack: center; + -webkit-justify-content: center; + justify-content: center; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + height: 80rpx; + box-sizing: border-box; + font-size: 32rpx; + -webkit-flex-shrink: 0; + flex-shrink: 0; + text-align: center; + font-family: PingFang SC; + border-radius: 180rpx; + background: transparent; + color: #fff; + font-style: normal; + font-weight: 500; + line-height: normal; + border: 2rpx solid #fff; + :nth-child(2) { + background: #fff; + color: #4285f8; + } + } + .recharge{ + background: #fff; + color: #4285f8; + } + } +} + +.menu-wrap { + border-radius: 20rpx; + margin: 0 24rpx; + padding: 0 24rpx; + background: #fff; + // transform: translateY(-90rpx); + + .menu-item { + display: flex; + align-items: center; + padding: 4rpx 0; + + .icon { + height: 80rpx; + border-radius: 20rpx; + display: flex; + align-items: center; + color: #fff; + margin-right: 20rpx; + + .iconfont { + font-size: 46rpx; + -webkit-background-clip: text !important; + -webkit-text-fill-color: transparent; + background: linear-gradient(135deg, #FE7849 0%, #FF1959 100%); + } + } + + .title { + font-size: 28rpx; + color: #333333; + flex: 1; + } + + .iconright { + font-size: 28rpx; + } + } +} + +.action { + position: fixed; + width: 100vw; + left: 0; + bottom: 0; + padding-bottom: 100rpx; + + view { + width: calc(100vw - 64rpx); + height: 80rpx; + line-height: 80rpx; + border-radius: 80rpx; + margin: 0 auto 30rpx auto; + text-align: center; + color: #fff; + font-size: 32rpx; + } + .recharge-withdraw { + background: #FF4646; + } + + .withdraw { + border: 4rpx solid #FF4646; + box-sizing: border-box; + line-height: 72rpx; + color: #FF4646; + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/card.scss b/pages_tool/member/public/css/card.scss new file mode 100644 index 0000000..c6d49d9 --- /dev/null +++ b/pages_tool/member/public/css/card.scss @@ -0,0 +1,670 @@ +.member-level { + width: 100%; + min-height: 100vh; + position: relative; +} +.level-top { + width: 100%; + position: relative; + image { + width: 100%; + height: 460rpx; + position: absolute; + } +} +.banner-container { + width: 100vw; + position: relative; + left: 0; + top: 0; + + .memberInfo { + width: 100%; + height: 140rpx; + padding: 40rpx 40rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + image { + width: 100rpx; + height: 100rpx; + border-radius: 50%; + border: 4rpx solid #ffffff; + box-sizing: border-box; + } + .growth-rules { + position: absolute; + display: flex; + align-items: center; + color: #fff; + right: 40rpx; + font-size: 24rpx; + z-index: 10; + .iconfont{ + margin-right: 10rpx; + } + } + .member-desc { + width: calc(100% - 20rpx - 100rpx); + height: 100%; + padding: 16rpx 0; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + + view { + font-weight: bold; + line-height: 1; + color: #ffffff; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .expire-time { + color: #ccc; + font-weight: normal; + margin-top: 10rpx; + } + } + } + + .demand { + width: 100%; + padding: 0 $padding; + box-sizing: border-box; + .demand-title { + font-size: $font-size-toolbar; + font-weight: bold; + line-height: 1; + display: flex; + align-items: center; + image { + width: 39rpx; + height: 35rpx; + margin-right: 10rpx; + } + } + .demand-info { + padding: 10rpx 24rpx; + box-sizing: border-box; + display: flex; + flex-direction: column; + margin-top: 27rpx; + border-radius: 10rpx; + justify-content: space-between; + height: 150rpx; + background: #ffffff; + .info-title { + display: flex; + justify-content: space-between; + align-items: center; + text { + &:nth-child(1) { + color: #000; + font-size: $font-size-tag; + } + &:nth-child(2) { + color: #959595; + } + } + } + progress { + margin-top: 39rpx; + } + .info-size { + display: flex; + justify-content: space-between; + align-items: center; + font-size: $font-size-tag; + color: #959595; + } + } + } + + .uni-swiper-dots { + bottom: 30rpx !important; + } + + .image-container { + box-sizing: border-box; + width: 100%; + height: 100%; + display: flex; + image { + width: 100%; + height: 100%; + } + .slide-image { + width: 535rpx; + height: 300rpx; + z-index: 200; + display: flex; + justify-content: space-between; + align-items: center; + border-radius: 20rpx; + overflow: hidden; + position: relative; + .bg-border{ + width: calc(100% - 40rpx); + height: calc(100% - 40rpx); + position: absolute; + top: 18rpx; + left: 20rpx; + border: 2rpx solid rgba(255, 255, 255, .2); + z-index: 10; + border-radius: 10rpx; + opacity: .5; + + } + .growth-rules{ + position: absolute; + right: 40rpx; + top: 40rpx; + z-index: 10; + } + .info { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + position: absolute; + left: 0; + bottom: 0; + padding: 30rpx 40rpx; + box-sizing: border-box; + .level-detail { + font-size: 52rpx; + display: flex; + align-items: center; + margin-top: 26rpx; + } + .growr-name { + font-size: 24rpx; + margin-top: 50rpx; + opacity: 0.8; + } + .growr-value { + font-size: 24rpx; + margin-top: 10rpx; + opacity: 0.8; + } + .progress { + margin-top: 30rpx; + } + .residue-growr-value { + text-align: right; + font-size: 24rpx; + margin-top: 10rpx; + } + view { + color: #ffffff; + line-height: 1.3; + } + } + .now_growth { + margin-top: 20rpx; + } + .pic { + display: flex; + justify-content: center; + align-items: center; + + image { + width: 160rpx; + } + } + .isnow { + font-size: 20rpx; + color: #fff; + padding: 2rpx; + line-height: 1; + margin-left: 10rpx; + } + } + } + + .item-left { + justify-content: flex-end; + padding: 56rpx 26rpx 0 0; + } + + .image-container-box .item-left { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .item-right { + justify-content: flex-start; + padding: 56rpx 0 0 26rpx; + } + + .item-center { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .card-content { + background-color: #fff; + border-radius: 10rpx; + padding: 20rpx 30rpx 20rpx; + // padding: 20rpx 30rpx; + margin:$margin-updown $margin-both; + .gift-title { + font-size: 30rpx; + } + .equity-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .equity-content { + padding: 20rpx 0; + line-height: 1; + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + flex: 1; + display: flex; + flex-direction: column; + .equity-desc { + font-size: $font-size-activity-tag; + margin-top: 16rpx; + color: $color-tip; + } + } + } + } + + .card-privilege-list{ + width: 100%; + flex-wrap: wrap; + display: flex; + justify-content: center; + + .card-privilege-item{ + width: 33%; + display: inline-block; + margin-top: 0; + text-align: center; + .card-privilege-icon{ + width: 60rpx; + height: 60rpx; + text-align: center; + margin: 0 auto; + line-height: 1; + } + .card-privilege-name{ + color: $color-title; + font-size: $font-size-sub; + padding-top: 20rpx; + } + .card-privilege-text{ + color: $color-tip; + font-size: $font-size-goods-tag; + padding: 0 20rpx; + } + .iconfont { + font-size: 60rpx; + background-image:-webkit-linear-gradient(top,#E3B66B,#F7DAA5); + -webkit-background-clip:text; + -webkit-text-fill-color:transparent; + } + .icon-zhekou,.icon-hongbao{ + font-size: 54rpx; + } + + } + } + + .member-gift { + background-color: #fff; + margin: $margin-updown $margin-both; + padding: 20rpx 30rpx; + border-radius: 10rpx; + .gift-title { + font-size: 30rpx; + } + .gift-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .gift-content { + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + padding: 20rpx 0; + line-height: 1; + flex: 1; + display: flex; + flex-direction: column; + .gift-desc { + font-size: 24rpx; + margin-top: 16rpx; + color: #999; + } + } + } + } + + .desc-wrap { + box-sizing: border-box; + width: 100%; + height: 98rpx; + padding: 24rpx 66rpx 0; + + .title { + width: 100%; + height: 42rpx; + line-height: 42rpx; + color: #222222; + font-size: $font-size-base; + font-family: 'PingFangTC-Regular'; + font-weight: 600; + text-align: left; + } + + .desc { + margin-top: 4rpx; + width: 100%; + height: 34rpx; + line-height: 34rpx; + color: #999999; + font-size: $font-size-tag; + font-family: 'PingFangTC-Regular'; + text-align: left; + } + } + + @keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } + + @-webkit-keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } +} +.coupon-popup-box { + background-color: #f7f7f7; + .coupon-popup-title { + text-align: center; + font-size: 32rpx; + line-height: 90rpx; + height: 90rpx; + display: block; + font-weight: bold; + position: relative; + border-bottom: 1rpx solid #eeeeee; + } + .iconfont { + position: absolute; + float: right; + right: 44rpx; + font-size: 40rpx; + font-weight: 500; + } + .coupon-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx 30rpx; + margin-bottom: 20rpx; + background-color: #fff; + border-radius: 4rpx; + .coupon-name { + flex: 1; + display: flex; + flex-direction: column; + .desc { + margin-top: 20rpx; + font-size: $font-size-tag; + color: #ababab; + } + } + .coupon-price { + color: red; + text { + font-size: 70rpx; + } + } + } + .coupon-popup-content { + max-height: 390rpx; + padding: 20rpx; + box-sizing: border-box; + } +} +.card-content-head{ + text-align: center; + color: $color-title; + margin: 20rpx 0; + .line-box{ + float: left; + text-align: center; + width: 35%; + margin-top: 26rpx; + .line{ + background-color: $color-title; + width: 60rpx; + height: 2rpx; + } + } + .card-content-title{ + float: left; + text-align: center; + width: 30%; + font-size: $font-size-base; + color: $color-title; + } +} + +.right{ + float: right; +} +.clear{ + clear: both; +} +.card-time-list{ + margin: -7.5rpx; + white-space: nowrap; + overflow-x: scroll; + height: 256rpx; + + .card-item-box{ + padding: 15rpx; + display: inline-block; + width: 33.3333%; + box-sizing: border-box; + + &.small { + width: 32.3%; + } + + .card-time-item{ + border: 2rpx solid #cccccc; + border-radius: $border-radius; + text-align: center; + padding: 25rpx 0 20rpx; + + image{ + width: 60rpx; + } + + .time-name { + line-height: 1.3; + } + } + .card-time-item.active{ + border-color: #E3B66B; + background: rgba(227, 182, 107, .3); + } + .time-price{ + font-size: $font-size-tag; + text{ + font-size: $font-size-toolbar; + } + + .price { + font-weight: bolder; + } + } + } +} +.action-wrap{ + height: 140rpx; + + &.have-agreement{ + height: 190rpx; + } + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } +} +.action { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 140rpx; + background: #fff; + box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.1); + text-align: right; + line-height: 100rpx; + padding: 0 40rpx; + box-sizing: border-box; + + &.have-agreement{ + height: 190rpx; + } + + .agreement { + text-align: center; + font-size: $font-size-tag; + line-height: 1; + margin-top: 20rpx; + + text { + color: #E3B66B; + } + } + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + .action-btn { + width: 100%; + height: 80rpx; + line-height: 80rpx; + color: #7C5711; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 30rpx 0 0 0; + border-radius: 10rpx; + border: none; + background-image:linear-gradient(to top,#F7DAA5,#E3B66B); + box-sizing: border-box; + } + + .title{ + margin-right: 6rpx; + } + + .bold{ + font-weight: bold; + } +} + +/* 说明弹框 */ +.tips-layer { + background: #fff; + z-index: 999; + height: 40%; + width: 100%; + + .head { + position: relative; + } + + .title { + height: 80rpx; + line-height: 80rpx; + text-align: center; + font-size: $font-size-toolbar; + font-weight: 700; + } + + text { + position: absolute; + top: 8rpx; + right: 44rpx; + font-size: $font-size-toolbar; + font-weight: 500; + } + + .body { + width: 100%; + height: calc(100% - 80rpx); + overflow-y: scroll; + + .detail { + padding: 20rpx; + + .font-size-base { + margin-bottom: 10rpx; + } + } + + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/collection.scss b/pages_tool/member/public/css/collection.scss new file mode 100644 index 0000000..55ba7be --- /dev/null +++ b/pages_tool/member/public/css/collection.scss @@ -0,0 +1,101 @@ +.lineheight-clear { + line-height: 1; +} +.goods_list { + width: 100%; + padding: $padding 0; + padding-top: 0; + box-sizing: border-box; + + .goods_li { + height: 200rpx; + background: #ffffff; + overflow: hidden; + border-radius: $border-radius; + display: flex; + justify-content: space-between; + margin: $margin-updown $margin-both; + padding: 30rpx; + + .pic { + width: 200rpx; + height: 200rpx; + box-sizing: border-box; + border-radius: $border-radius; + overflow: hidden; + image { + width: 100%; + height: 100%; + } + } + + .goods_info { + flex: 1; + height: 100%; + padding-left: 20rpx; + box-sizing: border-box; + display: flex; + justify-content: space-between; + flex-direction: column; + } + + .goods_name { + width: 100%; + height: 80rpx; + line-height: 1.5; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + } + + .goods_opection { + width: 100%; + height: 80rpx; + display: flex; + justify-content: space-between; + align-items: flex-end; + + .right { + display: flex; + align-items: flex-end; + } + + .symbol { + font-size: $font-size-tag; + color: var(--price-color); + } + + .price { + font-size: $font-size-toolbar; + color: var(--price-color); + } + + .cars { + padding: 0rpx 15rpx; + border: 1rpx solid $color-line; + border-radius: 32rpx; + } + + .icon { + font-size: $font-size-tag; + } + + .alike { + padding: 0rpx 15rpx; + border: 1rpx solid $color-line; + border-radius: 24rpx; + margin-left: 20rpx; + } + } + } +} +.empty { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + padding: $padding; + box-sizing: border-box; + margin-top: 50rpx; +} diff --git a/pages_tool/member/public/css/footprint.scss b/pages_tool/member/public/css/footprint.scss new file mode 100644 index 0000000..377bb92 --- /dev/null +++ b/pages_tool/member/public/css/footprint.scss @@ -0,0 +1,223 @@ +.empty { + margin-top: 100rpx; +} + +.lineheight-clear { +} + +.head-wrap { + width: 100vw; + height: 90rpx; + line-height: 90rpx; + background: #fff; + box-sizing: border-box; + padding: 0 30rpx; + text-align: right; +} + +.goods-list.single-column { + margin: 0 $margin-both; + + .checkbox-wrap { + margin-right: 20rpx; + display: flex; + align-items: center; + + .iconfont { + font-size: 40rpx; + color: #ccc; + } + } + + .datetime { + line-height: 1.5; + font-size: $font-size-base; + } + + .goods-item { + padding: 26rpx; + background: #fff; + border-radius: $border-radius; + display: flex; + position: relative; + margin: $margin-updown 0; + + &.first-child { + margin-top: 0; + } + + + .goods-img { + width: 200rpx; + height: 200rpx; + overflow: hidden; + border-radius: $border-radius; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-tag{ + color: #fff; + line-height: 1; + padding: 8rpx 12rpx; + position: absolute; + border-top-left-radius: $border-radius; + border-bottom-right-radius: $border-radius; + top: 26rpx; + left: 26rpx; + font-size: $font-size-goods-tag; + } + + .goods-tag-img { + position: absolute; + border-top-left-radius: $border-radius; + width: 80rpx; + height: 80rpx; + top: 26rpx; + left: 26rpx; + z-index: 5; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .info-wrap { + flex: 1; + display: flex; + flex-direction: column; + width: calc(100% - 220rpx); + } + &.manage{ + .info-wrap { + width: calc(100% - 280rpx); + } + } + + .name-wrap { + flex: 1; + } + + .goods-name { + font-size: $font-size-base; + line-height: 1.3; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + height: 68rpx; + } + + .introduction { + line-height: 1; + margin-top: 10rpx; + } + + .discount-price { + display: inline-block; + font-weight: bold; + line-height: 1; + margin-top: 16rpx; + color: var(--price-color); + .unit { + margin-right: 6rpx; + } + } + + .pro-info { + display: flex; + margin-top: auto; + + .delete-price { + text-decoration:line-through; + flex: 1; + + .unit { + margin-right: 6rpx; + } + } + + & > view { + line-height: 1; + + &:nth-child(2) { + text-align: right; + } + } + } + + .member-price-tag { + display: inline-block; + width: 60rpx; + line-height: 1; + margin-left: 6rpx; + + image { + width: 100%; + max-height: 30rpx; + } + } + } + +} + +.bottom-wrap { + position: fixed; + width: 100vw; + height: 100rpx; + background: #fff; + bottom: var(--window-bottom); + overflow: hidden; + display: flex; + bottom: 0; + z-index: 9; + + .all-election { + flex: 1; + height: 100rpx; + position: relative; + display: inline-block; + + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + left: 30rpx; + transform: translateY(-50%); + } + & > .icon-yuan_checkbox { + color: $color-disabled; + } + + & > text { + margin-left: 56rpx; + line-height: 100rpx; + padding-left: 30rpx; + } + } + + .action-btn { + flex: 1; + width: 180rpx; + height: 100rpx; + line-height: 100rpx; + border-radius: 0; + margin: 0; + display: flex; + align-items: center; + justify-content: flex-end; + + button { + width: 180rpx; + height: 70rpx; + line-height: 70rpx; + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/invite_friends.scss b/pages_tool/member/public/css/invite_friends.scss new file mode 100644 index 0000000..be39d57 --- /dev/null +++ b/pages_tool/member/public/css/invite_friends.scss @@ -0,0 +1,363 @@ +.invite_adv { + position: relative; + image { + height: 100%; + width: 100%; + } + .desc { + position: absolute; + top: 0; + right: 10rpx; + text-align: right; + color: #fff; + padding: 20rpx; + font-size: $font-size-tag; + .title_desc { + font-size: $font-size-tag; + } + .iconfont { + display: inline-block; + color: #fff; + font-size: $font-size-tag; + margin-right: 10rpx; + } + } + .time { + position: absolute; + bottom: 120rpx; + text-align: center; + width: 100%; + color: #fff; + } + .font { + position: absolute; + bottom: 220rpx; + text-align: center; + width: 333rpx; + height: 186rpx; + z-index: 5; + left: calc((100% - 333rpx) / 2); + } + .btn { + position: absolute; + background-size: cover; + background-repeat: no-repeat; + text-align: center; + width: 610rpx; + line-height: 112rpx; + height: 126rpx; + left: calc((100% - 610rpx) / 2); + color: #ff0029; + bottom: -24rpx; + font-size: 36rpx; + font-weight: bold; + } +} +.more_invite { + text-align: center; + padding: 30rpx; + display: flex; + align-items: center; + justify-content: center; +} +.content { + padding: 30rpx 30rpx 0 30rpx; + + .title { + font-size: $font-size-toolbar; + color: #000; + font-weight: 500; + } + .empty { + padding: 50rpx; + .tip { + font-size: $font-size-base; + color: #999999; + text-align: center; + } + } + .invitelist_block { + border: 2rpx solid $color-line; + border-radius: $border-radius; + margin-top: $margin-both; + background-color: #fff; + } + .invitelist { + .list-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 30rpx 24rpx; + + .img { + width: 70rpx; + height: 70rpx; + border-radius: 70rpx; + border: 2rpx solid; + margin-right: $margin-updown; + overflow: hidden; + image { + width: 100%; + height: 70rpx; + overflow: hidden; + } + } + + .list-left { + flex: 1; + .info { + display: flex; + + & > view { + flex: 1; + } + + .time { + text-align: right; + } + } + } + .prize { + } + } + } + .invite_active { + .list { + display: flex; + margin-top: 37rpx; + .item { + position: relative; + width: 232rpx; + height: 214rpx; + &.margin_right_none { + margin: 0; + } + image { + width: 100%; + height: 100%; + } + .desc { + position: absolute; + top: 0; + text-align: center; + width: 100%; + .price { + text-align: center; + background-image: -webkit-linear-gradient(bottom, #ff2440, #ff7b7b); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + font-size: 30rpx; + font-weight: 500; + line-height: 1; + text { + font-size: 50rpx; + } + } + .type { + font-size: $font-size-tag; + color: #666666; + } + } + } + .item:last-child { + margin-right: 0rpx !important; + } + } + .desc { + color: #999999; + padding: 30rpx 0; + + .title { + color: #999999; + font-weight: 400; + } + .desc_list { + view { + color: #999999; + display: flex; + text { + font-size: $font-size-activity-tag; + margin-right: 10rpx; + align-self: center; + } + } + } + } + } + .step { + display: flex; + align-items: center; + margin-top: 80rpx; + padding-bottom: 80rpx; + > view { + text-align: center; + width: 20%; + display: flex; + flex-direction: column; + + .img { + width: 56rpx; + height: 56rpx; + margin: auto; + image { + width: 100%; + height: 100%; + } + } + .text { + margin-top: 20rpx; + font-size: $font-size-tag; + color: $color-tip; + } + .jiantou { + width: 40rpx; + height: 24rpx; + margin: auto; + } + } + } +} +.invite-list{ + margin-top: 40rpx; +} +.share-popup, +.uni-popup__wrapper-box { + .share-title { + line-height: 60rpx; + font-size: $font-size-toolbar; + padding: 15rpx 0; + text-align: center; + } + + .share-content { + display: flex; + display: -webkit-flex; + -webkit-flex-wrap: wrap; + -moz-flex-wrap: wrap; + -ms-flex-wrap: wrap; + -o-flex-wrap: wrap; + flex-wrap: wrap; + padding: 15rpx; + + .share-box { + flex: 1; + text-align: center; + + .share-btn { + margin: 0; + padding: 0; + border: none; + line-height: 1; + height: auto; + text { + margin-top: 20rpx; + font-size: $font-size-tag; + display: block; + color: $color-title; + } + } + + .iconfont { + font-size: 80rpx; + line-height: initial; + } + .icon-pengyouquan,.icon-fuzhilianjie,.icon-share-friend { + color: #07c160; + } + } + } + + .share-footer { + height: 90rpx; + line-height: 90rpx; + border-top: 2rpx #f5f5f5 solid; + text-align: center; + color: #666; + } +} +.poster-layer { + .generate-poster { + padding: 40rpx 0; + .iconfont { + font-size: 80rpx; + color: #07c160; + line-height: initial; + } + > view { + text-align: center; + &:last-child { + margin-top: 20rpx; + } + } + } + .image-wrap { + width: 70%; + margin: 60rpx auto 40rpx auto; + box-shadow: 0 0 32rpx rgba(100, 100, 100, 0.3); + line-height: 1; + border-radius: 16rpx; + overflow: hidden; + + image { + width: 100%; + height: 750rpx; + } + } + .msg { + padding: 40rpx; + } + .save { + text-align: center; + height: 80rpx; + line-height: 80rpx; + } + .close { + position: absolute; + top: 0; + right: 20rpx; + width: 40rpx; + height: 80rpx; + font-size: 50rpx; + } +} +/* 说明弹框 */ +.tips-layer { + background: #fff; + z-index: 999; + height: 40%; + width: 100%; + + .head { + position: relative; + } + + .title { + height: 80rpx; + line-height: 80rpx; + text-align: center; + font-size: $font-size-toolbar; + font-weight: 700; + } + + text { + position: absolute; + top: 8rpx; + right: 44rpx; + font-size: $font-size-toolbar; + font-weight: 500; + } + + .body { + width: 100%; + height: calc(100% - 80rpx); + overflow-y: scroll; + + .detail { + padding: 20rpx 30rpx; + + .font-size-base { + margin-bottom: 10rpx; + } + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/css/level.scss b/pages_tool/member/public/css/level.scss new file mode 100644 index 0000000..e5f4bbf --- /dev/null +++ b/pages_tool/member/public/css/level.scss @@ -0,0 +1,413 @@ +.member-level { + width: 100%; + min-height: 100vh; + position: relative; +} +.level-top { + width: 100%; + position: relative; + image { + width: 100%; + height: 400rpx; + position: absolute; + } +} +.banner-container { + width: 100vw; + position: relative; + left: 0; + top: 0; + + .memberInfo { + width: 100%; + height: 140rpx; + padding: 40rpx 30rpx 0; + display: flex; + align-items: center; + justify-content: space-between; + box-sizing: border-box; + image { + width: 100rpx; + height: 100rpx; + border-radius: 50%; + border: 4rpx solid #ffffff; + box-sizing: border-box; + } + .growth-rules { + position: absolute; + display: flex; + align-items: center; + color: #fff; + right: 40rpx; + font-size: 24rpx; + .iconfont{ + margin-right: 10rpx; + } + } + .member-desc { + width: calc(100% - 20rpx - 100rpx); + height: 100%; + padding: 13rpx 0; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-between; + view { + line-height: 1.4; + color: #ffffff; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } + } + + .demand { + width: 100%; + padding: 0 $padding; + box-sizing: border-box; + .demand-title { + font-size: $font-size-toolbar; + font-weight: bold; + line-height: 1; + display: flex; + align-items: center; + image { + width: 39rpx; + height: 35rpx; + margin-right: 10rpx; + } + } + .demand-info { + padding: 10rpx 24rpx; + box-sizing: border-box; + display: flex; + flex-direction: column; + margin-top: 27rpx; + border-radius: 10rpx; + justify-content: space-between; + height: 150rpx; + background: #ffffff; + .info-title { + display: flex; + justify-content: space-between; + align-items: center; + text { + &:nth-child(1) { + color: #000; + font-size: $font-size-tag; + } + &:nth-child(2) { + color: #959595; + } + } + } + progress { + margin-top: 39rpx; + } + .info-size { + display: flex; + justify-content: space-between; + align-items: center; + font-size: $font-size-tag; + color: #959595; + } + } + } + + .uni-swiper-dots { + bottom: 30rpx !important; + } + + .image-container { + box-sizing: border-box; + width: 100%; + height: 100%; + display: flex; + image { + width: 100%; + height: 100%; + } + .slide-image { + width: 535rpx; + height: 300rpx; + z-index: 200; + display: flex; + justify-content: space-between; + align-items: center; + border-radius: 20rpx; + overflow: hidden; + position: relative; + + .info { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + position: absolute; + left: 0; + bottom: 0; + padding: 30rpx 40rpx; + box-sizing: border-box; + .level-detail { + font-size: $font-size-toolbar; + display: flex; + align-items: center; + } + .growr-name { + font-size: 24rpx; + margin-top: 30rpx; + } + .growr-value { + font-size: 40rpx; + } + .progress { + margin-top: 30rpx; + } + .residue-growr-value { + text-align: right; + font-size: 24rpx; + margin-top: 10rpx; + } + view { + color: #ffffff; + line-height: 1.3; + } + } + .now_growth { + margin-top: 20rpx; + } + .pic { + display: flex; + justify-content: center; + align-items: center; + + image { + width: 160rpx; + } + } + .isnow { + font-size: 20rpx; + color: #fff; + padding: 2rpx 4rpx; + line-height: 1; + margin-left: 10rpx; + border: 2rpx solid #fff; + border-radius: 4rpx; + } + } + } + + .item-left { + justify-content: flex-end; + padding: 56rpx 26rpx 0 0; + } + + .image-container-box .item-left { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .item-right { + justify-content: flex-start; + padding: 56rpx 0 0 26rpx; + } + + .item-center { + justify-content: center; + padding: 56rpx 0 0 0; + } + + .member-equity { + background-color: #fff; + border-radius: 10rpx; + padding: 20rpx 30rpx 20rpx; + // padding: 20rpx 30rpx; + margin:$margin-updown $margin-both; + .gift-title { + font-size: 30rpx; + } + .equity-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .equity-content { + padding: 20rpx 0; + line-height: 1; + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + flex: 1; + display: flex; + flex-direction: column; + .equity-desc { + font-size: $font-size-activity-tag; + margin-top: 16rpx; + color: $color-tip; + } + } + } + } + + .member-gift { + background-color: #fff; + margin: $margin-updown $margin-both; + padding: 20rpx 30rpx; + border-radius: 10rpx; + .gift-title { + font-size: 30rpx; + } + .gift-itme { + display: flex; + align-items: center; + image { + width: 60rpx; + height: 60rpx; + margin-right: 30rpx; + } + .gift-content { + &.active { + border-bottom: 2rpx solid #e5e5e5; + } + padding: 20rpx 0; + line-height: 1; + flex: 1; + display: flex; + flex-direction: column; + .gift-desc { + font-size: 24rpx; + margin-top: 16rpx; + color: #999; + } + } + } + } + + .desc-wrap { + box-sizing: border-box; + width: 100%; + height: 98rpx; + padding: 24rpx 66rpx 0; + + .title { + width: 100%; + height: 42rpx; + line-height: 42rpx; + color: #222222; + font-size: $font-size-base; + font-family: 'PingFangTC-Regular'; + font-weight: 600; + text-align: left; + } + + .desc { + margin-top: 4rpx; + width: 100%; + height: 34rpx; + line-height: 34rpx; + color: #999999; + font-size: $font-size-tag; + font-family: 'PingFangTC-Regular'; + text-align: left; + } + } + + @keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } + + @-webkit-keyframes descAnimation { + 0% { + opacity: 1; + } + + 25% { + opacity: 0.5; + } + + 50% { + opacity: 0; + } + + 75% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } + } +} +.coupon-popup-box { + background-color: #f7f7f7; + .coupon-popup-title { + text-align: center; + font-size: 32rpx; + line-height: 90rpx; + height: 90rpx; + display: block; + font-weight: bold; + position: relative; + border-bottom: 1rpx solid #eeeeee; + } + .iconfont { + position: absolute; + float: right; + right: 44rpx; + font-size: 40rpx; + font-weight: 500; + } + .coupon-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx 30rpx; + margin-bottom: 20rpx; + background-color: #fff; + border-radius: 4rpx; + .coupon-name { + flex: 1; + display: flex; + flex-direction: column; + .desc { + margin-top: 20rpx; + font-size: $font-size-tag; + color: #ababab; + } + } + .coupon-price { + color: red; + text { + font-size: 70rpx; + } + } + } + .coupon-popup-content { + max-height: 390rpx; + padding: 20rpx; + box-sizing: border-box; + } +} diff --git a/pages_tool/member/public/css/point.scss b/pages_tool/member/public/css/point.scss new file mode 100644 index 0000000..5204ec2 --- /dev/null +++ b/pages_tool/member/public/css/point.scss @@ -0,0 +1,207 @@ +.custom-navbar { + width: 100vw; + padding-bottom: 20rpx; + position: fixed; + left: 0; + top: 0; + z-index: 100; + background: unset; + + // #ifdef MP-WEIXIN + background-size: 100% 380rpx; + // #endif + + .navbar-wrap { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + } + + .navbar-title { + color: #fff; + font-size: 32rpx; + font-weight: 600; + } + + .back { + position: absolute; + color: #fff; + left: 30rpx; + font-size: 40rpx; + } +} + +.custom-navbar-block { + padding-bottom: 20rpx; +} + + +.head-wrap { + width: 100vw; + background-size: 100%; + padding: 60rpx 68rpx 140rpx 68rpx; + box-sizing: border-box; + border-radius: 0 0 100% 100%/0 0 70rpx 70rpx; + overflow: hidden; + + // #ifdef MP-WEIXIN + padding-top: 160rpx; + // #endif + + .title { + text-align: left; + line-height: 1; + color: #F6F6F6; + } + + .point { + color: var(--btn-text-color); + text-align: left; + line-height: 1; + margin-bottom: 20rpx; + font-size: 64rpx; + } + + .flex-box { + display: flex; + margin-top: 56rpx; + + .flex-item { + flex: 1; + + .num { + font-size: 34rpx; + margin-bottom: 20rpx; + color: #fff; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + } + + view { + text-align: left; + color: #F6F6F6; + line-height: 1; + } + } + } +} + +.menu-wrap { + border-radius: 20rpx; + margin: 0 24rpx; + padding: 30rpx; + background: #fff; + display: flex; + transform: translateY(-90rpx); + + .menu-item { + flex: 1; + text-align: left; + display: flex; + align-items: center; + + .icon { + width: 88rpx; + height: 88rpx; + background: #F3F3F3; + border-radius: 20rpx; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + margin-right: 24rpx; + + image { + width: 70%; + } + } + + .title { + font-size: 32rpx; + font-weight: bold; + color: #333333; + } + } +} + +.task-wrap { + background-color: #fff; + margin: 30rpx 24rpx; + border-radius: 18rpx; + padding: 32rpx; + transform: translateY(-90rpx); + + .title { + font-size: 32rpx; + text-align: left; + margin-bottom: 40rpx; + font-weight: bold; + } + + .task-item { + border-radius: $border-radius; + background: #fff; + display: flex; + align-items: center; + margin-bottom: 80rpx; + + &:last-child { + margin-bottom: 30rpx; + } + + .icon { + width: 62rpx; + height: 62rpx; + background: #F3F3F3; + border-radius: 20rpx; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + } + + .iconfont { + font-size: 52rpx; + -webkit-background-clip: text !important; + -webkit-text-fill-color: transparent; + background: linear-gradient(135deg, #FE7849 0%, #FF1959 100%); + } + + .iconshangpin { + font-size: 48rpx; + } + + .wrap { + flex: 1; + padding-left: 26rpx; + + .title { + line-height: 1; + font-size: 28rpx; + font-weight: bold; + margin-bottom: 0; + } + + .desc { + line-height: 1; + margin-top: 10rpx; + } + } + + .btn { + height: 60rpx; + line-height: 60rpx; + border-radius: 60rpx; + text-align: center; + width: 140rpx; + color: #fff; + font-size: 26rpx; + font-weight: 600; + background: linear-gradient(135deg, #FE7849 0%, #FF1959 100%); + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/js/collection.js b/pages_tool/member/public/js/collection.js new file mode 100644 index 0000000..9f9189b --- /dev/null +++ b/pages_tool/member/public/js/collection.js @@ -0,0 +1,80 @@ +export default { + data() { + return { + collectionList: [], + isShowEmpty: false + }; + }, + methods: { + //跳转至详情页 + toDetail(e) { + this.$util.redirectTo("/pages/goods/detail", { + goods_id: e.goods_id + }); + }, + //请求数据 + getData(mescroll) { + this.isShowEmpty = false; + let url = "/api/goodscollect/page" + let array = [] + this.$api.sendRequest({ + url: url, + data: { + page_size: mescroll.size, + page: mescroll.num, + }, + async: false, + }).then((res) => { + let newArr = res.data.list; + for (var i = 0; i < newArr.length; i++) { + newArr[i].composite_score = Math.floor((parseFloat(newArr[i].shop_desccredit) + parseFloat(newArr[i].shop_servicecredit) + parseFloat(newArr[i].shop_deliverycredit)) / 3).toFixed(1); + } + array = array.concat(newArr); + //设置列表数据 + if (mescroll.num == 1) this.collectionList = []; //如果是第一页需手动制空列表 + this.collectionList = this.collectionList.concat(newArr); //追加新数据 + mescroll.endSuccess(array.length); + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + this.isShowEmpty = true; + }) + + }, + //监听下拉刷新,初始化页面数据 + listenRefresh(e) { + this.$refs.goodsRecommend.init(); + }, + //删除某一项 + deleteItem(e) { + this.$api.sendRequest({ + url: "/api/goodscollect/delete", + data: { + goods_id: e + }, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: "删除成功" + }) + let array = this.collectionList; + let newArray = array.filter((v) => { + return v.goods_id != e; + }) + this.collectionList = newArray; + } else { + this.$util.showToast({ + title: res.message + }) + } + } + }) + }, + imageError(index) { + this.collectionList[index].logo = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + goodsImageError(index) { + this.collectionList[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + } + } +}; diff --git a/pages_tool/member/public/js/info.js b/pages_tool/member/public/js/info.js new file mode 100644 index 0000000..94d7fbc --- /dev/null +++ b/pages_tool/member/public/js/info.js @@ -0,0 +1,1034 @@ +import validate from '@/common/js/validate.js'; + +export default { + data() { + return { + registerConfig: {}, + indent: 'all', + customNavTitle: "", + formData: { + userHeadImg: '', + number: '', //账号 + nickName: '', //昵称 + sex: '', //性别 + realName: '', //真实姓名 + birthday: '', //生日 + currentPassword: '', //当前密码 + newPassword: '', //新密码 + confirmPassword: '', //确认密码 + mobile: '', //手机号 + mobileVercode: '', //手机验证码 + mobileDynacode: '', //手机动态验证吗 + mobileCodeText: "", + username: '', + provinceId: 0, + cityId: 0, + districtId: 0, + fullAddress: '', + address: '' + }, + memberInfoformData: { + userHeadImg: '', + number: '', //账号 + nickName: '', //昵称 + sex: '', //性别 + realName: '', //真实姓名 + birthday: '', //生日 + currentPassword: '', //当前密码 + newPassword: '', //新密码 + confirmPassword: '', //确认密码 + mobile: '', //手机号 + mobileVercode: '', //手机验证码 + mobileDynacode: '', //手机动态验证吗 + mobileCodeText: "", + }, + langList: [], + langIndex: 0, + seconds: 120, + timer: null, + isSend: false, + captcha: { + id: '', + img: '' + }, + isIphoneX: false, + items: [{ + value: '0', + name: '未知' + }, + { + value: '1', + name: '男', + checked: 'true' + }, + { + value: '2', + name: '女' + } + ], + current: 0, + memberConfig: { + is_audit: 0, + is_enable: 0 + }, + defaultRegions: [], + }; + }, + onLoad(option) { + this.isIphoneX = this.$util.uniappIsIPhoneX() + this.formData.mobileCodeText = this.$lang('findanimateCode'); + + if (option.back) { + this.back = option.back; + } + + this.getCaptcha(); + + if (option.action) { + this.indent = option.action; + this.setNavbarTitle() + + // #ifdef MP-WEIXIN + option.action == 'bind_mobile' && this.getCode() + // #endif + } + + this.getRegisterConfig(); + this.initLang(); + this.getMemberConfig(); + }, + onShow() { + if (!this.storeToken) { + this.$nextTick(() => { + this.$refs.login.open('/pages_tool/member/info'); + }); + } else { + this.getInfo(); + } + }, + onHide() { + this.seconds = 120; + this.formData.mobileCodeText = '获取动态码'; + this.isSend = false; + clearInterval(this.timer); + }, + watch: { + seconds(value) { + if (value == 0) { + this.seconds = 120; + this.formData.mobileCodeText = '获取动态码'; + this.isSend = false; + clearInterval(this.timer); + } + } + }, + computed: { + startDate() { + return this.getDate('start'); + }, + endDate() { + return this.getDate('end'); + } + }, + filters: { + mobile(mobile) { + return mobile.substring(0, 4 - 1) + '****' + mobile.substring(6 + 1); + } + }, + methods: { + // 初始化语言 + initLang() { + //获取语言列表 + this.langList = this.$langConfig.list(); + if (!uni.getStorageSync("lang")) { + this.langIndex = 0; + } else { + for (let i = 0; i < this.langList.length; i++) { + if (this.langList[i].value == uni.getStorageSync("lang")) { + this.langIndex = i; + break; + } + } + } + }, + setNavbarTitle() { + let title = '个人资料'; + switch (this.indent) { + case 'name': + title = this.$lang('modifyNickname'); + break; + case 'realName': + title = this.$lang('realName'); + break; + case 'sex': + title = this.$lang('sex'); + break; + case 'birthday': + title = this.$lang('birthday'); + break; + case 'password': + title = this.$lang('password'); + break; + case 'mobile': + title = this.$lang('mobile'); + break; + } + uni.setNavigationBarTitle({ + title: title + }); + }, + // 初始化用户信息 + getInfo() { + this.memberInfoformData.userHeadImg = this.memberInfo.headimg; + this.memberInfoformData.number = this.memberInfo.username; //账号 + this.memberInfoformData.nickName = this.memberInfo.nickname; //昵称 + this.memberInfoformData.realName = this.memberInfo.realname ? this.memberInfo.realname : '请输入真实姓名'; //真实姓名 + this.memberInfoformData.sex = this.memberInfo.sex == 0 ? '未知' : this.memberInfo.sex == 1 ? '男' : '女'; //性别 + this.memberInfoformData.birthday = this.memberInfo.birthday ? this.$util.timeStampTurnTime(this.memberInfo.birthday, 'YYYY-MM-DD') : '请选择生日'; //生日 + this.memberInfoformData.mobile = this.memberInfo.mobile; //手机号 + + this.formData.username = this.memberInfo.username; //用户名 + this.formData.nickName = this.memberInfo.nickname; //昵称 + this.formData.realName = this.memberInfo.realname; //真实姓名 + this.formData.sex = this.memberInfo.sex; //性别 + this.formData.birthday = this.memberInfo.birthday ? this.$util.timeStampTurnTime(this.memberInfo.birthday, 'YYYY-MM-DD') : ''; //生日 + this.formData.provinceId = this.memberInfo.province_id; + this.formData.cityId = this.memberInfo.city_id; + this.formData.districtId = this.memberInfo.district_id; + this.formData.fullAddress = this.memberInfo.full_address; + this.formData.address = this.memberInfo.address; + if (this.memberInfo.full_address) this.defaultRegions = [this.memberInfo + .province_id, this.memberInfo.city_id, this.memberInfo.district_id + ]; + }, + // 切换编辑项 + modifyInfo(action) { + switch (action) { + case 'cancellation': + this.getCancelStatus(); + break; + case 'language': + let newArray = []; + for (let i = 0; i < this.langList.length; i++) { + newArray.push(this.langList[i].name) + } + uni.showActionSheet({ + itemList: newArray, + success: function (res) { + if (vm.langIndex != res.tapIndex) { + vm.$langConfig.change(vm.langList[res.tapIndex].value) + } + } + }); + break; + case 'mobile': + // #ifdef MP + this.$util.redirectTo('/pages_tool/member/info_edit', { + action: 'bind_mobile' + }); + // #endif + // #ifndef MP + this.$util.redirectTo('/pages_tool/member/info_edit', { + action + }); + // #endif + break; + default: + this.$util.redirectTo('/pages_tool/member/info_edit', { + action + }); + } + }, + cancellation() { + uni.showModal({ + title: '风险提示', + content: '确定要注销当前账号吗?', + confirmColor: '#000000', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/membercancel/api/membercancel/apply', + success: rres => { + let cancellation_condition = rres.data.is_audit; + if (rres.code >= 0) { + this.$store.commit('setToken', ''); + this.$store.commit('setMemberInfo', ''); + this.$store.dispatch('emptyCart'); + this.$store.dispatch('emptyCart'); + uni.removeStorageSync('authInfo'); + this.$util.redirectTo('/pages/member/index'); + } else { + this.$util.showToast({ + title: rres.message + }); + } + } + }); + } + } + }); + }, + getCancelStatus() { + this.$api.sendRequest({ + url: '/membercancel/api/membercancel/info', + success: res => { + if (res.code >= 0) { + if (res.data) { + if (res.data.status == 0) { + this.$util.redirectTo('/pages_tool/member/cancelstatus', { + back: '/pages_tool/member/info' + }); + } else if (res.data.status == 1) { + this.$util.redirectTo('/pages_tool/member/cancelsuccess', { + back: '/pages_tool/member/info' + }); + } else { + this.$util.redirectTo('/pages_tool/member/cancelrefuse', { + back: '/pages_tool/member/info' + }); + } + } else { + this.$util.redirectTo('/pages_tool/member/assets', { + back: '/pages_tool/member/info' + }); + } + } + } + }); + }, + // 导航返回 + NavReturn() { + uni.navigateBack({ + delta: 1 + }) + }, + // 获取验证码 + getCaptcha() { + this.$api.sendRequest({ + url: '/api/captcha/captcha', + data: { + captcha_id: this.captcha.id + }, + success: res => { + if (res.code >= 0) { + this.captcha = res.data; + this.captcha.img = this.captcha.img.replace(/\r\n/g, ''); + } + } + }); + }, + // 退出登录 + logout() { + uni.showModal({ + title: '提示', + content: '确定要退出登录吗', + success: (res) => { + if (res.confirm) { + this.$store.commit('setToken', ''); + this.$store.commit('setMemberInfo', ''); + this.$store.dispatch('emptyCart'); + this.$store.dispatch('emptyCart'); + uni.removeStorageSync('authInfo'); + this.$util.redirectTo('/pages/member/index'); + } + } + }); + }, + headImage() { + this.$util.redirectTo("/pages_tool/member/modify_face"); + }, + // 检测手机是否已绑定 + async testBinding(type) { + var res = await this.checkMobile(); + return res; + }, + //获取注销的配置信息 + getMemberConfig() { + this.$api.sendRequest({ + url: '/membercancel/api/membercancel/config', + success: res => { + if (res.code >= 0) { + this.memberConfig = res.data + } + } + }); + + }, + save(type) { + switch (type) { + case 'username': + this.modifyUserName(); + break; + case 'name': + this.modifyNickName(); + break; + case 'realName': + this.modifyRealName(); + break; + case 'sex': + this.modifySex(); + break; + case 'birthday': + this.modifyBirthday(); + break; + case 'password': + this.modifyPassword(); + break; + case 'mobile': + this.modifyMobile(); + break; + case 'address': + this.modifyAddress(); + break; + } + }, + + // ------------------------修改用户名------------------------------ + modifyUserName() { + if (this.formData.username == this.memberInfo.username) { + this.$util.showToast({ + title: this.$lang('alikeusername') + }); + return; + } + var rule = [{ + name: 'username', + checkType: 'required', + errorMsg: this.$lang('noEmityUsername') + }]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifyusername', + data: { + username: this.formData.username + }, + success: res => { + if (res.code == 0) { + this.memberInfo.username = this.formData.username; + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + // ------------------------修改昵称------------------------------ + + modifyNickName() { + if (this.formData.nickName == this.memberInfo.nickname) { + this.$util.showToast({ + title: this.$lang('alikeNickname') + }); + return; + } + var rule = [{ + name: 'nickName', + checkType: 'required', + errorMsg: this.$lang('noEmityNickname') + }]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifynickname', + data: { + nickname: this.formData.nickName + }, + success: res => { + if (res.code == 0) { + this.memberInfo.nickname = this.formData.nickName; + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + + // ------------------------修改真实姓名------------------------------ + modifyRealName() { + if (this.formData.realName == this.memberInfo.realname && this.memberInfo.realname) { + this.$util.showToast({ + title: '与原真实姓名一致,无需修改' + }); + return; + } + var rule = [{ + name: 'realName', + checkType: 'required', + errorMsg: '真实姓名不能为空' + }]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifyrealname', + data: { + realname: this.formData.realName + }, + success: res => { + if (res.code == 0) { + this.memberInfo.realname = this.formData.realName; + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + + // ------------------------修改性别------------------------------ + radioChange: function (evt) { + for (let i = 0; i < this.items.length; i++) { + if (this.items[i].value === evt.target.value) { + this.formData.sex = i; + break; + } + } + }, + + modifySex() { + this.$api.sendRequest({ + url: '/api/member/modifysex', + data: { + sex: this.formData.sex + }, + success: res => { + if (res.code == 0) { + this.memberInfo.sex = this.formData.sex; + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + + // ------------------------修改生日------------------------------ + + bindDateChange: function (e) { + this.formData.birthday = e.target.value + }, + + getDate(type) { + const date = new Date(); + let year = date.getFullYear(); + let month = date.getMonth() + 1; + let day = date.getDate(); + + if (type === 'start') { + year = year - 60; + } else if (type === 'end') { + year = year + 2; + } + month = month > 9 ? month : '0' + month; + day = day > 9 ? day : '0' + day; + return `${year}-${month}-${day}`; + }, + + modifyBirthday() { + if (this.formData.birthday.length == 0) { + this.$util.showToast({ + title: '请选择生日' + }); + return; + } + this.$api.sendRequest({ + url: '/api/member/modifybirthday', + data: { + birthday: this.$util.timeTurnTimeStamp(this.formData.birthday) + }, + success: res => { + if (res.code == 0) { + this.memberInfo.birthday = this.$util.timeTurnTimeStamp(this.formData.birthday); + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + }, + + // ------------------------修改密码------------------------------ + /** + * 获取注册配置 + */ + getRegisterConfig() { + this.$api.sendRequest({ + url: '/api/register/config', + success: res => { + if (res.code >= 0) { + this.registerConfig = res.data.value; + } + } + }); + }, + modifyPassword() { + if (this.memberInfo.password) { + var rule = [{ + name: 'currentPassword', + checkType: 'required', + errorMsg: this.$lang("pleaseInputOldPassword") + }, + { + name: 'newPassword', + checkType: 'required', + errorMsg: this.$lang("pleaseInputNewPassword") + } + ]; + } else { + var rule = [{ + name: 'mobileVercode', + checkType: 'required', + errorMsg: this.$lang("confirmCodeInput") + }, + { + name: 'mobileDynacode', + checkType: 'required', + errorMsg: this.$lang("animateCodeInput") + }, + { + name: 'newPassword', + checkType: 'required', + errorMsg: this.$lang("pleaseInputNewPassword") + } + ]; + } + + let regConfig = this.registerConfig; + if (regConfig.pwd_len > 0) { + rule.push({ + name: 'newPassword', + checkType: 'lengthMin', + checkRule: regConfig.pwd_len, + errorMsg: '新密码长度不能小于' + regConfig.pwd_len + '位' + }); + } + if (regConfig.pwd_complexity) { + let passwordErrorMsg = '密码需包含', + reg = ''; + if (regConfig.pwd_complexity.indexOf('number') != -1) { + reg += '(?=.*?[0-9])'; + passwordErrorMsg += '数字'; + } + if (regConfig.pwd_complexity.indexOf('letter') != -1) { + reg += '(?=.*?[a-z])'; + passwordErrorMsg += '、小写字母'; + } + if (regConfig.pwd_complexity.indexOf('upper_case') != -1) { + reg += '(?=.*?[A-Z])'; + passwordErrorMsg += '、大写字母'; + } + if (regConfig.pwd_complexity.indexOf('symbol') != -1) { + reg += '(?=.*?[#?!@$%^&*-])'; + passwordErrorMsg += '、特殊字符'; + } + rule.push({ + name: 'newPassword', + checkType: 'reg', + checkRule: reg, + errorMsg: passwordErrorMsg + }); + } + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + if (this.formData.currentPassword == this.formData.newPassword) { + this.$util.showToast({ + title: '新密码不能与原密码相同' + }); + return; + } + if (this.formData.newPassword != this.formData.confirmPassword) { + this.$util.showToast({ + title: '两次密码不一致' + }); + return; + } + this.$api.sendRequest({ + url: '/api/member/modifypassword', + data: { + new_password: this.formData.newPassword, + old_password: this.formData.currentPassword, + code: this.formData.mobileDynacode, + key: uni.getStorageSync("password_mobile_key"), + }, + success: res => { + if (res.code == 0) { + this.memberInfo.password = 1; + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang('updateSuccess') + }); + this.NavReturn(); + uni.removeStorageSync('password_mobile_key'); + } else { + this.$util.showToast({ + title: res.message + }); + this.getCaptcha(); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + + // ------------------------修改手机号------------------------------ + // 验证手机号 + vertifyMobile() { + var rule = [{ + name: 'mobile', + checkType: 'required', + errorMsg: '请输入手机号' + }, { + name: 'mobile', + checkType: 'phoneno', + errorMsg: '请输入正确的手机号' + }]; + var checkRes = validate.check(this.formData, rule); + if (!checkRes) { + this.$util.showToast({ + title: validate.error + }); + return false; + } + return true; + }, + // 检测手机号是否存在 + async checkMobile() { + if (!this.vertifyMobile()) return; + let res = await this.$api.sendRequest({ + url: '/api/member/checkmobile', + data: { + mobile: this.formData.mobile + }, + async: false + }); + if (res.code != 0) { + this.$util.showToast({ + title: res.message + }); + return false; + } + return true; + }, + + // 发送短信动态码 + async bindMoblieCode() { + if (this.seconds != 120) return; + var rule = [{ + name: 'mobile', + checkType: 'phoneno', + errorMsg: this.$lang("surePhoneNumber") + }, + { + name: 'mobileVercode', + checkType: 'required', + errorMsg: this.$lang("confirmCodeInput") + }, + ]; + + var checkRes = validate.check(this.formData, rule); + + if (checkRes && !this.isSend) { + this.isSend = true; + this.$api.sendRequest({ + url: '/api/member/bindmobliecode', + data: { + mobile: this.formData.mobile, + captcha_id: this.captcha.id, + captcha_code: this.formData.mobileVercode + }, + success: res => { + let data = res.data; + if (data.key) { + if (this.seconds == 120 && this.timer == null) { + this.timer = setInterval(() => { + this.seconds--; + this.formData.mobileCodeText = '已发送(' + this.seconds + 's)'; + }, 1000); + } + uni.setStorageSync('mobile_key', data.key); + } else { + this.$util.showToast({ + title: res.message + }); + this.isSend = false; + } + }, + fail: res => { + this.isSend = false; + this.getCaptcha(); + } + }); + } else { + this.$util.showToast({ + title: validate.error ? validate.error : '请勿重复点击' + }); + } + }, + async modifyMobile() { + + var mobileRule = [{ + name: 'mobile', + checkType: 'phoneno', + errorMsg: this.$lang("surePhoneNumber") + }, + { + name: 'mobileVercode', + checkType: 'required', + errorMsg: this.$lang("confirmCodeInput") + }, + { + name: 'mobileDynacode', + checkType: 'required', + errorMsg: this.$lang("animateCodeInput") + }, + ]; + var checkRes = validate.check(this.formData, mobileRule); + + if (checkRes) { + if (this.formData.mobile == this.memberInfo.mobile) { + this.$util.showToast({ + title: this.$lang("alikePhone") + }); + return; + } + this.$api.sendRequest({ + url: '/api/member/modifymobile', + data: { + mobile: this.formData.mobile, + captcha_id: this.captcha.id, + captcha_code: this.formData.mobileVercode, + code: this.formData.mobileDynacode, + key: uni.getStorageSync("mobile_key"), + }, + success: res => { + if (res.code == 0) { + this.memberInfo.mobile = this.formData.mobile; + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + if (this.back) { + this.$util.redirectTo('/pages_tool/member/pay_password', { + 'back': this.back + }, 'redirectTo') + } else { + this.NavReturn(); + } + } else { + this.$util.showToast({ + title: res.message + }); + this.getCaptcha(); + } + }, + fail: res => { + this.isSend = false; + this.getCaptcha(); + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + /** + * 修改密码发送动态码 + */ + passwordMoblieCode() { + if (this.seconds != 120) return; + + if (this.formData.mobileVercode == '') { + this.$util.showToast({ + title: this.$lang("confirmCodeInput") + }); + return; + } + + if (!this.isSend) { + this.isSend = true; + this.$api.sendRequest({ + url: '/api/member/pwdmobliecode', + data: { + captcha_id: this.captcha.id, + captcha_code: this.formData.mobileVercode + }, + success: res => { + let data = res.data; + if (data.key) { + if (this.seconds == 120 && this.timer == null) { + this.timer = setInterval(() => { + this.seconds--; + this.formData.mobileCodeText = '已发送(' + this.seconds + 's)'; + }, 1000); + } + uni.setStorageSync('password_mobile_key', data.key); + } else { + this.$util.showToast({ + title: res.message + }); + this.isSend = false; + } + }, + fail: res => { + this.isSend = false; + this.getCaptcha(); + } + }); + } else { + this.$util.showToast({ + title: '请勿重复点击' + }); + } + }, + modifyAddress() { + var rule = [{ + name: 'fullAddress', + checkType: 'required', + errorMsg: '请选择所在地区' + }, + { + name: 'address', + checkType: 'required', + errorMsg: '请输入详细地址' + } + ]; + if (!rule.length) return; + var checkRes = validate.check(this.formData, rule); + if (checkRes) { + this.$api.sendRequest({ + url: '/api/member/modifyaddress', + data: { + province_id: this.formData.provinceId, + city_id: this.formData.cityId, + district_id: this.formData.districtId, + address: this.formData.address, + full_address: this.formData.fullAddress + }, + success: res => { + if (res.code == 0) { + this.memberInfo.province_id = this.formData.provinceId; + this.memberInfo.city_id = this.formData.cityId; + this.memberInfo.district_id = this.formData.districtId; + this.memberInfo.address = this.formData.address; + this.memberInfo.full_address = this.formData.fullAddress; + this.$store.commit('setMemberInfo', this.memberInfo); + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }); + } else { + this.$util.showToast({ + title: validate.error + }); + } + }, + initFormData() { + this.formData.currentPassword = ''; + this.formData.newPassword = ''; + this.formData.confirmPassword = ''; + this.formData.mobileVercode = ''; + this.formData.mobileDynacode = ''; + this.formData.mobile = ''; + }, + handleGetRegions(regions) { + this.formData.fullAddress = ''; + this.formData.fullAddress += regions[0] != undefined ? regions[0].label : ''; + this.formData.fullAddress += regions[1] != undefined ? '-' + regions[1].label : ''; + this.formData.fullAddress += regions[2] != undefined ? '-' + regions[2].label : ''; + this.formData.provinceId = regions[0] ? regions[0].value : 0; + this.formData.cityId = regions[1] ? regions[1].value : 0; + this.formData.districtId = regions[2] ? regions[2].value : 0; + }, + /** + * 手动绑定手机号 + */ + manualBinding() { + this.indent = 'mobile'; + }, + mobileAuth(e) { + if (e.detail.errMsg == 'getPhoneNumber:ok') { + let data = e.detail + // #ifdef MP-WEIXIN + Object.assign(data, this.authInfo) + // #endif + this.$api.sendRequest({ + url: '/api/member/mobileauth', + data, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: this.$lang("updateSuccess") + }); + this.NavReturn(); + } else { + this.$util.showToast({ + title: res.message + }); + } + } + }) + } + } + } +}; \ No newline at end of file diff --git a/pages_tool/member/public/js/invite_friends.js b/pages_tool/member/public/js/invite_friends.js new file mode 100644 index 0000000..884833b --- /dev/null +++ b/pages_tool/member/public/js/invite_friends.js @@ -0,0 +1,115 @@ +export default { + methods: { + //获取邀请列表 + getList() { + this.$api.sendRequest({ + url: '/memberrecommend/api/memberrecommend/lists', + data: { + page: this.page, + page_size: this.page_size + }, + success: res => { + this.inviteList = this.inviteList.concat(res.data.list); + this.total_num = res.data.page_count; + } + }); + }, + moreList() { + this.page++; + this.isClick = false; + if (this.page < this.total_num) { + this.getList(); + this.isClick = true; + } else if (this.page == this.total_num) { + this.getList(); + } + }, + getBaseInfo() { + this.$api.sendRequest({ + url: '/memberrecommend/api/memberrecommend/info', + success: res => { + if (res.code == 0) { + this.info = res.data; + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + } + }); + }, + openSharePopup() { + this.$refs.sharePopup.open(); + }, + // 关闭分享弹出层 + closeSharePopup() { + this.$refs.sharePopup.close(); + }, + // 打开规则说明弹出层 + openRulePopup() { + this.$refs.rulePopup.open(); + }, + // 打开规则说明弹出层 + closeRulePopup() { + this.$refs.rulePopup.close(); + }, + copyUrl() { + let text = this.$config.h5Domain + '/pages/index/index'; + if (this.memberInf && this.memberInfo.member_id) text += '?source_member=' + this.memberInfo.member_id; + this.$util.copy(text, () => { + this.closeSharePopup(); + }); + }, + // 打开海报弹出层 + openPosterPopup() { + this.getPoster(); + this.$refs.sharePopup.close(); + this.$refs.posterPopup.open(); + }, + // 关闭海报弹出层 + closePosterPopup() { + this.$refs.posterPopup.close(); + }, + //生成海报 + getPoster() { + //活动海报信息 + let qrcode_param = { + source_member: this.memberInfo.member_id + }; + this.$api.sendRequest({ + url: "/memberrecommend/api/memberrecommend/poster", + data: { + page: '/pages/index/index', + qrcode_param: JSON.stringify(qrcode_param) + }, + success: res => { + if (res.code == 0) { + this.poster = res.data.path + "?time=" + new Date().getTime(); + } else { + this.posterMsg = res.message; + } + } + }); + }, + savePoster() { + let url = this.$util.img(this.poster); + uni.downloadFile({ + url: url, + success: (res) => { + if (res.statusCode === 200) { + uni.saveImageToPhotosAlbum({ + filePath: res.tempFilePath, + success: () => { + this.$util.showToast({ + title: "保存成功" + }); + }, + fail: () => { + this.$util.showToast({ + title: "保存失败,请稍后重试" + }); + } + }); + } + } + }); + } + } +} \ No newline at end of file diff --git a/pages_tool/member/public/js/signin.js b/pages_tool/member/public/js/signin.js new file mode 100644 index 0000000..c22ca2e --- /dev/null +++ b/pages_tool/member/public/js/signin.js @@ -0,0 +1,276 @@ +export default { + data() { + return { + showSignDays: [], // 一共展示的天数 + rule: [{}], + hasSign: 0, //今天是否签到 + signDaysSeries: 0, //连续签到次数 + MonthData: [], //本月日期信息 + signList: [], + back: '', //返回页 + redirect: '', //返回方式 + successTip: {}, + startDate: null, + endDate: null, + isActive: "", //判断点击 + signState: 1, + headimg: '', + point: 0, + growth: 0, + signPoint: 0, + signGrowth: 0, + rewardRuleDay: [], + cycle: 0, + reward: {} + }; + }, + onLoad(option) { + setTimeout( () => { + if (!this.addonIsExist.membersignin) { + this.$util.showToast({ + title: '商家未开启会员签到', + mask: true, + duration: 2000 + }); + setTimeout(() => { + this.$util.redirectTo('/pages/index/index'); + }, 2000); + } + },1000); + + if (option.back) this.back = option.back; + if (option.redirect) this.redirect = option.redirect; + + this.getSignState(); + }, + onShow() { + if (!this.storeToken) { + this.$nextTick(() => { + this.$refs.login.open('/pages_tool/member/signin'); + }); + return; + } + + this.headimg = this.memberInfo.headimg; + this.signDaysSeries = this.memberInfo.sign_days_series; + + this.getSignPointData(); + this.getSignGrowthData(); + this.setPublicShare(); + + this.getIsSign(); + }, + methods: { + // 获取签到累积积分 + getSignPointData() { + this.$api.sendRequest({ + url: '/api/memberaccount/sum', + data: { + account_type: 'point', + from_type: 'signin' + }, + success: res => { + if (res.code == 0) { + this.signPoint = res.data; + } + } + }); + }, + // 获取签到累积成长值 + getSignGrowthData() { + this.$api.sendRequest({ + url: '/api/memberaccount/sum', + data: { + account_type: 'growth', + from_type: 'signin' + }, + success: res => { + if (res.code == 0) { + this.signGrowth = res.data; + } + } + }); + }, + // 签到是否开启 + getSignState() { + this.$api.sendRequest({ + url: '/api/membersignin/getSignStatus', + success: res => { + if (res.code == 0) { + this.signState = res.data.is_use; + } + } + }); + }, + navigateBack() { + if (this.back != '') { + this.$util.redirectTo(this.back, {}, this.redirect); + } else { + this.$util.redirectTo('/pages/member/index'); + } + }, + //获取rule + getRule() { + this.rewardRuleDay = []; + this.$api.sendRequest({ + url: '/api/membersignin/award', + success: res => { + if (res.code == 0) { + + this.cycle = res.data.cycle || 0; + this.rule = res.data.reward || []; + let default_point = 0; + if (this.rule.length > 0) { + this.rule.forEach((item, index) => { + if (item.day == 1) { + default_point = item.point; + } else { + this.rewardRuleDay.push(parseInt(item.day)); + this.reward[item.day] = item.point; + } + }); + } + //展示7天 + var showSignDays = []; + var start_day = 1; + var end_day = 7; + var total_day = res.data.cycle; + if (this.signDaysSeries > 5) { + start_day = this.signDaysSeries - 5; + } + if (total_day >= (this.signDaysSeries + 1)) { + end_day = this.signDaysSeries + 1; + } + if (this.signDaysSeries <= 5) { + end_day = 8 - start_day; + } + + if ((end_day - start_day) < 7 && total_day >= start_day + 6) { + end_day = start_day + 6; + } + if (total_day == this.signDaysSeries) { + start_day = this.signDaysSeries - 6; + end_day = this.signDaysSeries; + } + + for (let i = 1; i <= res.data.cycle; i++) { + if (i >= start_day && i <= end_day) { + showSignDays.push({ + day: i, + is_last: 0, + point: default_point + }) + } + } + + if (showSignDays && showSignDays.length) { + showSignDays[showSignDays.length - 1]['is_last'] = 1; + } + + for (let i in showSignDays) { + let item = showSignDays[i]; + if (this.$util.inArray(item.day, this.rewardRuleDay) != -1) { + showSignDays[i]['point'] = parseInt(this.reward[item.day]) + parseInt(default_point); + } + } + + this.showSignDays = showSignDays; + this.$refs.loadingCover.hide(); + } + } + }); + }, + //判断当前是否签到 + getIsSign() { + this.$api.sendRequest({ + url: '/api/membersignin/issign', + success: res => { + if (res.code == 0) { + this.hasSign = res.data; + this.getRule(); + this.getSignPointData(); + this.getSignGrowthData(); + } + } + }); + }, + //签到 + sign() { + if (this.signState == 0) { + this.$util.showToast({ + title: '签到未开启' + }) + } + + if (!this.hasSign && this.signState == 1) { + this.$api.sendRequest({ + url: '/api/membersignin/signin', + success: res => { + if (res.code == 0) { + this.successTip = res.data; + this.$refs.uniPopup.open() + this.getRule(); + this.getSignPointData(); + this.getSignGrowthData(); + this.hasSign = 1; + this.signDaysSeries = this.signDaysSeries + 1; + } else { + this.$util.showToast({ + title: res.message + }) + } + } + }); + } + }, + close() { + this.$refs.uniPopup.close() + }, + /** + * 设置公众号分享 + */ + setPublicShare() { + let shareUrl = this.$config.h5Domain + '/pages_tool/member/signin'; + + this.$util.setPublicShare({ + title: '签到有礼', + desc: '天天签到,积分好礼送不停', + link: shareUrl, + imgUrl: '' + }, + res => { + // console.log('公众号分享成功'); + // this.share(); + } + ); + }, + }, + computed: { + pointTomorrow: function() { + var signDaysSeries = this.signDaysSeries + 1; + var point = this.rule[0].point ? parseInt(this.rule[0].point) : 0; + for (let i = 1; i < this.rule.length; i++) { + let reward = this.rule[i]; + if (reward.day == signDaysSeries && reward.point) point += parseInt(reward.point); + } + return point; + }, + showDay: function() { + return parseInt(this.signDaysSeries / 7) * 7 + 1; + } + }, + /** + * 自定义分享内容 + */ + onShareAppMessage() { + var path = '/pages_tool/member/signin'; + return { + title: '签到有礼,天天签到,积分好礼送不停', + imageUrl: '', + path: path, + success: res => {}, + fail: res => {}, + complete: res => {} + }; + } +}; \ No newline at end of file diff --git a/pages_tool/member/withdrawal.vue b/pages_tool/member/withdrawal.vue new file mode 100644 index 0000000..db6a049 --- /dev/null +++ b/pages_tool/member/withdrawal.vue @@ -0,0 +1,171 @@ + + + + + + + + + + + {{ item.transfer_type_name }} + + {{ $util.timeStampTurnTime(item.apply_time) }} + + + + ¥{{ item.apply_money }} + {{ item.status_name }} + + + + + + + + + + + + + + + + + diff --git a/pages_tool/member/withdrawal_detail.vue b/pages_tool/member/withdrawal_detail.vue new file mode 100644 index 0000000..c93aacd --- /dev/null +++ b/pages_tool/member/withdrawal_detail.vue @@ -0,0 +1,131 @@ + + + + + -{{ detail.apply_money }} + + + + + + 当前状态 + {{ detail.status_name }} + + + 交易号 + {{ detail.withdraw_no }} + + + 手续费 + ¥{{ detail.service_money }} + + + 申请时间 + {{ $util.timeStampTurnTime(detail.apply_time) }} + + + 审核时间 + {{ $util.timeStampTurnTime(detail.audit_time) }} + + + 银行名称 + {{ detail.bank_name }} + + + 收款账号 + {{ detail.account_number }} + + + 拒绝理由 + {{ detail.refuse_reason }} + + + 转账方式名称 + {{ detail.transfer_type_name }} + + + 转账时间 + {{ $util.timeStampTurnTime(detail.payment_time) }} + + + + + + + + + + diff --git a/pages_tool/notice/detail.vue b/pages_tool/notice/detail.vue new file mode 100644 index 0000000..b27d7ec --- /dev/null +++ b/pages_tool/notice/detail.vue @@ -0,0 +1,142 @@ + + + + {{ detail.title }} + + 发表时间: {{ $util.timeStampTurnTime(detail.create_time) }} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/notice/list.vue b/pages_tool/notice/list.vue new file mode 100644 index 0000000..76aea2c --- /dev/null +++ b/pages_tool/notice/list.vue @@ -0,0 +1,179 @@ + + + + + + + + + + 置顶 + {{ item.title }} + + {{ $util.timeStampTurnTime(item.create_time, 1) }} + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/order/activist.vue b/pages_tool/order/activist.vue new file mode 100644 index 0000000..727ddee --- /dev/null +++ b/pages_tool/order/activist.vue @@ -0,0 +1,152 @@ + + + + + + + + + + {{ item.order_no }} + 退款成功 + 退款中 + 退款失败 + + + + + {{ item.sku_name }} + + {{ item.refund_status_name }} + + ¥{{ item.price }} + ×{{ item.num }} + + + + + + + 共{{ item.num }}件商品 + 退款:¥{{ item.refund_status == 3 ? item.refund_real_money : item.refund_apply_money }} + + + 查看详情 + + + {{ actionItem.title }} + + + + + + + + + + + + + + + + + + diff --git a/pages_tool/order/detail_virtual.vue b/pages_tool/order/detail_virtual.vue new file mode 100644 index 0000000..a07c408 --- /dev/null +++ b/pages_tool/order/detail_virtual.vue @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/pages_tool/order/evaluate.vue b/pages_tool/order/evaluate.vue new file mode 100644 index 0000000..3ad08c0 --- /dev/null +++ b/pages_tool/order/evaluate.vue @@ -0,0 +1,87 @@ + + + + + + + + + + + {{ item.sku_name }} + + + + + 描述相符 + + + + 好评 + 中评 + 差评 + + + + + + + + + + {{ goodsEvalList[index].content.length }}/200 + + + + {{ goodsEvalList[index].again_content.length }}/200 + + + + + + + + + + {{ imgList[index].length ? 6 - imgList[index].length : 0 }}/6 + + + + + + + + + + 匿名 + + 提交 + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/order/logistics.vue b/pages_tool/order/logistics.vue new file mode 100644 index 0000000..0856b0a --- /dev/null +++ b/pages_tool/order/logistics.vue @@ -0,0 +1,171 @@ + + + + + + + {{ packageItem.package_name }} + + + + + + + + + + + + + {{ goodsItem.sku_name }} + + + + + {{ goodsItem.num }} + + + + + + + + + + + + + 承运公司: {{ packageItem.express_company_name }} + + + + 运单号: + {{ packageItem.delivery_no }} + + + + + + + + + + + + {{ traceItem.remark }} + {{ traceItem.datetime }} + + + + + {{ packageItem.trace.reason }} + + + {{ packageItem.trace.reason }} + + + + + + + + + + + diff --git a/pages_tool/order/public/css/activist.scss b/pages_tool/order/public/css/activist.scss new file mode 100644 index 0000000..69d2a64 --- /dev/null +++ b/pages_tool/order/public/css/activist.scss @@ -0,0 +1,110 @@ +.activist-container { + width: 100vw; + height: 100vh; +} + +.order-item { + margin: $margin-updown $margin-both; + padding: 26rpx 24rpx; + border-radius: 10rpx; + background: #fff; + display: flex; + flex-direction: column; + + .order-header { + display: flex; + align-items: center; + padding-bottom: 26rpx; + border-bottom: 2rpx solid #f1f1f1; + + .status-num { + font-size: $font-size-goods-tag; + color: $color-title; + } + + .status-name { + flex: 1; + text-align: right; + font-size: $font-size-tag; + } + } + + .goods-wrap { + display: flex; + padding: 27rpx 0; + box-sizing: border-box; + border-bottom: 2rpx solid #f7f7f7; + image { + width: 170rpx; + height: 170rpx; + display: flex; + align-items: center; + justify-content: center; + } + .goods-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + margin-left: 15rpx; + + .goods-name { + line-height: 38rpx; + font-size: $font-size-base; + color: $color-title; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + } + .goods-num { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-top: 21rpx; + .num-text { + font-size: $font-size-tag; + line-height: 1; + } + .num-price { + display: flex; + flex-direction: column; + align-items: flex-end; + line-height: 1; + font-size: $font-size-tag; + .num { + color: $color-tip; + margin-top: 16rpx; + display: flex; + align-items: center; + } + } + } + } + } + .goods-btn { + display: flex; + flex-direction: column; + align-items: flex-end; + margin-top: 27rpx; + .btn-text { + font-size: $font-size-tag; + text { + &:nth-child(2) { + margin-left: 17rpx; + text { + font-size: $font-size-base; + } + } + } + } + .order-action { + display: flex; + margin-top: 24rpx; + .order-box-btn { + font-size: $font-size-goods-tag; + } + } + } +} diff --git a/pages_tool/order/public/css/evaluate.scss b/pages_tool/order/public/css/evaluate.scss new file mode 100644 index 0000000..86f7034 --- /dev/null +++ b/pages_tool/order/public/css/evaluate.scss @@ -0,0 +1,230 @@ +.page { + padding-bottom: 100rpx; +} + +.eval-good { + width: 100%; + padding: 0 30rpx; + box-sizing: border-box; + background: #ffffff; + + .good-box { + width: 100%; + height: 100%; + padding: 30rpx 0; + border-bottom: 2rpx solid #f5f5f5; + box-sizing: border-box; + display: flex; + justify-content: space-between; + + .good_pic { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + box-sizing: border-box; + } + + .good_info { + width: calc(100% - 200rpx); + height: 100%; + line-height: 1.3; + box-sizing: border-box; + } + } +} + +.eval-text { + width: 100%; + padding: 0 $margin-both; + box-sizing: border-box; + padding-bottom: $padding; + margin-top: $margin-updown; + + .text-box { + width: 100%; + height: 100%; + border-radius: $border-radius; + background: #ffffff; + padding-bottom: $padding; + box-sizing: border-box; + position: relative; + + textarea { + width: 100%; + height: 190rpx; + padding: $padding; + box-sizing: border-box; + font-size: $font-size-tag; + } + } + + .maxSize { + position: absolute; + right: 20rpx; + top: 160rpx; + color: #999; + font-size: $font-size-tag; + } + + .other-info { + width: 100%; + padding: 0 $padding; + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + margin-top: $margin-updown; + } + + .other-info-box { + width: 145rpx; + height: 145rpx; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-right: 30rpx; + margin-bottom: 30rpx; + position: relative; + + image { + width: 100%; + border-radius: $border-radius; + } + .iconfont { + font-size: 60rpx; + color: #898989; + line-height: 1; + } + text { + line-height: 1; + } + .imgDel { + width: 40rpx; + height: 40rpx; + position: absolute; + right: -20rpx; + top: -20rpx; + display: flex; + justify-content: center; + align-items: center; + .iconfont { + font-size: $font-size-toolbar; + } + } + } + .other-info-box.active { + border: 1rpx dashed #898989; + } + .other-info-box.active:active { + background: rgba($color: #cccccc, $alpha: 0.6); + } + // .other-info-box:nth-child(4n) { + // margin-right: 0; + // } +} + +.eval-star { + width: 100%; + background: #ffffff; + padding: 10rpx 30rpx; + box-sizing: border-box; + + .star-box { + width: 100%; + height: 100%; + display: flex; + align-items: center; + + .star-title { + height: 60rpx; + position: relative; + padding-right: $padding; + box-sizing: border-box; + line-height: 60rpx; + font-size: $font-size-base; + font-weight: bold; + } + + .grade-li { + width: 30%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + } + + .icon-haoping1 { + font-size: $font-size-base; + margin-right: 10rpx; + } + + .icon-haoping { + font-size: $font-size-base; + color: #999; + margin-right: 10rpx; + } + + .icon-zhongchaping { + font-size: $font-size-base; + margin-right: 10rpx; + color: #ccc; + } + } +} + +.eval-bottom { + position: fixed; + z-index: 5; + width: 100vw; + height: 100rpx; + background: #fff; + bottom: var(--window-bottom); + overflow: hidden; + display: flex; + justify-content: space-between; + &.safe-area { + padding-bottom: 68rpx !important; + } + + .all-election { + height: 100rpx; + position: relative; + padding-left: 20rpx; + display: inline-block; + width: 30%; + + & > .iconfont { + font-size: 45rpx; + position: absolute; + top: 50%; + left: 24rpx; + transform: translateY(-50%); + } + + & > text { + margin-left: 56rpx; + line-height: 100rpx; + } + } + + .action-btn { + flex: 1; + height: 100rpx; + line-height: 100rpx; + border-radius: 0; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + + button { + width: 100%; + height: 80rpx; + line-height: 80rpx; + } + } + .action-btn.disabled:after { + content: ''; + border: none; + } +} \ No newline at end of file diff --git a/pages_tool/order/public/css/logistics.scss b/pages_tool/order/public/css/logistics.scss new file mode 100644 index 0000000..73c24e8 --- /dev/null +++ b/pages_tool/order/public/css/logistics.scss @@ -0,0 +1,242 @@ +@mixin flex-row-center { + display: flex; + justify-content: center; + align-items: center; +} + +@mixin wrap { + padding: 30rpx; + border-radius: $border-radius; + background: #fff; + position: relative; + width: calc(100% - 60rpx); + box-sizing: border-box; +} +.swiper-item { + padding-top: 94rpx; + height: 100%; + .container { + height: calc(100vh - 124rpx); + overflow-y: scroll; + box-sizing: border-box; + display: flex; + flex-direction: column; + align-items: center; + padding-bottom: 30rpx; + &.safearea { + padding: 68rpx; + } + } + padding-bottom: 30rpx; + padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/ + padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/ +} +.order-nav { + width: 100vw; + // height: 60rpx; + flex-direction: row; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + background: #fff; + display: flex; + position: fixed; + left: 0; + z-index: 998; + + .uni-tab-item { + display: inline-block; + padding: 30rpx 24rpx 0; + // height: 60rpx; + // line-height: 60rpx; + } + + .uni-tab-item-title { + color: #555; + font-size: $font-size-toolbar; + display: block; + line-height: 1; + padding: 0 10rpx 30rpx; + flex-wrap: nowrap; + /* #ifndef APP-PLUS */ + white-space: nowrap; + /* #endif */ + text-align: center; + } + + .uni-tab-item-title-active { + display: block; + border-bottom: 2rpx solid #ffffff; + padding: 0 10rpx 30rpx; + } + + ::-webkit-scrollbar { + width: 0; + height: 0; + color: transparent; + } +} + +.goods-wrap { + @include wrap; + margin-top: 20rpx; + padding: 30rpx; + .goods { + display: flex; + position: relative; + margin-bottom: 20rpx; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + position: relative; + max-width: calc(100% - 140rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + font-weight: 500; + } + + .goods-sub-section { + width: 100%; + line-height: 1.3; + display: flex; + + .goods-price { + font-weight: 700; + font-size: $font-size-activity-tag; + } + + .unit { + font-weight: normal; + font-size: $font-size-tag; + margin-right: 2rpx; + } + + view { + flex: 1; + line-height: 1.3; + &:last-of-type { + text-align: left; + + .iconfont { + line-height: 1; + font-size: $font-size-tag; + } + } + } + } + } + } +} + +.express-company-wrap { + @include wrap; + margin-top: 20rpx; + .company-logo { + width: 120rpx; + height: 120rpx; + margin-right: 20rpx; + float: left; + image { + width: 100%; + height: 100%; + } + } + + .info { + flex: 1; + + .company { + line-height: 1.5; + margin-top: 16rpx; + } + + .no { + margin-top: 10rpx; + line-height: 1.5; + } + + .icon-fuzhi { + font-size: $font-size-base; + line-height: 1; + margin-left: 6rpx; + } + } +} + +.track-wrap { + @include wrap; + margin-top: 20rpx; + + .track-item { + position: relative; + flex-wrap: wrap; + overflow: visible; + display: flex; + &:after { + content: ''; + position: absolute; + z-index: 1; + pointer-events: none; + background-color: #e5e5e5; + width: 2rpx; + height: 150%; + top: 56rpx; + left: 20rpx; + bottom: -40rpx; + } + + .dot { + margin: 34rpx 20rpx 0 10rpx; + width: 20rpx; + height: 20rpx; + border-radius: 10rpx; + background-color: #ccc; + z-index: 9; + } + + .msg { + padding: 20rpx 0; + flex: 1; + + .text { + line-height: 1.5; + font-size: $font-size-base; + } + + .time { + color: $color-tip; + font-size: $font-size-activity-tag; + line-height: 1.3; + margin-top: 10rpx; + } + } + + &:last-of-type:after { + content: unset; + } + } +} diff --git a/pages_tool/order/public/css/refund.scss b/pages_tool/order/public/css/refund.scss new file mode 100644 index 0000000..c18b3c9 --- /dev/null +++ b/pages_tool/order/public/css/refund.scss @@ -0,0 +1,246 @@ +.refund-container { + width: 100vw; + height: 100vh; +} + +.align-right { + text-align: right; +} + +.goods-wrap { + margin: $margin-updown $margin-both; + padding: 30rpx; + border-radius: $border-radius; + background: #fff; + display: flex; + position: relative; + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + border-radius: $border-radius; + overflow: hidden; + + image { + width: 100%; + height: 100%; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 200rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + } + } +} + +.refund-option { + margin: $margin-updown $margin-both; + border-radius: $border-radius; + background: #fff; + + .option-item { + padding: $padding; + display: flex; + position: relative; + + view { + flex: 1; + + text { + display: block; + } + } + + .icon-right { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #ddd; + right: 20rpx; + } + + &:last-of-type { + border-top: 2rpx solid #f2f2f2; + } + } +} + +.refund-form { + margin: $margin-updown $margin-both; + padding: $padding; + border-radius: $border-radius; + background: #fff; + + .item-wrap { + display: flex; + position: relative; + line-height: 80rpx; + + .label { + width: 142rpx; + padding-right: 5rpx; + line-height: 80rpx; + } + + .cont { + flex: 1; + line-height: 80rpx; + text-align: right; + .refund-desc { + font-size: $font-size-base; + width: 100%; + line-height: 1; + min-height: 80rpx; + } + + &.reason { + padding-right: 40rpx; + } + } + .label.active{ + width: 100%; + } + + .icon-right { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #ddd; + right: 0; + } + } +} +.textarea-box{ + position: relative; + .mark{ + width: 100%; + height: 100%; + position: absolute; + left: 0; + bottom: 0; + background: red; + } +} +.newText{ + width: 100%; + min-height: 200rpx; + border-radius: $border-radius; + box-sizing: border-box; + margin-top: 10rpx; +} + +.sub-btn { + position: fixed; + width: 100%; + height: 100rpx; + line-height: 100rpx; + text-align: center; + color: #fff; + bottom: 0; + &.safe-area { + margin-bottom: 48rpx !important; + } +} + +.popup { + width: 100vw; + background: #fff; + border-top-left-radius: 24rpx; + border-top-right-radius: 24rpx; + + .popup-header { + height: 90rpx; + display: flex; + align-items: center; + padding: 0 30rpx; + + & > view { + flex: 1; + line-height: 1; + } + + .tit { + font-size: $font-size-toolbar; + font-weight: 600; + } + + .vice-tit { + margin-right: 20rpx; + } + } + + .popup-footer { + height: 140rpx; + + .confirm-btn { + height: 80rpx; + line-height: 80rpx; + color: #fff; + text-align: center; + margin: 20rpx; + border-radius: $border-radius; + &.color-base-bg{ + color: var(--btn-text-color); + } + } + + &.bottom-safe-area { + padding-bottom: 48rpx; + } + } +} + +.refund-reason-popup { + height: 50vh; + display: flex; + flex-direction: column; + + .icon-close { + font-size: 40rpx; + } + + .popup-body { + flex: 1; + + .scroll-view { + height: 100%; + } + + .item { + display: flex; + padding: 0 30rpx; + position: relative; + height: 70rpx; + line-height: 70rpx; + + .reason { + flex: 1; + height: 70rpx; + line-height: 70rpx; + } + + & > .iconfont { + font-size: 40rpx; + position: absolute; + top: 50%; + right: 30rpx; + transform: translateY(-50%); + } + + & > .icon-yuan_checkbox { + color: $color-tip; + } + } + } +} diff --git a/pages_tool/order/public/css/refund_detail.scss b/pages_tool/order/public/css/refund_detail.scss new file mode 100644 index 0000000..2f9594f --- /dev/null +++ b/pages_tool/order/public/css/refund_detail.scss @@ -0,0 +1,327 @@ +.detail-container { + width: 100vw; + height: 100vh; +} +.container { + transition: all 0.3s; + + .hide { + transform: translateX(-100%); + } +} + +.status-wrap { + padding: 20rpx; + background: #fff; + border-top: 1px solid #f5f5f5; + margin: 20rpx; + border-radius: $border-radius; + + .status-name { + display: block; + font-size: $font-size-toolbar; + line-height: 70rpx; + height: 70rpx; + } + + .refund-explain { + border-top: 1px dashed #eee; + padding-top: 20rpx; + } +} + +.refund-address-wrap { + margin: 20rpx; + background: #fff; + padding: 20rpx; + border-radius: $border-radius; + + .copy { + font-size: $font-size-activity-tag; + display: inline-block; + color: #666; + background: #fff; + line-height: 1; + padding: 6rpx 10rpx; + margin-left: 10rpx; + border-radius: 4rpx; + border: 1px solid #ddd; + } +} + +.history-wrap { + margin: 20rpx; + background: #fff; + padding: 20rpx; + display: flex; + position: relative; + border-radius: $border-radius; + + view { + flex: 1; + } + + .icon-right { + position: absolute; + top: 50%; + transform: translateY(-50%); + color: #ddd; + right: 20rpx; + } +} + +.refund-info { + margin: 20rpx; + background: #fff; + border-radius: $border-radius; + + .header { + height: 90rpx; + line-height: 90rpx; + padding: 0 20rpx; + } + + .body { + padding-bottom: 20rpx; + + .goods-wrap { + display: flex; + position: relative; + padding: 20rpx; + background: #f5f5f5; + + &:last-of-type { + margin-bottom: 0; + } + + .goods-img { + width: 180rpx; + height: 180rpx; + margin-right: 20rpx; + + image { + width: 100%; + height: 100%; + } + } + + .goods-info { + flex: 1; + position: relative; + max-width: calc(100% - 200rpx); + + .goods-name { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + line-height: 1.5; + font-size: $font-size-base; + } + + .goods-sub-section { + padding-top: 20rpx; + width: 100%; + line-height: 1.3; + display: flex; + + .refund-price { + font-size: $font-size-base; + } + + .unit { + font-weight: normal; + font-size: $font-size-tag; + margin-right: 2rpx; + } + } + } + } + + .info { + margin-top: 20rpx; + + .cell { + height: 50rpx; + line-height: 50rpx; + padding: 0 30rpx; + font-size: $font-size-tag; + color: $color-tip; + } + } + } +} + +.action { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + line-height: 100rpx; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + .order-box-btn{ + margin-right: $margin-both; + margin-left: 0; + } + + .action-btn { + height: 70rpx; + line-height: 70rpx; + color: #fff; + padding: 0 40rpx; + display: inline-block; + text-align: center; + margin: 16rpx 20rpx 16rpx 0; + border-radius: $border-radius; + + &.white { + height: 68rpx; + line-height: 68rpx; + color: #333; + border: 0.5px solid #999; + background: #fff; + } + } +} + +.form-wrap { + background: #fff; + + .item { + margin: 0 20rpx; + display: flex; + border-bottom: 1px solid #eee; + + &:last-child { + border-bottom: none; + } + + .label { + width: 140rpx; + line-height: 90rpx; + } + + .cont { + flex: 1; + line-height: 90rpx; + + .input, + .input-placeholder { + height: 90rpx; + line-height: 90rpx; + font-size: $font-size-base; + } + + .textarea { + width: 100%; + padding: 26rpx 0; + line-height: 1.3; + font-size: $font-size-base; + } + } + } +} + +.sub-btn { + margin-top: 20rpx; +} + +.record-wrap { + .cont { + width: 100%; + background-color: #fff; + padding: 30rpx; + box-sizing: border-box; + margin-top: 20rpx; + + .head { + display: flex; + flex-direction: column; + color: $color-title; + .time { + color: $color-tip; + font-size: $font-size-tag; + float: right; + } + } + .body { + padding-top: 20rpx; + .refund-action{ + line-height: 1; + color: $color-title; + } + .desc { + margin-top: 10rpx; + color: $color-tip; + font-size: $font-size-tag; + } + } + } + + .empty-box{ + height: 168rpx; + } +} + +.history-bottom { + position: fixed; + z-index: 5; + left: 0; + bottom: 0; + width: 100vw; + height: 100rpx; + background: #fff; + box-shadow: 0 0px 10px rgba(0, 0, 0, 0.1); + text-align: right; + display: flex; + + &.bottom-safe-area { + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); + } + + view { + flex: 1; + text-align: center; + line-height: 100rpx; + + &:first-child { + border-right: 1px solid #eee; + } + .iconfont { + font-weight: bold; + margin-right: 10rpx; + font-size: $font-size-base; + line-height: 1; + } + } + button { + width: 50%; + height: 100%; + // position: absolute; + border: none; + z-index: 1; + padding: 0; + margin: 0; + background: none; + display: flex; + justify-content: center; + align-items: center; + &::after { + border: none !important; + } + .iconfont{ + margin-right: 10rpx; + } + + } +} diff --git a/pages_tool/order/public/js/evaluate.js b/pages_tool/order/public/js/evaluate.js new file mode 100644 index 0000000..bd86771 --- /dev/null +++ b/pages_tool/order/public/js/evaluate.js @@ -0,0 +1,233 @@ +export default { + data() { + return { + orderId: null, + orderNo: "", + isAnonymous: 1, //是否匿名发布 1.匿名,0.公开 + + goodsList: [], //订单列表 + goodsEvalList: [], //评价列表 + + imgList: [], + isEvaluate: 0, //判断是否为追评 + + flag: false, //防止重复点击 , + evaluateConfig: { + evaluate_audit: 1, + evaluate_show: 0, + evaluate_status: 1 + }, + + isIphoneX: false //判断手机是否是iphoneX以上 + }; + }, + onLoad(options) { + //接收订单号,订单是否是追评等信息 + options.order_id ? (this.orderId = options.order_id) : this.$util.redirectTo('/pages/order/list'); + + this.isIphoneX = this.$util.uniappIsIPhoneX(); + if (!this.storeToken) { + this.$util.redirectTo('/pages_tool/login/login', { + back: '/pages_tool/order/evaluate?order_id=' + this.orderId + }, 'redirectTo'); + } + this.getEvaluateConfig(); + this.getOrderInfo(); + }, + onShow() { + //初始化重复点击 + this.flag = false; + }, + methods: { + //获取订单信息 + getOrderInfo() { + //获取订单信息 + let data = { + order_id: this.orderId + }; + this.$api.sendRequest({ + url: '/api/order/evluateinfo', + data: data, + success: res => { + if (res.code == 0) { + this.isEvaluate = res.data.evaluate_status + this.goodsList = res.data.list; + if (this.goodsList.length) { + this.orderNo = res.data.list[0].order_no; + } + if (this.isEvaluate) { + for (let i = 0; i < res.data.list.length; i++) { + let array = []; + this.imgList.push(array) + this.goodsEvalList.push({ + order_goods_id: res.data.list[i].order_goods_id, + goods_id: res.data.list[i].goods_id, + sku_id: res.data.list[i].sku_id, + again_content: "", + again_images: "" + }); + } + } else { + for (let i = 0; i < res.data.list.length; i++) { + let array = []; + this.imgList.push(array) + this.goodsEvalList.push({ + content: '', // 评价内容 + images: "", //图片数组 + scores: 5, // 评分 + explain_type: 1, // 评价类型 + order_goods_id: res.data.list[i].order_goods_id, + goods_id: res.data.list[i].goods_id, + sku_id: res.data.list[i].sku_id, + sku_name: res.data.list[i].sku_name, + sku_price: res.data.list[i].price, + sku_image: res.data.list[i].sku_image + }); + } + } + } else { + this.$util.showToast({ + title: "未获取到订单数据" + }) + setTimeout(() => { + this.$util.redirectTo('/pages/order/list', {}, "redirectTo"); + }, 1000) + } + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + }, + fail() { + if (this.$refs.loadingCover) this.$refs.loadingCover.hide(); + } + }); + }, + //监听评分变化 + setStar(e) { + this.goodsEvalList[e.index].scores = e.value; + if (e.value >= 4) { + this.goodsEvalList[e.index].explain_type = 1; + } else if (1 < e.value && e.value < 4) { + this.goodsEvalList[e.index].explain_type = 2 + } else { + this.goodsEvalList[e.index].explain_type = 3 + } + }, + //切换,是否匿名 + isAll() { + this.isAnonymous ? this.isAnonymous = 0 : this.isAnonymous = 1 + }, + //添加图片 + addImg(e) { + let size = this.imgList[e].length ? this.imgList[e].length : 0 + this.$util.upload(6 - size, { + path: 'evaluateimg' + }, res => { + let arr = this.imgList[e] + arr = arr.concat(res); + this.imgList[e] = []; + this.$set(this.imgList, e, arr) + if (this.isEvaluate) { + this.goodsEvalList[e].again_images = this.imgList[e].toString() + } else { + this.goodsEvalList[e].images = this.imgList[e].toString() + } + }); + }, + //删除图片 + deleteImg(i, index, j) { + this.imgList[index].splice(j, 1); + if (this.isEvaluate) { + this.goodsEvalList[index].again_images = this.imgList[index].toString() + } else { + this.goodsEvalList[index].images = this.imgList[index].toString() + } + }, + // 图片预览 + preview(i, j) { + let urls = this.imgList[j]; + for (let k = 0; k < urls.length; k++) { + urls[k] = this.$util.img(urls[k]) + } + uni.previewImage({ + urls: urls, + current: i + }); + }, + + //提交评价 + save() { + if (this.evaluateConfig.evaluate_status == 0) { + this.$util.showToast({ + title: "商家未开启商品评价功能" + }); + return; + } + for (let i = 0; i < this.goodsEvalList.length; i++) { + if (this.isEvaluate) { + if (!this.goodsEvalList[i].again_content.trim().length) { + this.$util.showToast({ + title: "商品的评价不能为空哦" + }); + return; + } + } else { + if (!this.goodsEvalList[i].content.trim().length) { + this.$util.showToast({ + title: "商品的评价不能为空哦" + }); + return; + } + } + } + let goodsEvaluate = JSON.stringify(this.goodsEvalList) + let data = { + order_id: this.orderId, + goods_evaluate: goodsEvaluate, + }; + if (!this.isEvaluate) { + data.order_no = this.orderNo; + data.member_name = this.memberInfo.nickname; + data.member_headimg = this.memberInfo.headimg; + data.is_anonymous = this.isAnonymous; + } + if (this.flag) return; + this.flag = true; + this.$api.sendRequest({ + url: this.isEvaluate ? '/api/goodsevaluate/again' : '/api/goodsevaluate/add', + data: data, + success: res => { + if (res.code == 0) { + this.$util.showToast({ + title: "评价成功" + }); + setTimeout(() => { + this.$util.redirectTo('/pages/order/list', {}, "redirectTo"); + }, 1000); + } else { + this.$util.showToast({ + title: res.message + }); + this.flag = false; + } + }, + fail: res => { + this.flag = false; + } + }); + }, + imageError(index) { + this.goodsList[index].sku_image = this.$util.getDefaultImage().goods; + this.$forceUpdate(); + }, + getEvaluateConfig() { + this.$api.sendRequest({ + url: '/api/goodsevaluate/config', + success: res => { + if (res.code == 0) { + var data = res.data; + this.evaluateConfig = data; + } + } + }); + } + } +}; \ No newline at end of file diff --git a/pages_tool/order/public/js/refundMethod.js b/pages_tool/order/public/js/refundMethod.js new file mode 100644 index 0000000..2feb464 --- /dev/null +++ b/pages_tool/order/public/js/refundMethod.js @@ -0,0 +1,30 @@ +export default { + methods: { + /** + * 撤销退款申请 + * @param {Object} order_goods_id + * @param {Object} callback + */ + cancleRefund(order_goods_id, callback) { + uni.showModal({ + content: '撤销之后本次申请将会关闭,如后续仍有问题可再次发起申请。', + cancelText: '暂不撤销', + cancelColor: '#898989', + success: res => { + if (res.confirm) { + this.$api.sendRequest({ + url: '/api/orderrefund/cancel', + data: { + order_goods_id + }, + success: res => { + typeof callback == 'function' && callback(res); + } + }) + } + } + }) + }, + + } +} diff --git a/pages_tool/order/refund.vue b/pages_tool/order/refund.vue new file mode 100644 index 0000000..7cfd496 --- /dev/null +++ b/pages_tool/order/refund.vue @@ -0,0 +1,306 @@ + + + + + + + + + + + {{ refund_data.order_goods_info.sku_name }} + + + + + + + 退款无需退货 + 没收到货,或与卖家协商同意无需退货只退款 + + + + + + 退货退款 + 已收到货,需退还收到的货物 + + + + + + + + + 退款原因: + + 请选择 + {{ refund_reason }} + + + + + 退款金额: + {{ $lang('common.currencySymbol') }}{{ refund_data.refund_money }} + + + + + 退款说明 + + + + + + + + + + + + {{ $lang('common.submit') }} + + + + + + + 退款原因 + + + + + + + {{ item }} + + + + + + + 确定 + + + + + + + + + + + + + + diff --git a/pages_tool/order/refund_batch.vue b/pages_tool/order/refund_batch.vue new file mode 100644 index 0000000..a9e3084 --- /dev/null +++ b/pages_tool/order/refund_batch.vue @@ -0,0 +1,312 @@ + + + + + + + + + + + {{ item.sku_name }} + + + + + + + + 退款原因: + + 请选择 + {{ refund_reason }} + + + + + 退款方式: + 退款无需退货 + 退货退款 + + + 退款金额: + {{ $lang('common.currencySymbol') }}{{ refund_data.refund_money }} + + + + + 退款说明 + + + + + + + + + + + + + {{ $lang('common.submit') }} + + + + + + + 退款原因 + + + + + + + {{ item }} + + + + + + + 确定 + + + + + + + + + + + + + + diff --git a/pages_tool/order/refund_detail.vue b/pages_tool/order/refund_detail.vue new file mode 100644 index 0000000..898bf3e --- /dev/null +++ b/pages_tool/order/refund_detail.vue @@ -0,0 +1,277 @@ + + + + + + + {{ detail.refund_status_name }} + + 如果商家拒绝,你可重新发起申请 + 如果商家同意,将通过申请并退款给你 + + + + 如果商家确认收货将会退款给你 + 如果商家拒绝收货,该次退款将会关闭,你可以重新发起退款 + + + + + 协商记录 + + + + + 退货地址 + + 收货人:{{ detail.shop_contacts }} + + + 联系方式:{{ detail.shop_mobile }} + + + 退货地址:{{ detail.shop_address }} + 复制 + + + + + 退款信息 + + + + + + + + {{ detail.sku_name }} + + + + + 退款方式:{{ detail.refund_type == 1 ? '仅退款' : '退款退货' }} + 退款途径:{{ detail.refund_money_type == 1 ? '原路退款' : detail.refund_money_type == 2 ? '线下退款' : '退款到余额' }} + 退款原因:{{ detail.refund_reason }} + 退款金额:{{ $lang('common.currencySymbol') }}{{ detail.refund_real_money }} + 退款金额:{{ $lang('common.currencySymbol') }}{{ detail.refund_apply_money }} + 退款编号:{{ detail.refund_no }} + 申请时间:{{ $util.timeStampTurnTime(detail.refund_action_time) }} + 退款时间:{{ $util.timeStampTurnTime(detail.refund_time) }} + 退款说明:{{ detail.refund_remark }} + 退款积分:{{ detail.use_point }} + + + + + + + {{ actionItem.title }} + + + + + + + + + 物流公司 + + + + + + 物流单号 + + + + + + 物流说明 + + + + + + 提交 + + + + + + + + + {{ logItem.action_way == 1 ? '买家' : '卖家' }} + {{ $util.timeStampTurnTime(logItem.action_time) }} + + + {{ logItem.action }} + {{ logItem.desc }} + + + + + + + + 返回详情 + + + + + + + + + + + diff --git a/pages_tool/order/refund_goods_select.vue b/pages_tool/order/refund_goods_select.vue new file mode 100644 index 0000000..f34e376 --- /dev/null +++ b/pages_tool/order/refund_goods_select.vue @@ -0,0 +1,226 @@ + + + + + 共{{refund_data.length}}件商品 + + + + + + + + + + + {{item.sku_name}} + + + + + + + + + + 下一步 + 请选择商品 + + + + + + + + + diff --git a/pages_tool/order/refund_type_select.vue b/pages_tool/order/refund_type_select.vue new file mode 100644 index 0000000..1356ef1 --- /dev/null +++ b/pages_tool/order/refund_type_select.vue @@ -0,0 +1,121 @@ + + + + + + + + 退款无需退货 + 没收到货,或与卖家协商同意无需退货只退款 + + + + + + 退货退款 + 已收到货,需退还收到的货物 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/pay/cashier.vue b/pages_tool/pay/cashier.vue new file mode 100644 index 0000000..b620d4a --- /dev/null +++ b/pages_tool/pay/cashier.vue @@ -0,0 +1,379 @@ + + + + + + {{ payInfo.pay_body }} + + ¥ + {{ payInfo.pay_money | moneyFormat }} + + + + + + + + {{ item.name }} + + + + + 确认支付 + + 店铺尚未配置支付方式! + + + + + + + + + + + diff --git a/pages_tool/pay/index.vue b/pages_tool/pay/index.vue new file mode 100644 index 0000000..5a1833c --- /dev/null +++ b/pages_tool/pay/index.vue @@ -0,0 +1,133 @@ + + + + + {{ $lang('paymentAmount') }} + + {{ $lang('common.currencySymbol') }} + {{ payInfo.pay_money }} + + {{ payInfo.pay_body }} + + + + + + + + + + diff --git a/pages_tool/pay/result.vue b/pages_tool/pay/result.vue new file mode 100644 index 0000000..818ece9 --- /dev/null +++ b/pages_tool/pay/result.vue @@ -0,0 +1,344 @@ + + + + + + + + {{ $lang('paymentSuccess') }} + + {{ $lang('common.currencySymbol') }} + {{ parseFloat(payInfo.pay_money).toFixed(2).split(".")[0] }} + .{{ parseFloat(payInfo.pay_money).toFixed(2).split(".")[1] }} + + + + + {{ $lang('paymentFail') }} + + + + + 恭喜您获得 + + + + + {{ consumeInfo.point_num }} + 积分 + + + + {{ consumeInfo.growth_num }} + 成长值 + + + + {{ consumeInfo.coupon_list.length }} + 张优惠券 + + + + + + + 充值记录 + 会员卡 + 查看订单 + 查看订单 + 查看订单 + + 查看订单 + + {{ $lang('goHome') }} + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pages_tool/pay/wx_pay.vue b/pages_tool/pay/wx_pay.vue new file mode 100644 index 0000000..7629f8f --- /dev/null +++ b/pages_tool/pay/wx_pay.vue @@ -0,0 +1,94 @@ + + + + + + + 点击右上角跳转到浏览器打开 + + + + + diff --git a/pages_tool/recharge/list.vue b/pages_tool/recharge/list.vue new file mode 100644 index 0000000..5155b27 --- /dev/null +++ b/pages_tool/recharge/list.vue @@ -0,0 +1,639 @@ + + + + + + + + + 充值金额 + 充值记录 + + + + + ¥ + + + + + + + + {{ parseFloat(item.face_value).toFixed(0) }} + 元 + + 售价 {{ item.buy_price }} 元 + + + + + + + + + + + + + + 请输入充值金额 + + {{keywordsInfo.price?keywordsInfo.price:'金额'}}元 + + + 售价{{payMoney}}元 + + + + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + + 0 + + + + + 确认充值 + + + + + + + + 充值 + + + + + + + + + + diff --git a/pages_tool/recharge/order_list.vue b/pages_tool/recharge/order_list.vue new file mode 100644 index 0000000..900a7b3 --- /dev/null +++ b/pages_tool/recharge/order_list.vue @@ -0,0 +1,177 @@ + + + + + + + + + + {{ orderItem.order_no }} + + + {{ $util.timeStampTurnTime(orderItem.create_time) }} + + + + 充值成功 + + + ¥ + {{ orderItem.buy_price }} + + + + + + + + + + + + + + + + + diff --git a/pages_tool/storeclose/storeclose.vue b/pages_tool/storeclose/storeclose.vue new file mode 100644 index 0000000..2ae9896 --- /dev/null +++ b/pages_tool/storeclose/storeclose.vue @@ -0,0 +1,99 @@ + + + + + + {{ textVal }} + + + + + + + diff --git a/pages_tool/vr/index.vue b/pages_tool/vr/index.vue new file mode 100644 index 0000000..bfe126c --- /dev/null +++ b/pages_tool/vr/index.vue @@ -0,0 +1,52 @@ + + + + + + + + + + + + diff --git a/pages_tool/webview/webview.vue b/pages_tool/webview/webview.vue new file mode 100644 index 0000000..f6fff44 --- /dev/null +++ b/pages_tool/webview/webview.vue @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..30988dd --- /dev/null +++ b/project.config.json @@ -0,0 +1,75 @@ +{ + "description": "项目配置文件", + "packOptions": { + "ignore": [] + }, + "setting": { + "urlCheck": true, + "es6": true, + "enhance": false, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": false, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "enableEngineNative": false, + "bundle": false, + "useIsolateContext": true, + "useCompilerModule": true, + "userConfirmedUseCompilerModuleSwitch": false, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true + }, + "compileType": "miniprogram", + "libVersion": "2.16.1", + "appid": "wx59e6ba6050bbe7bc", + "projectname": "niushop_b2c_v4_uniapp", + "debugOptions": { + "hidedInDevtools": [] + }, + "scripts": {}, + "staticServerOptions": { + "baseURL": "", + "servePath": "" + }, + "isGameTourist": false, + "condition": { + "search": { + "list": [] + }, + "conversation": { + "list": [] + }, + "game": { + "list": [] + }, + "plugin": { + "list": [] + }, + "gamePlugin": { + "list": [] + }, + "miniprogram": { + "list": [] + } + } +} \ No newline at end of file diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..34eb0f6 --- /dev/null +++ b/store/index.js @@ -0,0 +1,351 @@ +import Vue from 'vue' +import Vuex from 'vuex' +Vue.use(Vuex) + +import Http from '../common/js/http.js' +import colorList from '../common/js/style_color.js' + +const store = new Vuex.Store({ + state: { + token: null, + siteInfo: null, + memberInfo: null, + tabBarList: '', + siteState: 1, + themeStyle: '', + addonIsExist: { + bundling: 0, + coupon: 0, + discount: 0, + fenxiao: 0, + gift: 0, + groupbuy: 0, + manjian: 0, + memberconsume: 0, + memberrecharge: 0, + memberregister: 0, + membersignin: 0, + memberwithdraw: 0, + memberrecommend: 0, + pintuan: 0, + pointexchange: 0, + seckill: 0, + store: 0, + topic: 0, + bargain: 0, + membercancel: 0, + servicer: 0, + supermember: 0, + giftcard: 0, + divideticket: 0, + scenefestival: 0, + birthdaygift: 0, + pinfan: 0, + form: 0 + }, + authInfo: {}, // 授权信息 + flRefresh: 0, + location: null, // 定位信息 + defaultImg: { + goods: '', + head: '', + store: '', + article: '' + }, + cartList: {}, + cartIds: [], + cartNumber: 0, + cartMoney: 0, + cartChange: 0, + bottomNavHidden: false, // 底部导航是否隐藏,true:隐藏,false:显示 + globalStoreConfig: null, // 门店配置 + globalStoreInfo: null, // 门店信息 + defaultStoreInfo: null, // 默认门店 + cartPosition: null, // 购物车所在位置 + componentRefresh: 0, // 组件刷新 + servicerConfig: null, // 客服配置 + diySeckillInterval: 0, + diyGroupPositionObj: {}, + diyGroupShowModule: '', + tabBarHeight: '56px', + mapConfig: { + tencent_map_key: '', + wap_is_open: 1, + wap_valid_time: 0 + }, + copyright: null + }, + mutations: { + // 设置那些组件展示 + setDiyGroupShowModule(state, data) { + state.diyGroupShowModule = data; + }, + // 设置diyGroup中组件原有高度,通过他们来实现在首页的定位 + setDiyGroupPositionObj(state, data) { + state.diyGroupPositionObj = Object.assign({}, state.diyGroupPositionObj, data); + }, + setSiteState(state, siteStateVal) { + state.siteState = siteStateVal; + }, + setThemeStyle(state, value) { + state.themeStyle = value + uni.setStorageSync('themeStyle', value); // 初始化数据调用 + }, + setTabBarList(state, value) { + state.tabBarList = value; + }, + setAddonIsExist(state, value) { + state.addonIsExist = value; + uni.setStorageSync('addonIsExist', value); // 初始化数据调用 + }, + setToken(state, value) { + state.token = value; + if (value) { + uni.setStorageSync('token', value); // 初始化数据调用 + } else { + uni.removeStorageSync('token'); + } + }, + setAuthinfo(state, value) { + state.authInfo = value; + }, + setflRefresh(state, flRefreshVal) { + state.flRefresh = flRefreshVal; + }, + setLocation(state, value) { + var date = new Date(); + date.setSeconds(60 * state.mapConfig.wap_valid_time); + value.valid_time = date.getTime() / 1000; // 定位信息 5分钟内有效,过期后将重新获取定位信息 + state.location = value; + uni.setStorageSync('location', value); // 初始化数据调用 + }, + setDefaultImg(state, value) { + state.defaultImg = value; + uni.setStorageSync('defaultImg', value); // 初始化数据调用 + }, + setSiteInfo(state, value) { + state.siteInfo = value; + uni.setStorageSync('siteInfo', value); // 初始化数据调用 + }, + setShopInfo(state, value) { + state.shopInfo = value; + uni.setStorageSync('shopInfo', value); // 初始化数据调用 + }, + setCartChange(state) { + state.cartChange += 1; + }, + setBottomNavHidden(state, value) { + state.bottomNavHidden = value; + }, + setGlobalStoreConfig(state, value) { + state.globalStoreConfig = value; + uni.setStorageSync('globalStoreConfig', value); // 初始化数据调用 + }, + setGlobalStoreInfo(state, value) { + state.globalStoreInfo = value; + uni.setStorageSync('globalStoreInfo', value); // 初始化数据调用 + }, + setDefaultStoreInfo(state, value) { + state.defaultStoreInfo = value; + uni.setStorageSync('defaultStoreInfo', value); // 初始化数据调用 + }, + setCartPosition(state, value) { + state.cartPosition = value; + }, + setComponentRefresh(state) { + state.componentRefresh += 1; + }, + // 客服配置 + setServicerConfig(state, value) { + state.servicerConfig = value; + uni.setStorageSync('servicerConfig', value); + }, + setDiySeckillInterval(state, value) { + state.diySeckillInterval = value; + }, + setTabBarHeight(state, value) { + state.tabBarHeight = value; + }, + setMapConfig(state, value) { + state.mapConfig = value; + uni.setStorageSync('mapConfig', value); + }, + setCopyright(state, value) { + state.copyright = value; + uni.setStorageSync('copyright', value); + }, + setMemberInfo(state, value) { + state.memberInfo = value; + if (value) { + uni.setStorageSync('memberInfo', value); + } else { + uni.removeStorageSync('memberInfo'); + } + }, + setCartNumber(state, cartNumber) { + state.cartNumber = cartNumber + }, + setCartList(state, value) { + state.cartList = value; + }, + setCartIds(state, value) { + state.cartIds = value; + }, + setCartMoney(state, value) { + state.cartMoney = value; + } + }, + actions: { + init() { + return new Promise((resolve, reject) => { + Http.sendRequest({ + url: '/api/config/init', + success: res => { + var data = res.data; + if (data) { + this.commit('setThemeStyle', colorList[data.style_theme.name]); + + // 底部导航 + this.commit('setTabBarList', data.diy_bottom_nav); + + this.commit('setAddonIsExist', data.addon_is_exist); + + this.commit('setDefaultImg', data.default_img); + + this.commit('setSiteInfo', data.site_info); + + this.commit('setServicerConfig', data.servicer); + + this.commit('setCopyright', data.copyright); + + this.commit('setMapConfig', data.map_config); + + this.commit('setGlobalStoreConfig', data.store_config); + + //联系我们 + + this.commit('setShopInfo', data.shop_info); + // 默认总店 + if (data.store_info) { + this.commit('setDefaultStoreInfo', data.store_info); + } else { + // 清空不存在的门店信息 + this.commit('setDefaultStoreInfo', null); + this.commit('setGlobalStoreInfo', null); + } + + resolve(data); + } + } + }); + }) + }, + // 查询购物车列表、总数量、总价格 + getCartNumber() { + Http.sendRequest({ + url: '/api/cart/lists', + data: {}, + success: res => { + if (res.code == 0) { + let list = []; + let ids = []; + let totalMoney = 0; + let totalNum = 0; + + if (res.data.length) { + + res.data.forEach((item) => { + let cart = { + cart_id: item.cart_id, + goods_id: item.goods_id, + sku_id: item.sku_id, + num: item.num, + discount_price: item.discount_price + }; + + if (!list['goods_' + cart.goods_id]) { + list['goods_' + cart.goods_id] = {}; + } + list['goods_' + cart.goods_id]['sku_' + cart + .sku_id + ] = + cart; + ids.push(cart.cart_id); + }); + + for (let goods in list) { + let num = 0; + let money = 0; + for (let sku in list[goods]) { + let item = list[goods][sku]; + if (typeof item == 'object') { + num += item.num; + money += parseFloat(item.discount_price) * parseInt(item + .num); + } + } + list[goods].num = num; + list[goods].total_money = money; + + totalNum += num; + totalMoney += money; + + } + } + + this.commit('setCartList', list); + + this.commit('setCartIds', ids); + + this.commit('setCartNumber', totalNum); + + this.commit('setCartMoney', totalMoney); + + } + } + }); + }, + // 清空购物车 ns-goods-sku-index组件中引用 + emptyCart() { + this.commit('setCartList', {}); + this.commit('setCartIds', []); + this.commit('setCartNumber', 0); + this.commit('setCartMoney', 0); + }, + // 计算购物车数量、价格 + cartCalculate() { + + let ids = []; + let totalMoney = 0; + let totalNum = 0; + + for (let k in this.state.cartList) { + let item = this.state.cartList[k]; + + let num = 0; + let money = 0; + for (let sku in item) { + if (typeof item[sku] == 'object') { + num += item[sku].num; + money += parseFloat(item[sku].discount_price) * parseInt(item[sku].num); + ids.push(item[sku].cart_id); + } + } + item.num = num; + item.total_money = money; + + totalNum += num; + totalMoney += money; + + } + + this.commit('setCartNumber', totalNum); + + this.commit('setCartMoney', totalMoney); + + this.commit('setCartIds', ids); + + } + } +}) +export default store \ No newline at end of file diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..bd9cf10 --- /dev/null +++ b/uni.scss @@ -0,0 +1,32 @@ +/** + * 你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * 建议使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + */ + +//主色调,红色:#FF0036,绿色 #4CAF50,蓝色:#03A9F4,黄色:#FF9800,粉色:#FF547B,棕色:#C3A769,浅绿色:#65C4AA,黑色:#333333,紫色:#B323B4,淡粉色:#FF8B8B + +// 颜色 +$color-title: #303133; // 主标题 +$color-sub: #606266; // 副标题 +$color-tip: #909399; // 辅助提示色 +$color-bg: #f8f8f8; // 背景色 +$color-line: #eeeeee; //分割线 +$color-disabled: #cccccc; // 禁用色 + +// 文字 +$font-size-base: 28rpx; // 14px,正文文字 +$font-size-toolbar: 32rpx; // 16px,用于导航栏、标题 +$font-size-sub: 26rpx; // 13px,副标题 +$font-size-tag: 24rpx; // 12px,辅助性文字/大标签 +$font-size-goods-tag: 22rpx; // 11px,商品列表角标 +$font-size-activity-tag: 20rpx; // 10px,活动角标(拼团等角标)/小标签文字 + +$margin-both: 30rpx; //外边距 左右 +$margin-updown: 20rpx; // 外边距 上下 +$border-radius: 10rpx; //圆角 +$padding: 20rpx; //内边距 + +$base-color: var(--base-color); // 主色调 +$base-help-color: var(--base-help-color); //辅助颜色 + +$goods-price-color: var(--goods-price-color); diff --git a/uni_modules/mp-html/README.md b/uni_modules/mp-html/README.md new file mode 100644 index 0000000..7626289 --- /dev/null +++ b/uni_modules/mp-html/README.md @@ -0,0 +1,194 @@ +## 为减小组件包的大小,默认组件包中不包含编辑、latex 公式等扩展功能,需要使用扩展功能的请参考下方的 插件扩展 栏的说明 + +## 功能介绍 +- 全端支持(含 `v3、NVUE`) +- 支持丰富的标签(包括 `table`、`video`、`svg` 等) +- 支持丰富的事件效果(自动预览图片、链接处理等) +- 支持设置占位图(加载中、出错时、预览时) +- 支持锚点跳转、长按复制等丰富功能 +- 支持大部分 *html* 实体 +- 丰富的插件(关键词搜索、内容编辑、`latex` 公式等) +- 效率高、容错性强且轻量化 + +查看 [功能介绍](https://jin-yufeng.gitee.io/mp-html/#/overview/feature) 了解更多 + +## 使用方法 +- `uni_modules` 方式 + 1. 点击右上角的 `使用 HBuilder X 导入插件` 按钮直接导入项目或点击 `下载插件 ZIP` 按钮下载插件包并解压到项目的 `uni_modules/mp-html` 目录下 + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + + ``` + ```javascript + export default { + data() { + return { + html: 'Hello World!' + } + } + } + ``` + 3. 需要更新版本时在 `HBuilder X` 中右键 `uni_modules/mp-html` 目录选择 `从插件市场更新` 即可 + +- 源码方式 + 1. 从 [github](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 或 [gitee](https://gitee.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 下载源码 + 插件市场的 **非 uni_modules 版本** 无法更新,不建议从插件市场获取 + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + ``` + ```javascript + import mpHtml from '@/components/mp-html/mp-html' + export default { + // HBuilderX 2.5.5+ 可以通过 easycom 自动引入 + components: { + mpHtml + }, + data() { + return { + html: 'Hello World!' + } + } + } + ``` + +- npm 方式 + 1. 在项目根目录下执行 + ```bash + npm install mp-html + ``` + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + ``` + ```javascript + import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html' + export default { + // 不可省略 + components: { + mpHtml + }, + data() { + return { + html: 'Hello World!' + } + } + } + ``` + 3. 需要更新版本时执行以下命令即可 + ```bash + npm update mp-html + ``` + + 使用 *cli* 方式运行的项目,通过 *npm* 方式引入时,需要在 *vue.config.js* 中配置 *transpileDependencies*,详情可见 [#330](https://github.com/jin-yufeng/mp-html/issues/330#issuecomment-913617687) + 如果在 **nvue** 中使用还要将 `dist/uni-app/static` 目录下的内容拷贝到项目的 `static` 目录下,否则无法运行 + +查看 [快速开始](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart) 了解更多 + +## 组件属性 + +| 属性 | 类型 | 默认值 | 说明 | +|:---:|:---:|:---:|---| +| container-style | String | | 容器的样式([2.1.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v210)) | +| content | String | | 用于渲染的 html 字符串 | +| copy-link | Boolean | true | 是否允许外部链接被点击时自动复制 | +| domain | String | | 主域名(用于链接拼接) | +| error-img | String | | 图片出错时的占位图链接 | +| lazy-load | Boolean | false | 是否开启图片懒加载 | +| loading-img | String | | 图片加载过程中的占位图链接 | +| pause-video | Boolean | true | 是否在播放一个视频时自动暂停其他视频 | +| preview-img | Boolean | true | 是否允许图片被点击时自动预览 | +| scroll-table | Boolean | false | 是否给每个表格添加一个滚动层使其能单独横向滚动 | +| selectable | Boolean | false | 是否开启文本长按复制 | +| set-title | Boolean | true | 是否将 title 标签的内容设置到页面标题 | +| show-img-menu | Boolean | true | 是否允许图片被长按时显示菜单 | +| tag-style | Object | | 设置标签的默认样式 | +| use-anchor | Boolean | false | 是否使用锚点链接 | + +查看 [属性](https://jin-yufeng.gitee.io/mp-html/#/basic/prop) 了解更多 + +## 组件事件 + +| 名称 | 触发时机 | +|:---:|---| +| load | dom 树加载完毕时 | +| ready | 图片加载完毕时 | +| error | 发生渲染错误时 | +| imgtap | 图片被点击时 | +| linktap | 链接被点击时 | +| play | 音视频播放时 | + +查看 [事件](https://jin-yufeng.gitee.io/mp-html/#/basic/event) 了解更多 + +## api +组件实例上提供了一些 `api` 方法可供调用 + +| 名称 | 作用 | +|:---:|---| +| in | 将锚点跳转的范围限定在一个 scroll-view 内 | +| navigateTo | 锚点跳转 | +| getText | 获取文本内容 | +| getRect | 获取富文本内容的位置和大小 | +| setContent | 设置富文本内容 | +| imgList | 获取所有图片的数组 | +| pauseMedia | 暂停播放音视频([2.2.2+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v222)) | +| setPlaybackRate | 设置音视频播放速率([2.4.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v240)) | + +查看 [api](https://jin-yufeng.gitee.io/mp-html/#/advanced/api) 了解更多 + +## 插件扩展 +除基本功能外,本组件还提供了丰富的扩展,可按照需要选用 + +| 名称 | 作用 | +|:---:|---| +| audio | 音乐播放器 | +| editable | 富文本 **编辑**([示例项目](https://mp-html.oss-cn-hangzhou.aliyuncs.com/editable.zip)) | +| emoji | 解析 emoji | +| highlight | 代码块高亮显示 | +| markdown | 渲染 markdown | +| search | 关键词搜索 | +| style | 匹配 style 标签中的样式 | +| txv-video | 使用腾讯视频 | +| img-cache | 图片缓存 by [@PentaTea](https://github.com/PentaTea) | +| latex | 渲染 latex 公式 by [@Zeng-J](https://github.com/Zeng-J) | + +从插件市场导入的包中 **不含有** 扩展插件,使用插件需通过微信小程序 `富文本插件` 获取或参考以下方法进行打包: +1. 获取完整组件包 + ```bash + npm install mp-html + ``` +2. 编辑 `tools/config.js` 中的 `plugins` 项,选择需要的插件 +3. 生成新的组件包 + 在 `node_modules/mp-html` 目录下执行 + ```bash + npm install + npm run build:uni-app + ``` +4. 拷贝 `dist/uni-app` 中的内容到项目根目录 + +查看 [插件](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin) 了解更多 + +## 关于 nvue +`nvue` 使用原生渲染,不支持部分 `css` 样式,为实现和 `html` 相同的效果,组件内部通过 `web-view` 进行渲染,性能上差于原生,根据 `weex` 官方建议,`web` 标签仅应用在非常规的降级场景。因此,如果通过原生的方式(如 `richtext`)能够满足需要,则不建议使用本组件,如果有较多的富文本内容,则可以直接使用 `vue` 页面 +由于渲染方式与其他端不同,有以下限制: +1. 不支持 `lazy-load` 属性 +2. 视频不支持全屏播放 +3. 如果在 `flex-direction: row` 的容器中使用,需要给组件设置宽度或设置 `flex: 1` 占满剩余宽度 + +纯 `nvue` 模式下,[此问题](https://ask.dcloud.net.cn/question/119678) 修复前,不支持通过 `uni_modules` 引入,需要本地引入(将 [dist/uni-app](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 中的内容拷贝到项目根目录下) + +## 立即体验 + + +## 问题反馈 +遇到问题时,请先查阅 [常见问题](https://jin-yufeng.gitee.io/mp-html/#/question/faq) 和 [issue](https://github.com/jin-yufeng/mp-html/issues) 中是否已有相同的问题 +可通过 [issue](https://github.com/jin-yufeng/mp-html/issues/new/choose) 、插件问答或发送邮件到 [mp_html@126.com](mailto:mp_html@126.com) 提问,不建议在评论区提问(不方便回复) +提问请严格按照 [issue 模板](https://github.com/jin-yufeng/mp-html/issues/new/choose) ,描述清楚使用环境、`html` 内容或可复现的 `demo` 项目以及复现方式,对于 **描述不清**、**无法复现** 或重复的问题将不予回复 + +欢迎加入 `QQ` 交流群: +群1(已满):`699734691` +群2(已满):`778239129` +群3:`960265313` + +查看 [问题反馈](https://jin-yufeng.gitee.io/mp-html/#/question/feedback) 了解更多 diff --git a/uni_modules/mp-html/changelog.md b/uni_modules/mp-html/changelog.md new file mode 100644 index 0000000..6fd03eb --- /dev/null +++ b/uni_modules/mp-html/changelog.md @@ -0,0 +1,150 @@ +## v2.5.0(2024-04-22) +1. `U` `play` 事件增加返回 `src` 等信息 [详细](https://github.com/jin-yufeng/mp-html/issues/526) +2. `U` `preview-img` 属性支持设置为 `all` 开启 `base64` 图片预览 [详细](https://github.com/jin-yufeng/mp-html/issues/536) +3. `U` `editable` 插件增加简易模式(点击文字直接编辑) +4. `U` `latex` 插件支持块级公式 [详细](https://github.com/jin-yufeng/mp-html/issues/582) +5. `F` 修复了表格部分情况下背景丢失的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/587) +6. `F` 修复了部分 `svg` 无法显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/591) +7. `F` 修复了 `h5` 和 `app` 端部分情况下样式无法识别的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/518) +8. `F` 修复了 `latex` 插件部分情况下显示不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/580) +9. `F` 修复了 `editable` 插件表格无法删除的问题 +10. `F` 修复了 `editable` 插件 `vue3` `h5` 端点击图片报错的问题 +11. `F` 修复了 `editable` 插件点击表格没有菜单栏的问题 +## v2.4.3(2024-01-21) +1. `A` 增加 [card](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#card) 插件 [详细](https://github.com/jin-yufeng/mp-html/pull/533) by [@whoooami](https://github.com/whoooami) +2. `F` 修复了 `svg` 中包含 `foreignobject` 可能不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/523) +3. `F` 修复了合并单元格的表格部分情况下显示不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/561) +4. `F` 修复了 `img` 标签设置 `object-fit` 无效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/567) +5. `F` 修复了 `latex` 插件公式会换行的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/540) +6. `F` 修复了 `editable` 和 `audio` 插件共用时点击 `audio` 无法编辑的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/529) by [@whoooami](https://github.com/whoooami) +7. `F` 修复了微信小程序部分情况下图片会报错 `replace of undefined` 的问题 +8. `F` 修复了快手小程序图片不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/571) +## v2.4.2(2023-05-14) +1. `A` `editable` 插件支持修改文字颜色 [详细](https://github.com/jin-yufeng/mp-html/issues/254) +2. `F` 修复了 `svg` 中有 `style` 不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/505) +3. `F` 修复了使用旧版编译器可能报错 `Bad attr nodes` 的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/472) +4. `F` 修复了 `app` 端可能出现无法读取 `lazyLoad` 的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/513) +5. `F` 修复了 `editable` 插件在点击换图时未拼接 `domain` 的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/497) by [@TwoKe945](https://github.com/TwoKe945) +6. `F` 修复了 `latex` 插件部分情况下不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/515) +7. `F` 修复了 `editable` 插件点击音视频时其他标签框不消失的问题 +## v2.4.1(2022-12-25) +1. `F` 修复了没有图片时 `ready` 事件可能不触发的问题 +2. `F` 修复了加载过程中可能出现 `Root label not found` 错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/470) +3. `F` 修复了 `audio` 插件退出页面可能会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/457) +4. `F` 修复了 `vue3` 运行到 `app` 在 `HBuilder X 3.6.10` 以上报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/480) +5. `F` 修复了 `nvue` 端链接中包含 `%22` 时可能无法显示的问题 +6. `F` 修复了 `vue3` 使用 `highlight` 插件可能报错的问题 +## v2.4.0(2022-08-27) +1. `A` 增加了 [setPlaybackRate](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#setPlaybackRate) 的 `api`,可以设置音视频的播放速率 [详细](https://github.com/jin-yufeng/mp-html/issues/452) +2. `A` 示例小程序代码开源 [详细](https://github.com/jin-yufeng/mp-html-demo) +3. `U` 优化 `ready` 事件触发时机,未设置懒加载的情况下基本可以准确触发 [详细](https://github.com/jin-yufeng/mp-html/issues/195) +4. `U` `highlight` 插件在编辑状态下不进行高亮处理,便于编辑 +5. `F` 修复了 `flex` 布局下图片大小可能不正确的问题 +6. `F` 修复了 `selectable` 属性没有设置 `force` 也可能出现渲染异常的问题 +7. `F` 修复了表格中的图片大小可能不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/448) +8. `F` 修复了含有合并单元格的表格可能无法设置竖直对齐的问题 +9. `F` 修复了 `editable` 插件在 `scroll-view` 中使用时工具条位置可能不正确的问题 +10. `F` 修复了 `vue3` 使用 [search](advanced/plugin#search) 插件可能导致错误换行的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/449) +## v2.3.2(2022-08-13) +1. `A` 增加 [latex](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#latex) 插件,可以渲染数学公式 [详细](https://github.com/jin-yufeng/mp-html/pull/447) by [@Zeng-J](https://github.com/Zeng-J) +2. `U` 优化根节点下有很多标签的长内容渲染速度 +3. `U` `highlight` 插件适配 `lang-xxx` 格式 +4. `F` 修复了 `table` 标签设置 `border` 属性后可能无法修改边框样式的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/439) by [@zouxingjie](https://github.com/zouxingjie) +5. `F` 修复了 `editable` 插件输入连续空格无效的问题 +6. `F` 修复了 `vue3` 图片设置 `inline` 会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/438) +7. `F` 修复了 `vue3` 使用 `table` 可能报错的问题 +## v2.3.1(2022-05-20) +1. `U` `app` 端支持使用本地图片 +2. `U` 优化了微信小程序 `selectable` 属性在 `ios` 端的处理 [详细](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) +3. `F` 修复了 `editable` 插件不在顶部时 `tooltip` 位置可能错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/430) +4. `F` 修复了 `vue3` 运行到微信小程序可能报错丢失内容的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/414) +5. `F` 修复了 `vue3` 部分标签可能被错误换行的问题 +6. `F` 修复了 `editable` 插件 `app` 端插入视频无法预览的问题 +## v2.3.0(2022-04-01) +1. `A` 增加了 `play` 事件,音视频播放时触发,可用于与页面其他音视频进行互斥播放 [详细](basic/event#play) +2. `U` `show-img-menu` 属性支持控制预览时是否长按弹出菜单 +3. `U` 优化 `wxs` 处理,提高渲染性能 [详细](https://developers.weixin.qq.com/community/develop/article/doc/0006cc2b204740f601bd43fa25a413) +4. `U` `video` 标签支持 `object-fit` 属性 +5. `U` 增加支持一些常用实体编码 [详细](https://github.com/jin-yufeng/mp-html/issues/418) +6. `F` 修复了图片仅设置高度可能不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/410) +7. `F` 修复了 `video` 标签高度设置为 `auto` 不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/411) +8. `F` 修复了使用 `grid` 布局时可能样式错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/413) +9. `F` 修复了含有合并单元格的表格部分情况下显示异常的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/417) +10. `F` 修复了 `editable` 插件连续插入内容时顺序不正确的问题 +11. `F` 修复了 `uni-app` 包 `vue3` 使用 `audio` 插件报错的问题 +12. `F` 修复了 `uni-app` 包 `highlight` 插件使用自定义的 `prism.min.js` 报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/416) +## v2.2.2(2022-02-26) +1. `A` 增加了 [pauseMedia](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#pauseMedia) 的 `api`,可用于暂停播放音视频 [详细](https://github.com/jin-yufeng/mp-html/issues/317) +2. `U` 优化了长内容的加载速度 +3. `U` 适配 `vue3` [#389](https://github.com/jin-yufeng/mp-html/issues/389)、[#398](https://github.com/jin-yufeng/mp-html/pull/398) by [@zhouhuafei](https://github.com/zhouhuafei)、[#400](https://github.com/jin-yufeng/mp-html/issues/400) +4. `F` 修复了小程序端图片高度设置为百分比时可能不显示的问题 +5. `F` 修复了 `highlight` 插件部分情况下可能显示不完整的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/403) +## v2.2.1(2021-12-24) +1. `A` `editable` 插件增加上下移动标签功能 +2. `U` `editable` 插件支持在文本中间光标处插入内容 +3. `F` 修复了 `nvue` 端设置 `margin` 后可能导致高度不正确的问题 +4. `F` 修复了 `highlight` 插件使用压缩版的 `prism.css` 可能导致背景失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/367) +5. `F` 修复了编辑状态下使用 `emoji` 插件内容为空时可能报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/371) +6. `F` 修复了使用 `editable` 插件后将 `selectable` 属性设置为 `force` 不生效的问题 +## v2.2.0(2021-10-12) +1. `A` 增加 `customElements` 配置项,便于添加自定义功能性标签 [详细](https://github.com/jin-yufeng/mp-html/issues/350) +2. `A` `editable` 插件增加切换音视频自动播放状态的功能 [详细](https://github.com/jin-yufeng/mp-html/pull/341) by [@leeseett](https://github.com/leeseett) +3. `A` `editable` 插件删除媒体标签时触发 `remove` 事件,便于删除已上传的文件 +4. `U` `editable` 插件 `insertImg` 方法支持同时插入多张图片 [详细](https://github.com/jin-yufeng/mp-html/issues/342) +5. `U` `editable` 插入图片和音视频时支持拼接 `domian` 主域名 +6. `F` 修复了内部链接参数中包含 `://` 时被认为是外部链接的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/356) +7. `F` 修复了部分 `svg` 标签名或属性名大小写不正确时不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/351) +8. `F` 修复了 `nvue` 页面运行到非 `app` 平台时可能样式错误的问题 +## v2.1.5(2021-08-13) +1. `A` 增加支持标签的 `dir` 属性 +2. `F` 修复了 `ruby` 标签文字与拼音没有居中对齐的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/325) +3. `F` 修复了音视频标签内有 `a` 标签时可能无法播放的问题 +4. `F` 修复了 `externStyle` 中的 `class` 名包含下划线或数字时可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326) +5. `F` 修复了 `h5` 端引入 `externStyle` 可能不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326) +## v2.1.4(2021-07-14) +1. `F` 修复了 `rt` 标签无法设置样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/318) +2. `F` 修复了表格中有单元格同时合并行和列时可能显示不正确的问题 +3. `F` 修复了 `app` 端无法关闭图片长按菜单的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/322) +4. `F` 修复了 `editable` 插件只能添加图片链接不能修改的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/312) by [@leeseett](https://github.com/leeseett) +## v2.1.3(2021-06-12) +1. `A` `editable` 插件增加 `insertTable` 方法 +2. `U` `editable` 插件支持编辑表格中的空白单元格 [详细](https://github.com/jin-yufeng/mp-html/issues/310) +3. `F` 修复了 `externStyle` 中使用伪类可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/298) +4. `F` 修复了多个组件同时使用时 `tag-style` 属性时可能互相影响的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/305) by [@woodguoyu](https://github.com/woodguoyu) +5. `F` 修复了包含 `linearGradient` 的 `svg` 可能无法显示的问题 +6. `F` 修复了编译到头条小程序时可能报错的问题 +7. `F` 修复了 `nvue` 端不触发 `click` 事件的问题 +8. `F` 修复了 `editable` 插件尾部插入时无法撤销的问题 +9. `F` 修复了 `editable` 插件的 `insertHtml` 方法只能在末尾插入的问题 +10. `F` 修复了 `editable` 插件插入音频不显示的问题 +## v2.1.2(2021-04-24) +1. `A` 增加了 [img-cache](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#img-cache) 插件,可以在 `app` 端缓存图片 [详细](https://github.com/jin-yufeng/mp-html/issues/292) by [@PentaTea](https://github.com/PentaTea) +2. `U` 支持通过 `container-style` 属性设置 `white-space` 来保留连续空格和换行符 [详细](https://jin-yufeng.gitee.io/mp-html/#/question/faq#space) +3. `U` 代码风格符合 [standard](https://standardjs.com) 标准 +4. `U` `editable` 插件编辑状态下支持预览视频 [详细](https://github.com/jin-yufeng/mp-html/issues/286) +5. `F` 修复了 `svg` 标签内嵌 `svg` 时无法显示的问题 +6. `F` 修复了编译到支付宝和头条小程序时部分区域不可复制的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/291) +## v2.1.1(2021-04-09) +1. 修复了对 `p` 标签设置 `tag-style` 可能不生效的问题 +2. 修复了 `svg` 标签中的文本无法显示的问题 +3. 修复了使用 `editable` 插件编辑表格时可能报错的问题 +4. 修复了使用 `highlight` 插件运行到头条小程序时可能没有样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/280) +5. 修复了使用 `editable` 插件 `editable` 属性为 `false` 时会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/284) +6. 修复了 `style` 插件连续子选择器失效的问题 +7. 修复了 `editable` 插件无法修改图片和字体大小的问题 +## v2.1.0.2(2021-03-21) +修复了 `nvue` 端使用可能报错的问题 +## v2.1.0(2021-03-20) +1. `A` 增加了 [container-style](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#container-style) 属性 [详细](https://gitee.com/jin-yufeng/mp-html/pulls/1) +2. `A` 增加支持 `strike` 标签 +3. `A` `editable` 插件增加 `placeholder` 属性 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable) +4. `A` `editable` 插件增加 `insertHtml` 方法 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable) +5. `U` 外部样式支持标签名选择器 [详细](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart#setting) +6. `F` 修复了 `nvue` 端部分情况下可能不显示的问题 +## v2.0.5(2021-03-12) +1. `U` [linktap](https://jin-yufeng.gitee.io/mp-html/#/basic/event#linktap) 事件增加返回内部文本内容 `innerText` [详细](https://github.com/jin-yufeng/mp-html/issues/271) +2. `U` [selectable](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) 属性设置为 `force` 时能够在微信 `iOS` 端生效(文本块会变成 `inline-block`) [详细](https://github.com/jin-yufeng/mp-html/issues/267) +3. `F` 修复了部分情况下竖向无法滚动的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/182) +4. `F` 修复了多次修改富文本数据时部分内容可能不显示的问题 +5. `F` 修复了 [腾讯视频](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#txv-video) 插件可能无法播放的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/265) +6. `F` 修复了 [highlight](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#highlight) 插件没有设置高亮语言时没有应用默认样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/276) by [@fuzui](https://github.com/fuzui) diff --git a/uni_modules/mp-html/components/mp-html/mp-html.vue b/uni_modules/mp-html/components/mp-html/mp-html.vue new file mode 100644 index 0000000..5d1d36d --- /dev/null +++ b/uni_modules/mp-html/components/mp-html/mp-html.vue @@ -0,0 +1,498 @@ + + + + + + + + + + + + + + + diff --git a/uni_modules/mp-html/components/mp-html/node/node.vue b/uni_modules/mp-html/components/mp-html/node/node.vue new file mode 100644 index 0000000..09252fd --- /dev/null +++ b/uni_modules/mp-html/components/mp-html/node/node.vue @@ -0,0 +1,587 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + {{n.text}} + + + {{n.text}} + + \n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/uni_modules/mp-html/components/mp-html/parser.js b/uni_modules/mp-html/components/mp-html/parser.js new file mode 100644 index 0000000..5a93000 --- /dev/null +++ b/uni_modules/mp-html/components/mp-html/parser.js @@ -0,0 +1,1393 @@ +/** + * @fileoverview html 解析器 + */ + +// 配置 +const config = { + // 信任的标签(保持标签名不变) + trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,ruby,rt,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'), + + // 块级标签(转为 div,其他的非信任标签转为 span) + blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'), + + // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3 + // 行内标签 + inlineTags: makeMap('abbr,b,big,code,del,em,i,ins,label,q,small,span,strong,sub,sup'), + // #endif + + // 要移除的标签 + ignoreTags: makeMap('area,base,canvas,embed,frame,head,iframe,input,link,map,meta,param,rp,script,source,style,textarea,title,track,wbr'), + + // 自闭合的标签 + voidTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'), + + // html 实体 + entities: { + lt: '<', + gt: '>', + quot: '"', + apos: "'", + ensp: '\u2002', + emsp: '\u2003', + nbsp: '\xA0', + semi: ';', + ndash: '–', + mdash: '—', + middot: '·', + lsquo: '‘', + rsquo: '’', + ldquo: '“', + rdquo: '”', + bull: '•', + hellip: '…', + larr: '←', + uarr: '↑', + rarr: '→', + darr: '↓' + }, + + // 默认的标签样式 + tagStyle: { + // #ifndef APP-PLUS-NVUE + address: 'font-style:italic', + big: 'display:inline;font-size:1.2em', + caption: 'display:table-caption;text-align:center', + center: 'text-align:center', + cite: 'font-style:italic', + dd: 'margin-left:40px', + mark: 'background-color:yellow', + pre: 'font-family:monospace;white-space:pre', + s: 'text-decoration:line-through', + small: 'display:inline;font-size:0.8em', + strike: 'text-decoration:line-through', + u: 'text-decoration:underline' + // #endif + }, + + // svg 大小写对照表 + svgDict: { + animatetransform: 'animateTransform', + lineargradient: 'linearGradient', + viewbox: 'viewBox', + attributename: 'attributeName', + repeatcount: 'repeatCount', + repeatdur: 'repeatDur', + foreignobject: 'foreignObject' + } +} +const tagSelector={} +const { + windowWidth, + // #ifdef MP-WEIXIN + system + // #endif +} = uni.getSystemInfoSync() +const blankChar = makeMap(' ,\r,\n,\t,\f') +let idIndex = 0 + +// #ifdef H5 || APP-PLUS +config.ignoreTags.iframe = undefined +config.trustTags.iframe = true +config.ignoreTags.embed = undefined +config.trustTags.embed = true +// #endif +// #ifdef APP-PLUS-NVUE +config.ignoreTags.source = undefined +config.ignoreTags.style = undefined +// #endif + +/** + * @description 创建 map + * @param {String} str 逗号分隔 + */ +function makeMap (str) { + const map = Object.create(null) + const list = str.split(',') + for (let i = list.length; i--;) { + map[list[i]] = true + } + return map +} + +/** + * @description 解码 html 实体 + * @param {String} str 要解码的字符串 + * @param {Boolean} amp 要不要解码 & + * @returns {String} 解码后的字符串 + */ +function decodeEntity (str, amp) { + let i = str.indexOf('&') + while (i !== -1) { + const j = str.indexOf(';', i + 3) + let code + if (j === -1) break + if (str[i + 1] === '#') { + // { 形式的实体 + code = parseInt((str[i + 2] === 'x' ? '0' : '') + str.substring(i + 2, j)) + if (!isNaN(code)) { + str = str.substr(0, i) + String.fromCharCode(code) + str.substr(j + 1) + } + } else { + // 形式的实体 + code = str.substring(i + 1, j) + if (config.entities[code] || (code === 'amp' && amp)) { + str = str.substr(0, i) + (config.entities[code] || '&') + str.substr(j + 1) + } + } + i = str.indexOf('&', i + 1) + } + return str +} + +/** + * @description 合并多个块级标签,加快长内容渲染 + * @param {Array} nodes 要合并的标签数组 + */ +function mergeNodes (nodes) { + let i = nodes.length - 1 + for (let j = i; j >= -1; j--) { + if (j === -1 || nodes[j].c || !nodes[j].name || (nodes[j].name !== 'div' && nodes[j].name !== 'p' && nodes[j].name[0] !== 'h') || (nodes[j].attrs.style || '').includes('inline')) { + if (i - j >= 5) { + nodes.splice(j + 1, i - j, { + name: 'div', + attrs: {}, + children: nodes.slice(j + 1, i + 1) + }) + } + i = j - 1 + } + } +} + +/** + * @description html 解析器 + * @param {Object} vm 组件实例 + */ +function Parser (vm) { + this.options = vm || {} + this.tagStyle = Object.assign({}, config.tagStyle, this.options.tagStyle) + this.imgList = vm.imgList || [] + this.imgList._unloadimgs = 0 + this.plugins = vm.plugins || [] + this.attrs = Object.create(null) + this.stack = [] + this.nodes = [] + this.pre = (this.options.containerStyle || '').includes('white-space') && this.options.containerStyle.includes('pre') ? 2 : 0 +} + +/** + * @description 执行解析 + * @param {String} content 要解析的文本 + */ +Parser.prototype.parse = function (content) { + // 插件处理 + for (let i = this.plugins.length; i--;) { + if (this.plugins[i].onUpdate) { + content = this.plugins[i].onUpdate(content, config) || content + } + } + + new Lexer(this).parse(content) + // 出栈未闭合的标签 + while (this.stack.length) { + this.popNode() + } + if (this.nodes.length > 50) { + mergeNodes(this.nodes) + } + return this.nodes +} + +/** + * @description 将标签暴露出来(不被 rich-text 包含) + */ +Parser.prototype.expose = function () { + // #ifndef APP-PLUS-NVUE + for (let i = this.stack.length; i--;) { + const item = this.stack[i] + if (item.c || item.name === 'a' || item.name === 'video' || item.name === 'audio') return + item.c = 1 + } + // #endif +} + +/** + * @description 处理插件 + * @param {Object} node 要处理的标签 + * @returns {Boolean} 是否要移除此标签 + */ +Parser.prototype.hook = function (node) { + for (let i = this.plugins.length; i--;) { + if (this.plugins[i].onParse && this.plugins[i].onParse(node, this) === false) { + return false + } + } + return true +} + +/** + * @description 将链接拼接上主域名 + * @param {String} url 需要拼接的链接 + * @returns {String} 拼接后的链接 + */ +Parser.prototype.getUrl = function (url) { + const domain = this.options.domain + if (url[0] === '/') { + if (url[1] === '/') { + // // 开头的补充协议名 + url = (domain ? domain.split('://')[0] : 'http') + ':' + url + } else if (domain) { + // 否则补充整个域名 + url = domain + url + } /* #ifdef APP-PLUS */ else { + url = plus.io.convertLocalFileSystemURL(url) + } /* #endif */ + } else if (!url.includes('data:') && !url.includes('://')) { + if (domain) { + url = domain + '/' + url + } /* #ifdef APP-PLUS */ else { + url = plus.io.convertLocalFileSystemURL(url) + } /* #endif */ + } + return url +} + +/** + * @description 解析样式表 + * @param {Object} node 标签 + * @returns {Object} + */ +Parser.prototype.parseStyle = function (node) { + const attrs = node.attrs + const list = (this.tagStyle[node.name] || '').split(';').concat((attrs.style || '').split(';')) + const styleObj = {} + let tmp = '' + + if (attrs.id && !this.xml) { + // 暴露锚点 + if (this.options.useAnchor) { + this.expose() + } else if (node.name !== 'img' && node.name !== 'a' && node.name !== 'video' && node.name !== 'audio') { + attrs.id = undefined + } + } + + // 转换 width 和 height 属性 + if (attrs.width) { + styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px') + attrs.width = undefined + } + if (attrs.height) { + styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px') + attrs.height = undefined + } + + for (let i = 0, len = list.length; i < len; i++) { + const info = list[i].split(':') + if (info.length < 2) continue + const key = info.shift().trim().toLowerCase() + let value = info.join(':').trim() + if ((value[0] === '-' && value.lastIndexOf('-') > 0) || value.includes('safe')) { + // 兼容性的 css 不压缩 + tmp += `;${key}:${value}` + } else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import')) { + // 重复的样式进行覆盖 + if (value.includes('url')) { + // 填充链接 + let j = value.indexOf('(') + 1 + if (j) { + while (value[j] === '"' || value[j] === "'" || blankChar[value[j]]) { + j++ + } + value = value.substr(0, j) + this.getUrl(value.substr(j)) + } + } else if (value.includes('rpx')) { + // 转换 rpx(rich-text 内部不支持 rpx) + value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px') + } + styleObj[key] = value + } + } + + node.attrs.style = tmp + return styleObj +} + +/** + * @description 解析到标签名 + * @param {String} name 标签名 + * @private + */ +Parser.prototype.onTagName = function (name) { + this.tagName = this.xml ? name : name.toLowerCase() + if (this.tagName === 'svg') { + this.xml = (this.xml || 0) + 1 // svg 标签内大小写敏感 + config.ignoreTags.style = undefined // svg 标签内 style 可用 + } +} + +/** + * @description 解析到属性名 + * @param {String} name 属性名 + * @private + */ +Parser.prototype.onAttrName = function (name) { + name = this.xml ? name : name.toLowerCase() + // #ifdef (VUE3 && (H5 || APP-PLUS)) || APP-PLUS-NVUE + if (name.includes('?') || name.includes(';')) { + this.attrName = undefined + return + } + // #endif + if (name.substr(0, 5) === 'data-') { + if (name === 'data-src' && !this.attrs.src) { + // data-src 自动转为 src + this.attrName = 'src' + } else if (this.tagName === 'img' || this.tagName === 'a') { + // a 和 img 标签保留 data- 的属性,可以在 imgtap 和 linktap 事件中使用 + this.attrName = name + } else { + // 剩余的移除以减小大小 + this.attrName = undefined + } + } else { + this.attrName = name + this.attrs[name] = 'T' // boolean 型属性缺省设置 + } +} + +/** + * @description 解析到属性值 + * @param {String} val 属性值 + * @private + */ +Parser.prototype.onAttrVal = function (val) { + const name = this.attrName || '' + if (name === 'style' || name === 'href') { + // 部分属性进行实体解码 + this.attrs[name] = decodeEntity(val, true) + } else if (name.includes('src')) { + // 拼接主域名 + this.attrs[name] = this.getUrl(decodeEntity(val, true)) + } else if (name) { + this.attrs[name] = val + } +} + +/** + * @description 解析到标签开始 + * @param {Boolean} selfClose 是否有自闭合标识 /> + * @private + */ +Parser.prototype.onOpenTag = function (selfClose) { + // 拼装 node + const node = Object.create(null) + node.name = this.tagName + node.attrs = this.attrs + // 避免因为自动 diff 使得 type 被设置为 null 导致部分内容不显示 + if (this.options.nodes.length) { + node.type = 'node' + } + this.attrs = Object.create(null) + + const attrs = node.attrs + const parent = this.stack[this.stack.length - 1] + const siblings = parent ? parent.children : this.nodes + const close = this.xml ? selfClose : config.voidTags[node.name] + + // 替换标签名选择器 + if (tagSelector[node.name]) { + attrs.class = tagSelector[node.name] + (attrs.class ? ' ' + attrs.class : '') + } + + // 转换 embed 标签 + if (node.name === 'embed') { + // #ifndef H5 || APP-PLUS + const src = attrs.src || '' + // 按照后缀名和 type 将 embed 转为 video 或 audio + if (src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8') || (attrs.type || '').includes('video')) { + node.name = 'video' + } else if (src.includes('.mp3') || src.includes('.wav') || src.includes('.aac') || src.includes('.m4a') || (attrs.type || '').includes('audio')) { + node.name = 'audio' + } + if (attrs.autostart) { + attrs.autoplay = 'T' + } + attrs.controls = 'T' + // #endif + // #ifdef H5 || APP-PLUS + this.expose() + // #endif + } + + // #ifndef APP-PLUS-NVUE + // 处理音视频 + if (node.name === 'video' || node.name === 'audio') { + // 设置 id 以便获取 context + if (node.name === 'video' && !attrs.id) { + attrs.id = 'v' + idIndex++ + } + // 没有设置 controls 也没有设置 autoplay 的自动设置 controls + if (!attrs.controls && !attrs.autoplay) { + attrs.controls = 'T' + } + // 用数组存储所有可用的 source + node.src = [] + if (attrs.src) { + node.src.push(attrs.src) + attrs.src = undefined + } + this.expose() + } + // #endif + + // 处理自闭合标签 + if (close) { + if (!this.hook(node) || config.ignoreTags[node.name]) { + // 通过 base 标签设置主域名 + if (node.name === 'base' && !this.options.domain) { + this.options.domain = attrs.href + } /* #ifndef APP-PLUS-NVUE */ else if (node.name === 'source' && parent && (parent.name === 'video' || parent.name === 'audio') && attrs.src) { + // 设置 source 标签(仅父节点为 video 或 audio 时有效) + parent.src.push(attrs.src) + } /* #endif */ + return + } + + // 解析 style + const styleObj = this.parseStyle(node) + + // 处理图片 + if (node.name === 'img') { + if (attrs.src) { + // 标记 webp + if (attrs.src.includes('webp')) { + node.webp = 'T' + } + // data url 图片如果没有设置 original-src 默认为不可预览的小图片 + if (attrs.src.includes('data:') && this.options.previewImg !== 'all' && !attrs['original-src']) { + attrs.ignore = 'T' + } + if (!attrs.ignore || node.webp || attrs.src.includes('cloud://')) { + for (let i = this.stack.length; i--;) { + const item = this.stack[i] + if (item.name === 'a') { + node.a = item.attrs + } + if (item.name === 'table' && !node.webp && !attrs.src.includes('cloud://')) { + if (!styleObj.display || styleObj.display.includes('inline')) { + node.t = 'inline-block' + } else { + node.t = styleObj.display + } + styleObj.display = undefined + } + // #ifndef H5 || APP-PLUS + const style = item.attrs.style || '' + if (style.includes('flex:') && !style.includes('flex:0') && !style.includes('flex: 0') && (!styleObj.width || parseInt(styleObj.width) > 100)) { + styleObj.width = '100% !important' + styleObj.height = '' + for (let j = i + 1; j < this.stack.length; j++) { + this.stack[j].attrs.style = (this.stack[j].attrs.style || '').replace('inline-', '') + } + } else if (style.includes('flex') && styleObj.width === '100%') { + for (let j = i + 1; j < this.stack.length; j++) { + const style = this.stack[j].attrs.style || '' + if (!style.includes(';width') && !style.includes(' width') && style.indexOf('width') !== 0) { + styleObj.width = '' + break + } + } + } else if (style.includes('inline-block')) { + if (styleObj.width && styleObj.width[styleObj.width.length - 1] === '%') { + item.attrs.style += ';max-width:' + styleObj.width + styleObj.width = '' + } else { + item.attrs.style += ';max-width:100%' + } + } + // #endif + item.c = 1 + } + attrs.i = this.imgList.length.toString() + let src = attrs['original-src'] || attrs.src + // #ifndef H5 || MP-ALIPAY || APP-PLUS || MP-360 + if (this.imgList.includes(src)) { + // 如果有重复的链接则对域名进行随机大小写变换避免预览时错位 + let i = src.indexOf('://') + if (i !== -1) { + i += 3 + let newSrc = src.substr(0, i) + for (; i < src.length; i++) { + if (src[i] === '/') break + newSrc += Math.random() > 0.5 ? src[i].toUpperCase() : src[i] + } + newSrc += src.substr(i) + src = newSrc + } + } + // #endif + this.imgList.push(src) + if (!node.t) { + this.imgList._unloadimgs += 1 + } + // #ifdef H5 || APP-PLUS + if (this.options.lazyLoad) { + attrs['data-src'] = attrs.src + attrs.src = undefined + } + // #endif + } + } + if (styleObj.display === 'inline') { + styleObj.display = '' + } + // #ifndef APP-PLUS-NVUE + if (attrs.ignore) { + styleObj['max-width'] = styleObj['max-width'] || '100%' + attrs.style += ';-webkit-touch-callout:none' + } + // #endif + // 设置的宽度超出屏幕,为避免变形,高度转为自动 + if (parseInt(styleObj.width) > windowWidth) { + styleObj.height = undefined + } + // 记录是否设置了宽高 + if (!isNaN(parseInt(styleObj.width))) { + node.w = 'T' + } + if (!isNaN(parseInt(styleObj.height)) && (!styleObj.height.includes('%') || (parent && (parent.attrs.style || '').includes('height')))) { + node.h = 'T' + } + if (node.w && node.h && styleObj['object-fit']) { + if (styleObj['object-fit'] === 'contain') { + node.m = 'aspectFit' + } else if (styleObj['object-fit'] === 'cover') { + node.m = 'aspectFill' + } + } + } else if (node.name === 'svg') { + siblings.push(node) + this.stack.push(node) + this.popNode() + return + } + for (const key in styleObj) { + if (styleObj[key]) { + attrs.style += `;${key}:${styleObj[key].replace(' !important', '')}` + } + } + attrs.style = attrs.style.substr(1) || undefined + // #ifdef (MP-WEIXIN || MP-QQ) && VUE3 + if (!attrs.style) { + delete attrs.style + } + // #endif + } else { + if ((node.name === 'pre' || ((attrs.style || '').includes('white-space') && attrs.style.includes('pre'))) && this.pre !== 2) { + this.pre = node.pre = 1 + } + node.children = [] + this.stack.push(node) + } + + // 加入节点树 + siblings.push(node) +} + +/** + * @description 解析到标签结束 + * @param {String} name 标签名 + * @private + */ +Parser.prototype.onCloseTag = function (name) { + // 依次出栈到匹配为止 + name = this.xml ? name : name.toLowerCase() + let i + for (i = this.stack.length; i--;) { + if (this.stack[i].name === name) break + } + if (i !== -1) { + while (this.stack.length > i) { + this.popNode() + } + } else if (name === 'p' || name === 'br') { + const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes + siblings.push({ + name, + attrs: { + class: tagSelector[name] || '', + style: this.tagStyle[name] || '' + } + }) + } +} + +/** + * @description 处理标签出栈 + * @private + */ +Parser.prototype.popNode = function () { + const node = this.stack.pop() + let attrs = node.attrs + const children = node.children + const parent = this.stack[this.stack.length - 1] + const siblings = parent ? parent.children : this.nodes + + if (!this.hook(node) || config.ignoreTags[node.name]) { + // 获取标题 + if (node.name === 'title' && children.length && children[0].type === 'text' && this.options.setTitle) { + uni.setNavigationBarTitle({ + title: children[0].text + }) + } + siblings.pop() + return + } + + if (node.pre && this.pre !== 2) { + // 是否合并空白符标识 + this.pre = node.pre = undefined + for (let i = this.stack.length; i--;) { + if (this.stack[i].pre) { + this.pre = 1 + } + } + } + + const styleObj = {} + + // 转换 svg + if (node.name === 'svg') { + if (this.xml > 1) { + // 多层 svg 嵌套 + this.xml-- + return + } + // #ifdef APP-PLUS-NVUE + (function traversal (node) { + if (node.name) { + // 调整 svg 的大小写 + node.name = config.svgDict[node.name] || node.name + for (const item in node.attrs) { + if (config.svgDict[item]) { + node.attrs[config.svgDict[item]] = node.attrs[item] + node.attrs[item] = undefined + } + } + for (let i = 0; i < (node.children || []).length; i++) { + traversal(node.children[i]) + } + } + })(node) + // #endif + // #ifndef APP-PLUS-NVUE + let src = '' + const style = attrs.style + attrs.style = '' + attrs.xmlns = 'http://www.w3.org/2000/svg'; + (function traversal (node) { + if (node.type === 'text') { + src += node.text + return + } + const name = config.svgDict[node.name] || node.name + if (name === 'foreignObject') { + for (const child of (node.children || [])) { + if (child.attrs && !child.attrs.xmlns) { + child.attrs.xmlns = 'http://www.w3.org/1999/xhtml' + break + } + } + } + src += '<' + name + for (const item in node.attrs) { + const val = node.attrs[item] + if (val) { + src += ` ${config.svgDict[item] || item}="${val.replace(/"/g, '')}"` + } + } + if (!node.children) { + src += '/>' + } else { + src += '>' + for (let i = 0; i < node.children.length; i++) { + traversal(node.children[i]) + } + src += '' + name + '>' + } + })(node) + node.name = 'img' + node.attrs = { + src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'), + style, + ignore: 'T' + } + node.children = undefined + // #endif + this.xml = false + config.ignoreTags.style = true + return + } + + // #ifndef APP-PLUS-NVUE + // 转换 align 属性 + if (attrs.align) { + if (node.name === 'table') { + if (attrs.align === 'center') { + styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto' + } else { + styleObj.float = attrs.align + } + } else { + styleObj['text-align'] = attrs.align + } + attrs.align = undefined + } + + // 转换 dir 属性 + if (attrs.dir) { + styleObj.direction = attrs.dir + attrs.dir = undefined + } + + // 转换 font 标签的属性 + if (node.name === 'font') { + if (attrs.color) { + styleObj.color = attrs.color + attrs.color = undefined + } + if (attrs.face) { + styleObj['font-family'] = attrs.face + attrs.face = undefined + } + if (attrs.size) { + let size = parseInt(attrs.size) + if (!isNaN(size)) { + if (size < 1) { + size = 1 + } else if (size > 7) { + size = 7 + } + styleObj['font-size'] = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', 'xxx-large'][size - 1] + } + attrs.size = undefined + } + } + // #endif + + // 一些编辑器的自带 class + if ((attrs.class || '').includes('align-center')) { + styleObj['text-align'] = 'center' + } + + Object.assign(styleObj, this.parseStyle(node)) + + if (node.name !== 'table' && parseInt(styleObj.width) > windowWidth) { + styleObj['max-width'] = '100%' + styleObj['box-sizing'] = 'border-box' + } + + // #ifndef APP-PLUS-NVUE + if (config.blockTags[node.name]) { + node.name = 'div' + } else if (!config.trustTags[node.name] && !this.xml) { + // 未知标签转为 span,避免无法显示 + node.name = 'span' + } + + if (node.name === 'a' || node.name === 'ad' + // #ifdef H5 || APP-PLUS + || node.name === 'iframe' // eslint-disable-line + // #endif + ) { + this.expose() + } else if (node.name === 'video') { + if ((styleObj.height || '').includes('auto')) { + styleObj.height = undefined + } + /* #ifdef APP-PLUS */ + let str = '' + for (let i = 0; i < node.src.length; i++) { + str += '' + } + str += '' + node.html = str + /* #endif */ + } else if ((node.name === 'ul' || node.name === 'ol') && node.c) { + // 列表处理 + const types = { + a: 'lower-alpha', + A: 'upper-alpha', + i: 'lower-roman', + I: 'upper-roman' + } + if (types[attrs.type]) { + attrs.style += ';list-style-type:' + types[attrs.type] + attrs.type = undefined + } + for (let i = children.length; i--;) { + if (children[i].name === 'li') { + children[i].c = 1 + } + } + } else if (node.name === 'table') { + // 表格处理 + // cellpadding、cellspacing、border 这几个常用表格属性需要通过转换实现 + let padding = parseFloat(attrs.cellpadding) + let spacing = parseFloat(attrs.cellspacing) + const border = parseFloat(attrs.border) + const bordercolor = styleObj['border-color'] + const borderstyle = styleObj['border-style'] + if (node.c) { + // padding 和 spacing 默认 2 + if (isNaN(padding)) { + padding = 2 + } + if (isNaN(spacing)) { + spacing = 2 + } + } + if (border) { + attrs.style += `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` + } + if (node.flag && node.c) { + // 有 colspan 或 rowspan 且含有链接的表格通过 grid 布局实现 + styleObj.display = 'grid' + if (styleObj['border-collapse'] === 'collapse') { + styleObj['border-collapse'] = undefined + spacing = 0 + } + if (spacing) { + styleObj['grid-gap'] = spacing + 'px' + styleObj.padding = spacing + 'px' + } else if (border) { + // 无间隔的情况下避免边框重叠 + attrs.style += ';border-left:0;border-top:0' + } + + const width = [] // 表格的列宽 + const trList = [] // tr 列表 + const cells = [] // 保存新的单元格 + const map = {}; // 被合并单元格占用的格子 + + (function traversal (nodes) { + for (let i = 0; i < nodes.length; i++) { + if (nodes[i].name === 'tr') { + trList.push(nodes[i]) + } else if (nodes[i].name === 'colgroup') { + let colI = 1 + for (const col of (nodes[i].children || [])) { + if (col.name === 'col') { + const style = col.attrs.style || '' + const start = style.indexOf('width') ? style.indexOf(';width') : 0 + // 提取出宽度 + if (start !== -1) { + let end = style.indexOf(';', start + 6) + if (end === -1) { + end = style.length + } + width[colI] = style.substring(start ? start + 7 : 6, end) + } + colI += 1 + } + } + } else { + traversal(nodes[i].children || []) + } + } + })(children) + + for (let row = 1; row <= trList.length; row++) { + let col = 1 + for (let j = 0; j < trList[row - 1].children.length; j++) { + const td = trList[row - 1].children[j] + if (td.name === 'td' || td.name === 'th') { + // 这个格子被上面的单元格占用,则列号++ + while (map[row + '.' + col]) { + col++ + } + let style = td.attrs.style || '' + let start = style.indexOf('width') ? style.indexOf(';width') : 0 + // 提取出 td 的宽度 + if (start !== -1) { + let end = style.indexOf(';', start + 6) + if (end === -1) { + end = style.length + } + if (!td.attrs.colspan) { + width[col] = style.substring(start ? start + 7 : 6, end) + } + style = style.substr(0, start) + style.substr(end) + } + // 设置竖直对齐 + style += ';display:flex' + start = style.indexOf('vertical-align') + if (start !== -1) { + const val = style.substr(start + 15, 10) + if (val.includes('middle')) { + style += ';align-items:center' + } else if (val.includes('bottom')) { + style += ';align-items:flex-end' + } + } else { + style += ';align-items:center' + } + // 设置水平对齐 + start = style.indexOf('text-align') + if (start !== -1) { + const val = style.substr(start + 11, 10) + if (val.includes('center')) { + style += ';justify-content: center' + } else if (val.includes('right')) { + style += ';justify-content: right' + } + } + style = (border ? `;border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'}` + (spacing ? '' : ';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '') + ';' + style + // 处理列合并 + if (td.attrs.colspan) { + style += `;grid-column-start:${col};grid-column-end:${col + parseInt(td.attrs.colspan)}` + if (!td.attrs.rowspan) { + style += `;grid-row-start:${row};grid-row-end:${row + 1}` + } + col += parseInt(td.attrs.colspan) - 1 + } + // 处理行合并 + if (td.attrs.rowspan) { + style += `;grid-row-start:${row};grid-row-end:${row + parseInt(td.attrs.rowspan)}` + if (!td.attrs.colspan) { + style += `;grid-column-start:${col};grid-column-end:${col + 1}` + } + // 记录下方单元格被占用 + for (let rowspan = 1; rowspan < td.attrs.rowspan; rowspan++) { + for (let colspan = 0; colspan < (td.attrs.colspan || 1); colspan++) { + map[(row + rowspan) + '.' + (col - colspan)] = 1 + } + } + } + if (style) { + td.attrs.style = style + } + cells.push(td) + col++ + } + } + if (row === 1) { + let temp = '' + for (let i = 1; i < col; i++) { + temp += (width[i] ? width[i] : 'auto') + ' ' + } + styleObj['grid-template-columns'] = temp + } + } + node.children = cells + } else { + // 没有使用合并单元格的表格通过 table 布局实现 + if (node.c) { + styleObj.display = 'table' + } + if (!isNaN(spacing)) { + styleObj['border-spacing'] = spacing + 'px' + } + if (border || padding) { + // 遍历 + (function traversal (nodes) { + for (let i = 0; i < nodes.length; i++) { + const td = nodes[i] + if (td.name === 'th' || td.name === 'td') { + if (border) { + td.attrs.style = `border:${border}px ${borderstyle || 'solid'} ${bordercolor || 'gray'};${td.attrs.style || ''}` + } + if (padding) { + td.attrs.style = `padding:${padding}px;${td.attrs.style || ''}` + } + } else if (td.children) { + traversal(td.children) + } + } + })(children) + } + } + // 给表格添加一个单独的横向滚动层 + if (this.options.scrollTable && !(attrs.style || '').includes('inline')) { + const table = Object.assign({}, node) + node.name = 'div' + node.attrs = { + style: 'overflow:auto' + } + node.children = [table] + attrs = table.attrs + } + } else if ((node.name === 'tbody' || node.name === 'tr') && node.flag && node.c) { + node.flag = undefined; + (function traversal (nodes) { + for (let i = 0; i < nodes.length; i++) { + if (nodes[i].name === 'td') { + // 颜色样式设置给单元格避免丢失 + for (const style of ['color', 'background', 'background-color']) { + if (styleObj[style]) { + nodes[i].attrs.style = style + ':' + styleObj[style] + ';' + (nodes[i].attrs.style || '') + } + } + } else { + traversal(nodes[i].children || []) + } + } + })(children) + } else if ((node.name === 'td' || node.name === 'th') && (attrs.colspan || attrs.rowspan)) { + for (let i = this.stack.length; i--;) { + if (this.stack[i].name === 'table' || this.stack[i].name === 'tbody' || this.stack[i].name === 'tr') { + this.stack[i].flag = 1 // 指示含有合并单元格 + } + } + } else if (node.name === 'ruby') { + // 转换 ruby + node.name = 'span' + for (let i = 0; i < children.length - 1; i++) { + if (children[i].type === 'text' && children[i + 1].name === 'rt') { + children[i] = { + name: 'div', + attrs: { + style: 'display:inline-block;text-align:center' + }, + children: [{ + name: 'div', + attrs: { + style: 'font-size:50%;' + (children[i + 1].attrs.style || '') + }, + children: children[i + 1].children + }, children[i]] + } + children.splice(i + 1, 1) + } + } + } else if (node.c) { + (function traversal (node) { + node.c = 2 + for (let i = node.children.length; i--;) { + const child = node.children[i] + // #ifdef (MP-WEIXIN || MP-QQ || APP-PLUS || MP-360) && VUE3 + if (child.name && (config.inlineTags[child.name] || ((child.attrs.style || '').includes('inline') && child.children)) && !child.c) { + traversal(child) + } + // #endif + if (!child.c || child.name === 'table') { + node.c = 1 + } + } + })(node) + } + + if ((styleObj.display || '').includes('flex') && !node.c) { + for (let i = children.length; i--;) { + const item = children[i] + if (item.f) { + item.attrs.style = (item.attrs.style || '') + item.f + item.f = undefined + } + } + } + // flex 布局时部分样式需要提取到 rich-text 外层 + const flex = parent && ((parent.attrs.style || '').includes('flex') || (parent.attrs.style || '').includes('grid')) + // #ifdef MP-WEIXIN + // 检查基础库版本 virtualHost 是否可用 + && !(node.c && wx.getNFCAdapter) // eslint-disable-line + // #endif + // #ifndef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO + && !node.c // eslint-disable-line + // #endif + if (flex) { + node.f = ';max-width:100%' + } + + if (children.length >= 50 && node.c && !(styleObj.display || '').includes('flex')) { + mergeNodes(children) + } + // #endif + + for (const key in styleObj) { + if (styleObj[key]) { + const val = `;${key}:${styleObj[key].replace(' !important', '')}` + /* #ifndef APP-PLUS-NVUE */ + if (flex && ((key.includes('flex') && key !== 'flex-direction') || key === 'align-self' || key.includes('grid') || styleObj[key][0] === '-' || (key.includes('width') && val.includes('%')))) { + node.f += val + if (key === 'width') { + attrs.style += ';width:100%' + } + } else /* #endif */ { + attrs.style += val + } + } + } + attrs.style = attrs.style.substr(1) || undefined + // #ifdef (MP-WEIXIN || MP-QQ) && VUE3 + for (const key in attrs) { + if (!attrs[key]) { + delete attrs[key] + } + } + // #endif +} + +/** + * @description 解析到文本 + * @param {String} text 文本内容 + */ +Parser.prototype.onText = function (text) { + if (!this.pre) { + // 合并空白符 + let trim = '' + let flag + for (let i = 0, len = text.length; i < len; i++) { + if (!blankChar[text[i]]) { + trim += text[i] + } else { + if (trim[trim.length - 1] !== ' ') { + trim += ' ' + } + if (text[i] === '\n' && !flag) { + flag = true + } + } + } + // 去除含有换行符的空串 + if (trim === ' ') { + if (flag) return + // #ifdef VUE3 + else { + const parent = this.stack[this.stack.length - 1] + if (parent && parent.name[0] === 't') return + } + // #endif + } + text = trim + } + const node = Object.create(null) + node.type = 'text' + // #ifdef (MP-BAIDU || MP-ALIPAY || MP-TOUTIAO) && VUE3 + node.attrs = {} + // #endif + node.text = decodeEntity(text) + if (this.hook(node)) { + // #ifdef MP-WEIXIN + if (this.options.selectable === 'force' && system.includes('iOS') && !uni.canIUse('rich-text.user-select')) { + this.expose() + } + // #endif + const siblings = this.stack.length ? this.stack[this.stack.length - 1].children : this.nodes + siblings.push(node) + } +} + +/** + * @description html 词法分析器 + * @param {Object} handler 高层处理器 + */ +function Lexer (handler) { + this.handler = handler +} + +/** + * @description 执行解析 + * @param {String} content 要解析的文本 + */ +Lexer.prototype.parse = function (content) { + this.content = content || '' + this.i = 0 // 标记解析位置 + this.start = 0 // 标记一个单词的开始位置 + this.state = this.text // 当前状态 + for (let len = this.content.length; this.i !== -1 && this.i < len;) { + this.state() + } +} + +/** + * @description 检查标签是否闭合 + * @param {String} method 如果闭合要进行的操作 + * @returns {Boolean} 是否闭合 + * @private + */ +Lexer.prototype.checkClose = function (method) { + const selfClose = this.content[this.i] === '/' + if (this.content[this.i] === '>' || (selfClose && this.content[this.i + 1] === '>')) { + if (method) { + this.handler[method](this.content.substring(this.start, this.i)) + } + this.i += selfClose ? 2 : 1 + this.start = this.i + this.handler.onOpenTag(selfClose) + if (this.handler.tagName === 'script') { + this.i = this.content.indexOf('', this.i) + if (this.i !== -1) { + this.i += 2 + this.start = this.i + } + this.state = this.endTag + } else { + this.state = this.text + } + return true + } + return false +} + +/** + * @description 文本状态 + * @private + */ +Lexer.prototype.text = function () { + this.i = this.content.indexOf('<', this.i) // 查找最近的标签 + if (this.i === -1) { + // 没有标签了 + if (this.start < this.content.length) { + this.handler.onText(this.content.substring(this.start, this.content.length)) + } + return + } + const c = this.content[this.i + 1] + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + // 标签开头 + if (this.start !== this.i) { + this.handler.onText(this.content.substring(this.start, this.i)) + } + this.start = ++this.i + this.state = this.tagName + } else if (c === '/' || c === '!' || c === '?') { + if (this.start !== this.i) { + this.handler.onText(this.content.substring(this.start, this.i)) + } + const next = this.content[this.i + 2] + if (c === '/' && ((next >= 'a' && next <= 'z') || (next >= 'A' && next <= 'Z'))) { + // 标签结尾 + this.i += 2 + this.start = this.i + this.state = this.endTag + return + } + // 处理注释 + let end = '-->' + if (c !== '!' || this.content[this.i + 2] !== '-' || this.content[this.i + 3] !== '-') { + end = '>' + } + this.i = this.content.indexOf(end, this.i) + if (this.i !== -1) { + this.i += end.length + this.start = this.i + } + } else { + this.i++ + } +} + +/** + * @description 标签名状态 + * @private + */ +Lexer.prototype.tagName = function () { + if (blankChar[this.content[this.i]]) { + // 解析到标签名 + this.handler.onTagName(this.content.substring(this.start, this.i)) + while (blankChar[this.content[++this.i]]); + if (this.i < this.content.length && !this.checkClose()) { + this.start = this.i + this.state = this.attrName + } + } else if (!this.checkClose('onTagName')) { + this.i++ + } +} + +/** + * @description 属性名状态 + * @private + */ +Lexer.prototype.attrName = function () { + let c = this.content[this.i] + if (blankChar[c] || c === '=') { + // 解析到属性名 + this.handler.onAttrName(this.content.substring(this.start, this.i)) + let needVal = c === '=' + const len = this.content.length + while (++this.i < len) { + c = this.content[this.i] + if (!blankChar[c]) { + if (this.checkClose()) return + if (needVal) { + // 等号后遇到第一个非空字符 + this.start = this.i + this.state = this.attrVal + return + } + if (this.content[this.i] === '=') { + needVal = true + } else { + this.start = this.i + this.state = this.attrName + return + } + } + } + } else if (!this.checkClose('onAttrName')) { + this.i++ + } +} + +/** + * @description 属性值状态 + * @private + */ +Lexer.prototype.attrVal = function () { + const c = this.content[this.i] + const len = this.content.length + if (c === '"' || c === "'") { + // 有冒号的属性 + this.start = ++this.i + this.i = this.content.indexOf(c, this.i) + if (this.i === -1) return + this.handler.onAttrVal(this.content.substring(this.start, this.i)) + } else { + // 没有冒号的属性 + for (; this.i < len; this.i++) { + if (blankChar[this.content[this.i]]) { + this.handler.onAttrVal(this.content.substring(this.start, this.i)) + break + } else if (this.checkClose('onAttrVal')) return + } + } + while (blankChar[this.content[++this.i]]); + if (this.i < len && !this.checkClose()) { + this.start = this.i + this.state = this.attrName + } +} + +/** + * @description 结束标签状态 + * @returns {String} 结束的标签名 + * @private + */ +Lexer.prototype.endTag = function () { + const c = this.content[this.i] + if (blankChar[c] || c === '>' || c === '/') { + this.handler.onCloseTag(this.content.substring(this.start, this.i)) + if (c !== '>') { + this.i = this.content.indexOf('>', this.i) + if (this.i === -1) return + } + this.start = ++this.i + this.state = this.text + } else { + this.i++ + } +} + +export default Parser diff --git a/uni_modules/mp-html/package.json b/uni_modules/mp-html/package.json new file mode 100644 index 0000000..84c07e3 --- /dev/null +++ b/uni_modules/mp-html/package.json @@ -0,0 +1,76 @@ +{ + "id": "mp-html", + "displayName": "mp-html 富文本组件【全端支持,支持编辑、latex等扩展】", + "version": "v2.5.0", + "description": "一个强大的富文本组件,高效轻量,功能丰富", + "keywords": [ + "富文本", + "编辑器", + "html", + "rich-text", + "editor" + ], + "repository": "https://github.com/jin-yufeng/mp-html", + "dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/mp-html", + "type": "component-vue" + }, + "uni_modules": { + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "u", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/mp-html/static/app-plus/mp-html/js/handler.js b/uni_modules/mp-html/static/app-plus/mp-html/js/handler.js new file mode 100644 index 0000000..1d986bd --- /dev/null +++ b/uni_modules/mp-html/static/app-plus/mp-html/js/handler.js @@ -0,0 +1 @@ +"use strict";function t(t){for(var e=Object.create(null),n=t.attributes.length;n--;)e[t.attributes[n].name]=t.attributes[n].value;return e}function e(){a[1]&&(this.src=a[1],this.onerror=null),this.onclick=null,this.ontouchstart=null,uni.postMessage({data:{action:"onError",source:"img",attrs:t(this)}})}function n(){window.unloadimgs-=1,0===window.unloadimgs&&uni.postMessage({data:{action:"onReady"}})}function o(r,s,c){for(var d=0;d0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("navigateTo",{url:encodeURI(n)})},navigateBack:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.delta;a("navigateBack",{delta:parseInt(n)||1})},switchTab:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("switchTab",{url:encodeURI(n)})},reLaunch:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("reLaunch",{url:encodeURI(n)})},redirectTo:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=e.url;a("redirectTo",{url:encodeURI(n)})},getEnv:function(e){window.plus?e({plus:!0}):e({h5:!0})},postMessage:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};a("postMessage",e.data||{})}},r=/uni-app/i.test(navigator.userAgent),d=/Html5Plus/i.test(navigator.userAgent),s=/complete|loaded|interactive/;var w=window.my&&navigator.userAgent.indexOf("AlipayClient")>-1;var u=window.swan&&window.swan.webView&&/swan/i.test(navigator.userAgent);var c=window.qq&&window.qq.miniProgram&&/QQ/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var g=window.tt&&window.tt.miniProgram&&/toutiaomicroapp/i.test(navigator.userAgent);var v=window.wx&&window.wx.miniProgram&&/micromessenger/i.test(navigator.userAgent)&&/miniProgram/i.test(navigator.userAgent);var p=window.qa&&/quickapp/i.test(navigator.userAgent);for(var l,_=function(){window.UniAppJSBridge=!0,document.dispatchEvent(new CustomEvent("UniAppJSBridgeReady",{bubbles:!0,cancelable:!0}))},f=[function(e){if(r||d)return window.__dcloud_weex_postMessage||window.__dcloud_weex_?document.addEventListener("DOMContentLoaded",e):window.plus&&s.test(document.readyState)?setTimeout(e,0):document.addEventListener("plusready",e),o},function(e){if(v)return window.WeixinJSBridge&&window.WeixinJSBridge.invoke?setTimeout(e,0):document.addEventListener("WeixinJSBridgeReady",e),window.wx.miniProgram},function(e){if(c)return window.QQJSBridge&&window.QQJSBridge.invoke?setTimeout(e,0):document.addEventListener("QQJSBridgeReady",e),window.qq.miniProgram},function(e){if(w){document.addEventListener("DOMContentLoaded",e);var n=window.my;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){if(u)return document.addEventListener("DOMContentLoaded",e),window.swan.webView},function(e){if(g)return document.addEventListener("DOMContentLoaded",e),window.tt.miniProgram},function(e){if(p){window.QaJSBridge&&window.QaJSBridge.invoke?setTimeout(e,0):document.addEventListener("QaJSBridgeReady",e);var n=window.qa;return{navigateTo:n.navigateTo,navigateBack:n.navigateBack,switchTab:n.switchTab,reLaunch:n.reLaunch,redirectTo:n.redirectTo,postMessage:n.postMessage,getEnv:n.getEnv}}},function(e){return document.addEventListener("DOMContentLoaded",e),o}],m=0;m \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md new file mode 100644 index 0000000..381c9a8 --- /dev/null +++ b/uni_modules/uni-datetime-picker/changelog.md @@ -0,0 +1,85 @@ +## 2.2.2(2021-12-10) +- 修复 clear-icon 属性在小程序平台不生效的 bug +## 2.2.1(2021-12-10) +- 修复 日期范围选在小程序平台,必须多点击一次才能取消选中状态的 bug +## 2.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +## 2.1.5(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 2.1.4(2021-09-10) +- 修复 hide-second 在移动端的 bug +- 修复 单选赋默认值时,赋值日期未高亮的 bug +- 修复 赋默认值时,移动端未正确显示时间的 bug +## 2.1.3(2021-09-09) +- 新增 hide-second 属性,支持只使用时分,隐藏秒 +## 2.1.2(2021-09-03) +- 优化 取消选中时(范围选)直接开始下一次选择, 避免多点一次 +- 优化 移动端支持清除按钮,同时支持通过 ref 调用组件的 clear 方法 +- 优化 调整字号大小,美化日历界面 +- 修复 因国际化导致的 placeholder 失效的 bug +## 2.1.1(2021-08-24) +- 新增 支持国际化 +- 优化 范围选择器在 pc 端过宽的问题 +## 2.1.0(2021-08-09) +- 新增 适配 vue3 +## 2.0.19(2021-08-09) +- 新增 支持作为 uni-forms 子组件相关功能 +- 修复 在 uni-forms 中使用时,选择时间报 NAN 错误的 bug +## 2.0.18(2021-08-05) +- 修复 type 属性动态赋值无效的 bug +- 修复 ‘确认’按钮被 tabbar 遮盖 bug +- 修复 组件未赋值时范围选左、右日历相同的 bug +## 2.0.17(2021-08-04) +- 修复 范围选未正确显示当前值的 bug +- 修复 h5 平台(移动端)报错 'cale' of undefined 的 bug +## 2.0.16(2021-07-21) +- 新增 return-type 属性支持返回 date 日期对象 +## 2.0.15(2021-07-14) +- 修复 单选日期类型,初始赋值后不在当前日历的 bug +- 新增 clearIcon 属性,显示框的清空按钮可配置显示隐藏(仅 pc 有效) +- 优化 移动端移除显示框的清空按钮,无实际用途 +## 2.0.14(2021-07-14) +- 修复 组件赋值为空,界面未更新的 bug +- 修复 start 和 end 不能动态赋值的 bug +- 修复 范围选类型,用户选择后再次选择右侧日历(结束日期)显示不正确的 bug +## 2.0.13(2021-07-08) +- 修复 范围选择不能动态赋值的 bug +## 2.0.12(2021-07-08) +- 修复 范围选择的初始时间在一个月内时,造成无法选择的bug +## 2.0.11(2021-07-08) +- 优化 弹出层在超出视窗边缘定位不准确的问题 +## 2.0.10(2021-07-08) +- 修复 范围起始点样式的背景色与今日样式的字体前景色融合,导致日期字体看不清的 bug +- 优化 弹出层在超出视窗边缘被遮盖的问题 +## 2.0.9(2021-07-07) +- 新增 maskClick 事件 +- 修复 特殊情况日历 rpx 布局错误的 bug,rpx -> px +- 修复 范围选择时清空返回值不合理的bug,['', ''] -> [] +## 2.0.8(2021-07-07) +- 新增 日期时间显示框支持插槽 +## 2.0.7(2021-07-01) +- 优化 添加 uni-icons 依赖 +## 2.0.6(2021-05-22) +- 修复 图标在小程序上不显示的 bug +- 优化 重命名引用组件,避免潜在组件命名冲突 +## 2.0.5(2021-05-20) +- 优化 代码目录扁平化 +## 2.0.4(2021-05-12) +- 新增 组件示例地址 +## 2.0.3(2021-05-10) +- 修复 ios 下不识别 '-' 日期格式的 bug +- 优化 pc 下弹出层添加边框和阴影 +## 2.0.2(2021-05-08) +- 修复 在 admin 中获取弹出层定位错误的bug +## 2.0.1(2021-05-08) +- 修复 type 属性向下兼容,默认值从 date 变更为 datetime +## 2.0.0(2021-04-30) +- 支持日历形式的日期+时间的范围选择 + > 注意:此版本不向后兼容,不再支持单独时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker) +## 1.0.6(2021-03-18) +- 新增 hide-second 属性,时间支持仅选择时、分 +- 修复 选择跟显示的日期不一样的 bug +- 修复 chang事件触发2次的 bug +- 修复 分、秒 end 范围错误的 bug +- 优化 更好的 nvue 适配 diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue new file mode 100644 index 0000000..b57610f --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue @@ -0,0 +1,185 @@ + + + + + {{weeks.date}} + + + + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue new file mode 100644 index 0000000..c48a096 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -0,0 +1,898 @@ + + + + + + + + + + {{ (nowDate.year||'') + ' 年 ' + ( nowDate.month||'') +' 月'}} + + + + + + + + + + + + + + {{nowDate.month}} + + + + {{SUNText}} + + + {{monText}} + + + {{TUEText}} + + + {{WEDText}} + + + {{THUText}} + + + {{FRIText}} + + + {{SATText}} + + + + + + + + + + + {{tempSingleDate ? tempSingleDate : selectDateText}} + + + + + + + {{tempRange.before ? tempRange.before : startDateText}} + + + + + + + {{tempRange.after ? tempRange.after : endDateText}} + + + + + + + 确认 + + + + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json new file mode 100644 index 0000000..cc76311 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json @@ -0,0 +1,19 @@ +{ + "uni-datetime-picker.selectDate": "select date", + "uni-datetime-picker.selectTime": "select time", + "uni-datetime-picker.selectDateTime": "select datetime", + "uni-datetime-picker.startDate": "start date", + "uni-datetime-picker.endDate": "end date", + "uni-datetime-picker.startTime": "start time", + "uni-datetime-picker.endTime": "end time", + "uni-datetime-picker.ok": "ok", + "uni-datetime-picker.clear": "clear", + "uni-datetime-picker.cancel": "cancel", + "uni-calender.MON": "MON", + "uni-calender.TUE": "TUE", + "uni-calender.WED": "WED", + "uni-calender.THU": "THU", + "uni-calender.FRI": "FRI", + "uni-calender.SAT": "SAT", + "uni-calender.SUN": "SUN" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json new file mode 100644 index 0000000..7bc7405 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json @@ -0,0 +1,19 @@ +{ + "uni-datetime-picker.selectDate": "选择日期", + "uni-datetime-picker.selectTime": "选择时间", + "uni-datetime-picker.selectDateTime": "选择日期时间", + "uni-datetime-picker.startDate": "开始日期", + "uni-datetime-picker.endDate": "结束日期", + "uni-datetime-picker.startTime": "开始时间", + "uni-datetime-picker.endTime": "结束时间", + "uni-datetime-picker.ok": "确定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json new file mode 100644 index 0000000..7d37043 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json @@ -0,0 +1,19 @@ +{ + "uni-datetime-picker.selectDate": "選擇日期", + "uni-datetime-picker.selectTime": "選擇時間", + "uni-datetime-picker.selectDateTime": "選擇日期時間", + "uni-datetime-picker.startDate": "開始日期", + "uni-datetime-picker.endDate": "結束日期", + "uni-datetime-picker.startTime": "開始时间", + "uni-datetime-picker.endTime": "結束时间", + "uni-datetime-picker.ok": "確定", + "uni-datetime-picker.clear": "清除", + "uni-datetime-picker.cancel": "取消", + "uni-calender.SUN": "日", + "uni-calender.MON": "一", + "uni-calender.TUE": "二", + "uni-calender.WED": "三", + "uni-calender.THU": "四", + "uni-calender.FRI": "五", + "uni-calender.SAT": "六" +} diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js new file mode 100644 index 0000000..9601aba --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue new file mode 100644 index 0000000..699aa63 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue @@ -0,0 +1,927 @@ + + + + + + {{time}} + + {{selectTimeText}} + + + + + + + + {{selectTimeText}} + + + + + + {{lessThanTen(item)}} + + + + + {{lessThanTen(item)}} + + + + + {{lessThanTen(item)}} + + + + + - + - + + + + + + {{lessThanTen(item)}} + + + + + {{lessThanTen(item)}} + + + + + {{lessThanTen(item)}} + + + + + : + : + + + + {{clearText}} + + + + {{cancelText}} + + + {{okText}} + + + + + + + + + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 0000000..e844331 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,981 @@ + + + + + + + + + + + + + + {{rangeSeparator}} + + + + + + + + + + + + + + + + + + + + + + + + {{okText}} + + + + + + + + + + + + + + + + + + + + + + + + + + + {{clearText}} + {{okText}} + + + + + + + + + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js new file mode 100644 index 0000000..efa5773 --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -0,0 +1,410 @@ +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range, + // multipleStatus + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + // this.multipleStatus = multipleStatus + this.lastHover = false + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + // let dateCompBefore = this.dateCompare(this.startDate, fullDate) + // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + disableBefore = this.dateCompare(this.startDate, nowDate) + } + + if (this.endDate) { + // let dateCompAfter = this.dateCompare(fullDate, this.endDate) + // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + disableAfter = this.dateCompare(nowDate, this.endDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), + month: full.month, + disable: !(disableBefore && disableAfter), + isDay, + userChecked: false + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + /** + * 比较真实起始日期 + */ + + isLogicBefore(currentDay, before, after) { + let logicBefore = before + if (before && after) { + logicBefore = this.dateCompare(before, after) ? before : after + } + return this.dateEqual(logicBefore, currentDay) + } + + isLogicAfter(currentDay, before, after) { + let logicAfter = after + if (before && after) { + logicAfter = this.dateCompare(before, after) ? after : before + } + return this.dateEqual(logicAfter, currentDay) + } + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + if (!this.range) return + if (before && after) { + if (!this.lastHover) { + this.lastHover = true + return + } + this.multipleStatus.before = fullDate + this.multipleStatus.after = '' + this.multipleStatus.data = [] + this.multipleStatus.fulldate = '' + this.lastHover = false + } else { + if (!before) { + this.multipleStatus.before = fullDate + this.lastHover = false + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus + .after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus + .before); + } + this.lastHover = true + } + } + this._getWeek(fullDate) + } + + /** + * 鼠标 hover 更新多选状态 + */ + setHoverMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (this.lastHover) return + + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + this._getWeek(fullDate) + } + + /** + * 更新默认值多选状态 + */ + setDefaultMultiple(before, after) { + this.multipleStatus.before = before + this.multipleStatus.after = after + if (before && after) { + if (this.dateCompare(before, after)) { + this.multipleStatus.data = this.geDateAll(before, after); + this._getWeek(after) + } else { + this.multipleStatus.data = this.geDateAll(after, before); + this._getWeek(before) + } + } + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json new file mode 100644 index 0000000..5e0ff11 --- /dev/null +++ b/uni_modules/uni-datetime-picker/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-datetime-picker", + "displayName": "uni-datetime-picker 日期选择器", + "version": "2.2.2", + "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", + "keywords": [ + "uni-datetime-picker", + "uni-ui", + "uniui", + "日期时间选择器", + "日期时间" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md new file mode 100644 index 0000000..162fbef --- /dev/null +++ b/uni_modules/uni-datetime-picker/readme.md @@ -0,0 +1,21 @@ + + +> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` + +## DatetimePicker 时间选择器 + +> **组件名:uni-datetime-picker** +> 代码块: `uDatetimePicker` + + +该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 + +若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 + +**_点击 picker 默认值规则:_** + +- 若设置初始值 value, 会显示在 picker 显示框中 +- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/uni_modules/x-skeleton/changelog.md b/uni_modules/x-skeleton/changelog.md new file mode 100644 index 0000000..9bd11da --- /dev/null +++ b/uni_modules/x-skeleton/changelog.md @@ -0,0 +1,11 @@ +## 1.0.4(2023-09-02) +1、优化一些显示的细节问题 +## 1.0.3(2023-09-01) +1、新增动画、时间、颜色等相关属性 +## 1.0.2(2023-08-31) +1、回滚到v1.0.0版本,暂时取消动画时间的修改属性 +## 1.0.1(2023-08-31) +1、新增动画持续时间属性 +2、新增淡出持续时间属性 +## 1.0.0(2023-08-31) +第一个版本 diff --git a/uni_modules/x-skeleton/components/x-skeleton/x-skeleton-configs.js b/uni_modules/x-skeleton/components/x-skeleton/x-skeleton-configs.js new file mode 100644 index 0000000..017c6b0 --- /dev/null +++ b/uni_modules/x-skeleton/components/x-skeleton/x-skeleton-configs.js @@ -0,0 +1,147 @@ +export default { + methods: { + bannerConfigs() { + return { + padding: '20rpx', + gridRows: 1, + gridColumns: 1, + gridRowsGap: '40rpx', + gridColumnsGap: '24rpx', + itemDirection: 'row', + itemGap: '30rpx', + itemAlign: 'center', + headShow: true, + headWidth: '100%', + headHeight: '300rpx', + headBorderRadius: '20rpx', + textShow: false, + textRows: 3, + textRowsGap: '20rpx', + textWidth: '100%', + textHeight: '30rpx', + textBorderRadius: '6rpx', + ...this.configs + } + }, + + infoConfigs() { + return { + padding: '20rpx', + gridRows: 1, + gridColumns: 1, + gridRowsGap: '50rpx', + gridColumnsGap: '24rpx', + itemDirection: 'row', + itemGap: '30rpx', + itemAlign: 'flex-start', + headShow: true, + headWidth: '100rpx', + headHeight: '100rpx', + headBorderRadius: '50%', + textShow: true, + textRows: 4, + textRowsGap: '30rpx', + textWidth: ['50%', '100%', '100%', '80%'], + textHeight: ['40rpx', '24rpx', '24rpx', '24rpx'], + textBorderRadius: '6rpx', + ...this.configs + } + }, + + textConfigs() { + return { + padding: '20rpx', + gridRows: 1, + gridColumns: 1, + gridRowsGap: '50rpx', + gridColumnsGap: '24rpx', + itemDirection: 'row', + itemGap: '30rpx', + itemAlign: 'flex-start', + headShow: false, + headWidth: '100rpx', + headHeight: '100rpx', + headBorderRadius: '50%', + textShow: true, + textRows: 4, + textRowsGap: '30rpx', + textWidth: ['50%', '100%', '100%', '80%'], + textHeight: '30rpx', + textBorderRadius: '6rpx', + ...this.configs + } + }, + + menuConfigs() { + return { + padding: '20rpx', + gridRows: 2, + gridColumns: 5, + gridRowsGap: '40rpx', + gridColumnsGap: '40rpx', + itemDirection: 'column', + itemGap: '16rpx', + itemAlign: 'center', + headShow: true, + headWidth: '100rpx', + headHeight: '100rpx', + headBorderRadius: '50%', + textShow: true, + textRows: 1, + textRowsGap: '0rpx', + textWidth: '100%', + textHeight: '24rpx', + textBorderRadius: '6rpx', + ...this.configs + } + }, + + listConfigs() { + return { + padding: '20rpx', + gridRows: 2, + gridColumns: 1, + gridRowsGap: '50rpx', + gridColumnsGap: '24rpx', + itemDirection: 'row', + itemGap: '30rpx', + itemAlign: 'flex-start', + headShow: true, + headWidth: '200rpx', + headHeight: '200rpx', + headBorderRadius: '16rpx', + textShow: true, + textRows: 4, + textRowsGap: '30rpx', + textWidth: ['50%', '100%', '100%', '80%'], + textHeight: ['38rpx', '24rpx', '24rpx', '24rpx'], + textBorderRadius: '6rpx', + ...this.configs + } + }, + + waterfallConfigs() { + return { + padding: '20rpx', + gridRows: 2, + gridColumns: 2, + gridRowsGap: '40rpx', + gridColumnsGap: '24rpx', + itemDirection: 'column', + itemGap: '16rpx', + itemAlign: 'center', + headShow: true, + headWidth: '100%', + headHeight: '400rpx', + headBorderRadius: '12rpx', + textShow: true, + textRows: 3, + textRowsGap: '12rpx', + textWidth: ['40%', '85%', '60%'], + textHeight: ['30rpx', '20rpx', '20rpx'], + textBorderRadius: '6rpx', + ...this.configs + } + }, + } +} \ No newline at end of file diff --git a/uni_modules/x-skeleton/components/x-skeleton/x-skeleton.vue b/uni_modules/x-skeleton/components/x-skeleton/x-skeleton.vue new file mode 100644 index 0000000..6c52e00 --- /dev/null +++ b/uni_modules/x-skeleton/components/x-skeleton/x-skeleton.vue @@ -0,0 +1,324 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/uni_modules/x-skeleton/package.json b/uni_modules/x-skeleton/package.json new file mode 100644 index 0000000..7912e90 --- /dev/null +++ b/uni_modules/x-skeleton/package.json @@ -0,0 +1,84 @@ +{ + "id": "x-skeleton", + "displayName": "skeleton骨架屏(可任意配置-易用-灵活-动画)", + "version": "1.0.4", + "description": "x-skeleton骨架屏可随意配置内容,扩展性强,简单易用,内含常用的骨架类型", + "keywords": [ + "skeleton", + "骨架屏", + "加载效果", + "vue", + "微信小程序" +], + "repository": "", +"engines": { + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "u" + }, + "App": { + "app-vue": "u", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "u" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/x-skeleton/readme.md b/uni_modules/x-skeleton/readme.md new file mode 100644 index 0000000..74726ab --- /dev/null +++ b/uni_modules/x-skeleton/readme.md @@ -0,0 +1,93 @@ +# x-skeleton + +# 功能介绍 +- 支持 H5、微信小程序,其他端未测试过 +- 使用简单、灵活,高度自定义 +- 加载时支持动画 +- 消失时加了动画,不再生硬切换页面 +- 支持绝大部分常用场景: +1、轮播图 +2、个人信息 +3、段落 +4、菜单 +5、列表 +6、瀑布流 +7、自定义... + +# 属性说明 + +| 参数 | 说明 | 类型 | 默认值 | 可选值 | +| ------- | --------------------------------------------------- | ------- | ------ | --- | +| type | 骨架类型,为空时是完全自定义 | String | - |banner轮播图、info个人信息、text段落、menu菜单、list列表、waterfall瀑布流| +| loading | 是否显示骨架占位图,设置为false将会展示子组件内容 | Boolean | true |true、false| +| animate | 是否开启动画效果 | Boolean | true |true、false| +| animateTime | 动画效果持续时间,单位秒 | Number \| String | 1.8 |-| +| fadeOut | 是否开启淡出动画 | Boolean | true |true、false| +| fadeOutTime | 淡出效果持续时间,单位秒 | Number \| String | 0.5 |-| +| bgColor | 骨架的背景色 | String | #EAEDF5 |-| +| highlightBgColor | 骨架的动画高亮背景色 | String | #F9FAFF |-| +| configs | 自定义配置,具体看下方 | Object | {} |-| + +## configs参数说明 + +| 参数 | 说明 | 类型 | +| ------- | --------------------------------------------------- | ------- | +| padding | 骨架内边距,同 css 的 padding | String | +| gridRows | 行数 | Number | +| gridColumns | 列数 | Number | +| gridRowsGap | 行间隔 | String | +| gridColumnsGap | 竖间距 | String | +| itemDirection | head与text之间的排列方向(row、column) | String | +| itemGap | head与text之间的间隔 | String | +| itemAlign | head与text之间的纵轴对齐方式,同 flex 的align-items(center、flex-start、flex-end等) | String | +| headShow | head是否展示 | Boolean | +| headWidth | head宽度,支持百分比 | String | +| headHeight | head高度 | String | +| headBorderRadius | head圆角,支持百分比 | String | +| textShow | text是否展示 | Boolean | +| textRows | text的行数 | Number | +| textRowsGap | text间距 | String | +| textWidth | text的宽度,可以为百分比,数值,带单位字符串等,可通过数组传入指定每个段落行的宽度 | String \| Array \| Number | +| textHeight | text的高度,可以为数值,带单位字符串等,可通过数组传入指定每个段落行的高度 | String \| Array \| Number | +| textBorderRadius | text的圆角,支持百分比 | String | + +大部分情况下,直接指定相应的 type 已经够用了,如果大家想进行样式的微调、完全自定义可通过设置 configs 来实现。 + +简单解释一下这些参数(右边有结构布局图示): + +布局总共分成 4 块,分别是 grid、item、head、text。 + +1、grid:包含 item,指定每一行有多少个 item,每一列有多少个 item + +2、item:包含 head、text,可设置他们之间的排列方式、间距 + +3、head:一个 item 只有一个 head,可设置宽高、圆角 + +4、text:一个 item 可以有多行 text,可分别设置宽高、圆角、间距 + + + +# 使用示例 + +```html + + 我是轮播图 + +``` + +```js +export default { + data() { + return { + loading: true, + } + }, + onLoad() { + setTimeout(() => { + this.loading = false; + }, 2000); + }, +} +``` + +更多用法请下载查看示例代码,有问题可以留言 \ No newline at end of file
{{ info.level_name }}