You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

594 lines
15 KiB

3 months ago
<template>
<view class="collection" :style="colorStyle">
<view class="nav acea-row row-center">
<view class="item acea-row row-middle" :class="active == index?'on':''" v-for="(item,index) in navList" :key="index" @click="navTap(index)">{{item.name}}</view>
</view>
<view class="manage acea-row row-between-wrapper" v-if="collectProductList.length">
<view> <text class="num">{{count}}</text> {{!active ? '件商品':'条视频'}}</view>
<view class="close" @click="manageTap" v-if="administer">完成</view>
<view @click="manageTap" v-else>管理</view>
</view>
<view class="collectList" v-if="collectProductList.length && !active">
<view class="collectList-content">
<checkbox-group @change="checkboxChange">
<view class="item acea-row" v-for="(item,index) in collectProductList" :key="index" @click="goGoods(item.product_id)">
<!-- #ifndef MP -->
<checkbox class="checkbox" v-if="administer" :value="(item.id).toString()" :checked="item.checked" />
<!-- #endif -->
<!-- #ifdef MP -->
<checkbox class="checkbox" v-if="administer" :value="item.id" :checked="item.checked" />
<!-- #endif -->
<easy-loadimage mode="widthFix" :image-src="item.image" :borderSrc="item.activity_frame.image" width="200rpx" height="200rpx" borderRadius="16rpx"></easy-loadimage>
<view class="text acea-row row-column">
<view class="top">
<view class="name line2">{{item.store_name}}</view>
<view class="flex items-end flex-wrap mt-12 w-full" v-if="item.store_label && item.store_label.length">
<BaseTag
:text="label.label_name"
:color="label.color"
:background="label.bg_color"
:borderColor="label.border_color"
:circle="label.border_color ? true : false"
:imgSrc="label.icon"
v-for="(label, idx) in item.store_label" :key="idx"></BaseTag>
</view>
</view>
<view class="money acea-row row-bottom row-between">
<view class="acea-row row-bottom">
<BaseMoney :money="item.price" symbolSize="24" integerSize="40" decimalSize="24"></BaseMoney>
<view class="svip acea-row" v-if="item.price_type == 'member' && item.vip_price > 0">
<view class="labelCon acea-row row-middle">SVIP</view>
<view class="acea-row row-middle">
<BaseMoney :money="item.vip_price" symbolSize="22" integerSize="22" decimalSize="22"></BaseMoney>
</view>
</view>
</view>
<view class="icon acea-row row-center-wrapper">
<text class="iconfont icon-ic_ShoppingCart1"></text>
</view>
</view>
</view>
</view>
</checkbox-group>
</view>
<view class='loadingicon acea-row row-center-wrapper'>
<text class='loading iconfont icon-jiazai' :hidden='loading==false'></text>{{loadTitle}}
</view>
<view class="footer acea-row row-between-wrapper" v-if="administer">
<checkbox-group @change="checkboxAllChange">
<checkbox value="all" :checked="isAllSelect" />
<text class='checkAll'>全选</text>
</checkbox-group>
<view class="acea-row row-middle">
<view class="bnt acea-row row-center-wrapper" @click="del('product')">取消收藏({{getIds().length}})</view>
</view>
</view>
<view class="footer-placeholder" v-if="administer"></view>
<view class="safe-placeholder"></view>
</view>
<view class="videoList" v-if="collectProductList.length && active">
<view class='videoList-content'>
<checkbox-group @change="checkboxChange">
<view class="acea-row row-middle">
<view class="item" v-for="(item,index) in collectProductList" :key="index" @click="goVideo(item.video_id)">
<!-- #ifndef MP -->
<checkbox class="checkbox" v-if="administer" :value="(item.id).toString()" :checked="item.checked" />
<!-- #endif -->
<!-- #ifdef MP -->
<checkbox class="checkbox" v-if="administer" :value="item.id" :checked="item.checked" />
<!-- #endif -->
<image :src="item.image" mode="aspectFill"></image>
<view class="like acea-row row-bottom">
<text class="iconfont icon-shipindianzan-weidian1"></text>{{item.like_num}}
</view>
</view>
</view>
</checkbox-group>
</view>
<view class='loadingicon acea-row row-center-wrapper'>
<text class='loading iconfont icon-jiazai' :hidden='loading==false'></text>{{loadTitle}}
</view>
<view class="footer acea-row row-between-wrapper" v-if="administer">
<checkbox-group @change="checkboxAllChange">
<checkbox value="all" :checked="isAllSelect" />
<text class='checkAll'>全选</text>
</checkbox-group>
<view class="acea-row row-middle">
<view class="bnt acea-row row-center-wrapper" @click="del('video')">取消收藏({{getIds().length}})</view>
</view>
</view>
<view class="footer-placeholder" v-if="administer"></view>
<view class="safe-placeholder"></view>
</view>
<view class='px-20 mt-20' v-else-if="!collectProductList.length && page > 1">
<emptyPage title="暂无收藏,去看点别的吧~" src="/statics/images/noCollection.gif"></emptyPage>
<recommend :hostProduct="hostProduct"></recommend>
</view>
</view>
</template>
<script>
import colors from '@/mixins/color.js';
import {
HTTP_REQUEST_URL
} from '@/config/app';
import {
getCollectUserList,
getProductHot,
collectDel
} from '@/api/store.js';
import {
mapGetters
} from "vuex";
import {
toLogin
} from '@/libs/login.js';
import recommend from '@/components/recommend';
import home from '@/components/home';
import emptyPage from '@/components/emptyPage.vue';
import WaterfallsFlow from '@/components/WaterfallsFlow/WaterfallsFlow.vue';
export default {
mixins: [colors],
computed: mapGetters(['isLogin']),
components: {
recommend,
home,
emptyPage,
WaterfallsFlow,
},
data() {
return {
navList: [{
name: '商品'
},
{
name: '视频'
}
],
active: 0,
hostProduct: [],
loadTitle: '加载更多',
loading: false,
loadend: false,
collectProductList: [],
limit: 20,
page: 1,
hotScroll: false,
hotPage: 1,
hotLimit: 10,
imgHost: HTTP_REQUEST_URL,
administer: 0,
isAllSelect: false,
count: 0,
isShowAuth: false
}
},
onLoad(options) {
this.active = options.active || 0
},
onShow() {
uni.removeStorageSync('form_type_cart');
this.loadend = false;
this.page = 1;
this.collectProductList = [];
this.get_host_product();
if (this.isLogin) {
this.get_user_collect_product(this.active ? 'video' : 'product');
} else {
toLogin()
}
},
methods: {
onLoadFun() {
this.get_user_collect_product('product');
this.isShowAuth = false;
},
// 授权关闭
authColse: function(e) {
this.isShowAuth = e
},
goGoods(id) {
if (this.administer) return false
uni.navigateTo({
url: `/pages/goods_details/index?id=${id}`
});
},
goVideo(id) {
if (this.administer) return false
uni.navigateTo({
//#ifdef APP
url: '/pages/short_video/appSwiper/index?id=' + id,
//#endif
//#ifndef APP
url: '/pages/short_video/nvueSwiper/index?id=' + id,
//#endif
})
},
//批量获取id集合
getIds(){
let ids = []
this.collectProductList.forEach(item=>{
if(item.checked){
ids.push(item.id)
}
})
return ids
},
del(type) {
if (!this.getIds().length) {
return this.$util.Tips({
title: '请选择收藏商品或视频'
});
}
collectDel(ids, type).then(res => {
this.loadend = false;
this.page = 1;
this.$set(this, 'collectProductList', []);
this.get_user_collect_product(type);
return this.$util.Tips({
title: res.msg
});
}).catch(err => {
return this.$util.Tips({
title: err
});
})
},
checkboxChange(event) {
let idList = event.detail.value;
this.collectProductList.forEach((item) => {
if (idList.indexOf(item.id + '') !== -1) {
item.checked = true;
} else {
item.checked = false;
}
})
if (idList.length == this.collectProductList.length) {
console.log('4545');
this.isAllSelect = true;
} else {
console.log('4444');
this.isAllSelect = false;
}
},
forGoods(val) {
let that = this;
if (!that.collectProductList.length) return
that.collectProductList.forEach((item) => {
if (val) {
item.checked = true;
} else {
item.checked = false;
}
})
},
checkboxAllChange(event) {
let value = event.detail.value;
if (value.length) {
this.isAllSelect = true;
this.forGoods(1)
} else {
this.isAllSelect = false;
this.forGoods(0)
}
},
manageTap() {
this.administer = !this.administer;
},
navTap(index) {
this.active = index;
let type = 'product'
if (index) {
type = 'video'
} else {
type = 'product'
}
this.isAllSelect = false;
this.forGoods(0);
this.loadend = false;
this.page = 1;
this.$set(this, 'collectProductList', []);
this.get_user_collect_product(type);
},
/**
* 获取收藏产品
*/
get_user_collect_product: function(type) {
let that = this;
if (this.loading) return;
if (this.loadend) return;
that.loading = true;
that.loadTitle = "";
getCollectUserList({
page: that.page,
limit: that.limit,
category: type
}).then(res => {
let collectProductList = res.data.list;
collectProductList.forEach(item => {
item.checked = false;
})
this.count = res.data.count;
let loadend = collectProductList.length < that.limit;
that.collectProductList = that.$util.SplitArray(collectProductList, that.collectProductList);
that.$set(that, 'collectProductList', that.collectProductList);
that.loadend = loadend;
that.loadTitle = loadend ? '没有更多内容啦~' : '加载更多';
that.page = that.page + 1;
that.loading = false;
}).catch(err => {
that.loading = false;
that.loadTitle = "加载更多";
});
},
/**
* 获取我的推荐
*/
get_host_product: function() {
let that = this;
if (that.hotScroll) return
getProductHot(
that.hotPage,
that.hotLimit,
).then(res => {
that.hotPage++
that.hotScroll = res.data.length < that.hotLimit
that.hostProduct = that.hostProduct.concat(res.data)
});
}
},
onPageScroll(e) {
uni.$emit('scroll');
},
onReachBottom() {
if (this.collectProductList.length) {
this.get_user_collect_product('product');
} else {
// this.get_host_product();
}
}
}
</script>
<style lang="scss">
.collection {
.nav {
background-color: #fff;
height: 80rpx;
.item {
margin: 0 101rpx;
font-weight: 400;
color: #333333;
font-size: 28rpx;
position: relative;
&.on {
font-weight: 500;
font-size: 30rpx;
color: var(--view-theme);
&:before {
content: '';
position: absolute;
width: 64rpx;
height: 6rpx;
background: var(--view-theme);
bottom: 0;
}
}
}
}
.manage {
margin-top: 20rpx;
padding: 32rpx 24rpx 0;
border-radius: 24rpx 24rpx 0 0;
font-weight: 400;
color: #333333;
font-size: 28rpx;
line-height: 40rpx;
background-color: #fff;
.close {
color: #999999;
}
.num {
color: var(--view-theme);
margin: 0 5rpx;
}
}
.collectList {
.collectList-content {
padding: 8rpx 0;
border-radius: 0 0 24rpx 24rpx;
background-color: #FFFFFF;
}
.item {
position: relative;
padding: 24rpx;
.checkbox {
align-self: center;
margin-right: 20rpx;
}
/deep/checkbox .uni-checkbox-input {
margin-right: 0;
}
.text {
flex: 1;
padding-left: 20rpx;
.top {
flex: 1;
}
.name {
font-weight: 400;
color: #333333;
font-size: 28rpx;
line-height: 40rpx;
}
.label {
margin-top: 16rpx;
.labelCon {
height: 26rpx;
border: 1px solid var(--view-theme);
padding: 0 5rpx;
color: var(--view-theme);
font-weight: 400;
font-size: 18rpx;
line-height: 1;
border-radius: 4rpx;
}
}
.money {
font-size: 24rpx;
font-weight: 600;
color: var(--view-theme);
.num {
font-size: 30rpx;
}
.svip {
height: 26rpx;
padding-right: 6rpx;
border-radius: 13rpx;
margin: 0 0 6rpx 8rpx;
background-color: #FFF0D1;
line-height: 1;
}
.labelCon {
padding: 0 6rpx;
border-radius: 13rpx 0 13rpx 13rpx;
margin-right: 6rpx;
background: linear-gradient(90deg, #484643 0%, #1F1B17 100%);
font-weight: 600;
font-size: 18rpx;
color: #FDDAA4;
}
.icon {
width: 48rpx;
height: 48rpx;
border-radius: 24rpx;
background-color: #F5F5F5;
}
.iconfont {
font-size: 30rpx;
color: #333333;
}
}
}
}
}
.videoList {
// padding: 0 4rpx 100rpx 4rpx;
.videoList-content {
// padding: 0 4rpx 100rpx 4rpx;
padding: 8rpx 0;
border-radius: 0 0 24rpx 24rpx;
background-color: #FFFFFF;
}
.item {
width: 226rpx;
height: 300rpx;
border-radius: 8rpx;
position: relative;
margin-left: 16rpx;
margin-top: 20rpx;
position: relative;
overflow: hidden;
image {
width: 100%;
height: 100%;
}
.checkbox {
position: absolute;
top: 10rpx;
left: 10rpx;
z-index: 9;
}
/deep/checkbox .uni-checkbox-input {
margin-right: 0;
background-color: rgba(0, 0, 0, 0.16);
}
/deep/checkbox .wx-checkbox-input {
background-color: rgba(0, 0, 0, 0.16);
}
.like {
position: absolute;
color: #fff;
bottom: 0;
font-weight: 400;
font-size: 20rpx;
left: 0;
width: 226rpx;
height: 100rpx;
background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, rgba(0, 0, 0, 0.25) 100%);
border-radius: 0 0 8rpx 8rpx;
padding: 0 0 14rpx 14rpx;
.iconfont {
font-size: 24rpx;
margin-right: 6rpx;
}
}
}
}
.safe-placeholder {
height: constant(safe-area-inset-bottom);
height: env(safe-area-inset-bottom);
}
.footer-placeholder {
height: 96rpx;
}
.footer {
box-sizing: border-box;
padding: 0 32rpx;
width: 100%;
height: 96rpx;
background-color: #fff;
position: fixed;
bottom: 0;
z-index: 30;
height: calc(96rpx + constant(safe-area-inset-bottom)); ///兼容 IOS<11.2/
height: calc(96rpx + env(safe-area-inset-bottom)); ///兼容 IOS>11.2/
padding-bottom: constant(safe-area-inset-bottom); ///兼容 IOS<11.2/
padding-bottom: env(safe-area-inset-bottom); ///兼容 IOS>11.2/
width: 100%;
left: 0;
.bnt {
width: 186rpx;
height: 64rpx;
border-radius: 32rpx;
color: #fff;
background-color: var(--view-theme);
font-weight: 500;
font-size: 24rpx;
}
}
}
</style>