|
|
|
<template>
|
|
|
|
<view class="member-center">
|
|
|
|
<view class="header">
|
|
|
|
<cu-custom :isBack="true" :isCenter="true">
|
|
|
|
<block slot="backText">
|
|
|
|
<view class="backImg">
|
|
|
|
<image src="@/static/images/back-btn.png" mode=""></image>
|
|
|
|
</view>
|
|
|
|
</block>
|
|
|
|
<block slot="content">
|
|
|
|
<view class="tab-title">会员中心</view>
|
|
|
|
</block>
|
|
|
|
</cu-custom>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<view class="vip-info-box">
|
|
|
|
<view class="vip-box">
|
|
|
|
<!-- <image class="bg" src="@/static/images/vip-card.png" mode=""></image> -->
|
|
|
|
<image class="bg" :src="vipList[activeIndex].image" mode=""></image>
|
|
|
|
<view class="info-box">
|
|
|
|
<view class="user-info acea-row">
|
|
|
|
<view class="headImg">
|
|
|
|
<image class="image" v-if="userInfo.avatar" :src="userInfo.avatar" mode=""></image>
|
|
|
|
<view class="noAvatar acea-row row-middle row-center" v-else>
|
|
|
|
<image src="@/static/images/yanjie-logo.png" mode="widthFix"></image>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="">
|
|
|
|
<view class="user-name">{{ userInfo.nickname || '微信用户' }}</view>
|
|
|
|
<view class="">账号:{{ userInfo.phone || userInfo.uid }}</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="progress-bar-box">
|
|
|
|
<view class="progress-bar" :style="'width:'+ (growthPercent || 0) +'%;'"></view>
|
|
|
|
</view>
|
|
|
|
<view class="acea-row">
|
|
|
|
<!-- <view class="vip-icon"></view> -->
|
|
|
|
<image class="vip-icon" :src="vipList[activeIndex].icon" mode=""></image>
|
|
|
|
<view class="to-next-level">下一等级还需成长值 {{userInfo.growth}}/{{vipList[activeIndex+1].growthValue}}</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<!-- <view class="header">
|
|
|
|
<view class="slider-banner banner">
|
|
|
|
<swiper indicatorDots="true" @change="swiperChange">
|
|
|
|
<block v-for="(item, vipListIndex) in vipList" :key="vipListIndex">
|
|
|
|
<swiper-item>
|
|
|
|
<view class="swiper-slide" :style="{ backgroundImage: 'url(' + item.image + ')' }">
|
|
|
|
<image :src="item.icon" />
|
|
|
|
<view class="name">{{ item.name }}</view>
|
|
|
|
<view class="discount">
|
|
|
|
可享受商品折扣: {{ item.discount / 10 }}折
|
|
|
|
<text class="iconfont icon-zhekou"></text>
|
|
|
|
</view>
|
|
|
|
<view class="nav acea-row" v-if="item.grade == grade">
|
|
|
|
<view class="item" v-for="(val, indexn) in vipComplete" :key="indexn">
|
|
|
|
<view class="num">{{ val.newNumber }}</view>
|
|
|
|
<view>{{ val.realName }}</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
<view class="lock" v-if="item.grade > grade">
|
|
|
|
<text class="iconfont icon-quanxianguanlisuozi"></text>该会员等级尚未解锁
|
|
|
|
</view>
|
|
|
|
<view class="lock" v-if="item.grade < grade">
|
|
|
|
<text class="iconfont icon-xuanzhong1"></text>已解锁更高等级
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</swiper-item>
|
|
|
|
</block>
|
|
|
|
</swiper>
|
|
|
|
</view>
|
|
|
|
</view> -->
|
|
|
|
<view class="wrapper" :style="'min-height:calc(100vh - '+ topHeight +'px)'">
|
|
|
|
<view class="title">
|
|
|
|
会员权益
|
|
|
|
<!-- <view>
|
|
|
|
<text class="iconfont icon-jingyanzhi"></text>会员升级要求
|
|
|
|
</view>
|
|
|
|
<view class="num">
|
|
|
|
<text class="current">{{ taskCount }}</text>
|
|
|
|
/{{ vipRequire.length }}
|
|
|
|
</view> -->
|
|
|
|
</view>
|
|
|
|
<view class="vip-rights acea-row row-around">
|
|
|
|
<view class="rights-item">
|
|
|
|
<image src="../../../static/images/vip-rights1.png" mode=""></image>
|
|
|
|
<view class="text">专属优惠</view>
|
|
|
|
</view>
|
|
|
|
<view class="rights-item">
|
|
|
|
<image src="../../../static/images/vip-rights2.png" mode=""></image>
|
|
|
|
<view class="text">会员券</view>
|
|
|
|
</view>
|
|
|
|
<view class="rights-item">
|
|
|
|
<image src="../../../static/images/vip-rights3.png" mode=""></image>
|
|
|
|
<view class="text">生日福利</view>
|
|
|
|
</view>
|
|
|
|
<view class="rights-item">
|
|
|
|
<image src="../../../static/images/vip-rights4.png" mode=""></image>
|
|
|
|
<view class="text">积分回馈</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
|
|
|
|
<view class="info-box">
|
|
|
|
<view class="info-title">权益说明</view>
|
|
|
|
<view class="" v-html="vipList[activeIndex].benefit"></view>
|
|
|
|
</view>
|
|
|
|
<view class="info-box">
|
|
|
|
<view class="info-title">会员规则说明</view>
|
|
|
|
<view class="" v-html="vipList[activeIndex].explain"></view>
|
|
|
|
</view>
|
|
|
|
<!-- <view class="list">
|
|
|
|
<view class="item" v-for="(item, vipCompleteIndex) in vipComplete" :key="vipCompleteIndex">
|
|
|
|
<view class="top acea-row row-between-wrapper">
|
|
|
|
<view class="name">
|
|
|
|
{{ item.name}}
|
|
|
|
<text class="iconfont icon-wenti" v-if="item.illustrate" @click="showGrow(item)"></text>
|
|
|
|
</view>
|
|
|
|
<view>{{ item.finish ? "已满足条件" : "未满足条件" }}</view>
|
|
|
|
</view>
|
|
|
|
<view class="cu-progress">
|
|
|
|
<view class="bg-red" :style="{ width: item.speed + '%' }"></view>
|
|
|
|
</view>
|
|
|
|
<view class="experience acea-row row-between-wrapper">
|
|
|
|
<view>{{ item.taskTypeTitle }}</view>
|
|
|
|
<view>
|
|
|
|
<text class="num">{{ item.newNumber }}</text>
|
|
|
|
/{{ item.number }}
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view>
|
|
|
|
</view> -->
|
|
|
|
</view>
|
|
|
|
<!-- <Recommend></Recommend> -->
|
|
|
|
<!-- <view class="growthValue" :class="growthValue === false ? 'on' : ''">
|
|
|
|
<view class="pictrue">
|
|
|
|
<image :src="`${$VUE_APP_RESOURCES_URL}/images/value.jpg`" />
|
|
|
|
<text class="iconfont icon-guanbi3" @click="growthTap"></text>
|
|
|
|
</view>
|
|
|
|
<view class="conter">{{ illustrate }}</view>
|
|
|
|
</view>
|
|
|
|
<view class="mask" :hidden="growthValue" @click="growthTap"></view> -->
|
|
|
|
</view>
|
|
|
|
</template>
|
|
|
|
<script>
|
|
|
|
import { mapGetters } from 'vuex'
|
|
|
|
import {
|
|
|
|
div,
|
|
|
|
mul
|
|
|
|
} from "@/utils/bc";
|
|
|
|
// import { swiper, swiperSlide } from "vue-awesome-swiper";
|
|
|
|
|
|
|
|
// import Recommend from "@/components/Recommend";
|
|
|
|
import { getVipInfo, getVipTask, setDetection } from "@/api/user";
|
|
|
|
export default {
|
|
|
|
name: "Poster",
|
|
|
|
components: {
|
|
|
|
// swiper,
|
|
|
|
// swiperSlide,
|
|
|
|
// Recommend
|
|
|
|
},
|
|
|
|
props: {},
|
|
|
|
data: function() {
|
|
|
|
return {
|
|
|
|
CustomBar: this.CustomBar,
|
|
|
|
topHeight: 0,
|
|
|
|
vipList: [], //等级列表
|
|
|
|
vipRequire: [], //等级要求
|
|
|
|
vipComplete: [], //完成情况
|
|
|
|
taskCount: 0, //任务数
|
|
|
|
grade: 0, //当前会员等级
|
|
|
|
swiperVip: {
|
|
|
|
speed: 1000,
|
|
|
|
effect: "coverflow",
|
|
|
|
slidesPerView: "auto",
|
|
|
|
centeredSlides: true,
|
|
|
|
// loop: true,
|
|
|
|
coverflowEffect: {
|
|
|
|
rotate: 0, // 旋转的角度
|
|
|
|
stretch: -20, // 拉伸 图片间左右的间距和密集度
|
|
|
|
depth: 100, // 深度 切换图片间上下的间距和密集度
|
|
|
|
modifier: 2, // 修正值 该值越大前面的效果越明显
|
|
|
|
slideShadows: false // 页面阴影效果
|
|
|
|
},
|
|
|
|
observer: true,
|
|
|
|
observeParents: true
|
|
|
|
},
|
|
|
|
loading: false,
|
|
|
|
growthValue: true,
|
|
|
|
illustrate: "",
|
|
|
|
activeIndex: 0,
|
|
|
|
growthPercent: 0,
|
|
|
|
};
|
|
|
|
},
|
|
|
|
watch: {
|
|
|
|
vipList: function() {
|
|
|
|
let that = this;
|
|
|
|
if (that.vipList.length > 0) {
|
|
|
|
that.vipList.forEach(function(item, index) {
|
|
|
|
if (item.isClear === false) {
|
|
|
|
// that.swiper.slideTo(index);
|
|
|
|
that.activeIndex = index;
|
|
|
|
that.grade = item.grade;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
computed: {
|
|
|
|
...mapGetters(['userInfo']),
|
|
|
|
// swiper() {
|
|
|
|
// // return this.$refs.mySwiper.swiper;
|
|
|
|
// }
|
|
|
|
},
|
|
|
|
mounted: function() {
|
|
|
|
this.topHeight = this.CustomBar + 188;
|
|
|
|
let that = this;
|
|
|
|
setDetection();
|
|
|
|
that.getInfo();
|
|
|
|
// that.swiper.on("slideChange", function() {
|
|
|
|
// that.activeIndex = that.swiper.activeIndex;
|
|
|
|
// that.getTask();
|
|
|
|
// });
|
|
|
|
},
|
|
|
|
|
|
|
|
methods: {
|
|
|
|
swiperChange: function(e) {
|
|
|
|
let that = this;
|
|
|
|
that.activeIndex = e.mp.detail.current;
|
|
|
|
that.getTask();
|
|
|
|
},
|
|
|
|
growthTap: function() {
|
|
|
|
this.growthValue = true;
|
|
|
|
},
|
|
|
|
getInfo: function() {
|
|
|
|
let that = this;
|
|
|
|
getVipInfo().then(
|
|
|
|
res => {
|
|
|
|
that.vipList = res.data.list;
|
|
|
|
that.vipRequire = res.data.task.list;
|
|
|
|
that.vipComplete = res.data.task.task;
|
|
|
|
that.taskCount = res.data.task.reachCount;
|
|
|
|
that.vipList.forEach((val, index) => {
|
|
|
|
val.benefit = val.benefit.replace(/\n/g,"<br/>"); // /\r/g
|
|
|
|
val.explain = val.explain.replace(/\n/g,"<br/>"); // /\r/g
|
|
|
|
if (val.isClear === false) {
|
|
|
|
this.growthPercent = mul(div(this.userInfo.growth, this.vipList[index+1].growthValue), 100);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
},
|
|
|
|
err => {
|
|
|
|
uni.showToast({
|
|
|
|
title:
|
|
|
|
err.msg || err.response.data.msg || err.response.data.message,
|
|
|
|
icon: "none",
|
|
|
|
duration: 2000
|
|
|
|
});
|
|
|
|
}
|
|
|
|
);
|
|
|
|
},
|
|
|
|
getTask: function() {
|
|
|
|
let that = this;
|
|
|
|
getVipTask(that.vipList[that.activeIndex].id).then(
|
|
|
|
res => {
|
|
|
|
that.vipRequire = res.data.list;
|
|
|
|
that.vipComplete = res.data.task;
|
|
|
|
that.taskCount = res.data.reachCount;
|
|
|
|
},
|
|
|
|
err => {
|
|
|
|
uni.showToast({
|
|
|
|
title:
|
|
|
|
err.msg || err.response.data.msg || err.response.data.message,
|
|
|
|
icon: "none",
|
|
|
|
duration: 2000
|
|
|
|
});
|
|
|
|
}
|
|
|
|
);
|
|
|
|
},
|
|
|
|
showGrow: function(item) {
|
|
|
|
if (this.illustrate != item.illustrate) this.illustrate = item.illustrate;
|
|
|
|
this.growthValue = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="less" scoped>
|
|
|
|
.header {
|
|
|
|
.tab-title {
|
|
|
|
font-size: 32rpx;
|
|
|
|
font-family: PingFang SC;
|
|
|
|
font-weight: 600;
|
|
|
|
color: #2DB5AE;
|
|
|
|
line-height: 42rpx;
|
|
|
|
}
|
|
|
|
.backImg {
|
|
|
|
width: 88rpx;
|
|
|
|
height: 62rpx;
|
|
|
|
padding-left: 26rpx;
|
|
|
|
image {
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.vip-info-box {
|
|
|
|
padding: 6rpx 18rpx;
|
|
|
|
.vip-box {
|
|
|
|
width: 100%;
|
|
|
|
height: 364rpx;
|
|
|
|
position: relative;
|
|
|
|
.bg {
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
position: absolute;
|
|
|
|
top: 0;
|
|
|
|
left: 0;
|
|
|
|
z-index: -1;
|
|
|
|
}
|
|
|
|
.info-box {
|
|
|
|
padding: 180rpx 38rpx 0rpx;
|
|
|
|
.user-info {
|
|
|
|
padding-bottom: 10rpx;
|
|
|
|
font-size: 24rpx;
|
|
|
|
font-family: PingFang SC;
|
|
|
|
font-weight: 500;
|
|
|
|
color: #FFFFFF;
|
|
|
|
line-height: 32rpx;
|
|
|
|
.headImg {
|
|
|
|
width: 76rpx;
|
|
|
|
height: 76rpx;
|
|
|
|
box-shadow: 0rpx 0rpx 20rpx 10rpx rgba(0,0,0,0.08);
|
|
|
|
padding: 4rpx;
|
|
|
|
background-color: linear-gradient(135deg, rgba(27, 141, 204, 1), rgba(57, 211, 150, 1));
|
|
|
|
border-radius: 50%;
|
|
|
|
margin-right: 12rpx;
|
|
|
|
.image {
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
border-radius: 50%;
|
|
|
|
}
|
|
|
|
.noAvatar {
|
|
|
|
width: 100%;
|
|
|
|
height: 100%;
|
|
|
|
border-radius: 50%;
|
|
|
|
background: #F1F1F1;
|
|
|
|
image {
|
|
|
|
width: 90%;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.user-name {
|
|
|
|
font-size: 30rpx;
|
|
|
|
font-weight: 600;
|
|
|
|
line-height: 42rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.progress-bar-box {
|
|
|
|
width: 642rpx;
|
|
|
|
height: 8rpx;
|
|
|
|
background: #39D396;
|
|
|
|
border-radius: 4rpx;
|
|
|
|
margin-bottom: 14rpx;
|
|
|
|
.progress-bar {
|
|
|
|
// width: 330rpx;
|
|
|
|
height: 8rpx;
|
|
|
|
background: #1B8DCC;
|
|
|
|
border-radius: 4rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.vip-icon {
|
|
|
|
width: 80rpx;
|
|
|
|
height: 26rpx;
|
|
|
|
// background-color: #FFFFFF;
|
|
|
|
}
|
|
|
|
.to-next-level {
|
|
|
|
padding-left: 10rpx;
|
|
|
|
font-size: 20rpx;
|
|
|
|
font-family: PingFang SC;
|
|
|
|
font-weight: 500;
|
|
|
|
color: #FFFFFF;
|
|
|
|
line-height: 26rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.vip-rights {
|
|
|
|
padding: 6rpx 0rpx 20rpx;
|
|
|
|
.rights-item {
|
|
|
|
font-size: 22rpx;
|
|
|
|
font-family: PingFang SC;
|
|
|
|
font-weight: 600;
|
|
|
|
color: #2DB5AE;
|
|
|
|
line-height: 30rpx;
|
|
|
|
text-align: center;
|
|
|
|
image {
|
|
|
|
width: 76rpx;
|
|
|
|
height: 76rpx;
|
|
|
|
margin-bottom: 10rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
.member-center .wrapper .info-box {
|
|
|
|
padding: 20rpx;
|
|
|
|
background: #F5F6F8;
|
|
|
|
box-shadow: 0rpx 10rpx 16rpx 0rpx rgba(0, 0, 0, 0.06);
|
|
|
|
border-radius: 16rpx;
|
|
|
|
margin-bottom: 20rpx;
|
|
|
|
font-size: 24rpx;
|
|
|
|
font-family: PingFang SC;
|
|
|
|
font-weight: 500;
|
|
|
|
color: #3A3A3C;
|
|
|
|
line-height: 32rpx;
|
|
|
|
.info-title {
|
|
|
|
font-size: 30rpx;
|
|
|
|
font-family: SourceHanSansSCVF;
|
|
|
|
font-weight: 600;
|
|
|
|
color: #3A3A3C;
|
|
|
|
line-height: 46rpx;
|
|
|
|
padding-bottom: 16rpx;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// .banner swiper {
|
|
|
|
// height: 328rpx;
|
|
|
|
// }
|
|
|
|
// .swiper-slide {
|
|
|
|
// margin: 0 auto;
|
|
|
|
// }
|
|
|
|
</style>
|