admin/addon/pc/source/os/src/views/member/index.vue

736 lines
17 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="box">
<div class="null-page" v-show="yes"></div>
<div class="member-index" v-loading="loading">
<div class="member-top">
<div class="info-wrap">
<div class="info-top">
<div class="avtar">
<router-link to="/member/info">
<img v-if="member.headimg" :src="$img(member.headimg)" @error="member.headimg = defaultHeadImage" />
<img v-else :src="$img(defaultHeadImage)" />
</router-link>
</div>
<div class="member-wrap">
<template v-if="member">
<div class="name member-name" v-if="member.nickname">
<router-link to="/member/info">{{ member.nickname }}</router-link>
</div>
<div class="level" v-if="member.member_level_name">{{ member.member_level_name }}</div>
<div class="growth">
成长值:
<el-progress :text-inside="true" :stroke-width="10" :percentage="progress" :show-text="false"></el-progress>
<div></div>
</div>
</template>
<div class="no-login name" v-else>未登录</div>
</div>
</div>
<div class="account">
<div class="content">
<div class="item">
<router-link to="/member/my_coupon" class="item-content">
<img src="@/assets/images/coupon.png" alt />
<div class="name">优惠券</div>
<div class="num" v-if="member.member_id && couponNum">{{ couponNum }}</div>
<div class="num" v-else>0</div>
</router-link>
</div>
<div class="item">
<router-link to="/member/my_point" class="item-content">
<img src="@/assets/images/point.png" alt />
<div class="name">积分</div>
<div class="num" v-if="member.point">{{ member.point }}</div>
<div class="num" v-else>0</div>
</router-link>
</div>
<div class="item">
<router-link to="/member/account" class="item-content">
<img src="@/assets/images/balance.png" alt />
<div class="name">余额</div>
<div class="num" v-if="member.balance || member.balance_money">
{{ (parseFloat(member.balance) + parseFloat(member.balance_money)).toFixed(2) }}
</div>
<div class="num" v-else>0</div>
</router-link>
</div>
</div>
</div>
</div>
<div class="collection">
<div class="title">我的关注</div>
<div class="xian"></div>
<div class="item-wrap">
<div class="item">
<div class="num">{{ goodsTotal }}</div>
<div class="collect">商品关注</div>
</div>
</div>
</div>
</div>
<div class="member-bottom">
<div class="my-order">
<div class="order-title">我的订单</div>
<div class="xian"></div>
<div class="order-item">
<router-link to="/member/order_list?status=waitpay" class="item">
<i class="iconfont icondaifukuan"></i>
<div v-if="orderNum.waitPay" class="order-num">{{ orderNum.waitPay }}</div>
<div class="name">待付款</div>
</router-link>
<router-link to="/member/order_list?status=waitsend" class="item">
<i class="iconfont icondaifahuo"></i>
<div v-if="orderNum.readyDelivery" class="order-num">{{ orderNum.readyDelivery }}</div>
<div class="name">待发货</div>
</router-link>
<router-link to="/member/order_list?status=waitconfirm" class="item">
<i class="iconfont icontubiaolunkuo-"></i>
<div v-if="orderNum.waitDelivery" class="order-num">{{ orderNum.waitDelivery }}</div>
<div class="name">待收货</div>
</router-link>
<router-link to="/member/order_list?status=waitrate" class="item">
<i class="iconfont icondaipingjia"></i>
<div v-if="orderNum.waitEvaluate" class="order-num">{{ orderNum.waitEvaluate }}</div>
<div class="name">待评价</div>
</router-link>
<router-link to="/member/activist" class="item">
<i class="iconfont iconshouhou"></i>
<div v-if="orderNum.refunding" class="order-num">{{ orderNum.refunding }}</div>
<div class="name">退款/售后</div>
</router-link>
</div>
<div v-if="orderList.length">
<div class="order-goods-wrap" v-for="(orderItem, orderIndex) in orderList" :key="orderIndex">
<div class="order-goods" v-for="(goodsItem, goodsIndex) in orderItem.order_goods" :key="goodsIndex">
<div class="goods-item">
<div class="goods-img" @click="$router.pushToTab({ path: '/sku-' + goodsItem.sku_id })">
<img :src="$img(goodsItem.sku_image, { size: 'mid' })" @error="imageErrorOrder(orderIndex, goodsIndex)" />
</div>
<div class="info-wrap">
<div class="goods-name" @click="$router.pushToTab({ path: '/sku-' + goodsItem.sku_id })">{{ goodsItem.sku_name }}</div>
<div class="price">{{ goodsItem.price }}</div>
</div>
<div class="payment">{{ orderItem.order_status_name }}</div>
<div class="goods-detail" @click="orderDetail(orderItem)">
<p>查看详情</p>
</div>
</div>
</div>
</div>
</div>
<div class="empty" v-else>
<img src="@/assets/images/member-empty.png" alt />
<div><router-link to="/">您买的东西太少了这里都空空的快去挑选合适的商品吧</router-link></div>
</div>
</div>
<div class="bottom-right">
<div class="my-foot">
<div class="title">我的足迹</div>
<div class="xian"></div>
<div class="foot-content" v-for="(item, index) in footList" :key="item.goods_id">
<div class="foot-item" @click="$router.pushToTab({ path: '/sku-' + item.sku_id })">
<div class="foot-img"><img :src="$img(item.sku_image, { size: 'mid' })" @error="imageErrorFoot(index)" /></div>
<div class="foot-info">
<div class="foot-name">{{ item.goods_name }}</div>
<div class="foot-price">{{ item.discount_price }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {
orderNum,
couponNum,
footprint,
levelList
} from '@/api/member/index';
import {
goodsCollect
} from '@/api/member/collection';
import {
apiOrderList
} from '@/api/order/order';
import {
mapGetters
} from 'vuex';
export default {
name: 'member',
components: {},
data: () => {
return {
couponNum: 0,
orderNum: {
waitPay: 0, //待付款
readyDelivery: 0, //待发货
waitDelivery: 0, //待收货
refunding: 0 // 退款中
},
orderList: [],
orderStatus: 'all',
footInfo: {
page: 1,
page_size: 6
},
total: 0,
footList: [],
currentPage: 1,
loading: true,
goodsTotal: 0,
state: '',
growth: '',
levelList: [],
member_level: {},
progress: 0,
yes: true
};
},
created() {
this.getCouponNum();
this.getOrderNum();
this.getOrderList();
this.getFootprint();
this.getGoodsCollect();
// this.$store.dispatch("member/member_detail")
this.$forceUpdate()
},
computed: {
...mapGetters(['defaultHeadImage', 'defaultGoodsImage', 'member'])
},
watch: {
member: {
handler() {
console.log(this.member)
if (this.member) this.getLevelList();
},
immediate: true,
deep: true,
}
},
mounted() {
let self = this;
setTimeout(function() {
self.yes = false;
}, 300);
},
methods: {
getLevelList() {
levelList()
.then(res => {
if (res.data && res.code == 0) {
this.levelList = res.data;
let listIndex = this.levelList.findIndex(item => item.level_id == this.member.member_level);
const max = this.levelList.length;
if (max > listIndex + 1) {
if (this.member.growth > this.levelList[listIndex + 1].growth) {
this.progress = 100;
} else {
this.progress = (this.member.growth / this.levelList[listIndex + 1].growth) * 100;
}
} else {
this.progress = 100;
}
} else {
this.$message.error(err.message);
}
})
.catch(err => {
console.log(err.message);
});
},
//获取优惠券数量
getCouponNum() {
couponNum()
.then(res => {
this.couponNum = res.data;
})
.catch(err => {
console.log(err.message);
});
},
//获取订单数量
getOrderNum() {
orderNum({
order_status: 'waitpay,waitsend,waitconfirm,waitrate,refunding'
})
.then(res => {
console.log(res,'获取订单数量')
if (res.code == 0) {
this.orderNum.waitPay = res.data.waitpay;
this.orderNum.readyDelivery = res.data.waitsend;
this.orderNum.waitDelivery = res.data.waitconfirm;
this.orderNum.waitEvaluate = res.data.waitrate;
this.orderNum.refunding = res.data.refunding;
}
})
.catch(err => {
console.log(err.message);
});
},
//获取订单列表
getOrderList() {
apiOrderList({
order_status: this.orderStatus,
page: 1,
page_size: 3
})
.then(res => {
if (res.code == 0 && res.data) {
this.orderList = res.data.list;
}
this.loading = false;
})
.catch(err => {
this.loading = false;
this.$message.error(err.message);
});
},
//获取我的足迹
getFootprint() {
footprint(this.footInfo)
.then(res => {
if (res.code == 0 && res.data) {
this.footList = res.data.list;
this.total = res.data.count;
}
})
.catch(err => {
console.log(err.message);
});
},
orderDetail(data) {
switch (parseInt(data.order_type)) {
case 2:
// 自提订单
this.$router.push({
path: '/member/order_detail_pickup',
query: {
order_id: data.order_id
}
});
break;
case 3:
// 本地配送订单
this.$router.push({
path: '/member/order_detail_local_delivery',
query: {
order_id: data.order_id
}
});
break;
case 4:
// 虚拟订单
this.$router.push({
path: '/member/order_detail_virtual',
query: {
order_id: data.order_id
}
});
break;
default:
this.$router.push({
path: '/member/order_detail',
query: {
order_id: data.order_id
}
});
break;
}
},
imageErrorOrder(orderIndex, goodsIndex) {
this.orderList[orderIndex].order_goods[goodsIndex].sku_image = this.defaultGoodsImage;
},
imageErrorFoot(index) {
this.footList[index].sku_image = this.defaultGoodsImage;
},
getGoodsCollect() {
goodsCollect()
.then(res => {
this.goodsTotal = res.data.count;
})
.catch(err => {
this.loading = false;
console.log(err.message);
});
}
}
};
</script>
<style lang="scss" scoped>
.box {
width: 100%;
position: relative;
}
.null-page {
width: 100%;
height: 730px;
background-color: #ffffff;
position: absolute;
top: 0;
left: 0;
z-index: 9;
}
.member-index {
.member-top {
width: 100%;
display: flex;
.info-wrap {
width: 75%;
height: 160px;
border: 1px solid #e9e9e9;
background: #ffffff;
display: flex;
.info-top {
display: flex;
align-items: center;
margin: 22px;
margin-right: 0;
width: 300px;
border-right: 1px solid #e9e9e9;
.avtar {
width: 84px;
height: 84px;
margin: 20px 0 10px 0;
border: 1px solid #e9e9e9;
border-radius: 50%;
overflow: hidden;
display: block;
cursor: pointer;
margin-left: 21px;
text-align: center;
line-height: 84px;
img {
display: inline-block;
}
}
.member-wrap {
margin-left: 20px;
.name {
font-size: 18px;
font-weight: 600;
cursor: pointer;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.growth {
display: flex;
align-items: center;
}
.el-progress {
width: 100px;
}
.level {
padding: 3px 4px;
line-height: 1;
color: #ffffc1;
margin: 6px 0;
cursor: default;
background: linear-gradient(#636362, #4e4e4d);
border-radius: 3px;
display: inline-block;
}
}
}
.account {
width: 400px;
display: flex;
align-items: center;
.content {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
.item {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.item-content {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
img {
width: 50px;
height: 50px;
}
.name {
margin-top: 5px;
color: #666666;
&:hover {
color: $base-color;
}
}
.num {
color: $ns-text-color-black;
}
}
}
}
}
.collection {
background: #ffffff;
margin-left: 20px;
width: 210px;
border: 1px solid #e9e9e9;
padding-left: 20px;
.title {
padding: 10px 0;
display: inline-block;
border-bottom: 1px solid $base-color;
}
.xian {
height: 1px;
background: #f1f1f1;
}
.item-wrap {
display: flex;
justify-content: center;
align-items: center;
.item {
flex: 1;
margin-top: 37px;
.num {}
.collect {
color: #666666;
}
}
}
}
}
.member-bottom {
width: 100%;
margin-top: 15px;
height: 553px;
display: flex;
overflow: hidden;
.my-order {
width: 75%;
background-color: #ffffff;
.order-title {
font-size: $ns-font-size-base;
padding: 10px 0;
margin-left: 15px;
border-bottom: 1px solid $base-color;
display: inline-block;
}
.xian {
height: 1px;
background: #f1f1f1;
margin-left: 15px;
}
.order-item {
display: flex;
justify-content: center;
align-content: center;
.item {
flex: 1;
text-align: center;
height: 85px;
padding-top: 20px;
cursor: pointer;
position: relative;
&:hover {
background: #ffffff;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.order-num {
position: absolute;
top: 23px;
right: 25px;
background: $base-color;
border-radius: 50%;
width: 18px;
height: 18px;
line-height: 18px;
color: #ffff;
}
i {
font-size: 30px;
}
.name {
font-size: $ns-font-size-base;
}
}
}
.order-goods {
.goods-item {
display: flex;
padding: 14px;
border-top: 1px solid #f1f1f1;
.goods-img {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
img {
width: 60px;
height: 60px;
}
}
.info-wrap {
flex: 3;
width: 80%;
.goods-name {
height: 46px;
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.price {
color: $base-color;
}
}
.payment {
flex: 2;
display: flex;
align-items: center;
justify-content: center;
text-overflow: ellipsis;
}
.goods-detail {
flex: 2;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&:hover {
color: $base-color;
}
}
}
}
}
.bottom-right {
.my-foot {
background: #ffffff;
margin-left: 20px;
width: 230px;
.title {
font-size: $ns-font-size-base;
padding: 10px 0;
display: inline-block;
border-bottom: 1px solid $base-color;
margin: 0 15px;
}
.xian {
margin-left: 15px;
background: #f1f1f1;
height: 1px;
}
.foot-content {
.foot-item {
display: flex;
padding: 10px 0;
margin: 0 15px;
.foot-img {
width: 57px;
height: 57px;
cursor: pointer;
img {
width: 100%;
height: 100%;
}
}
.foot-info {
margin-left: 5px;
display: flex;
flex-direction: column;
justify-content: space-between;
.foot-name {
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
line-height: 1;
width: 140px;
}
.foot-price {
color: $base-color;
}
}
}
}
}
}
}
}
.empty {
text-align: center;
margin-top: 65px;
}
</style>