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.
duomendian/pages/store/home/store_cate2.vue

1420 lines
34 KiB

3 months ago
<template>
<view class="container">
<view class="headerBg">
<image :src="info.background_image" mode="aspectFill" class="image"></image>
<view class="shade"></view>
<!-- #ifdef MP || APP -->
<view :style="{height: getHeight.barTop+'px'}"></view>
<view :style="{height: getHeight.barHeight+'px'}"></view>
<!-- #endif -->
<view style="height: 224rpx;"></view>
</view>
<view class="page">
<view class="search-box" :style="{height: headerHeight ? (headerHeight+'px') : 'auto'}">
<view class="input-box" id="input-box" :class="{fixed: scrollTop > 0}">
<!-- #ifdef MP || APP -->
<view :style="{height: getHeight.barTop+'px'}"></view>
<!-- #endif -->
<!-- 顶部搜索框 -->
<!-- #ifdef MP -->
<view class="input-wrapper acea-row row-middle" :style="{height: getHeight.barHeight+'px'}">
<view class="menu_box flex-center" @tap="moreNav">
<text class="iconfont icon-a-icon_menu1x"></text>
</view>
<navigator url="/pages/goods/goods_search/index" class="input acea-row row-middle" hover-class="none">
<text class="iconfont icon-ic_search"></text>搜索商品
</navigator>
<view v-if="info.store_splicing_switch" class="group-btn" @click="onCollage">
<image :src="imgHost+'/statics/images/group-btn.png'" mode="aspectFit" class="img"></image>
</view>
<view :style="{width: getHeight.barWidth+'px'}"></view>
</view>
<!-- #endif -->
<!-- #ifndef MP -->
<view class="input-wrapper acea-row row-middle">
<view class="menu_box flex-center" @tap="moreNav">
<text class="iconfont icon-a-icon_menu1x"></text>
</view>
<navigator url="/pages/goods/goods_search/index" class="input acea-row row-middle" hover-class="none">
<text class="iconfont icon-ic_search"></text>搜索商品
</navigator>
<!-- #ifdef H5 -->
<view v-if="info.store_splicing_switch && $wechat.isWeixin()" class="group-btn" @click="onCollage">
<image :src="imgHost+'/statics/images/group-btn.png'" mode="aspectFit" class="img"></image>
</view>
<!-- #endif -->
</view>
<!-- #endif -->
</view>
</view>
<!-- <scroll-view scroll-y="true" class="scroll-view" @scroll="goodsListScroll" @scrolltolower="getProducts"> -->
<!-- 门店地址 -->
<view class="store-section">
<view class="panel">
<view class="acea-row row-middle store-name">
<view class="name-wrap">
<navigator :url="'/pages/store/info/index?store_id='+info.id" hover-class="none" class="acea-row row-middle name-inner">
<text class="iconfont icon-ic_mall"></text>
<view class="name line1">{{info.name}}</view>
<text class="iconfont icon-ic_rightarrow"></text>
</navigator>
</view>
<!-- <view class="tips">门店支持自提</view> -->
<view class="switch acea-row" v-if="deliveryList.length > 1">
<view v-for="(item, index) in deliveryList" :key="item.key" :class="{ on: switchNum == item.key }" class="btn" @click="swithFn(item.key)">{{item.name}}</view>
</view>
<view class="tips" v-else-if="deliveryList.length == 1">门店支持{{deliveryList[0].name}}</view>
</view>
<view class="acea-row row-bottom address-wrap">
<view class="address-box">
<view class="time">营业时间{{info.day_time}}</view>
<view class="address-info">
<text class="distance">距您{{info.range}}km</text>
{{info.address}}{{info.detailed_address}}
</view>
</view>
<view class="acea-row btn-box">
<view class="btn" @click="showMaoLocation">
<text class="iconfont icon-ic_location5"></text>
<view class="">地图</view>
</view>
<view class="btn" @click="goKefu">
<text class="iconfont icon-ic_customerservice"></text>
<view class="">客服</view>
</view>
</view>
</view>
</view>
</view>
<!-- 商品排序条件 -->
<view class="nav-box" id="nav-box">
<view class="nav acea-row row-middle" :class="{ fixed: scrollTop && conterTop <= headerHeight }" :style="{ top: headerHeight+'px' }">
<view class="flex-1 acea-row row-around row-middle">
<view @click="set_where(1)" :class="{'activeColor':active == 1}">
默认排序
</view>
<view @click='set_where(2)' :class="{'activeColor':active == 2}">
价格
<text v-if="price==2" class="iconfont icon-ic_down2"></text>
<text v-else class="iconfont icon-ic_up2"></text>
</view>
<view @click='set_where(3)' :class="{'activeColor':active == 3}">
销量
<text v-if="stock==2" class="iconfont icon-ic_down2"></text>
<text v-else class="iconfont icon-ic_up2"></text>
</view>
</view>
<view @click="set_where(4)" class="filter-btn">
<view class="line-left"></view>
筛选
<text class="iconfont icon-ic_sort"></text>
</view>
</view>
</view>
<!-- 商品列表 -->
<view class="list waterList">
<WaterfallsFlow ref="waterfallsFlow" :wfList="productList" @itemTap="godDetail"></WaterfallsFlow>
<view class='loadingicon acea-row row-center-wrapper' v-if='productList.length > 0'>
<text class='loading iconfont icon-jiazai' :hidden='loading==false'></text>{{loadTitle}}
</view>
</view>
<!-- 商品列表 -->
<view class="default" v-if="productList.length==0 && where.page > 1">
<emptyPage title="暂无商品,去看点别的吧~"></emptyPage>
</view>
<!-- </scroll-view> -->
<view class="footer">
<view class="inner-box" :class="{ open: footerOpen }">
<view class="inner acea-row row-between row-middle">
<view class="acea-row row-bottom" style="flex-wrap: nowrap;">
<BaseMoney :money="totalPrice" symbolSize="32" integerSize="48" decimalSize="32" color="#FFFFFF"></BaseMoney>
<view class="detail-btn" style="white-space: nowrap;" @click="getCartLists">查看明细<text class="iconfont icon-ic_uparrow"></text></view>
</view>
<view class="btn" @click="subOrder">去结算({{cartNums}})</view>
</view>
</view>
<view class="cartIcon" @click="getCartLists">
<uni-badge :text="cartNums" absolute="rightTop" :offset="[6, 4]" :custom-style="{background: 'var(--view-theme)'}">
<view class="image-wrap">
<image src="@/static/img/cart_pic.png" class="image"></image>
</view>
</uni-badge>
</view>
</view>
</view>
<!-- 筛选弹窗 -->
<filterPopup ref="popup" :level="level" :storeCategory="storeCategory" :storeBrand="storeBrand" @brandChange="brandChange" @categoryChange="categoryChange" @submitFn="submitFn"></filterPopup>
<!-- 客服弹窗 -->
<Kefu ref="kefu" @closeKefu="closeKefu" :customerList="customerList" :customerType="customerType"></Kefu>
<!-- #ifdef H5 || MP -->
<tuiDrawer :visible="collageVisible" :zIndex="970" :maskZIndex="960" mode="bottom" backgroundColor="transparent" @close="onCollageClose">
<view class="dialog">
<view class="dialog-head acea-row row-between row-middle">
<view>发起一起拼</view>
<view class="btn" @click="onCollageClose">
<text class="iconfont icon-ic_close"></text>
</view>
</view>
<view class="dialog-body">
<view class="navbar" v-if="deliveryList.length > 1">
<view class="navbar-bg"></view>
<view class="active-bg acea-row row-bottom" :class="{'row-right':collageDelivery==1}">
<image v-if="collageDelivery==1" class="image2" src="../static/navbar-right-2.png"></image>
<image class="image1" src="../static/navbar-left-1.png"></image>
<image v-if="collageDelivery==2" class="image2" src="../static/navbar-left-2.png"></image>
</view>
<view class="inner acea-row">
<view v-for="(item, index) in deliveryList" :key="item.key" :class="{ on: collageDelivery == item.key }" class="item acea-row row-center-wrapper"
@click="collageDeliveryChange(item, index)">
<text :class="'iconfont '+item.icon"></text>
{{item.name}}
</view>
</view>
</view>
<view class="dialog-content" :class="{
btl:collageIndex==deliveryList.length-1,
btr:!collageIndex
}">
<scroll-view v-if="collageDelivery == 1 && addressList.length" :scroll-y="addressList.length > 3" :style="{ height: addressList.length > 3 ? '388rpx' : 'auto' }"
class="address-box">
<view class="list">
<view v-for="(item, index) in addressList" :key="item.id" :class="{ on: item.id == addressId }" class="item acea-row row-middle" @click="onAddressChange(item)">
<view class="text">
<view class="info">{{item.province}}{{item.city}}{{item.district}}{{item.street}}{{item.detail}}</view>
<view class="name">{{item.real_name}} {{item.phone}}</view>
</view>
<text class="iconfont icon-ic_complete"></text>
</view>
</view>
</scroll-view>
<navigator v-if="collageDelivery == 1 && !addressList.length" class="link" url="/pages/users/user_address/index?fromType=1" hover-class="none">
<view class="title acea-row row-between-wrapper">
<view>添加配送地址</view>
<text class="iconfont icon-ic_rightarrow"></text>
</view>
<view>您还未添加配送地址先去添加地址再下单吧~</view>
</navigator>
<view v-if="collageDelivery == 2" class="store-box acea-row">
<view class="text">
<view class="name">{{collageStore.name}}</view>
<view class="info acea-row">
<text class="iconfont icon-ic_location51"></text>
<view class="value">{{collageStore.address}}{{collageStore.detailed_address}}</view>
</view>
<view class="info acea-row">
<text class="iconfont icon-icon_clock"></text>
<view class="value">营业时间{{collageStore.day_time}}</view>
</view>
</view>
<view class="map-box">
<image src="../static/map2.png" class="map"></image>
<view class="img-box">
<image :src="collageStore.image" class="img"></image>
<view class="range">距您{{collageStore.range}}km</view>
<view class="dot"></view>
</view>
</view>
</view>
<view class="btn-box acea-row row-center-wrapper" v-if="collageDelivery == 1 && addressList.length">
<navigator url="/pages/users/user_address/index?fromType=1" hover-class="none">
添加地址
<text class="iconfont icon-ic_rightarrow"></text>
</navigator>
</view>
</view>
</view>
<view class="dialog-foot">
<view class="btn" @click="initCollage">发起拼单</view>
</view>
</view>
</tuiDrawer>
<!-- 商品属性弹窗 -->
<productWindow :attr="attr" :isShow="1" :iSplus="1" :iScart="1" :type="2" @myevent="onMyEvent" @attrVal="attrVal" @ChangeAttr="ChangeAttr" @ChangeCartNum="ChangeCartNumDuo"
@iptCartNum="iptCartNum" @goCat="goCatNum">
</productWindow>
<!-- #endif -->
<homeList :currentPage="currentPage" :navH="getHeight.barTop+40" :openNavList="diyProduct.navList"></homeList>
<cartList :cartNums='cartNums' :cartData="cartData" @closeList="closeList" @ChangeCartNumDan="ChangeCartList" @ChangeSubDel="ChangeSubDel" @ChangeOneDel="ChangeOneDel"></cartList>
</view>
</template>
<script>
import filterPopup from "@/components/filterPopup/index.vue";
import Kefu from "@/components/kefu/index.vue";
import WaterfallsFlow from "@/components/WaterfallsFlow/WaterfallsFlow.vue";
import productWindow from "@/components/productWindow/index.vue";
import emptyPage from "@/components/emptyPage.vue";
import homeList from "@/components/homeList/index.vue";
import cartList from "@/components/cartList/index.vue";
import tuiDrawer from "@/components/tui-drawer/tui-drawer.vue";
import {
mapState,
mapGetters
} from 'vuex';
import {
vcartList,
getCartCounts,
cartDel
} from '@/api/order.js';
import {
getProducts,
getCustomerList,
getStoreCategory,
getStoreBrand
} from '@/api/new_store.js';
import {
goShopDetail
} from '@/libs/order.js';
import {
HTTP_REQUEST_URL
} from '@/config/app';
import {
// #ifdef MP || H5
hasCollage,
// #endif
getAttr,
initCollage,
isWithin,
} from '@/api/store.js';
import {
getAddressList,
} from '@/api/user.js';
// #ifdef H5
import {
toLogin
} from '@/libs/login.js';
// #endif
import skuSelect from '@/mixins/skuSelect.js';
export default {
components: {
filterPopup,
Kefu,
WaterfallsFlow,
productWindow,
emptyPage,
homeList,
cartList,
tuiDrawer,
},
props: {
info: {
type: Object,
default: {}
},
customerType: {
type: Number,
default: 1
},
cart_num: {
type: Number,
default: 0
},
},
mixins: [skuSelect],
computed: {
...mapState({
// cartNum: state => state.indexData.cartNum
}),
...mapGetters(['isLogin', 'uid', 'cartNum', 'diyProduct', 'diyCategory']),
level() {
return this.diyCategory.level
},
},
provide: {
parent: {}
},
data() {
return {
id: 0,
getHeight: this.$util.getWXStatusHeight(),
imgHost: HTTP_REQUEST_URL,
price: 0,
stock: 0,
productList: [], // 商品数据
customerList: [], // 客服数据
storeCategory: [], // 分类数据
storeBrand: [], // 品牌数据
show: false,
active: 1,
where: {
cid: 0,
sid: 0,
tid: 0,
keyword: '',
priceOrder: '',
salesOrder: '',
news: 0,
page: 1,
limit: 5,
store_id: 0,
brand_id: '',
},
loading: false,
loadend: false,
loadTitle: '加载更多',
deliveryList: [{
name: '自提',
key: 2,
icon: 'icon-icon_shop1'
},
{
name: '配送',
key: 1,
icon: 'icon-icon_electromobile'
},
],
switchNum: 1,
// #ifdef H5 || MP
collageVisible: false,
collageDelivery: 2,
collageIndex: 0,
collageAddress: {},
collageStore: {},
// #endif
drawervisible: true,
footerOpen: false,
totalPrice: 0,
cartData: {
cartList: [],
iScart: false
},
attr: {
cartAttr: false,
productAttr: [],
productSelect: {},
deliveryType: [],
},
is_vip: 0, //是否是会员
storeInfo: {},
attrValue: '', //已选属性
currentPage: false,
tempArr: [],
headerHeight: 0,
conterTop: 0,
scrollTop: 0, //已滚动的距离
addressId: 0, // 配送地址id
addressList: [], // 配送地址列表
cartNums: 0
}
},
mounted() {
let default_delivery = this.info.default_delivery;
for (let i = 0; i < this.deliveryList.length; i++) {
if (this.deliveryList[i].key == 2 && (!this.info.store_self_mention || !this.info.is_store)) {
this.deliveryList.splice(i, 1);
i--;
}
}
if (this.deliveryList.length == 1) {
default_delivery = this.deliveryList[0].key;
}
this.collageDelivery = default_delivery;
this.collageStore = this.info;
this.where.store_id = this.info.id;
this.switchNumFun(default_delivery);
uni.$off('newCartNum');
uni.$on('newCartNum', (data) => {
if (data.length) {
this.tempArr.forEach((item) => {
data.forEach(j => {
if (item.id == j.product_id) {
item.cart_num = 0
}
})
})
this.cartNums = 0;
this.totalPrice = 0;
}
});
this.$eventHub.$off('onCartAddChange');
this.$eventHub.$on('onCartAddChange', (data) => {
let index = -1;
for (let i = 0; i < this.productList.length; i++) {
if (this.productList[i].id == data.id) {
index = i;
break;
}
}
if (data.spec_type) {
this.goCartDuo(data);
} else {
this.goCartDan(data, index, 1);
}
});
let view = uni.createSelectorQuery().in(this).select("#nav-box");
// 页面滚动
uni.$on('onPageScroll', ({
scrollTop
}) => {
this.scrollTop = scrollTop;
this.footerOpen = false;
this.currentPage = false;
view
.boundingClientRect((data) => {
this.conterTop = data.top;
})
.exec();
});
// 页面滚动到底部
uni.$on('onReachBottom', () => {
this.getProducts();
});
uni.$on('activeAddress', () => {
this.getAddressList();
});
this.getProducts(true);
this.getCartNum();
this.getCartList(1);
this.getAddressList();
},
methods: {
productslist() {
this.getProducts(true);
},
showMaoLocation() {
let data = {
latitude: Number(this.info.latitude),
longitude: Number(this.info.longitude),
name: this.info.name,
address: `${this.info.address}${this.info.detailed_address}`,
};
// #ifdef H5
if (this.$wechat.isWeixin()) {
data.scale = 13;
return this.$wechat.seeLocation(data);
}
// #endif
uni.openLocation(data);
},
// 选择品牌
brandChange(val) {
this.where.brand_id = val
},
// 选择分类
categoryChange(val) {
this.where.cid = val.cid
this.where.sid = val.sid
this.where.tid = val.tid
},
// 确认提交
submitFn(val) {
if (val == 1) {
this.getProducts(true)
this.$refs.popup.visible = false
} else if (val == 2) {
this.where.brand_id = ""
this.where.cid = ""
this.where.sid = ""
this.getProducts(true)
this.$refs.popup.visible = false
}
},
// 打开附近门店
goMap(val = 0) {
uni.navigateTo({
url: `/pages/store/store_list/index?storeFrom=1&type=1&storeId=${val ? this.collageStore.id : this.info.id}&isCollage=${val}`
});
},
// 打开客服
goKefu() {
this.getCustomerList()
this.$refs.kefu.show = true
},
// 购物车
shoppCart() {
uni.switchTab({
url: "/pages/order_addcart/order_addcart"
})
},
// 关闭客服
closeKefu() {
this.$refs.kefu.show = false
},
// 获取客服列表数据
getCustomerList() {
getCustomerList(this.where.store_id).then(res => {
this.customerList = res.data
})
},
// 去详情页
godDetail(item) {
this.currentPage = false
goShopDetail(item, this.uid).catch(res => {
uni.navigateTo({
url: `/pages/goods_details/index?id=${item.id}&fromType=1`
})
})
},
// 操作
set_where: function(e) {
switch (e) {
case 1:
this.active = 1
this.where.priceOrder = ""
this.where.salesOrder = ""
this.where.brand_id = ""
this.price = 0
break;
case 2:
if (this.price == 0) this.price = 1;
else if (this.price == 1) this.price = 2;
else if (this.price == 2) this.price = 0;
if (this.price == 1) {
this.where.priceOrder = "asc"
} else if (this.price == 2) {
this.where.priceOrder = "desc"
} else {
this.where.priceOrder = ""
}
this.active = 2
this.stock = 0;
break;
case 3:
if (this.stock == 0) this.stock = 1;
else if (this.stock == 1) this.stock = 2;
else if (this.stock == 2) this.stock = 0;
if (this.stock == 1) {
this.where.priceOrder = ""
this.where.salesOrder = "asc"
} else if (this.stock == 2) {
this.where.priceOrder = ""
this.where.salesOrder = "desc"
} else {
this.where.salesOrder = ""
}
this.active = 3
this.price = 0
break;
case 4:
this.getStoreCategory()
this.getStoreBrand()
this.$refs.popup.visible = true
this.loadend = false;
this.loading = false;
break;
}
if (e < 4) {
this.loadend = false;
this.$set(this.where, 'page', 1);
this.getProducts(true)
}
},
// 商品列表
getProducts(isPage) {
let that = this;
if (that.loadend) return;
if (that.loading) return;
if (isPage === true) {
// that.$refs.waterfallsFlow.refresh();
that.where.page = 1;
that.$set(that, 'productList', []);
}
that.loading = true;
that.loadTitle = '';
that.where.delivery_type = that.delivery_type;
getProducts(this.where).then(res => {
let list = res.data;
let productList = that.$util.SplitArray(list, that.productList);
let loadend = list.length < that.where.limit;
that.loadend = loadend;
that.loading = false;
that.loadTitle = loadend ? '没有更多内容啦~' : '加载更多';
that.$set(that, 'productList', productList);
that.$set(that.where, 'page', that.where.page + 1);
that.$set(that, 'tempArr', productList);
this.$nextTick(() => {
const query = uni.createSelectorQuery().in(this);
query
.select("#input-box")
.boundingClientRect((data) => {
this.headerHeight = data.height;
})
.exec();
// query
// .select("#nav-box")
// .boundingClientRect((data) => {
// this.conterTop = data.top;
// })
// .exec();
})
}).catch(err => {
that.loading = false;
that.loadTitle = '加载更多'
});
},
// 切换自提方式
swithFn(num) {
this.switchNumFun(num);
this.page = 1;
this.loadend = false;
this.tempArr = []
this.getProducts(true)
},
switchNumFun(num) {
switch (num) {
case 1:
this.switchNum = 1
this.delivery_type = '3'
break;
case 2:
this.switchNum = 2
this.delivery_type = '2'
break;
}
},
// 筛选-分类数据
getStoreCategory() {
let data = {
pid: 0
}
getStoreCategory(data).then(res => {
res.data.map(item => {
this.$set(item, 'disabled', false)
this.$set(item, 'current', 0)
// item.children.unshift({
// 'id': 0,
// 'cate_name': '全部'
// })
item.children.map(items => {
this.$set(items, 'disabled', false)
this.$set(items, 'current', 0)
// item.children.unshift({
// 'id': 0,
// 'cate_name': '全部'
// })
})
})
this.storeCategory = res.data
})
},
// 筛选-品牌数据
getStoreBrand() {
getStoreBrand(this.where).then(res => {
this.storeBrand = res.data
})
},
// #ifdef H5 || MP
onCollage() {
if (!this.isLogin) {
return toLogin();
}
hasCollage().then(res => {
const collageId = res.data.collageId;
if (collageId) {
uni.navigateTo({
url: `/pages/store/group_buy/index?collage_id=${collageId}`
});
} else {
this.collageVisible = true;
}
});
},
onCollageClose() {
this.collageVisible = false;
},
initCollage() {
let data = {
store_id: this.collageStore.id,
address_id: this.collageAddress.id || 0,
shipping_type: this.collageDelivery == 1 ? 3 : 2
};
initCollage(data).then(res => {
this.collageVisible = false;
uni.navigateTo({
url: `/pages/store/group_buy/index?collage_id=${res.data.collageId}`
});
}).catch(err => {
this.$util.Tips({
title: err
});
});
},
collageDeliveryChange(item, index) {
if (item.key != 2 || this.info.is_store) {
this.collageDelivery = item.key;
this.collageIndex = index;
}
},
onAddressChange(data) {
isWithin({
store_id: this.collageStore.id,
address_id: data.id
}).then(() => {
this.addressId = data.id;
}).catch(() => {
this.$util.Tips({
title: '您选择的地址超出门店配送范围,请重新选择'
});
});
},
// #endif
// 生成订单;
subOrder: function() {
let that = this,
list = that.cartData.cartList,
ids = [];
if (list.length) {
list.forEach(item => {
if (item.attrStatus && item.status) {
ids.push(item.id)
}
});
uni.navigateTo({
url: '/pages/goods/order_confirm/index?is_store=1&cartId=' + ids.join(',') + '&delivery_type=' + that.delivery_type + '&store_id=' + that.info.id
});
that.cartData.iScart = false;
} else {
return that.$util.Tips({
title: '请选择产品'
});
}
},
// 计算总价;
getTotalPrice: function() {
let that = this,
list = that.cartData.cartList,
totalPrice = 0.00;
list.forEach(item => {
if (item.attrStatus && item.status) {
totalPrice = that.$util.$h.Add(totalPrice, that.$util.$h.Mul(item.cart_num, item
.truePrice));
}
})
// if(num){
// data.forEach(item => {
// totalPrice = that.$util.$h.Sub(totalPrice, that.$util.$h.Mul(item.cart_num, item.sum_price));
// })
// }
that.$set(that, 'totalPrice', totalPrice);
},
getCartLists(iSshow) {
if (this.footerOpen) {
this.getCartList();
} else {
this.footerOpen = true;
}
},
getCartList(iSshow) {
let that = this;
let data = {
store_id: that.info.id
};
vcartList(data).then(res => {
that.$set(that.cartData, 'cartList', res.data);
if (res.data.length) {
that.$set(that.cartData, 'iScart', iSshow ? false : !that.cartData.iScart);
} else {
that.$set(that.cartData, 'iScart', false);
}
// that.getTotalPrice();
})
},
// 商品详情接口;
getAttrs(id) {
let that = this;
getAttr(id, 0).then(res => {
// uni.hideLoading();
that.$set(that.attr, 'productAttr', res.data.productAttr);
that.$set(that, 'productValue', res.data.productValue);
that.$set(that, 'is_vip', res.data.storeInfo.is_vip);
that.$set(that, 'storeInfo', res.data.storeInfo);
that.DefaultSelect();
})
},
moreNav() {
this.currentPage = !this.currentPage;
},
goodsListScroll() {
this.footerOpen = false;
this.currentPage = false;
},
getCartNum: function() {
let that = this;
getCartCounts(0, that.info.id).then(res => {
this.cartNums = res.data.count;
this.totalPrice = res.data.sum_price;
});
},
closeList(e) {
this.$set(this.cartData, 'iScart', e);
},
getAddressList() {
getAddressList({
page: 1,
limit: 100
}).then(res => {
let addressList = res.data;
this.addressList = addressList;
})
}
}
}
</script>
<style lang="scss">
.container {}
.activeColor {
color: var(--view-theme) !important;
}
.headerBg {
position: absolute;
top: 0;
left: 0;
width: 100%;
.image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.shade {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(180deg, rgba(0, 0, 0, 0.4047) 0%, #F5F5F5 100%);
}
}
.nav-box {
height: 98rpx;
}
.nav {
top: 0;
right: 0;
left: 0;
z-index: 10;
height: 98rpx;
font-size: 30rpx;
color: #666666;
background: #F5F5F5;
&.fixed {
background: #FFFFFF;
}
.iconfont {
margin-left: 6rpx;
vertical-align: middle;
font-size: 14rpx;
}
.icon-ic_sort {
margin-left: 8rpx;
font-size: 28rpx;
}
}
.list {
padding: 0 20rpx;
background: #F5F5F5;
}
.list .waterList {
margin-bottom: 60rpx;
}
.default {
padding: 0 20rpx;
}
.input-wrapper {
position: relative;
height: 78rpx;
padding: 0 24rpx;
.input {
flex: 1;
min-width: 0;
height: 58rpx;
padding-left: 24rpx;
border-radius: 29rpx;
background: rgba(255, 255, 255, 0.2);
font-size: 24rpx;
color: #FFFFFF;
.iconfont {
margin-right: 16rpx;
font-size: 32rpx;
}
}
.group-btn {
width: 80rpx;
height: 64rpx;
border-radius: 50%;
margin-left: 16rpx;
.img {
width: 100%;
height: 100%;
}
}
}
/* #ifdef H5 || MP */
.dialog {
padding: 44rpx 20rpx 0;
padding-bottom: constant(safe-area-inset-bottom);
padding-bottom: env(safe-area-inset-bottom);
border-radius: 40rpx 40rpx 0 0;
background: linear-gradient(180deg, #F5F5F5 0%, #F5F5F5 0%, #FFFFFF 100%);
}
.dialog-head {
padding: 0 24rpx;
font-weight: 500;
font-size: 32rpx;
color: #333333;
.btn {
width: 40rpx;
height: 40rpx;
cursor: pointer;
.iconfont {
font-size: 40rpx;
color: #BBBBBB;
}
}
}
.dialog-body {
margin-top: 48rpx;
.navbar {
flex-shrink: 0;
position: relative;
height: 82rpx;
.navbar-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 190rpx;
border-radius: 16rpx 16rpx 0 0;
background: #EEEEEE;
}
.active-bg {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 96rpx;
.image1 {
width: 50%;
height: 100%;
}
.image2 {
width: 48rpx;
height: 78rpx;
}
}
.inner {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
.item {
flex: 1;
min-width: 0;
font-size: 28rpx;
line-height: 44rpx;
color: #666666;
.iconfont {
display: none;
margin-right: 8rpx;
font-size: 36rpx;
}
&.on {
font-weight: 500;
font-size: 32rpx;
color: var(--view-theme);
.iconfont {
display: inline-block;
}
}
}
}
}
.dialog-content {
position: relative;
border-radius: 0 0 16rpx 16rpx;
background: #FFFFFF;
&.btl {
border-top-left-radius: 24rpx;
}
&.btr {
border-top-right-radius: 24rpx;
}
.link {
padding: 40rpx 32rpx;
font-size: 22rpx;
line-height: 30rpx;
color: #999999;
.title {
margin-bottom: 16rpx;
font-weight: 500;
font-size: 28rpx;
line-height: 40rpx;
color: #333333;
}
.iconfont {
font-size: 32rpx;
}
}
}
.address-box {
.list {
padding: 36rpx 32rpx;
background-color: transparent;
}
.item {
margin-top: 32rpx;
color: #333333;
&:first-child {
margin-top: 0;
}
.text {
flex: 1;
}
.info {
font-weight: 500;
font-size: 28rpx;
line-height: 40rpx;
}
.name {
margin-top: 8rpx;
font-size: 22rpx;
line-height: 30rpx;
color: #999999;
}
.iconfont {
visibility: hidden;
font-size: 36rpx;
}
&.on {
color: var(--view-theme);
.name {
color: var(--view-theme);
}
.iconfont {
visibility: visible;
}
}
}
}
.btn-box {
height: 88rpx;
font-size: 24rpx;
line-height: 34rpx;
color: #666666;
.iconfont {
margin-left: 4rpx;
font-size: 24rpx;
}
}
.store-box {
padding: 40rpx 28rpx 40rpx 32rpx;
.text {
flex: 1;
}
.name {
font-weight: 500;
font-size: 28rpx;
line-height: 40rpx;
color: #333333;
}
.info {
margin-top: 16rpx;
font-size: 22rpx;
line-height: 30rpx;
color: #999999;
}
.value {
flex: 1;
}
.iconfont {
margin-right: 12rpx;
font-size: 22rpx;
}
.map-box {
position: relative;
width: 188rpx;
height: 104rpx;
margin-left: 32rpx;
.map {
width: 100%;
height: 100%;
}
.img-box {
position: absolute;
bottom: 16rpx;
left: 50%;
width: 52rpx;
height: 52rpx;
padding: 6rpx;
border-radius: 6rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 12rpx 0rpx rgba(0, 0, 0, 0.0784);
transform: translateX(-50%);
}
.img {
width: 100%;
height: 100%;
border-radius: 6rpx;
}
.range {
position: absolute;
top: -40rpx;
left: 50%;
height: 36rpx;
padding: 0 16rpx;
border-radius: 6rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 16rpx 0rpx rgba(0, 0, 0, 0.0784);
transform: translateX(-50%);
white-space: nowrap;
font-size: 20rpx;
line-height: 36rpx;
color: #333333;
&::after {
content: "";
position: absolute;
bottom: 0;
left: 50%;
width: 0;
height: 0;
border-width: 5rpx 9rpx;
border-style: solid;
border-color: #FFFFFF transparent transparent;
transform: translate(-50%, 100%);
}
}
.dot {
position: absolute;
bottom: -10rpx;
left: 50%;
width: 6rpx;
height: 6rpx;
border-radius: 50%;
background: var(--view-theme);
transform: translateX(-50%);
}
}
}
}
.dialog-foot {
padding: 20rpx 0;
.btn {
height: 72rpx;
border-radius: 36rpx;
background: var(--view-theme);
text-align: center;
font-weight: 500;
font-size: 26rpx;
line-height: 72rpx;
color: #FFFFFF;
}
}
/* #endif */
.page {
position: relative;
}
.store-section {
padding: 20rpx;
.panel {
padding: 0 32rpx 32rpx;
border-radius: 16rpx;
background: #FFFFFF;
}
.store-name {
height: 92rpx;
.name-wrap {
flex: 1;
min-width: 0;
}
.name-inner {
display: inline-flex;
max-width: 100%;
}
.name {
flex: 1;
min-width: 0;
margin: 0 8rpx 0 10rpx;
font-weight: 500;
font-size: 30rpx;
color: #333333;
}
.iconfont {
font-size: 32rpx;
color: #333333;
}
.tips {
font-size: 24rpx;
color: var(--view-theme);
}
}
.address-wrap {
.address-box {
flex: 1;
min-width: 0;
font-size: 22rpx;
color: #666666;
}
.address-info {
margin-top: 20rpx;
line-height: 34rpx;
}
.distance {
position: relative;
padding-right: 12rpx;
margin-right: 12rpx;
&::after {
content: "";
position: absolute;
top: 50%;
right: 0;
width: 1rpx;
height: 18rpx;
background: #CCCCCC;
transform: translateY(-50%);
}
}
.btn {
position: relative;
padding-left: 24rpx;
margin-left: 24rpx;
text-align: center;
font-size: 20rpx;
color: #333333;
&::before {
content: "";
position: absolute;
top: 50%;
left: 0;
width: 2rpx;
height: 24rpx;
background: #EEEEEE;
transform: translateY(-50%);
}
&:first-child::before {
display: none;
}
.iconfont {
display: inline-block;
margin-bottom: 8rpx;
font-size: 40rpx;
}
}
}
.switch {
width: 192rpx;
height: 48rpx;
background: #F5F5F5;
border-radius: 24rpx;
.btn {
width: 96rpx;
height: 48rpx;
border-radius: 24rpx;
text-align: center;
font-size: 24rpx;
line-height: 48rpx;
color: #999999;
&.on {
background: var(--view-theme);
color: #FFFFFF;
}
}
}
}
.line-left {
position: absolute;
top: 50%;
left: 0;
width: 1rpx;
height: 26rpx;
background: #CCCCCC;
transform: translateY(-50%);
}
.filter-btn {
position: relative;
padding: 0 32rpx;
}
</style>