| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610 | <template>	<view class="">		<mescroll-body :sticky="true" ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback">			<view class="padding-lr padding-top-sm bg flex " @click.stop="goSearch(1)">				<view class="flex justify-between margin-right-sm" @tap.stop="goSelectCity" style="line-height: 68rpx;">					<image src="../../static/images/index/place.png" style="width: 27rpx;height: 37rpx;"						class="margin-top-xs"></image>					<view class="localName text-white margin-left-sm">{{city}}</view>				</view>				<u-search class="flex-sub" placeholder="搜索你需要的服务" shape="square" disabled :show-action="false"					:animation="true" bg-color="#F7F7F7" color="#1A1A1A"></u-search>			</view>			<view v-if="tabIndex == 0" class="bg">				<view class="padding-lr-sm ">					<swiper class="screen-swiper" style="height: 260rpx;" :circular="true" :autoplay="true"						interval="2500" duration="800">																		<swiper-item v-for="(item,index) in swiperList" :key="index">							<image :src="item.imageUrl" mode="aspectFit" class="radius"></image>						</swiper-item>					</swiper>				</view>				<view class="bg" style="color: #333333;">					<u-grid :col="5" :border="false">						<u-grid-item v-for="(item,index) in gridData" :key='index' @click="goNav(item.url)">							<image :src="item.imageUrl" style="width: 92rpx;height: 92rpx;border-radius: 92rpx;">							</image>							<view class="grid-text" style="font-size: 25rpx;margin-top: 10rpx;">{{item.name}}</view>						</u-grid-item>					</u-grid>				</view>			</view>			<ren-dropdown-filter :filterData='filterData' :border="false" :defaultIndex='defaultIndex'				@onSelected='change' class="u-skeleton-rect">			</ren-dropdown-filter>			<view style="background-color: #FFFFFF;" v-if="orderList.length">				<view class="flex margin-bottom-sm bg padding-sm radius margin-lr-sm margin-top-sm "					v-for="(item,index) in orderList" :key='index' @click="goOrder(item)" style="box-shadow: 6rpx 10rpx 4px #F5F5F5;">					<view style="width: 220upx;height: 160upx;border-radius: 10rpx;">						<image :src="item.massageImg?item.massageImg: '../../static/logo.png'"							style="width: 220upx;height: 160upx;border-radius: 10upx;"></image>					</view>					<view class="margin-left text-white flex flex-direction" style="width: 65%;">						<view class="flex justify-between">							<view class="text-bold text-lg margin-left-xs">{{item.title}}</view>							<view style="color: #999999;font-size: 22upx;">已售{{item.sales}}</view>						</view>						<view class="flex flex-wrap" style="margin-top: 10rpx;" v-if="item.labels.length>0">							<text class="margin-bottom-xs box" v-for="(items,index) in item.labels"								:key="index">{{items}}</text>						</view>						<!-- <view class="text-cut" style="color: #999999;">{{item.describes}}</view> -->						<view style="width: 100%;display: flex;justify-content: space-between;align-items: center;">							<view style="color:#FF1200;font-size: 24upx;" v-if="isVip == false">								¥<text									style="font-size: 32upx;font-weight: bold;">{{item.price}}/</text>{{item.duration}}分钟							</view>							<view style="color:#FF1200;font-size: 24upx;" v-else>								¥<text									style="font-size: 32upx;font-weight: bold;">{{item.memberPrice}}/</text>{{item.duration}}分钟							</view>							<!-- <view class="text-green text-df">								¥<text									class="text-green text-xl text-bold">{{item.price}}</text>/<text class="text-sm">会员价:¥{{item.memberPrice}}</text>/</text>{{item.duration}}分钟							</view> -->							<view v-if="XCXIsSelect != '否'"								style="background: #2FB57A;color: #ffffff;line-height: 56upx;border-radius: 8rpx;font-size: 24upx;padding: 0upx 23upx;"								>								选择技师							</view>						</view>					</view>				</view>			</view>			<empty v-if="orderList.length == 0"></empty>		</mescroll-body>		<!-- <u-skeleton :loading="loading" :animation="true" elColor='#FFFFFF' bgColor='#FFFFFF'></u-skeleton> -->	</view></template><script>	import MescrollMixin from "@/components/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";	import mescrollBody from "@/components/mescroll-uni/components/mescroll-body/mescroll-body.vue";	import meTabs from "@/components/mescroll-uni/me-tabs/me-tabs.vue";	import empty from '@/components/empty.vue'	import RenDropdownFilter from '@/components/ren-dropdown-filter/ren-dropdown-filter.vue'	export default {		mixins: [MescrollMixin], // 使用mixin		components: {			mescrollBody,			meTabs,			empty,			RenDropdownFilter		},		data() {			return {				loading: true, // 是否显示骨架屏组件				defaultSelected: [],				tabIndex: 0, // tab下标				tabData: [{					createTime: "",					gameName: '推荐',					gameImg: "",					id: 0,					status: 0,					updateTime: "",				}],				swiperList: [],				gridData: [],				value1: 0,				value2: 0,				value3: 0,				game: [],				defaultIndex: [0, 0, 0],				filterData: [					[{						label: '推荐',						value: '',					}, ],					[{							label: '价格',							value: '0',						},						{							label: '从高到低',							value: '1',						},						{							label: '从低到高',							value: '2',						}					],					[{							label: '销量',							value: '0',						},						{							label: '从高到低',							value: '1',						},						{							label: '从低到高',							value: '2',						}					],				],				city: '请选择城市',				latitude: '',				longitude: '',				orderList: [],				token: '',				XCXIsSelect: '否',				isVip: false,				myId: uni.getStorageSync('userId') ? uni.getStorageSync('userId') : '',				showModal: true,				arr: [],				tab: '',				age: 0,				birthDate: ''			}		},		onLoad(e) {			let that = this			that.XCXIsSelect = that.$queue.getData('XCXIsSelect');			uni.getLocation({				type: 'gcj02',				geocode: true, //设置该参数为true可直接获取经纬度及城市信息				success: function(res) {					console.log(res, '地理位置')					that.latitude = res.latitude					that.longitude = res.longitude					uni.setStorageSync('latitude', res.latitude)					uni.setStorageSync('longitude', res.longitude)					// #ifdef APP-PLUS					that.city = res.address.city					that.selectCity(that.longitude, that.latitude);					uni.setStorageSync('city', res.address.city)					let data = {						num: 1,						size: 10					}					that.getData(data)					// #endif					// #ifdef H5					that.selectCity(that.longitude, that.latitude);					// #endif					// #ifdef MP-WEIXIN					that.selectCity(that.longitude, that.latitude);					// uni.request({					// 	url: 'https://apis.map.qq.com/ws/geocoder/v1/?location=' + that.latitude +					// 		',' + that.longitude + '&key=5DLBZ-QYMR6-334SQ-MOZUI-Z3GVO-SBFB4',					// 	success(re) {					// 		if (re.statusCode === 200) {					// 			let citydata = re.data.result.address_component.city					// 			// console.log("获取城市名称成功", citydata)/					// 			that.city = citydata ? citydata : '未知'					// 			uni.setStorageSync('city', citydata)					// 			let data = {					// 				num: 1,					// 				size: 10					// 			}					// 			that.getData(data)					// 		} else {					// 			console.log("获取信息失败,请重试!")					// 		}					// 	}					// });					// #endif				},				fail: function() {					console.log('获取地址失败')				}			})			// 获取邀请码保存到本地			if (e.invitation) {				that.$queue.setData('inviterCode', e.invitation);			}			if (this.myId) {				that.$Request.getT('/app/common/type/250').then(res => { //技师完成通知					if (res.code == 0) {						if (res.data && res.data.value) {							that.arr.push(res.data.value)						}					}				})				that.$Request.getT('/app/common/type/248').then(res => { //技师取消通知					if (res.code == 0) {						if (res.data && res.data.value) {							that.arr.push(res.data.value)						}					}				})			}		},		onShow() {			let that = this			that.city = uni.getStorageSync('city') ? uni.getStorageSync('city') : '请选择城市'			that.getBannerList()			that.getGrid()			// that.getRenZheng()			that.token = uni.getStorageSync('token')			if (uni.getStorageSync('token')) {				that.getIsVip()			}			that.myId = uni.getStorageSync('userId')			// #ifdef MP-WEIXIN			//订阅			if (that.myId) {				if (this.showModal) {					this.openMsg()				}			}			// #endif			let data = {				num: 1,				size: 10			}			that.getData(data)			// that.mescroll.resetUpScroll()		},		methods: {			selectCity(longitude, latitude) {				this.$Request.get('/app/Login/selectCity?lat=' + latitude + '&lng=' + longitude).then(res => {					if (res.code == 0) {						this.city = res.data.city ? res.data.city : '未知'						uni.setStorageSync('city', res.data.city)						let data = {							num: 1,							size: 10						}						this.getData(data)					}				});			},			// 开启订阅消息			openMsg() {				console.log('订阅消息')				var that = this				uni.getSetting({					withSubscriptions: true, //是否获取用户订阅消息的订阅状态,默认false不返回					success(ret) {						console.log(ret.subscriptionsSetting, '------------------')						// if (ret.subscriptionsSetting.itemSettings && Object.keys(ret.subscriptionsSetting.itemSettings).length == 2) {						if (ret.subscriptionsSetting.itemSettings) {							uni.setStorageSync('sendMsg', true)							uni.openSetting({ // 打开设置页 								success(rea) {									console.log(rea.authSetting)								}							});						} else { // 用户没有点击“总是保持以上,不再询问”则每次都会调起订阅消息							uni.setStorageSync('sendMsg', false)							uni.showModal({								title: '提示',								content: '为了更好的体验,请绑定消息推送',								confirmText: '确定',								cancelText: '取消',								success: function(res) {									if (res.confirm) {										wx.requestSubscribeMessage({											tmplIds: that.arr,											success(re) {												var datas = JSON.stringify(re);												if (datas.indexOf("accept") != -1) {													console.log(re)													// uni.setStorageSync('sendMsg', true)												}											},											fail: (res) => {												console.log(res)											}										})										// uni.setStorageSync('sendMsg', true)										that.showModal = false									} else if (res.cancel) {										console.log('取消')										// uni.setStorageSync('sendMsg', false)										that.showModal = true									}								}							})						}					}				})			},			getIsVip() {				this.$Request.get("/app/UserVip/isUserVip").then(res => {					if (res.code == 0) {						this.isVip = res.data						uni.setStorageSync('isVIP', res.data)					}				});			},			/*下拉刷新的回调 */			downCallback() {				// 这里加载你想下拉刷新的数据, 比如刷新轮播数据				// loadSwiper();				// 下拉刷新的回调,默认重置上拉加载列表为第一页 (自动执行 page.num=1, 再触发upCallback方法 )				// this.$refs.uDropdown.close();				this.mescroll.resetUpScroll()			},			/*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */			upCallback(page) {				this.getData(page)			},			getData(page) {				let data = {					// id: curTab,					page: page.num,					limit: page.size,					status: 1,					// isRecommend: num,					condition: this.value1, //智能优选					by: this.value2, //销量					authentication: this.value3, //价格					latitude: this.latitude,					longitude: this.longitude,					city: this.city				}				this.$Request.get("/app/artificer/selectMassageTypePage", data).then(res => {					this.mescroll.endBySize(res.data.list.length, res.data.list)					this.loading = false;					if (res.code == 0) {						if (page.num == 1) {							this.orderList = res.data.list							for (let i = 0; i < this.orderList.length; i++) {								this.orderList[i].labels = this.orderList[i].labels.split(",");							}						} else {							this.orderList = [...this.orderList, ...res.data.list]							for (let i = 0; i < this.orderList.length; i++) {								this.orderList[i].labels = this.orderList[i].labels.split(",");							}						}					}					this.mescroll.endSuccess(res.data.list.length); // 隐藏加载状态栏				}).catch(() => {					//联网失败, 结束加载					this.mescroll.endErr();				});				// this.getClassfly()				this.getBannerList()				this.getGrid()			},			// 切换菜单			tabChange() {				if (uni.getStorageSync('sendMsg')) {					wx.requestSubscribeMessage({						tmplIds: this.arr,						success(re) {							var datas = JSON.stringify(re);							if (datas.indexOf("accept") != -1) {}						},						fail: (res) => {							console.log(res)						}					})				}				this.defaultIndex = [0, 0, 0]				// this.$refs.uDropdown.close();				// this.orderList = []; // 置空列表,显示加载进度条				this.mescroll.resetUpScroll()			},			// 筛选			change(e) {				console.log(e)				this.value1 = e[0][0].value				this.value3 = e[1][0].value				this.value2 = e[2][0].value				this.mescroll.resetUpScroll()			},			// 选择城市			goSelectCity() {				uni.navigateTo({					url: '/pages/index/citys/citys'				});			},			// 跳转游戏列表			goNav(url) {				if (uni.getStorageSync('sendMsg')) {					wx.requestSubscribeMessage({						tmplIds: this.arr,						success(re) {							var datas = JSON.stringify(re);							if (datas.indexOf("accept") != -1) {								console.log(re)							}						},						fail: (res) => {							console.log(res)						}					})				}				if (url.indexOf('/pages/') !== -1) {					uni.navigateTo({						url					});				} else {					//#ifndef H5					uni.navigateTo({						url: '/pages/index/webView?url=' + url					});					//#endif					//#ifdef H5					window.location.href = url;					//#endif				}			},			//获取轮播图			getBannerList() {				this.$Request.get("/app/banner/selectBannerList", {					classify: 1				}).then(res => {					if (res.code == 0) {						this.swiperList = res.data					}				});			},			// 获取金刚区分类			getGrid() {				this.$Request.get("/app/banner/selectBannerList", {					classify: 2				}).then(res => {					if (res.code == 0) {						this.gridData = res.data						// console.log(this.gridData, ';;;;;;')					}				});			},			// 跳转搜索			goSearch(index) {				if (uni.getStorageSync('sendMsg')) {					console.log('授权+1')					wx.requestSubscribeMessage({						tmplIds: this.arr,						success(re) {							var datas = JSON.stringify(re);							if (datas.indexOf("accept") != -1) {								console.log(re)							}						},						fail: (res) => {							console.log(res)						}					})				}				uni.navigateTo({					url: '/pages/index/search/index?index=' + index				});			},			// 跳转订单			goOrder(e) {				console.log('授权', uni.getStorageSync('sendMsg'))				if (uni.getStorageSync('sendMsg')) {					wx.requestSubscribeMessage({						tmplIds: this.arr,						success(re) {							var datas = JSON.stringify(re);							if (datas.indexOf("accept") != -1) {								console.log(re)							}						},						fail: (res) => {							console.log(res)						}					})				}				if (this.token) {					uni.navigateTo({						url: '/pages/index/order/order?massageTypeId=' + e.massageTypeId					});				} else {					uni.navigateTo({						url: '/pages/public/login'					});				}			},		}	}</script><style lang="scss">	page {		background-color: #FFFFFF;	}	.bg {		background: #FFFFFF;	}	.sticky-tabs {		z-index: 990;		position: sticky;		top: var(--window-top);		// background-color: #fff;	}	/* // 使用mescroll-uni,则top为0 */	.mescroll-uni,	/deep/.mescroll-uni {		.sticky-tabs {			top: 0;		}	}	.demo-tip {		padding: 18upx;		font-size: 24upx;		text-align: center;	}	.line_s {		display: inline-flex;		width: 10rpx;		height: 10rpx;		background: #1AD566;		border-radius: 50%;		margin-right: 10rpx;	}	.line_x {		display: inline-flex;		width: 10rpx;		height: 10rpx;		background: #000000;		border-radius: 50%;		margin-right: 10rpx;	}	.box {		// border: 3rpx solid #005dff;		background: #E8FAE1;		color: #2FB57A;		padding: 5rpx 15rpx;		font-size: 24upx;		letter-spacing: 2rpx;		border-radius: 8rpx;		// margin-top: 10rpx;		margin-right: 8upx;	}</style>
 |