xuxueyang
2024-09-09 8478015e961b93963e0a269d92c281d84da44f63
update 会员信息、兑换商品等
已修改14个文件
已添加4个文件
1040 ■■■■■ 文件已修改
common/global.scss 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
components/banner3d/banner3d.vue 416 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manifest.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/order/order-detail.vue 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/user/supplier-user.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pages/user/user-customer.scss 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/images/customer/coupon/coupon-bg-user.png 补丁 | 查看 | 原始文档 | blame | 历史
static/images/customer/coupon/member/icon-member-4.png 补丁 | 查看 | 原始文档 | blame | 历史
static/images/customer/coupon/member/member-level-bg.png 补丁 | 查看 | 原始文档 | blame | 历史
store/index.js 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/coupon/coupon-self.vue 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/coupon/good-all.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/coupon/good-self.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/coupon/point-history.vue 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/self/collect.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/self/history.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/self/member-center.vue 182 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sub_pages/customer/shopping/confirm.vue 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
common/global.scss
@@ -238,6 +238,24 @@
.component-stock-zero{
    position: relative;
}
.component-status-zero{
    position: absolute;
    line-height: 100%;
    // font-size: ;
    left: -2rpx;
    right: -2rpx;
    top: -2rpx;
    bottom: -2rpx;
    font-size: 600;
    content: '已下架';
    color: #fff;
    text-align: center;
    padding-top: calc(50% - 20rpx);
    background-color: #52525275;
}
.component-status-zero{
    position: relative;
}
.component-popup_input{
    margin: 0 auto;
    margin-top: 160rpx;
components/banner3d/banner3d.vue
对比新文件
@@ -0,0 +1,416 @@
<template>
    <div class="banner-container">
        <swiper :style="{width: '100vw', height: '410rpx'}" :indicator-dots="swiperConfig.indicatorDots"
            :indicator-color="swiperConfig.indicatorColor" :indicator-active-color="swiperConfig.indicatorActiveColor"
            :autoplay="swiperConfig.autoplay" :interval="swiperConfig.interval" :duration="swiperConfig.duration"
            :circular="swiperConfig.circular" :previous-margin="swiperConfig.previousMargin"
            :next-margin="swiperConfig.nextMargin" @change="swiperChange" @animationfinish="animationfinish">
            <swiper-item v-for="(item, i) in bannerList" :key="i">
                <!-- 1.当前展示为第1项时,bannerList最后一项和第二项的justifyContent值分别为flex-end和flex-start,其余项值为center -->
                <!-- 2.当前展示为最后一项时,bannerList倒数第2项和第1项的justifyContent值分别为flex-end和flex-start,其余项值为center -->
                <!-- 3.当前展示为其他项(非第1和最后1项)时,bannerList当前项的前1项和后1项的justifyContent值分别为flex-end和flex-start,其余项值为center -->
                <!-- 4.padding值也需要根据不同项设定不同值,但理同justifyContent -->
                <div class="image-container" :style="{
                  transform: curIndex===i?'scale(' + scaleX + ',' + scaleY + ')':'scale(1,1)',
                  transitionDuration: '.3s',
                  transitionTimingFunction: 'ease'
                }" :class="[curIndex===0?((i===listLen-1)?'item-left':(i===1?'item-right':'item-center')):(curIndex===listLen-1?(i===0?'item-right':(i===listLen-2?'item-left':'item-center')):(i===curIndex-1?'item-left':(i===curIndex+1?'item-right':'item-center')))]">
                    <image :src="item.bg" class="slide-image" />
                    <image :src="item.picture" class="icon-image" :class="[`v${i+1}`]" mode="aspectFit"></image>
                    <view class="container" :class="[`v${i+1}`]">
                        <view class="title">{{bannerList[i].title}}</view>
                        <view class="line-component" v-if="bannerList[i].point">
                            <view class="line-bg">
                                <view class="tip"
                                    :style="{'left':(bannerList[i].point.end&&(bannerList[i].point.current/bannerList[i].point.end)||0).toFixed(2)*100+'%'}">
                                    {{bannerList[i].point.current || 0}}
                                </view>
                                <view class="tip-loc"
                                    :style="{'left':(bannerList[i].point.end&&(bannerList[i].point.current/bannerList[i].point.end)||0).toFixed(2)*100+'%'}">
                                </view>
                            </view>
                            <view class="desc">
                                <span
                                    v-if="bannerList[i].point.end">{{bannerList[i].point.current || 0}}/{{bannerList[i].point.end}},升级还需{{bannerList[i].point.end-bannerList[i].point.current}}成长值</span>
                                <span v-else>成长值:{{bannerList[i].point.current || 0}}</span>
                            </view>
                        </view>
                    </view>
                </div>
            </swiper-item>
        </swiper>
        <!--         <div class="desc-wrap" :class="[isDescAnimating?'hideAndShowDesc':'']">
            <div class="title">{{bannerList[descIndex].title}}</div>
            <div class="desc">{{bannerList[descIndex].description}}</div>
        </div> -->
    </div>
</template>
<script>
    export default {
        props: {
            bannerList: {
                type: Array,
                default () {
                    return []
                }
            },
            swiperConfig: {
                type: Object,
                default () {
                    return {
                        indicatorDots: true,
                        indicatorColor: 'rgba(255, 255, 255, .4)',
                        indicatorActiveColor: 'rgba(255, 255, 255, 1)',
                        autoplay: false,
                        interval: 3000,
                        duration: 300,
                        circular: true,
                        previousMargin: '58rpx',
                        nextMargin: '58rpx'
                    }
                }
            },
            scaleX: {
                type: String,
                default: (634 / 550).toFixed(4)
            },
            scaleY: {
                type: String,
                default: (378 / 328).toFixed(4)
            }
        },
        computed: {
            listLen() {
                return this.bannerList.length
            }
        },
        data() {
            return {
                curIndex: 0,
                descIndex: 0,
                isDescAnimating: false
            }
        },
        methods: {
            swiperChange(e) {
                const that = this
                this.curIndex = e.mp.detail.current
                this.isDescAnimating = true
                let timer = setTimeout(function() {
                    that.descIndex = e.mp.detail.current
                    clearTimeout(timer)
                }, 150)
            },
            animationfinish(e) {
                this.isDescAnimating = false
            },
            // getBannerDetail(index) {
            //     uni.showLoading({
            //         title: '将前往详情页面',
            //         duration: 2000,
            //         mask: true
            //     })
            // }
        }
    }
</script>
<style lang="scss" scoped>
    .banner-container {
        width: 100vw;
        height: 454rpx;
        .image-container {
            box-sizing: border-box;
            width: 100%;
            height: 100%;
            display: flex;
            position: relative;
            .slide-image {
                width: 550rpx;
                height: 328rpx;
                z-index: 200;
                position: relative;
                z-index: 0;
            }
            .icon-image {
                position: absolute;
                right: 50rpx;
                top: 26rpx;
                z-index: 1;
                background-size: 100% 100%;
                width: 196rpx;
                height: 254rpx;
            }
            .icon-image.v4 {
                top: 10rpx;
            }
            .container {
                position: absolute;
                left: 90rpx;
                right: 90rpx;
                top: 90rpx;
                bottom: 90rpx;
                z-index: 1;
                .title {
                    font-weight: 600;
                    font-size: 56rpx;
                    line-height: 80rpx;
                    text-align: left;
                    margin-top: 60rpx;
                    font-style: normal;
                }
                .line-component {
                    margin-top: 60rpx;
                    .desc {
                        font-size: 24rpx;
                        font-weight: 600;
                        font-size: 24rpx;
                        // color: #7D5809;
                        line-height: 34rpx;
                        text-align: left;
                        margin-top: 16rpx;
                    }
                    .line-bg {
                        width: 322rpx;
                        height: 12rpx;
                        // background: #A1B8CC;
                        border-radius: 6rpx;
                        position: relative;
                        .tip-loc {
                            width: 22rpx;
                            height: 12rpx;
                            // background: #D7E5F3;
                            border-radius: 6rpx;
                            position: absolute;
                            left: 0;
                            top: 0;
                            bottom: 0;
                            border-radius: 6rpx;
                        }
                        .tip {
                            min-width: 52rpx;
                            padding-left: 20rpx;
                            padding-right: 20rpx;
                            height: 28rpx;
                            font-size: 20rpx;
                            // background: #D7E5F3;
                            // color: #85A7E3;
                            line-height: 28rpx;
                            text-align: center;
                            font-style: normal;
                            position: absolute;
                            left: 0;
                            top: -40rpx;
                        }
                    }
                }
            }
            .container.v1 {
                .title {
                    color: #7CC662;
                }
                .line-component {
                    .desc {
                        color: #6DA05C;
                    }
                    .line-bg {
                        background: #AECD96;
                        .tip-loc {
                            background: #DEE9CF;
                        }
                        .tip {
                            background: #DEE9CF;
                            color: #6DA05C;
                        }
                    }
                }
            }
            .container.v2 {
                .title {
                    color: #7498E0;
                }
                .line-component {
                    .desc {
                        color: #809BB5;
                    }
                    .line-bg {
                        background: #A1B8CC;
                        .tip-loc {
                            background: #D7E5F3;
                        }
                        .tip {
                            background: #D7E5F3;
                            color: #809BB5;
                        }
                    }
                }
            }
            .container.v3 {
                .title {
                    color: #C47810;
                }
                .line-component {
                    .desc {
                        color: #7D5809;
                    }
                    .line-bg {
                        background: #D1B067;
                        .tip-loc {
                            background: #FFF0CE;
                        }
                        .tip {
                            background: #FFF0CE;
                            color: #7D5809;
                        }
                    }
                }
            }
            .container.v4 {
                .title {
                    color: #DD834E;
                }
                .line-component {
                    .desc {
                        color: #B66A2C;
                    }
                    .line-bg {
                        background: #D69975;
                        .tip-loc {
                            background: #FACAAE;
                        }
                        .tip {
                            background: #FACAAE;
                            color: #B66A2C;
                        }
                    }
                }
            }
        }
        .item-left {
            justify-content: flex-end;
            padding: 56rpx 26rpx 0 0;
        }
        .item-right {
            justify-content: flex-start;
            padding: 56rpx 0 0 26rpx;
        }
        .item-center {
            justify-content: center;
            padding: 56rpx 0 0 0;
        }
        .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: 30rpx;
                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: 24rpx;
                font-family: 'PingFangTC-Regular';
                text-align: left;
            }
        }
        @keyframes descAnimation {
            0% {
                opacity: 1;
            }
            25% {
                opacity: .5;
            }
            50% {
                opacity: 0;
            }
            75% {
                opacity: .5;
            }
            100% {
                opacity: 1;
            }
        }
        @-webkit-keyframes descAnimation {
            0% {
                opacity: 1;
            }
            25% {
                opacity: .5;
            }
            50% {
                opacity: 0;
            }
            75% {
                opacity: .5;
            }
            100% {
                opacity: 1;
            }
        }
        .hideAndShowDesc {
            animation: descAnimation .3s ease 1;
            -webkit-animation: descAnimation .3s ease 1;
        }
    }
</style>
manifest.json
@@ -49,7 +49,7 @@
    "quickapp" : {},
    /* 快应用特有相关 */
    "mp-weixin" : {
        "appid" : "wx6d0ecc4e18710458",
        "appid" : "wx1441324401626290",
        "setting" : {
            "urlCheck" : false,
            "es6" : true,
pages/order/order-detail.vue
@@ -101,7 +101,12 @@
                if (code === 0) {
                    this.dto = {
                        ...this.dto,
                        ...data
                        ...data,
                        // pointGoodsList: [{
                        //     name: '1',
                        //     num: 1,
                        //     description: 'descriptiondescriptiondescriptiondescriptiondescription'
                        // }]
                    }
                }
            },
@@ -223,7 +228,7 @@
                                id: this.id,
                            }
                        })
                        this.$message.hideLoading()
                        if (code === 0) {
                            //微信接口
@@ -399,7 +404,7 @@
                    // this.showSales = false
                    // this.$forceUpdate()
                    // setTimeout(() => {
                        // uni.navigateBack()
                    // uni.navigateBack()
                    // }, 1200)
                }
            },
@@ -436,7 +441,8 @@
            </view>
        </view>
        <view v-for="(item,index) of list" :key="index">
            <view class="flower-info m-b-20 m-t-12 br-4" v-if="!showSales||showSales&&(submitForm.orderItemId == item.id)">
            <view class="flower-info m-b-20 m-t-12 br-4"
                v-if="!showSales||showSales&&(submitForm.orderItemId == item.id)">
                <view class="supplier-name ">
                    <image class="icon-dp" src="/static/common/icon-dp.png"></image>
                    {{ item.supplierName || ''}}
@@ -494,6 +500,7 @@
            </view>
        </view>
        <view class="info-container bg-white br-4" v-if="!showSales">
            <view class="form-item">
                <view class="label">订单编号:</view>
@@ -573,6 +580,39 @@
            </view>
        </view>
        <view class="info-container bg-white br-4 m-t-12"
            v-if="!showSales&& dto.pointGoodsList&& dto.pointGoodsList.length>0">
            <view v-for="(item,j) of dto.pointGoodsList" :key="j" class="m-b-12">
                <view class="flower-info  br-4">
                    <view class="flex flex-wrap-normal">
                        <image class="flower-img img100 br-4 m-r-6" :src="item.cover" @click="previewImg(item.cover)">
                        </image>
                        <view class="flex1">
                            <view class=" flex">
                                <view class="title">
                                    {{ item.name || ''}}
                                </view>
                            </view>
                            <view class="each-list" style="display: contents;">
                                <view class="each-item">
                                    <view class="label">数量</view>
                                    <view class="value">{{ item.num || 0 }}</view>
                                </view>
                                <view class="each-item" style="min-width: unset;max-width: unset;">
                                    <view class="label" style="min-width: 55rpx;">描述</view>
                                    <view class="value" style="word-break: break-all;text-align: left;">{{ item.description || '-' }}
                                    </view>
                                </view>
                            </view>
                        </view>
                    </view>
                </view>
            </view>
        </view>
        <view class="info-container bg-white br-4 m-t-12" v-if="!showSales">
            <view class="icon-view">
pages/user/supplier-user.vue
@@ -43,31 +43,31 @@
                        <!-- #ifdef PUB_CUSTOMER_DEV -->
                        <span class="member-level" @click="goto('/sub_pages/customer/self/member-center',true)"
                            v-if="currentInfo&&currentInfo.customerDTO&&currentInfo.customerDTO.userGrowthRecord">
                            <view v-if="currentInfo.customerDTO.userGrowthRecord.currentMemberLevel=='普通会员'">
                                <image class="member-icon v1"
                            <view v-if="currentInfo.customerDTO.userGrowthRecord.currentMemberLevel=='普通会员'" class="v1">
                                <image class="member-icon"
                                    src="../../static/images/customer/coupon/member/icon-member-1.png"></image>
                                {{currentInfo.customerDTO.userGrowthRecord.currentMemberLevel}}
                                <uni-icons color="#79C57B" type="right" size="18"></uni-icons>
                                <uni-icons color="#7CC662" type="right" size="18"></uni-icons>
                            </view>
                            <view v-else-if="currentInfo.customerDTO.userGrowthRecord.currentMemberLevel=='银卡会员'">
                            <view v-else-if="currentInfo.customerDTO.userGrowthRecord.currentMemberLevel=='银卡会员'" class="v2">
                                <image class="member-icon v2"
                                    src="../../static/images/customer/coupon/member/icon-member-2.png"></image>
                                {{currentInfo.customerDTO.userGrowthRecord.currentMemberLevel}}
                                <uni-icons color="#96B1E9" type="right" size="18"></uni-icons>
                                <uni-icons color="#7498E0" type="right" size="18"></uni-icons>
                            </view>
                            <view v-else-if="currentInfo.customerDTO.userGrowthRecord.currentMemberLevel=='金卡会员'">
                            <view v-else-if="currentInfo.customerDTO.userGrowthRecord.currentMemberLevel=='金卡会员'" class="v3">
                                <image class="member-icon v3"
                                    src="../../static/images/customer/coupon/member/icon-member-3.png"></image>
                                {{currentInfo.customerDTO.userGrowthRecord.currentMemberLevel}}
                                <uni-icons color="#AD790F" type="right" size="18"></uni-icons>
                                <uni-icons color="#C47810" type="right" size="18"></uni-icons>
                            </view>
                            <view v-else>
                            <view v-else  class="v4">
                                <image class="member-icon v4"
                                    src="../../static/images/customer/coupon/member/icon-member-3.png"></image>
                                    src="../../static/images/customer/coupon/member/icon-member-4.png"></image>
                                {{currentInfo.customerDTO.userGrowthRecord.currentMemberLevel}}
                                <uni-icons color="#E4531C" type="right" size="18"></uni-icons>
                                <uni-icons color="#DD834E" type="right" size="18"></uni-icons>
                            </view>
@@ -109,7 +109,7 @@
        </view>
        <!-- #ifdef PUB_CUSTOMER_DEV -->
        <view class="user-utils m-20 coupon-info-container" @click="goto( `/sub_pages/customer/coupon/good-all`,true)"
        <view class="m-20 coupon-info-container" @click="goto( `/sub_pages/customer/coupon/good-all`,true)"
            v-if="selftype==='customer'||!selftype">
            <view>
                <view class="title">积分商城</view>
pages/user/user-customer.scss
@@ -1,7 +1,6 @@
.member-level{
    font-weight: 600;
    font-size: 32rpx;
    color: #A3EBCD;
    line-height: 44rpx;
    text-align: left;
    font-style: normal;
@@ -11,33 +10,36 @@
    
    .member-icon{
        display: inline-block;
        vertical-align: bottom;
        width: 48rpx;
        height: 56rpx;
        vertical-align: middle;
        width: 57rpx;
        height: 61rpx;
        background-size: 100% 100%;
    }
}
.member-level.v1{
    color: #A3EBCD;
.member-level .v1{
    color: #7CC662;
}
.member-level.v2{
    color: #96B1E9;
.member-level .v2{
    color: #7498E0;
}
.member-level.v3{
    color: #AD790F;
.member-level .v3{
    color: #C47810;
}
.member-level.v4{
    color: #E4531C;
.member-level .v4{
    color: #DD834E;
}
.coupon-info-container{
    display: flex;
    // width: 690rpx;
    padding: 22rpx 36rpx;
    // height: 134rpx;
    background: linear-gradient( 180deg, #FBECC1 0%, #E6CE9E 100%);
    // background: linear-gradient( 180deg, #FBECC1 0%, #E6CE9E 100%);
    // background: unset !important;
    border-radius: 8rpx;
    border: 2rpx solid;
    border-image: linear-gradient(180deg, rgba(238, 217, 173, 1), rgba(219, 182, 105, 1)) 2 2;
    // border: 2rpx solid;
    // border-image: linear-gradient(180deg, rgba(238, 217, 173, 1), rgba(219, 182, 105, 1)) 2 2;
    background-image: url('../../static/images/customer/coupon/coupon-bg-user.png');
    background-size: 100% 100%;
    .title{
        font-weight: 600;
        font-size: 36rpx;
static/images/customer/coupon/coupon-bg-user.png
static/images/customer/coupon/member/icon-member-4.png
static/images/customer/coupon/member/member-level-bg.png
store/index.js
@@ -34,6 +34,10 @@
            'shopnum': 0,
            'coupon': 0
        },
        cache: {
            coupon: {},
            goods:[],
        },
        defaultaddress: {}
    },
    mutations: {
@@ -120,6 +124,19 @@
            console.log('sign_clear', key)
            state.sign[key] = 0
        },
        cache_coupon_select: async function({
            commit,
            state
        }, dto) {
            state.cache['coupon'] = dto || {}
        },
        cache_goods_select: async function({
            commit,
            state
        }, goods) {
            state.cache['goods'] = goods || []
        },
        // lazy loading openid
        logout: async function({
            commit,
sub_pages/customer/coupon/coupon-self.vue
@@ -1,6 +1,6 @@
<template>
    <view class="coupon-container">
        <view class="p10">
        <view class="p10" v-if="source!=='shopping'">
            <top-tabs :tabs="tabs" :flg="flg" @change="changeTab" type="coupon">
            </top-tabs>
@@ -8,7 +8,8 @@
        <view class="">
            <no-data v-if="!list||list.length==0" style="width: 100%;"></no-data>
            <view v-for="(item,index) of list" :key="index" class="coupont-item" :class="[query.status]">
            <view v-for="(item,index) of list" :key="index" class="coupont-item" :class="[query.status]"
                @click="selectCoupon(item)">
                <view class="flex container img100">
                    <view class="info-price">
                        <view class="price1">
@@ -31,8 +32,8 @@
                </view>
            </view>
        </view>
        <view style="min-height: 130rpx;"></view>
        <view class="bottom-button" @click="getCoupon">领取优惠券</view>
        <view style="min-height: 130rpx;" v-if="source!=='shopping'"></view>
        <view class="bottom-button" v-if="source!=='shopping'" @click="getCoupon">领取优惠券</view>
    </view>
</template>
@@ -63,17 +64,38 @@
                query: {
                    status: 'unused'
                },
                list: []
                list: [],
                source: ''
            }
        },
        async onLoad() {
            this.listApi = '/api/v2/coupon/app' + `/mine/${this.query.status}/list`
        async onLoad(options) {
            if (options.source) {
                this.source = options.source || ''
            }
            if (this.source === 'shopping') {
                //只展示可用的
                this.page.size = 100
                this.listApi = '/api/v2/coupon/app' + `/mine/unused/list`
            } else {
                this.listApi = '/api/v2/coupon/app' + `/mine/${this.query.status}/list`
            }
            await this.$store.dispatch('sign_clear', 'coupon')
            this.getList()
        },
onReachBottom() {
            this.getMore()
        },
        methods: {
            async selectCoupon(item) {
                if (this.source == 'shopping') {
                    await this.$store.dispatch('cache_coupon_select', item)
                    uni.navigateBack()
                }
            },
            changeTab(flg) {
                this.flg = '' + flg
                this.query.status = this.tabs[flg].status
sub_pages/customer/coupon/good-all.vue
@@ -12,7 +12,7 @@
            <view class="flex point-info">
                <view class="point-record m-r-a">
                    <view class="text-center title">我的积分</view>
                    <view class="flex">
                    <view class="flex" @click="goto('/sub_pages/customer/coupon/point-history',true)">
                        <image src="../../../static/images/customer/coupon/icon-point.png" class="point-icon">
                        </image>
                        {{currentInfo.currentPoint || 0}}
sub_pages/customer/coupon/good-self.vue
@@ -1,6 +1,6 @@
<template>
    <view class="coupon-container">
        <view class="p10">
        <view class="p10" v-if="source!=='shopping'">
            <top-tabs :tabs="tabs" :flg="flg" @change="changeTab" type="coupon">
            </top-tabs>
@@ -20,23 +20,39 @@
                        <view class="time word-e">
                            {{item.description||''}}
                        </view>
                        <view class="button" @click="getPointGood(item)">
                        <view class="button" @click="getPointGood(item)" v-if="source!=='shopping'">
                            查看详情
                        </view>
                        <view class="button" @click="updateSelectGood(item)" v-if="source=='shopping'">
                            {{isIngood(item)?'移除':'添加'}}
                        </view>
                    </view>
                </view>
                <view class="tip">
                <!--     <view class="tip">
                    <span class="t-red">*</span>此券每人限领1张。仅限用于花满芜鲜花交易平台鲜切花花款满额使用,不可与其他优惠同享、不可叠加使用
                </view>
                </view> -->
            </view>
        </view>
        <!-- <view style="min-height: 130rpx;"></view> -->
        <view style="min-height: 130rpx;" v-if="source=='shopping'"></view>
        <view class="bottom-button" @click="backpage()" v-if="source=='shopping'">返回订单结算</view>
        <!-- <view class="bottom-button" @click="toGoodAll">前往兑换</view> -->
    </view>
</template>
<script>
    import {
        mapState
    } from 'vuex'
    export default {
        computed: {
            ...mapState({
                cache_goods: state => {
                    return state.cache.goods || []
                },
            }),
        },
        data() {
            return {
                flg: 0,
@@ -62,16 +78,68 @@
                query: {
                    status: 'A'
                },
                list: []
                list: [],
                source: ''
            }
        },
        async onLoad() {
            this.listApi = '/api/customer/point/goods/exchange/list'
        onReachBottom() {
            this.getMore()
        },
        async onLoad(options) {
            if (options.source) {
                this.source = options.source || ''
            }
            if (this.source === 'shopping') {
                //只展示可用的
                this.page.size = 100
                this.listApi = '/api/customer/point/goods/exchange/list'
            } else {
                this.listApi = '/api/customer/point/goods/exchange/list'
            }
            this.getList()
        },
        methods: {
            isIngood(item) {
                for (var tmp of this.cache_goods) {
                    if (tmp.id == item.id) {
                        return true
                    }
                }
                return false
            },
            async updateSelectGood(item) {
                var has = false
                for (var tmp of this.cache_goods) {
                    if (tmp.id == item.id) {
                        has = true
                        break
                    }
                }
                var arr = []
                if (has) {
                    //移除
                    var arr = []
                    for (var tmp of this.cache_goods) {
                        if (tmp.id == item.id) {} else {
                            arr.push(tmp)
                        }
                    }
                } else {
                    //添加
                    for (var tmp of this.cache_goods) {
                        arr.push(tmp)
                    }
                    arr.push(item)
                }
                await this.$store.dispatch('cache_coupon_select', arr)
                this.$forceUpdate()
            },
            changeTab(flg) {
                this.flg = '' + flg
                this.query.status = this.tabs[flg].status
sub_pages/customer/coupon/point-history.vue
@@ -1,6 +1,30 @@
<template>
    <!-- 列表页面 -->
    <view>
        <view class="p15" style="min-height: calc(100vh - 260rpx);">
            <no-data v-if="!list||list.length==0" style="width: 100%;"></no-data>
            <view v-for="(item,index) in list" :key="index" class="m-b-24">
                <view @click.stop="toDetail(item)" class="notice-item">
                    <view v-if="item.typeStr" class="type">{{item.typeStr||'-'}}</view>
                    <view class="time">{{item.recordDate || ''}}</view>
                    <view class="form-item">
                        <view class="form-item-label">变更类型</view>
                        <view class="form-item-value">{{item.changeTypeStr || ''}}</view>
                    </view>
                    <view class="form-item">
                        <view class="form-item-label">积分</view>
                        <view class="form-item-value">{{item.point || ''}}</view>
                    </view>
                    <view class="form-item">
                        <view class="form-item-label">备注</view>
                        <view class="form-item-value">{{item.remarks || ''}}</view>
                    </view>
                </view>
            </view>
        </view>
        <!-- 判断是否到底了,自动吧 -->
        <footer-msg :more="page.total>0&&page.total>page.current*page.size"></footer-msg>
    </view>
</template>
@@ -8,15 +32,58 @@
    export default {
        data() {
            return {
                query: {
                    // status: ''
                }
            }
        },
        onLoad() {
            this.listApi = '/api/customer/point/list'
            this.getList()
        },
        onReachBottom() {
            this.getMore()
        },
        async onPullDownRefresh() {
            this.page.current = 1
            await this.getList()
            uni.stopPullDownRefresh()
        },
        methods: {
        }
    }
</script>
<style>
<style lang="scss" scoped>
    .notice-item {
        padding: 20rpx;
        font-size: 28rpx;
        background-color: #fff;
</style>
        .type {
            font-weight: 600;
        }
        .time {
            font-size: 24rpx;
            color: darkgray;
        }
        .form-item {
            display: flex;
            .form-item-label {}
            .form-item-value {
                flex: 1;
                text-align: right;
            }
        }
    }
</style>
sub_pages/customer/self/collect.vue
@@ -234,7 +234,7 @@
        <view class="trade-list-container">
            <view class="trade-info-container flex" :class="[dto.status!=='UP'?'OFF':'']" v-for="(dto,index) of list"
                :key="index">
                <image class="img img100 br-4 m-r-10" :class="[!dto.stock?'component-stock-zero':'']"
                <image class="img img100 br-4 m-r-10" :class="[!dto.stock?'component-stock-zero':'',dto.status!=='UP'?'component-status-zero':'']"
                    :src="dto.url||dto.cover" @click.stop="toDetail(dto)"></image>
                <view class="flex1">
                    <view class="flex" @click.stop="toDetail(dto)">
sub_pages/customer/self/history.vue
@@ -222,7 +222,7 @@
        <view class="trade-list-container">
            <view class="trade-info-container flex" :class="[dto.status!=='UP'?'OFF':'']" v-for="(dto,index) of list"
                :key="index">
                <image class="img img100 br-4 m-r-10" :class="[!dto.stock?'component-stock-zero':'']"
                <image class="img img100 br-4 m-r-10" :class="[!dto.stock?'component-stock-zero':'',dto.status!=='UP'?'component-status-zero':'']"
                    :src="dto.url||dto.cover" @click.stop="toDetail(dto)"></image>
                <view class="flex1">
                    <view class="flex" @click.stop="toDetail(dto)">
sub_pages/customer/self/member-center.vue
@@ -1,22 +1,184 @@
<template>
    <view>
    <view class="member-center">
        <image src="../../../static/images/customer/coupon/member/member-level-bg.png" mode="aspectFit"
            class="img100 member-level-image"></image>
        <view class="banner">
            <banner3d ref="banner3d" v-if="init" :banner-list="bannerList" :swiper-config="swiperConfig"></banner3d>
        </view>
        <view class="p20" style="padding-top: 0rpx;">
            <view class="info bg-white p20">
                <view class="flex">
                    <view>成长值规则</view>
                    <view class="m-l-a m-r-0 text-right desc-gray" @click="goto('/pages/help/content?id=会员协议',false)">点击查看会员协议
                    </view>
                </view>
            </view>
            <view class="info bg-white p20 m-t-20"
                v-if="currentInfo.customerDTO&&currentInfo.customerDTO.userGrowthRecord
            &&currentInfo.customerDTO.userGrowthRecord.targetMemberInfos&&currentInfo.customerDTO.userGrowthRecord.targetMemberInfos.length>=1">
                <view class="text-center desc-gray">
                    ———————— 会员权益 ————————
                </view>
                <view>
                    <view class="m-t-12">积分达到
                        {{currentInfo.customerDTO.userGrowthRecord.targetMemberInfos[0].targetStartPoint || '-'}}</view>
                    <view class="m-t-12">优惠
                        {{currentInfo.customerDTO.userGrowthRecord.targetMemberInfos[0].targetDiscountAmount || '-'}}元/扎
                    </view>
                </view>
            </view>
            <view class="info bg-white p20 m-t-20">
                <view class="text-center desc-gray">
                    ————— 成长值获取规则 —————
                </view>
                <view class="m-t-12">
                    每消费1元,即可获得1成长值。
                    成长值将在订单交易完成后,根据实际交易金额进行赠送。
                    消费越多,获得的成长值越多,享受更高等级的会员权益。
                    快来参与消费,累积成长值,解锁更多专属福利吧!
                </view>
            </view>
        </view>
    </view>
    </view>
</template>
<script>
    import banner3d from '@/components/banner3d/banner3d'
    export default {
        data() {
            return {
        methods: {
        },
        onLoad() {
            if (this.currentInfo.customerDTO && this.currentInfo.customerDTO.userGrowthRecord && this.currentInfo
                .customerDTO.userGrowthRecord.currentMemberLevel) {
                // userGrowthRecord: {currentMemberLevel: "普通会员", currentGrowthValue: 6919,…}
                // currentGrowthValue: 6919
                // currentMemberLevel: "普通会员"
                //     targetMemberInfos: [{targetMemberLevel: "金卡会员", targetStartPoint: 15001, targetGap: 8082, targetDiscountAmount: 0.4},…]
                //         0: {targetMemberLevel: "金卡会员", targetStartPoint: 15001, targetGap: 8082, targetDiscountAmount: 0.4}
                //         targetDiscountAmount: 0.4
                //         targetGap: 8082
                //         targetMemberLevel: "金卡会员"
                //         targetStartPoint: 15001
                //         1: {targetMemberLevel: "钻石会员", targetStartPoint: 10001, targetGap: 3082, targetDiscountAmount: 0.5}
                //         targetDiscountAmount: 0.5
                //         targetGap: 3082
                //         targetMemberLevel: "钻石会员"
                //         targetStartPoint: 10001
                //计算下一个等级的差距
                for (var tmp of this.bannerList) {
                    tmp.point = {
                        current: this.currentInfo.customerDTO.userGrowthRecord.currentGrowthValue || 0
                    }
                }
                if (this.currentInfo.customerDTO.userGrowthRecord.targetMemberInfos) {
                    var t = -1
                    for (var tmp of this.bannerList) {
                        t += 1
                        for (var k of this.currentInfo.customerDTO.userGrowthRecord.targetMemberInfos) {
                            if (tmp.title === k.targetMemberLevel) {
                                console.log('eq', k, tmp)
                                tmp.point = {
                                    current: this.currentInfo.customerDTO.userGrowthRecord.currentGrowthValue || 0,
                                    end: k.targetStartPoint || 0,
                                }
                            }
                        }
                    }
                }
                this.init = true
                this.$nextTick(() => {
                    var name = this.currentInfo.customerDTO.userGrowthRecord.currentMemberLevel
                    var index = -1
                    for (var tmp of this.bannerList) {
                        index += 1
                        if (tmp.title === name) {
                            this.$refs.banner3d.swiperChange({
                                mp: {
                                    detail: {
                                        current: index
                                    }
                                }
                            })
                            break
                        }
                    }
                })
            }
        },
        methods: {
        }
        data() {
            return {
                init: false,
                bannerList: [{
                    bg: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/d3/d31e9011d1c140068942c106c2f7e37bTFDUPzQRgaHx7a20dcefe1fb5eb12e18d294b8c1f86e.png',
                    picture: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/ef/ef96604518db467fbd344c08e48d1fac8jZdk1ED0Yq023d4f86c2ec36975c981ba522c2bfe3f.png',
                    title: '普通会员',
                    // description: '一万年太久,就现在,给你爱',
                    path: '',
                    point: undefined
                }, {
                    bg: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/cf/cff11dd119174483a46858ace7ddc2a3lJlA3kEXom5H82b85fac5f2db00d50ece7e650207f78.png',
                    picture: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/07/075db9222f7a41e981c5b263d7210ed5Ztljs5yDHKILd37c3399011f84f401b755477bb8a323.png',
                    title: '银卡会员',
                    // description: '花中樱,鱼乃鲷花中樱,鱼乃鲷',
                    path: ''
                }, {
                    bg: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/5b/5b9bcdeb29ab4ab7a7a7871e430e9180kwtx0q4ovEGpe93cd3cc7772e4b31a6cfea199663815.png',
                    picture: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/f1/f192b651606045ddba5c5f04a34a00c2R8MmH6mVsprH81cab47fbe889222f6088f4ca2cf20d5.png',
                    title: '金卡会员',
                    // description: '取材自湘西苗族传统的烟熏文化',
                    path: ''
                }, {
                    bg: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/ce/ce13a8fe5d7d48aeb6e6dec8217d8cbeWia6N8vcYrbse93cd3cc7772e4b31a6cfea199663815.png',
                    picture: 'https://hmy-flower.oss-cn-shanghai.aliyuncs.com/c9/c94d8f444af94b899d1e1593cebb933eDyZyhyoyDxTRaf60a4d692f097e5d790cdb88fae9d0c.png',
                    title: '钻石会员',
                    // description: '在自己的小世界里,日日好日,夜夜好清宵',
                    path: ''
                }],
                swiperConfig: {
                    indicatorDots: true,
                    indicatorColor: 'rgba(255, 255, 255, .4)',
                    indicatorActiveColor: 'rgba(255, 255, 255, 1)',
                    autoplay: false,
                    interval: 3000,
                    duration: 300,
                    circular: true,
                    previousMargin: '58rpx',
                    nextMargin: '58rpx'
                }
            }
        },
        components: {
            banner3d
        },
    }
</script>
<style>
<style lang="scss" scoped>
    .member-center {
        position: relative;
</style>
        .banner {
            position: relative;
            z-index: 10;
            padding-top: 160rpx;
        }
        .member-level-image {
            width: 750rpx;
            min-height: 530rpx;
            position: absolute;
            left: 0;
            right: 0;
            top: 0;
            z-index: 1;
        }
    }
</style>
sub_pages/customer/shopping/confirm.vue
@@ -11,11 +11,55 @@
                address: state => {
                    return state.defaultaddress || {}
                },
                cache_coupon: state => {
                    return state.cache.coupon || {}
                },
                cache_goods: state => {
                    return state.cache.goods || []
                },
            }),
            coupon_fee() {
                //优惠券
                if (this.dto.couponRecordId && this.cache_coupon) {
                    //计算优惠券
                    if (this.cache_coupon.couponDiscountType === 'zero') {
                        return this.cache_coupon.couponDiscountValue || 0
                    } else if (this.cache_coupon.minOrderAmount && this.cache_coupon.minOrderAmount > 0) {
                        var total = ((dto.totalAmount || 0) + (dto.packing || 0) + (current_transport.fee || 0) || 0)
                            .toFixed(2)
                        if (total >= this.cache_coupon.minOrderAmount) {
                            return this.cache_coupon.couponDiscountValue || 0
                        }
                    } else {
                        return this.cache_coupon.couponDiscountValue || 0
                    }
                }
                return 0
            }
        },
        async beforeDestroy() {
            await this.$store.dispatch('cache_coupon_select', {})
            await this.$store.dispatch('cache_goods_select', [])
        },
        async onShow() {
            //优惠券
            if (this.cache_coupon && this.cache_coupon.id) {
                this.dto.couponRecordId = this.cache_coupon.id
                this.dto.couponRecordStr = this.cache_coupon.couponName
            }
            //兑换券
            this.dto.couponRecordStr = ''
            if (this.cache_goods && this.cache_goods.length > 0) {
                this.dto.couponRecordStr = ''
                var names = []
                for (var tmp of this.cache_goods) {
                    names.push(tmp.name || tmp.title || '')
                }
                this.dto.couponRecordStr = names.join(',')
            }
        },
        onLoad(options) {
            // console.log('dto',options)
@@ -81,6 +125,9 @@
                    transportId: '',
                    addressId: '',
                    flowers: [],
                    couponRecordId: '',
                    couponRecordStr: '',
                    goodsRecordIdListStr: '',
                },
                current_transport: {},
                cacheAddressId: '',
@@ -109,6 +156,18 @@
            }
        },
        methods: {
            toSelectCoupon() {
                //跳转去列表页面进行选择
                uni.navigateTo({
                    url: '/sub_pages/customer/coupon/coupon-self?source=shopping'
                })
            },
            toSelectGood() {
                //跳转去列表页面进行选择
                uni.navigateTo({
                    url: '/sub_pages/customer/coupon/good-self?source=shopping'
                })
            },
            select_need(e) {
                this.show_select_need = false
                this.dto.specialNeedsStr = e.value[0].label
@@ -175,6 +234,10 @@
                            })
                            tmp.$message.hideLoading()
                            if (code === 0) {
                                //清空优惠券
                                this.$store.dispatch('cache_coupon_select', {})
                                this.$store.dispatch('cache_goods_select', [])
                                //提交信息
                                console.log('pay,', data)
                                // /api/pub/init/callback?orderId=
@@ -335,7 +398,19 @@
            </view>
            <view class="p10 bg-white m-t-20 br-4">
                <!-- #ifdef PUB_CUSTOMER_DEV -->
                <view class="form-item  flex ">
                    <view class="label">优惠券</view>
                    <view class="m-l-a m-r-0 flex " :class="[!dto.couponRecordId?'desc-gray':'']"
                        @click="toSelectCoupon">
                        <view>{{dto.couponRecordStr||dto.couponRecordId || '请选择'}}</view>
                        <u-icon class="m-l-a" name="arrow-right"></u-icon>
                    </view>
                </view>
                <!-- #endif -->
                <view class="form-item  flex m-t-12">
                    <view class="label">特殊需求</view>
                    <view class="m-l-a m-r-0 flex " :class="[!dto.specialNeeds?'desc-gray':'']" @click="()=>{
@@ -355,6 +430,18 @@
                        </view>
                    </view>
                </view>
                <!-- #ifdef PUB_CUSTOMER_DEV -->
                <view class="form-item  flex ">
                    <view class="label">兑换券</view>
                    <view class="m-l-a m-r-0 flex "
                        :class="[!dto.goodsRecordIdList||dto.goodsRecordIdList.length==0?'desc-gray':'']"
                        @click="toSelectGood">
                        <view>{{dto.goodsRecordIdListStr|| '请选择'}}</view>
                        <u-icon class="m-l-a" name="arrow-right"></u-icon>
                    </view>
                </view>
                <!-- #endif -->
            </view>
        </view>
@@ -377,6 +464,12 @@
                    {{ (current_transport.fee || 0) }}
                </view>
            </view>
            <view class="desc flex">
                <view>优惠:</view>
                <view class="m-l-a m-r-0 text-right">
                    -{{ coupon_fee || 0 }}
                </view>
            </view>
        </view>
@@ -385,7 +478,8 @@
        <view class="bottom-price flex">
            <view class="m-t-12 m-l-0 m-r-a">
                合计 <span class="t-red">¥
                    {{ ((dto.totalAmount || 0) + (dto.packing || 0) + (current_transport.fee || 0) || 0).toFixed(2) }} </span>元
                    {{ ((dto.totalAmount || 0) + (dto.packing || 0) + (current_transport.fee || 0) - coupon_fee || 0).toFixed(2) }}
                </span>元
            </view>
            <view class="button-green-1 m-l-a m-r-0" style="min-width: 240rpx" @click="submitOrder">
                提交订单