781 lines
28 KiB
Vue
781 lines
28 KiB
Vue
<template>
|
||
<div class="">
|
||
<!-- 顶部 -->
|
||
<div class="bg-white">
|
||
<div class="flex flex-1 row-center col-center" style="width: 100%; height: 150px;" v-if="shopInfo.banner">
|
||
<el-image :src="shopInfo.banner" fit="cover" style="height: 100%; width: 100%; max-width: 1920px;">
|
||
</el-image>
|
||
</div>
|
||
<div class="wrapper1180 flex flex-1 col-center row-between" style="height: 40px">
|
||
<div class="h-item flex row-center" :class="xuanIndex =='' ? 'h-item-x':''" @click="changeXuan('')">
|
||
店铺首页
|
||
</div>
|
||
|
||
<div class="flex row-left flex-1">
|
||
<div class="h-item flex row-center" :class="xuanIndex =='all' ? 'h-item-x':''"
|
||
@click="changeXuan('all')">
|
||
全部商品
|
||
</div>
|
||
<!-- <div class="" v-for="(item, index) in goodsClassList" :key="index">
|
||
<div class="h-item flex row-center" :class="xuanIndex == item.id ? 'h-item-x':''"
|
||
@click="changeXuan(item.id)">
|
||
{{item.name}}
|
||
</div>
|
||
</div> -->
|
||
<!-- 商品分类 -->
|
||
<swiper class="swiper flex row-left" ref="mySwiper" :options="swiperOptions"
|
||
style="width: 672px; display: flex; justify-content: flex-start;margin: 0;">
|
||
<swiper-slide class="swiper-item flex row-left" v-for="(itemd, indexd) in goodsClassListGroup"
|
||
:key="indexd">
|
||
<div class="flex">
|
||
<div class="" v-for="(item, index) in itemd" :key="index">
|
||
<div class="h-item flex row-center" :class="xuanIndex == item.id ? 'h-item-x':''"
|
||
@click="changeXuan(item.id)">
|
||
{{item.name}}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</swiper-slide>
|
||
</swiper>
|
||
</div>
|
||
|
||
<div class="search">
|
||
<el-input v-model="keyword" placeholder="店铺搜索" @change="search" size="mini"></el-input>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="shop-details flex col-top wrapper1180 flex-1">
|
||
<!-- left -->
|
||
<div class="left">
|
||
<!-- 店铺介绍 -->
|
||
<div class="shop bg-white">
|
||
<div class="shop-logo flex-col col-center">
|
||
<el-image class="logo-img" :src="shopInfo.logo"></el-image>
|
||
<div class="m-t-10">
|
||
<el-tag size="mini" v-if="shopInfo.type == 1">自营</el-tag>
|
||
<span class="weight-500">{{ shopInfo.name }}</span>
|
||
</div>
|
||
<div class="xs muted m-t-10 line-5">
|
||
{{shopInfo.intro}}
|
||
</div>
|
||
</div>
|
||
<div class="flex m-t-30">
|
||
<div class="flex-1 text-center">
|
||
<div class="xxl m-b-10">{{ shopInfo.on_sale_count }}</div>
|
||
<div>全部商品</div>
|
||
</div>
|
||
<div class="flex-1 text-center">
|
||
<div class="xxl m-b-10">{{ shopInfo.follow_num }}</div>
|
||
<div>关注人数</div>
|
||
</div>
|
||
</div>
|
||
<el-divider></el-divider>
|
||
<div class="flex xs m-b-16">
|
||
<div class="m-r-12">店铺星级</div>
|
||
<div class="m-t-5">
|
||
<el-rate v-model="shopInfo.star" disabled> </el-rate>
|
||
</div>
|
||
</div>
|
||
<div class="flex xs m-b-16">
|
||
<div class="m-r-12">店铺评分</div>
|
||
<div class="">{{ shopInfo.score }}分</div>
|
||
</div>
|
||
<div class="flex row-center row-between">
|
||
<div class="flex row-center">
|
||
<el-button size="mini" @click="shopFollow">{{
|
||
shopInfo.shop_follow_status == 1 ? '已关注' : '关注店铺'
|
||
}}</el-button>
|
||
</div>
|
||
<el-popover placement="bottom" width="200" trigger="hover">
|
||
<div>
|
||
<el-image style="width: 100%" :src="shopInfo.customer_image"></el-image>
|
||
</div>
|
||
|
||
<div slot="reference" class="xs lighter text-center">
|
||
<i class="el-icon-chat-dot-round nr"></i>
|
||
<span>联系客服</span>
|
||
</div>
|
||
</el-popover>
|
||
</div>
|
||
</div>
|
||
<!-- 商品分类 -->
|
||
<div class="m-t-10 bg-white">
|
||
<div class="l-fen flex row-center" @click="getClassGoods('')"
|
||
:class="gClassId == ''?'l-fen-select':''">
|
||
全部商品
|
||
</div>
|
||
<div class="" v-for="(item, index) in goodsClassList" :key="index" @click="getClassGoods(item.id)">
|
||
<div class="l-fen flex row-center" v-show="index < 4"
|
||
:class="gClassId == item.id?'l-fen-select':''">
|
||
{{item.name}}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<!-- right -->
|
||
<div class="right m-l-15">
|
||
<!-- 领券 -->
|
||
<div class="bg-white" v-if="couponsList.length && xuanIndex == ''">
|
||
<div class="coupon-list">
|
||
<div class="m-b-10 flex row-between">
|
||
<div class="">
|
||
领券
|
||
</div>
|
||
<div class="flex row-center coupons-more" @click="more=!more" v-if="couponsList.length > 3">
|
||
<div class="m-r-5">
|
||
更多
|
||
</div>
|
||
<i :class="more?'el-icon-arrow-up':'el-icon-arrow-down'"></i>
|
||
</div>
|
||
</div>
|
||
<div class="flex" :class="more? 'swiper-item-zk':'swiper-item-c'">
|
||
<div class="item" v-for="(item, index) in couponsList" :key="index">
|
||
<div :class="[
|
||
'info white',
|
||
{ gray: item.is_get },
|
||
]">
|
||
<div class="info-hd flex">
|
||
<div>
|
||
<price-formate :price="item.money" :first-size="38" :second-size="38" />
|
||
</div>
|
||
<div class="m-l-8 flex1">
|
||
<div class="line1">{{ item.name }}</div>
|
||
<div class="xs line1">{{ item.condition_type_desc }}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="info-time xs">{{ item.user_time_desc }}</div>
|
||
</div>
|
||
<div class="flex row-between coupon-button">
|
||
<div class="tips-con xs lighter">
|
||
{{ item.use_scene_desc }}
|
||
</div>
|
||
<div class="primary sm" @click="hqCoupon(item.id)" v-if="!item.is_get">
|
||
立即领取
|
||
</div>
|
||
</div>
|
||
<img v-if="item.is_get" class="receice" src="~/static/images/coupons_img_receive.png"
|
||
alt="" />
|
||
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 店铺推荐 -->
|
||
<div class="shop-list" v-if="recommend && xuanIndex == ''">
|
||
<div class="m-b-10">
|
||
店铺推荐
|
||
</div>
|
||
<el-carousel arrow="never" indicator-position="outside" trigger="click" height="300px"
|
||
:autoplay="false">
|
||
<el-carousel-item v-for="(itemd, indexd) in recommend" :key="indexd">
|
||
<div class="flex">
|
||
|
||
<div class="shop-item" v-for="(itemg, indexg) in itemd" :key="indexg">
|
||
<nuxt-link :to="`/goods_details/${itemg.id}`">
|
||
<div class="">
|
||
<div class="">
|
||
<el-image :src="itemg.image" style="height: 200px; width: 200px;">
|
||
</el-image>
|
||
</div>
|
||
<div class="name m-l-10 line-1">
|
||
{{itemg.name}}
|
||
</div>
|
||
<div class="m-l-10 flex">
|
||
<div class="primary m-r-8">
|
||
<price-formate :price="itemg.min_price" :first-size="16" />
|
||
</div>
|
||
<div class="muted sm line-through">
|
||
<price-formate :price="itemg.market_price" />
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nuxt-link>
|
||
</div>
|
||
</div>
|
||
</el-carousel-item>
|
||
</el-carousel>
|
||
</div>
|
||
<!-- 分类商品 -->
|
||
<div :class="xuanIndex == ''? 'm-t-10':''">
|
||
<div class="sort m-b-16 flex bg-white col-top" id="goods-sort">
|
||
<div class="sort-title">排序方式:</div>
|
||
<div class="sort-name m-l-16 flex">
|
||
<div :class="['item', { active: sortType == '' }]" @click="changeSortType('')">
|
||
综合
|
||
</div>
|
||
<div :class="['item', { active: sortType == 'price' }]" @click="changeSortType('price')">
|
||
价格
|
||
<i v-show="priceSort == 'desc'" class="el-icon-arrow-down"></i>
|
||
<i v-show="priceSort == 'asc'" class="el-icon-arrow-up"></i>
|
||
</div>
|
||
<div :class="['item', { active: sortType == 'sales_sum' }]"
|
||
@click="changeSortType('sales_sum')">
|
||
销量
|
||
<i v-show="saleSort == 'desc'" class="el-icon-arrow-down"></i>
|
||
<i v-show="saleSort == 'asc'" class="el-icon-arrow-up"></i>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<template v-if="goodsList.length">
|
||
<goods-list :list="goodsList" :num="4" />
|
||
<div class="pagination flex m-t-30 row-center" style="padding-bottom: 38px" v-if="count">
|
||
<el-pagination background layout="prev, pager, next" :total="count" prev-text="上一页"
|
||
next-text="下一页" hide-on-single-page :page-size="20" @current-change="changePage">
|
||
</el-pagination>
|
||
</div>
|
||
</template>
|
||
<null-data v-else :img="require('~/static/images/goods_null.png')" text="暂无商品~"></null-data>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import {
|
||
trottle
|
||
} from "~/utils/tools";
|
||
import {
|
||
Message
|
||
} from 'element-ui';
|
||
export default {
|
||
head() {
|
||
return {
|
||
title: this.$store.getters.headTitle,
|
||
link: [{
|
||
rel: 'icon',
|
||
type: 'image/x-icon',
|
||
href: this.$store.getters.favicon,
|
||
}, ],
|
||
}
|
||
},
|
||
|
||
layout: "street",
|
||
|
||
components: {},
|
||
async asyncData({
|
||
$get,
|
||
query,
|
||
}) {
|
||
// 店铺信息
|
||
const
|
||
shopData = await $get("shop/getShopInfo", {
|
||
params: {
|
||
shop_id: query.id
|
||
},
|
||
});
|
||
if (shopData.code == 1) {
|
||
if (shopData.data.goods_list.length > 0) {
|
||
var num = [];
|
||
for (var i = 0; i < Math.ceil(shopData.data.goods_list.length / 4); i++) {
|
||
var start = i * 4;
|
||
var end = start + 4;
|
||
num.push(shopData.data.goods_list.slice(start, end));
|
||
}
|
||
}
|
||
}
|
||
console.log('num', num)
|
||
|
||
// 获取优惠券
|
||
const
|
||
coupon = await $get("coupon/getCouponList", {
|
||
params: {
|
||
shop_id: query.id
|
||
},
|
||
});
|
||
|
||
// 商品分类
|
||
const
|
||
goodsClass = await $get("shop_goods_category/getShopGoodsCategory", {
|
||
params: {
|
||
shop_id: query.id
|
||
},
|
||
});
|
||
|
||
if (goodsClass.code == 1) {
|
||
if (goodsClass.data.length > 0) {
|
||
var group = [];
|
||
for (var i = 0; i < Math.ceil(goodsClass.data.length / 6); i++) {
|
||
var start = i * 6;
|
||
var end = start + 6;
|
||
group.push(goodsClass.data.slice(start, end));
|
||
}
|
||
}
|
||
}
|
||
console.log('group', group)
|
||
|
||
return {
|
||
recommend: num, // 推荐列表
|
||
shopInfo: shopData.data, // 商家信息
|
||
goodsClassList: goodsClass.data, // 商品分类列表
|
||
goodsClassListGroup: group, // 商品分类切割列表
|
||
couponsList: coupon.data.lists, // 优惠券列表
|
||
};
|
||
},
|
||
data() {
|
||
return {
|
||
goodsClassListGroup: [],
|
||
recommend: [],
|
||
couponsList: [],
|
||
gClassId: '',
|
||
shopInfo: [],
|
||
goodsClassList: [],
|
||
swiperOptions: {
|
||
pagination: {
|
||
el: '.swiper-pagination',
|
||
clickable: true,
|
||
},
|
||
navigation: {
|
||
nextEl: '.swiper-button-next',
|
||
prevEl: '.swiper-button-prev',
|
||
},
|
||
preventClicks: true,
|
||
slidesPerView: 'auto',
|
||
autoplay: true,
|
||
},
|
||
|
||
sortType: "",
|
||
saleSort: "desc",
|
||
priceSort: "desc",
|
||
page: 1,
|
||
count: 0,
|
||
goodsList: [],
|
||
|
||
more: false,
|
||
|
||
keyword: '',
|
||
xuanIndex: '',
|
||
}
|
||
},
|
||
|
||
created() {
|
||
this.getGoods();
|
||
this.changeSortType = trottle(this.changeSortType, 500, this);
|
||
},
|
||
|
||
methods: {
|
||
// 搜索商品
|
||
search() {
|
||
this.getGoods()
|
||
|
||
// 搜索后跳转到商品列表位置
|
||
if(this.xuanIndex == '') {
|
||
setTimeout(() => {
|
||
document.getElementById('goods-sort').scrollIntoView()
|
||
}, 500)
|
||
}
|
||
},
|
||
|
||
// 顶部商品分类选择事件
|
||
changeXuan(id) {
|
||
this.xuanIndex = id
|
||
if (id == 'all') {
|
||
this.gClassId = ''
|
||
this.getGoods()
|
||
} else {
|
||
this.gClassId = id
|
||
this.getGoods()
|
||
}
|
||
},
|
||
|
||
// 店铺信息
|
||
async getShopData() {
|
||
const
|
||
shopData = await this.$get("shop/getShopInfo", {
|
||
params: {
|
||
shop_id: this.$route.query.id
|
||
},
|
||
});
|
||
|
||
if (shopData.code == 1) {
|
||
|
||
this.shopInfo = shopData.data
|
||
// 切割推荐列表
|
||
if (shopData.data.goods_list.length > 0) {
|
||
var num = [];
|
||
for (var i = 0; i < Math.ceil(shopData.data.goods_list.length / 4); i++) {
|
||
var start = i * 4;
|
||
var end = start + 4;
|
||
num.push(shopData.data.goods_list.slice(start, end));
|
||
}
|
||
}
|
||
|
||
console.log('num', num)
|
||
this.recommend = num
|
||
}
|
||
},
|
||
|
||
|
||
// 关注店铺
|
||
shopFollow() {
|
||
const a = this.$post("shop_follow/changeStatus", {
|
||
shop_id: this.$route.query.id
|
||
});
|
||
this.getShopData()
|
||
},
|
||
|
||
// 领取优惠券
|
||
async hqCoupon(id) {
|
||
const {
|
||
msg,
|
||
code
|
||
} = await this.$post("coupon/getCoupon", {
|
||
coupon_id: id,
|
||
});
|
||
|
||
if (code == 1) {
|
||
this.$message({
|
||
message: msg,
|
||
type: "success",
|
||
});
|
||
}
|
||
this.getCouponList()
|
||
},
|
||
|
||
// 获取优惠券列表
|
||
async getCouponList() {
|
||
const
|
||
coupon = await this.$get("coupon/getCouponList", {
|
||
params: {
|
||
shop_id: this.$route.query.id
|
||
},
|
||
});
|
||
},
|
||
|
||
|
||
// 点击商品分类
|
||
getClassGoods(id) {
|
||
this.gClassId = id
|
||
|
||
if (id == '') {
|
||
this.xuanIndex = 'all'
|
||
} else {
|
||
this.xuanIndex = id
|
||
}
|
||
|
||
this.getGoods()
|
||
},
|
||
|
||
changeSortType(type) {
|
||
this.sortType = type;
|
||
switch (type) {
|
||
case "price":
|
||
if (this.priceSort == "asc") {
|
||
this.priceSort = "desc";
|
||
} else if (this.priceSort == "desc") {
|
||
this.priceSort = "asc";
|
||
}
|
||
break;
|
||
case "sales_sum":
|
||
if (this.saleSort == "asc") {
|
||
this.saleSort = "desc";
|
||
} else if (this.saleSort == "desc") {
|
||
this.saleSort = "asc";
|
||
}
|
||
break;
|
||
default:
|
||
}
|
||
this.getGoods();
|
||
},
|
||
changePage(current) {
|
||
this.page = current;
|
||
this.getGoods();
|
||
},
|
||
async getGoods() {
|
||
const {
|
||
name
|
||
} = this.$route.query;
|
||
const {
|
||
priceSort,
|
||
sortType,
|
||
saleSort
|
||
} = this;
|
||
let sort = "";
|
||
switch (sortType) {
|
||
case "price":
|
||
sort = priceSort;
|
||
break;
|
||
case "sales_sum":
|
||
sort = saleSort;
|
||
break;
|
||
}
|
||
const {
|
||
data: {
|
||
list,
|
||
count
|
||
},
|
||
} = await this.$get("pc/goodsList", {
|
||
params: {
|
||
page_size: 20,
|
||
page_no: this.page,
|
||
sort_type: sortType,
|
||
sort,
|
||
category_id: this.gClassId,
|
||
shop_id: this.$route.query.id,
|
||
name: this.keyword,
|
||
},
|
||
});
|
||
this.count = count
|
||
this.goodsList = list;
|
||
},
|
||
},
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
.shop {
|
||
width: 227px;
|
||
padding: 15px;
|
||
|
||
.logo-img {
|
||
width: 62px;
|
||
height: 62px;
|
||
border-radius: 50%;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.el-rate__icon {
|
||
font-size: 16px;
|
||
}
|
||
}
|
||
|
||
.h-item {
|
||
width: 82px;
|
||
height: 24px;
|
||
margin-right: 30px;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.h-item-x {
|
||
border-radius: 100px;
|
||
background-color: #FF2C3C;
|
||
color: #FFFFFF;
|
||
}
|
||
|
||
.search {
|
||
width: 240px;
|
||
|
||
::v-deep .el-input {
|
||
width: 240px;
|
||
border-radius: 10px;
|
||
}
|
||
}
|
||
|
||
.shop-details {
|
||
margin-top: 10px;
|
||
|
||
.left {
|
||
.l-border {
|
||
padding-bottom: 27px;
|
||
border-bottom: 1px solid #EEEEEE;
|
||
margin-bottom: 27px;
|
||
}
|
||
|
||
.desc {
|
||
color: #101010;
|
||
font-size: 12px;
|
||
}
|
||
|
||
.desc-b {
|
||
color: #FFFFFF;
|
||
font-size: 12px;
|
||
}
|
||
|
||
.desc-n {
|
||
color: #FFFFFF;
|
||
font-size: 18px;
|
||
}
|
||
|
||
.desc-n {
|
||
color: #101010;
|
||
font-size: 14px;
|
||
}
|
||
|
||
.left-btn {
|
||
width: 82px;
|
||
height: 29px;
|
||
border-radius: 4px;
|
||
border: 1px solid rgba(187, 187, 187, 100);
|
||
}
|
||
|
||
.left-shop {
|
||
background-color: #FFFFFF;
|
||
padding: 20px 15px;
|
||
width: 210px;
|
||
height: 364px;
|
||
}
|
||
|
||
.r-color-h {
|
||
background-color: #A4ADB3;
|
||
color: #FFFFFF;
|
||
}
|
||
|
||
.l-tips {
|
||
padding: 1px 2px;
|
||
}
|
||
|
||
.l-fen {
|
||
width: 210px;
|
||
height: 44px;
|
||
line-height: 20px;
|
||
color: rgba(16, 16, 16, 100);
|
||
font-size: 14px;
|
||
text-align: center;
|
||
cursor: pointer;
|
||
}
|
||
|
||
.l-fen-select {
|
||
color: #FF2C3C;
|
||
;
|
||
}
|
||
}
|
||
|
||
.right {
|
||
width: 961px;
|
||
|
||
.coupon-list {
|
||
background-color: #FFFFFF;
|
||
padding: 20px 0;
|
||
margin: 0 20px;
|
||
border-bottom: 1px solid #EEEEEE;
|
||
|
||
.coupons-more {
|
||
cursor: pointer;
|
||
}
|
||
|
||
.swiper-item-c {
|
||
width: 760px;
|
||
// height: 120px;
|
||
|
||
flex-wrap: nowrap;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.swiper-item-zk {
|
||
width: 770px;
|
||
flex-wrap: wrap;
|
||
}
|
||
}
|
||
|
||
.shop-list {
|
||
background-color: #FFFFFF;
|
||
height: 360px;
|
||
padding: 0 20px;
|
||
padding-top: 10px;
|
||
|
||
.shop-item {
|
||
width: 200px;
|
||
height: 298px;
|
||
background-color: #FFFFFF;
|
||
margin-right: 12px;
|
||
|
||
.name {
|
||
color: rgba(16, 16, 16, 100);
|
||
font-size: 14px;
|
||
text-align: left;
|
||
margin-bottom: 18px;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
.sort {
|
||
padding: 16px 16px 0;
|
||
|
||
.sort-name {
|
||
.item {
|
||
margin-right: 30px;
|
||
cursor: pointer;
|
||
|
||
&.active {
|
||
color: #FF2C3C
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
.swiper {}
|
||
|
||
.swiper-item {
|
||
width: 672px;
|
||
// box-sizing: content-box;
|
||
}
|
||
|
||
.item {
|
||
margin-bottom: 20px;
|
||
margin-right: 16px;
|
||
position: relative;
|
||
cursor: pointer;
|
||
|
||
.coupon-button {
|
||
background-color: #f2f2f2;
|
||
width: 240px;
|
||
height: 30px;
|
||
padding: 0 8px;
|
||
}
|
||
|
||
.info {
|
||
padding: 0 10px;
|
||
background: url("~/static/images/bg_coupon_s.png") no-repeat;
|
||
width: 240px;
|
||
height: 80px;
|
||
background-size: 100%;
|
||
|
||
&.gray {
|
||
background-image: url("~/static/images/bg_coupon.png");
|
||
}
|
||
|
||
.info-hd {
|
||
overflow: hidden;
|
||
}
|
||
}
|
||
|
||
.tips {
|
||
position: relative;
|
||
background-color: #f2f2f2;
|
||
height: 30px;
|
||
padding: 0 8px;
|
||
|
||
.tips-con {
|
||
width: 100%;
|
||
left: 0;
|
||
background-color: #f2f2f2;
|
||
position: absolute;
|
||
top: 30px;
|
||
padding: 10px;
|
||
z-index: 99;
|
||
}
|
||
}
|
||
|
||
.receice {
|
||
position: absolute;
|
||
top: 0;
|
||
right: 0px;
|
||
width: 58px;
|
||
height: 45px;
|
||
}
|
||
|
||
.choose {
|
||
position: absolute;
|
||
top: 0;
|
||
right: 0;
|
||
background-color: #ffe72c;
|
||
color: $--color-primary;
|
||
padding: 1px 5px;
|
||
}
|
||
}
|
||
|
||
.more {
|
||
position: absolute;
|
||
bottom: 20px;
|
||
cursor: pointer;
|
||
right: 30px;
|
||
}
|
||
}
|
||
</style>
|