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.
555 lines
15 KiB
555 lines
15 KiB
<template>
|
|
<div class="attentionds">
|
|
<div class="attentiondsTit">
|
|
<div class="attentionBox">
|
|
<div class="">
|
|
<div class="searchRight">
|
|
<span v-if="!edit" class="batch" @click="showEdit">批量管理</span>
|
|
<div v-else class="saveList">
|
|
<el-checkbox v-model="selectAll" @change="changeChecked" :true-label='1' :false-label='0'>全选</el-checkbox>
|
|
<span class="delete" @click="cancelFun">取消收藏</span>
|
|
<span class="save" @click="saveList">保存</span>
|
|
</div>
|
|
<input v-if="activeName==='commodity'" type="text" v-model="keyword" @keyup.enter="searchPro" :placeholder="$t('common.searchproducthint')">
|
|
<input v-else type="text" v-model="keyword" @keyup.enter="searchPro" :placeholder="$t('common.searchshophint')">
|
|
<span class="searchBtn" @click="searchPro">
|
|
<icon-svg icon-class="search" />
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<el-tabs v-model="activeName" @tab-click="handleClick">
|
|
<el-tab-pane label="收藏的商品" name="commodity">
|
|
<div class="list sub-main" v-if="flag" v-loading="loading">
|
|
<div class="attentiondsList">
|
|
<div class="listBox">
|
|
<div class="attentiondsItem" v-for="(item,index) of attentiondList" :key="item.collectId" :class="{selected: item.selected === 1, edit: edit}" @click="selectPro(index,item.selected)">
|
|
<div class="mc" v-if="edit"></div>
|
|
<div class="imgBox" :class="{offShelf: item.shelveState === 0}">
|
|
<div class="tipText" v-if="item.shelveState === 0">
|
|
<span>已下架</span>
|
|
</div>
|
|
<img :src="item.image" alt="">
|
|
</div>
|
|
<div class="info">
|
|
<h3 class="overflow">{{ item.productName }}</h3>
|
|
<span class="price">¥{{ item.price }}</span>
|
|
</div>
|
|
<div class="btnBox">
|
|
<span @click="cancelSingle(item.collectId)">取消收藏</span>
|
|
<span @click="toProductDetail(item)">查看详情</span>
|
|
</div>
|
|
</div>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
</div>
|
|
<el-pagination
|
|
v-if="attentiondList.length>0"
|
|
background
|
|
layout="prev, pager, next, jumper"
|
|
:page-size="10"
|
|
:current-page="page"
|
|
@current-change="handleCurrentChange"
|
|
:total="total">
|
|
</el-pagination>
|
|
</div>
|
|
<div class="nothing sub-main" v-else>
|
|
<icon-svg style="width: 240px; height: 240px; margin-bottom: 20px;" icon-class="user-favorite-nodata" />
|
|
<p class="fs20 font-color-999">你还没有收藏的商品~</p>
|
|
</div>
|
|
</el-tab-pane>
|
|
<el-tab-pane label="收藏的店铺" name="shop">
|
|
<div class="list sub-main" v-if="flag" v-loading="loading">
|
|
<div class="attentiondsList">
|
|
<div class="listBox">
|
|
<div class="attentiondsItem" v-for="(item,index) of shopList" :key="item.id" :class="{selected: item.selected === 1, edit: edit}" @click="selectShop(index,item.selected)">
|
|
<div class="mc" v-if="edit"></div>
|
|
<div class="imgBox">
|
|
<img :src="item.shopLogo" alt="">
|
|
</div>
|
|
<div class="info">
|
|
<h3>{{ item.shopName }}</h3>
|
|
</div>
|
|
<div class="btnBox">
|
|
<span @click="cancelSingle(item.collectId)">取消收藏</span>
|
|
<span @click="toStore(item.shopId)">进入店铺</span>
|
|
</div>
|
|
</div>
|
|
<div class="clearfix"></div>
|
|
</div>
|
|
</div>
|
|
<el-pagination
|
|
v-if="shopList.length>0"
|
|
background
|
|
layout="prev, pager, next, jumper"
|
|
:page-size="10"
|
|
:current-page="page"
|
|
@current-change="handleCurrentChange"
|
|
:total="total">
|
|
</el-pagination>
|
|
</div>
|
|
<div class="nothing sub-main" v-else>
|
|
<icon-svg style="width: 240px; height: 240px; margin-bottom: 20px;" icon-class="user-favorite-nodata" />
|
|
<p class="fs20 font-color-999">你还没有收藏的店铺~</p>
|
|
</div>
|
|
</el-tab-pane>
|
|
</el-tabs>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import {
|
|
getCollectShop,
|
|
getCollectProduct,
|
|
cancelCollect
|
|
} from '@/api/user/user.js'
|
|
export default {
|
|
name: 'favorites',
|
|
data () {
|
|
return {
|
|
page: 1,
|
|
pageSize: 10,
|
|
total: 0,
|
|
edit: false,
|
|
attentiondChecked: 0,
|
|
selectAll: 0,
|
|
activeName: 'commodity',
|
|
keyword: '',
|
|
attentiondList: [],
|
|
shopList: [],
|
|
flag: true,
|
|
loading: false
|
|
}
|
|
},
|
|
mounted () {
|
|
this.getAllProduct()
|
|
},
|
|
methods: {
|
|
// 收藏店铺查询
|
|
async getAllShop () {
|
|
this.loading = true
|
|
const response = await getCollectShop({
|
|
page: this.page,
|
|
pageSize: this.pageSize,
|
|
search: this.keyword
|
|
})
|
|
const res = response.data
|
|
if (res.code === '200') {
|
|
this.shopList = res.data.list
|
|
this.total = res.data.total
|
|
this.flag = res.data.list.length > 0
|
|
this.loading = false
|
|
} else {
|
|
this.$message.warning(res.message)
|
|
}
|
|
},
|
|
// 收藏商品查询
|
|
async getAllProduct () {
|
|
const response = await getCollectProduct({
|
|
page: this.page,
|
|
pageSize: this.pageSize,
|
|
search: this.keyword
|
|
})
|
|
const res = response.data
|
|
if (res.code === '200') {
|
|
this.attentiondList = res.data.list
|
|
this.total = res.data.total
|
|
this.flag = res.data.list.length > 0
|
|
this.loading = false
|
|
} else {
|
|
this.$message.warning(res.message)
|
|
}
|
|
},
|
|
handleCurrentChange (val) {
|
|
this.page = val
|
|
if (this.activeName === 'commodity') {
|
|
this.getAllProduct()
|
|
} else {
|
|
this.getAllShop()
|
|
}
|
|
},
|
|
saveList () {
|
|
if (this.activeName === 'commodity') {
|
|
this.attentiondList.forEach(i => {
|
|
this.$set(i, 'selected', 0)
|
|
})
|
|
} else {
|
|
this.shopList.forEach(i => {
|
|
this.$set(i, 'selected', 0)
|
|
})
|
|
}
|
|
this.selectAll = 0
|
|
this.edit = false
|
|
},
|
|
handleClick () {
|
|
this.page = 1
|
|
this.keyword = ''
|
|
this.edit = false
|
|
this.selectAll = 0
|
|
if (this.activeName === 'commodity') {
|
|
this.getAllProduct()
|
|
} else {
|
|
this.getAllShop()
|
|
}
|
|
},
|
|
// 跳转到商品详情
|
|
toProductDetail (item) {
|
|
let data = {
|
|
shopId: item.shopId,
|
|
skuId: item.skuId,
|
|
productId: item.productId
|
|
}
|
|
this.$router.push({
|
|
path: '/productDetail',
|
|
query: {
|
|
proData: JSON.stringify(data)
|
|
}
|
|
})
|
|
},
|
|
// 跳转到店铺
|
|
toStore (id) {
|
|
this.$router.push({
|
|
path: '/store', query: {shopId: id}
|
|
})
|
|
},
|
|
// 商品单个选中
|
|
selectPro (index, selected) {
|
|
if (selected === 1) {
|
|
this.attentiondList[index].selected = 0
|
|
} else {
|
|
this.attentiondList[index].selected = 1
|
|
}
|
|
this.selectAll = 1
|
|
this.attentiondList.map(item => {
|
|
if (item.selected === 0) {
|
|
this.selectAll = 0
|
|
}
|
|
})
|
|
},
|
|
// 店铺单个选中
|
|
selectShop (index, selected) {
|
|
if (selected === 1) {
|
|
this.shopList[index].selected = 0
|
|
} else {
|
|
this.shopList[index].selected = 1
|
|
}
|
|
this.selectAll = 1
|
|
this.shopList.map(item => {
|
|
if (item.selected === 0) {
|
|
this.selectAll = 0
|
|
}
|
|
})
|
|
},
|
|
// 全选
|
|
changeChecked () {
|
|
if (this.activeName === 'commodity') {
|
|
this.attentiondList.forEach(i => {
|
|
this.$set(i, 'selected', this.selectAll)
|
|
})
|
|
console.log(this.attentiondList)
|
|
} else {
|
|
this.shopList.forEach(i => {
|
|
this.$set(i, 'selected', this.selectAll)
|
|
})
|
|
console.log(this.shopList)
|
|
}
|
|
},
|
|
// 批量管理
|
|
showEdit () {
|
|
if (this.activeName === 'commodity') {
|
|
if (this.attentiondList.length === 0) {
|
|
return
|
|
}
|
|
} else {
|
|
if (this.shopList.length === 0) {
|
|
return
|
|
}
|
|
}
|
|
this.edit = true
|
|
},
|
|
// 搜索
|
|
searchPro () {
|
|
this.page = 1
|
|
if (this.activeName === 'commodity') {
|
|
this.getAllProduct()
|
|
} else {
|
|
this.getAllShop()
|
|
}
|
|
},
|
|
// 取消收藏请求
|
|
async unfavorite (ids) {
|
|
const response = await cancelCollect({ ids: ids })
|
|
const res = response.data
|
|
if (res.code === '200') {
|
|
this.$message.success('取消成功')
|
|
this.edit = false
|
|
if (this.activeName === 'commodity') {
|
|
this.getAllProduct()
|
|
} else {
|
|
this.getAllShop()
|
|
}
|
|
}
|
|
},
|
|
// 取消单个收藏
|
|
cancelSingle (id) {
|
|
let ids = [id]
|
|
this.unfavorite(ids)
|
|
},
|
|
// 取消选中收藏
|
|
cancelFun () {
|
|
let flag2 = false
|
|
let ids = []
|
|
if (this.activeName === 'commodity') {
|
|
this.attentiondList.forEach(item => {
|
|
if (item.selected === 1) {
|
|
flag2 = true
|
|
ids.push(item.collectId)
|
|
}
|
|
})
|
|
if (flag2 === false) {
|
|
return this.$message.warning('请先选择需要取消的收藏')
|
|
}
|
|
} else {
|
|
this.shopList.forEach(item => {
|
|
if (item.selected === 1) {
|
|
flag2 = true
|
|
ids.push(item.collectId)
|
|
}
|
|
})
|
|
if (flag2 === false) {
|
|
return this.$message.warning('请先选择需要取消的收藏')
|
|
}
|
|
}
|
|
this.$confirm('此操作将取消选中的收藏, 是否继续?', '提示', {
|
|
confirmButtonText: this.$t('common.sure'),
|
|
cancelButtonText: this.$t('common.cancel'),
|
|
type: 'warning'
|
|
}).then(() => {
|
|
this.unfavorite(ids)
|
|
}).catch(() => {
|
|
})
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
$searchHeight: 37px;
|
|
.attentionds {
|
|
border: 1px solid #E5E5E5;
|
|
.attentiondsTit {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 30px;
|
|
position: relative;
|
|
>>> .el-tabs__nav-wrap::after {
|
|
height: 1px;
|
|
}
|
|
>>> .el-tabs--top {
|
|
width: 100%;
|
|
}
|
|
.attentionBox {
|
|
position: absolute;
|
|
top: 10px;
|
|
right: 25px;
|
|
z-index: 99;
|
|
.searchRight {
|
|
display: flex;
|
|
input {
|
|
margin-left: 16px;
|
|
border: 1px solid #E5E5E5;
|
|
padding-left: 10px;
|
|
font-size: 14px;
|
|
width: 280px;
|
|
}
|
|
span {
|
|
display: block;
|
|
height: 30px;
|
|
line-height: 30px;
|
|
}
|
|
.batch {
|
|
color: #FFFFFF;
|
|
font-size: 12px;
|
|
width: 78px;
|
|
text-align: center;
|
|
height: $searchHeight;
|
|
line-height: $searchHeight;
|
|
background: $mainGlod;
|
|
cursor: pointer;
|
|
}
|
|
.searchBtn {
|
|
// width: 64px;
|
|
height: $searchHeight;
|
|
line-height: $searchHeight;
|
|
// background: $mainGlod;
|
|
color: #FFFFFF;
|
|
font-size: 25px;
|
|
text-align: center;
|
|
cursor: pointer;
|
|
position: absolute;
|
|
right: 10px;
|
|
}
|
|
}
|
|
}
|
|
span {
|
|
display: block;
|
|
height: 30px;
|
|
line-height: 30px;
|
|
}
|
|
.saveList {
|
|
display: flex;
|
|
align-items: center;
|
|
span {
|
|
margin-left: 36px;
|
|
cursor: pointer;
|
|
color: #333333;
|
|
font-size: 14px;
|
|
}
|
|
span.save {
|
|
width: 104px;
|
|
height: $searchHeight;
|
|
background: #FFFFFF;
|
|
color: #333333;
|
|
border: 1px solid $mainGlod;
|
|
text-align: center;
|
|
line-height: $searchHeight;
|
|
}
|
|
}
|
|
>>> .el-tabs__nav-scroll {
|
|
padding: 0 25px;
|
|
height: 60px;
|
|
line-height: 60px;
|
|
background-color: #FAFAFA;
|
|
}
|
|
}
|
|
.list {
|
|
padding: 10px 20px 20px 20px;
|
|
.attentiondsList {
|
|
.topTime {
|
|
color: #333333;
|
|
font-size: 18px;
|
|
margin-bottom: 30px;
|
|
}
|
|
.listBox {
|
|
.attentiondsItem {
|
|
width: 186px;
|
|
float: left;
|
|
margin:0 18px 20px 0;
|
|
position: relative;
|
|
.imgBox {
|
|
width: 186px;
|
|
height: 186px;
|
|
border: 1px solid #E5E5E5;
|
|
border-bottom: 0;
|
|
box-sizing: border-box;
|
|
img {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
}
|
|
.info {
|
|
border: 1px solid #E5E5E5;
|
|
box-sizing: border-box;
|
|
text-align: center;
|
|
padding: 0 15px 15px;
|
|
h3 {
|
|
font-size: 14px;
|
|
color: #333333;
|
|
height: 30px;
|
|
line-height: 30px;
|
|
margin-top: 10px;
|
|
}
|
|
span {
|
|
color: $mainGlod;
|
|
font-size: 14px;
|
|
}
|
|
}
|
|
.btnBox {
|
|
border: 1px solid #E5E5E5;
|
|
display: flex;
|
|
border-top: none;
|
|
span {
|
|
width: 50%;
|
|
display: block;
|
|
text-align: center;
|
|
font-size: 14px;
|
|
color: #333333;
|
|
height: 30px;
|
|
line-height: 30px;
|
|
cursor: pointer;
|
|
}
|
|
span:first-child {
|
|
border-right: 1px solid #E5E5E5;
|
|
box-sizing: border-box;
|
|
}
|
|
}
|
|
.offShelf {
|
|
position: relative;
|
|
z-index: 99;
|
|
.tipText {
|
|
top: 0;
|
|
position: absolute;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background: rgba(28,28,28,0.5);
|
|
color: #fff;
|
|
}
|
|
}
|
|
}
|
|
.attentiondsItem:nth-child(5n) {
|
|
margin-right: 0;
|
|
}
|
|
.edit:before {
|
|
content: "";
|
|
background: url("./../../../assets/images/user-unselected.svg");
|
|
width: 24px;
|
|
height: 24px;
|
|
position: absolute;
|
|
right: 10px;
|
|
top: 10px;
|
|
display: block;
|
|
background-size: contain;
|
|
z-index: 999;
|
|
}
|
|
.selected:before {
|
|
background: url("./../../../assets/images/user-selected.svg");
|
|
background-size: contain;
|
|
}
|
|
}
|
|
}
|
|
>>> .el-pagination {
|
|
margin: 30px 0 20px 0;
|
|
}
|
|
}
|
|
.sub-main{
|
|
min-height: 400px;
|
|
}
|
|
.nothing{
|
|
width: 100%;
|
|
margin-top: 30px;
|
|
text-align: center;
|
|
min-height: 400px;
|
|
p{
|
|
margin-bottom: 20px;
|
|
}
|
|
.el-button{
|
|
background-color: $mainGlod;
|
|
color: #FFFFFF;
|
|
font-weight: normal;
|
|
border-radius: 0;
|
|
}
|
|
}
|
|
.mc{
|
|
width: 100%;
|
|
height: 100%;
|
|
position: absolute;
|
|
opacity: 0;
|
|
}
|
|
}
|
|
</style>
|