Files
dtx_store/pages/store/shop/shopDetail.vue

402 lines
9.1 KiB
Vue

<template>
<view class="shopDetail">
<view class="top">
<view class="search" @click="search">
<uni-icons type="left" class="back" size="30" @click="$Router.back();" />
<view class="input">
<uni-icons type="search" class="search-icon" color="grey" size="20" /> 请输入要搜索商品的关键词
</view>
</view>
<view class="shopInfo">
<view class="shopInfo-title-left">
<image class="shop-logo" :src="logo" mode="aspectFill" />
<view class="shop-title">
<view class="shop-titl">{{name}}</view>
<view>店铺评分:<span class='no'>5.0</span> 服务态度 :<span class='no'>5.0</span></view>
</view>
</view>
<!-- <view class="shopInfo-title-right"> +关注 </view> -->
</view>
</view>
<view class="content">
<view class="left">
<scroll-view scroll-y="true" class="scroll-view-left">
<view :class="['classify-item', item.category_id === category_id?'active_classify_item':'']"
v-for="(item,index) in classify" :key="index" @click="selectClassify(item.category_id)">
{{item.name}}
</view>
</scroll-view>
</view>
<view class="right">
<scroll-view scroll-y="true" class="scroll-view-right" @scrolltolower='lower'>
<block v-if="goods.length > 0">
<view class="goods-item" v-for="(item,index) in goods" :key="index"
@click="onGoods(item.goods_id)">
<image :src="item.cover" mode="aspectFill" class="good-img" />
<view class="item--content">
<view class="title">{{item.name}}</view>
<view class="sub_title">{{item.shop.name}}</view>
<view class="price">{{item.price.price_min || '0'}}
<view class="price-type">
<text> DT积分</text>
<text class="kucun"> 库存量:{{item.stock}}</text>
</view>
</view>
</view>
</view>
</block>
<block v-else>
<view class="vertical pages-empty">
<u-empty icon="http://cdn.uviewui.com/uview/empty/list.png" textColor="#999" text="暂无相关商品">
</u-empty>
</view>
</block>
</scroll-view>
</view>
</view>
</view>
</template>
<script>
import {
shopsDetail,
shopsGoods
} from "@/apis/interfaces/store"
export default {
data() {
return {
name : '',
logo : '',
category_id : '',
classify : [],
goods : [],
has_more:true,
page:1,
ShopId:'',
}
},
onLoad(e) {
this.ShopId = this.$Route.query.ShopId
shopsDetail(this.ShopId).then(res => {
this.classify = [{
category_id: '',
name: '全部商品',
}, ...res.categories]
this.name = res.name
this.logo = res.cover
this.getGoods()
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
onPullDownRefresh() {
this.has_more = true;
this.page = 1;
this.goods = [];
this.getGoods()
},
methods: {
getGoods() {
uni.showLoading({
title:'请求中~',
mask:true,
})
shopsGoods(this.ShopId, this.category_id,this.page).then(res => {
this.goods = this.goods.concat(res.data);
this.has_more = res.page.has_more;
uni.hideLoading();
}).catch(err => {
uni.showToast({
title: err.message,
icon: 'none'
})
})
},
lower(){
if(this.has_more){
this.page = this.page + 1
this.getGoods();
}else{
uni.showToast({
title:'没有更多~',
icon:"none",
mask:true,
})
}
},
selectClassify(id) {
if (id === this.category_id) return;
this.category_id = id;
this.page = 1;
this.goods =[];
this.has_more = true;
this.getGoods()
},
search() {
this.$Router.push({
name: 'StoreSearch'
});
},
onGoods(id) {
this.$Router.push({
name: 'StoreGoods',
params: {
id: id
}
})
}
}
}
</script>
<style lang="scss">
.pages-empty {
height: 70vh;
}
.shopDetail {
width: 100%;
height: 100vh;
.top {
height: 320rpx;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-end;
box-sizing: border-box;
padding-top: 44px;
width: 100%;
.search {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
width: 100%;
padding-right: $padding;
.back {
padding: 0 $padding;
}
.input {
flex: 1;
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
background-color: #f9f9f9;
color: gray;
font-size: 26rpx;
border-radius: 30rpx;
padding: 10rpx $padding;
.search-icon {
margin-right: $margin;
}
}
}
.shopInfo {
border-top: solid 1 #f9f9f9;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
width: 100%;
padding: $padding - 10;
background-color: #fff;
.shopInfo-title-left {
width: 500rpx;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.shop-logo {
width: 100rpx;
height: 100rpx;
border-radius: 10rpx;
border: solid 1rpx #f9f9f9;
}
.shop-title {
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: flex-start;
box-sizing: border-box;
font-size: 26rpx;
margin-left: $margin;
color: #999;
width: 370rpx;
.no {
color: $text-price;
padding-left: 4rpx;
padding-right: 10rpx;
}
.shop-titl {
font-size: 34rpx;
color: #333;
font-weight: bold;
margin-bottom: 6rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
width: 100%;
}
}
}
.shopInfo-title-right {
display: flex;
flex-direction: row;
align-items: center;
justify-content: center;
box-sizing: border-box;
font-size: 28rpx;
color: #222;
background-color: $main-color;
padding: 6rpx $padding;
color: #FFF;
}
}
}
.content {
height: calc(100vh - 320rpx);
background-color: #eee;
display: flex;
flex-direction: row;
align-items: center;
padding-top: 20rpx;
box-sizing: border-box;
.left {
width: 180rpx;
height: 100%;
.scroll-view-left {
height: 100%;
width: 100%;
}
.classify-item {
width: 100%;
padding: $padding 0;
font-size: 26rpx;
text-align: center;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
color: #222;
display: inline-block;
}
.active_classify_item {
background-color: #FFFFFF;
}
}
.right {
width: calc(100% - 180rpx);
height: 100%;
background-color: #fff;
.scroll-view-right {
width: 100%;
height: 100%;
.goods-item {
width: 100%;
display: inline-block;
border-bottom: solid 1rpx #eee;
// padding: $padding;
padding-left: $padding;
padding-top: $padding;
padding-bottom: $padding;
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-start;
box-sizing: border-box;
.good-img {
width: 160rpx;
height: 160rpx;
border-radius: 10rpx;
}
.item--content {
flex: 1;
padding: $padding - 10;
&>.title {
font-size: 28rpx;
color: #333;
// @extend .ellipsis-1;
}
&>.sub_title {
color: #a05f0c;
font-size: 24rpx;
padding-top: 4rpx;
// @extend .ellipsis-1;
}
&>.price {
padding-top: $padding/2;
display: flex;
flex-direction: row;
align-items: flex-end;
justify-content: flex-start;
box-sizing: border-box;
line-height: 40rpx;
font-weight: bold;
font-size: 32rpx;
color: $text-price;
// @extend .ellipsis-1;
.price-type {
display: flex;
flex-direction: row;
align-items: flex-end;
justify-content: space-between;
box-sizing: border-box;
flex: 1;
text {
margin-right: $margin/2;
padding-left: 6rpx;
font-size: 70%;
}
.kucun {
color: $text-gray;
font-weight: normal;
}
}
}
}
}
}
}
}
}
</style>