| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568 | <template>	<ax-body hide-indicator-area :style="[StyleSheet]">		<!-- 标题栏 -->		<template #title>			<view class="titlebar">				<image src="@/static/img/title.png" class="page-title"></image>				<!-- <text class="page-subtitle">“特惠充电享不停”</text> -->			</view>		</template>		<view class="base">			<!-- 搜索块 -->			<view id="search" class="app-flex search-view">				<view class="locate-city">					<image src="@/static/img/locate.svg" class="_icon"></image>					<text class="__name">{{city.data[city.index].text}}</text>				</view>				<label class="search-bar" @click="$app.url.goto('/pages/search/search')">					<input placeholder-class="app-placeholder" placeholder="输入目的地/电站名" />					<image src="@/static/img/search.svg" class="_icon-search"></image>				</label>			</view>		</view>		<view class="arrears-tips" v-if="payment_msg!=null">			<view class="arrears-left">				<image class="arrears-icon" src="@/static/img/arrears-icon.svg" mode=""></image>				<view class="arrears-text">您有一笔超充订单{{(payment_msg.maspAmount+payment_msg.maspRealAmount).toFixed(2)}}元待补缴</view>			</view>			<view class="arrears-btn" @click="topage_coupon">去补缴</view>		</view>		<!-- 主滚动 -->		<view class="main-scroll-wrap">			<scroll-view class="root-scroll app-hide-scrollbar" @scrolltolower="scrollLock=true" @scrolltoupper="scrollLock=false" scroll-y>				<view class="contet-root">					<!-- 内容顶部 -->					<view id="roller" class="base">						<!-- 快捷栏 -->						<view class="shortcut-bar">							<view class="_item" @click="$app.url.goto('/pages/order/order')">								<image src="@/static/img/shortcut1.png" class="_icon"></image>								<view class="_name">订单中心</view>							</view>							<view class="_item" @click="$app.url.goto('/pages/coupon-buy/coupon-buy')">								<image src="@/static/img/shortcut2.png" class="_icon"></image>								<view class="_name">购充电券</view>							</view>							<view class="_item" @click="customerService()">								<image src="@/static/img/shortcut3.png" class="_icon"></image>								<view class="_name">在线客服</view>							</view>							<view class="_item" @click="$app.url.goto('/pages/feedback/feedback')">								<image src="@/static/img/shortcut4.png" class="_icon"></image>								<view class="_name">意见反馈</view>							</view>						</view>						<!-- 版头广告 -->						<swiper class="banner" v-if="banners.length>0" autoplay="true" >							<swiper-item v-for="(item,index) in banners" :key="index" @click="$app.url.goto(item.jumpPage)">								<view class="swiper-item">									<image   @load="bannerLoadCompleted()" :src="showImg(item.pic)" class="swiper-item-image" mode="widthFix"></image>								</view>							</swiper-item>						</swiper>					</view>					<view id="fixed" class="base">						<!-- 选项条 -->						<view class="app-flex options-bar">							<view class="app-flex middle option-wrap">								<view v-for="(item,index) in sorts.data" :key="index" @click="changeSort(index)" 								class="option-item" :class="{active:sorts.index==index}">{{item.name}}</view>							</view>							<view class="app-flex c-center separ"></view>							<view @click="$app.url.goto('/pages/map/map',false)" class="app-flex middle map-mode">								<image src="@/static/img/map.svg" class="_icon"></image>								<text>地图模式</text>							</view>						</view>					</view>					<!-- 电站列表 -->					<view id="list-box" class="list-scroll-wrap">						<scroll-view class="list-scroll" :scroll-y="scrollLock">							<view class="list">								<view v-for="(item,index) in list.data" :key="index" @click="gotoSiteDetail(item)" class="item">									<view class="contet">										<view class="name">											<view class="icon"><image src="@/static/img/plug.svg" mode="widthFix"></image></view>											<view class="txt">{{item.name}}</view>										</view>										<view class="parkade">											<view class="icon"><image src="@/static/img/parkade.svg" mode="widthFix"></image></view>											<!-- <view class="txt"><rich-text :nodes="item.parkTips"></rich-text></view> -->											<view class="txt">充电减免2小时停车费,超出时长部分计时收费</view>										</view>										<view class="app-flex c-between info">											<view class="app-flex middle">												<view class="charge"><text class="icon">快</text><text class="value">{{item.params.emptyFast}}</text><text class="max">{{item.params.totalFast}}</text></view>												<view class="charge"><text class="icon blue">慢</text><text class="value">{{item.params.emptySlow}}</text><text class="max">{{item.params.totalSlow}}</text></view>											</view>											<view class="discount" v-if="discountInfo">												<view>													{{discountInfo.temp2}}												</view>											</view>											<view class="distance">												<view class="icon"><image src="@/static/img/distance.svg" mode="widthFix"></image></view>												<text>{{item.params.rangeShow}}</text>											</view>										</view>									</view>									<view class="price">										<!-- v-if="user_info.firmId===null" -->										<view class="app-flex middle" style="color: #FF5D50;" v-if="user_info.firmType===0||user_info.firmId===null||user_info===null">											<text class="value">{{item.params.nowPrice?item.params.nowPrice.toFixed(4):"0.0000"}}</text>											<text class="unit">元/度</text>										</view>										<view class="app-flex middle" v-else>											<view class="card-bottom-text">												<text>{{item.params.firmPrice.toFixed(4)}}</text>												<text class="mini-text">元/度</text>											</view>											<view class="operation-price-btn">												企业专享价											</view>											<view class="ordinary-price">{{item.params.nowPrice?item.params.nowPrice.toFixed(4):"0.0000"}}</view>										</view>										<view>{{item.params.priceShow}}</view>									</view>								</view>							</view>						</scroll-view>					</view>					<!-- <view style="height: 158px;"></view> -->				</view>			</scroll-view>		</view>		<ax-popup ref="filter" position="" maskType="black" maskEnable maskClose>			<view class="ad-popup">				<view class="close-get" @click="$refs.filter.close()">X</view>				<swiper class="ad-swiper" :autoplay="true" :interval="3000" :duration="1000">					<swiper-item class="ad-swiper-item" v-for="(item,index) in adBanner" :key="index">						<image class="ad-image" :src="showImg(item.picture)" mode="widthFix"></image>					</swiper-item>				</swiper>			</view>		</ax-popup>		<app-navigation id="app-navigation" active="home"></app-navigation>	</ax-body></template><script>	var bmap = require('static/js/bmap-wx.js'); 	export default {		async onLoad(options) {			const permit = await this.queryPermit();			if(permit.privacy){				// 没有通过隐私协议				this.privacy.visible = true;			}else{				// 已通过隐私协议				if(permit.location===true){					// 可以调用定位能力					this.updateLocation();				}else if(permit.location===false){					// 通过了隐私协议,但是定位被拒绝					this.location.visible = true;					this.updateLocation();				}else if(permit.location===undefined){					// 没有申请过定位能力					this.updateLocation();				}			}						if (options.hasOwnProperty('q') && options.q) {			    // 通过下面这步解码,可以拿到url的值				const url = decodeURIComponent(options.q)				// 对url中携带的参数提取处理				console.log("url:"+url)				var device_no = this.getQueryParams(url,"connectorCode")				console.log("device_no:"+device_no)				if(device_no){					this.getDeviceInfo(device_no)				}							}			// this.user_info=this.$app.storage.get('USER_INFO')		},		mounted() {			if(this.adBanner.length>0){				this.$refs.filter.open();			}			this.setListHeight();			this.setAppNavigationHeight();			this.get_frimid()			this.get_userinfo()			this.get_paymentMsg()		},		data() {			return {				payment_msg:null,				user_info:{},				// 导航栏高度				appNavigationHeight: 0,				// 页面滚动锁				scrollLock: true,								sorts:{					index: 0,					data: [{name:'离我最近',code:"range"},{name:'空闲最多',code:"device"},{name:'电费最低',code:"price"}]				},				list:{					height: 0,					data: []				},				banners:[],				adBanner:[],				location:{					visible: false,					value: '',				},				privacy:{					visible: false,				},				city:{					index: 0,					data:[						{text:'贵阳',areaCode:"5201"},						{text:'六盘水',areaCode:"5202"},						{text:'遵义',areaCode:"5203"},						{text:'安顺',areaCode:"5204"},						{text:'毕节',areaCode:"5205"},						{text:'铜仁',areaCode:"5206"},						{text:'黔东南',areaCode:"5226"},						{text:'黔南',areaCode:"5227"},						{text:'黔西南',areaCode:"5223"},					]				},				discountInfo:null			}		},		onShow() {			this.getBanners()			this.getAdswiper()		},		computed:{			StyleSheet(){				return {					'--app-navigation-heiht': `${this.appNavigationHeight}px`,					'--list-heiht': `${this.list.height}px`				}			}		},		onShareAppMessage(res) {			if (res.from === 'button') {				// 来自页面内分享按钮				console.log(res.target);			}			return {				title: "用券充天天都享会员价", // 标题				path: "/pages/index/index", // 分享路径				imageUrl: '../../static/img/share.jpg', // 分享图				desc: '用券充天天都享会员价'			};		},		onShareTimeline() {			return {				title: "用券充天天都享会员价", // 标题				path: "/pages/index/index", // 分享路径				imageUrl: '../../static/img/share.jpg'// 分享图			};		},		methods: {			get_userinfo(){				this.$api.base("post", "/userApi/getUserAccount", {}, {error:false}).then(res => {					this.user_info = res.accountInfo					this.$app.storage.set('USER_INFO', res.accountInfo);				})			},			// 企业用户扫码进入			get_frimid(){				if(this.$app.storage.get('FRIM_ID')){					if(this.$app.storage.get('USER_TOKEN')){						this.$api.base("post","/userApi/add-firm-user?firmId="+parseInt(this.$app.storage.get('FRIM_ID')),{},{error: false}).then(res=>{							this.get_userinfo()							setTimeout(()=>{								this.$app.storage.remove('FRIM_ID')							},500)							this.$app.popup.alert(res.msg);						}).catch(err=>{							setTimeout(()=>{								this.$app.storage.remove('FRIM_ID')							},500)							// this.$app.popup.alert(err.msg)						})					}else{						uni.showModal({							title:'未登录',							content:'你还未进行登录,请去登录',							showCancel:false,							success:function(res) {								if(res.confirm){									uni.navigateTo({										url:'/pages/login/login'									})								}							}						})					}				}			},			getDeviceInfo(sn){				this.$api.base("post","/chargeApi/checkDevicesBySn",{"sn":sn},{}).then(res=>{					var item = res.device;					//设备状态 0:离网1:空闲2:占用(未充电)3:占用(充电中)4:占用(预约锁定)255:故障					if(item.deviceStatus == 0 || item.deviceStatus == 255 ){						return;					}					this.$app.url.goto('/pages/terminal/terminal?deviceId='+item.id+"&deviceStatus="+item.deviceStatus);				})			},			getQueryParams(url,key) {  			    const queryString = url.split('?')[1] || '';  			    const params = {};  			    const pairs = queryString.split('&');  			  			    pairs.forEach(pair => {  			        const [key, value] = pair.split('=');  			        params[decodeURIComponent(key)] = decodeURIComponent(value || '');  			    });  			  			    return params[key];  			}, 			showImg(img){				return this.$config.url.request+img			},			// 打开客服			customerService(){				const cs = this.$config.customerService;				this.$app.act.customerService(cs.id,cs.url).catch(err=>{					console.log(err);					this.$app.popup.alert('客服中心失联啦,请联系管理员!');				});			},			// 查询许可			queryPermit(){				return new Promise((resolve,reject)=>{					const data = {};					const check = ()=>{						if( Object.keys(data).length == 2 ) resolve(data);					}					if(uni.getPrivacySetting){						uni.getPrivacySetting({							success: res => {								data.privacy = res.needAuthorization;							},							complete: () => {								if(typeof data.privacy !='boolean' && typeof data.privacy !='undefined') data.privacy = null;								check();							},						});					}else{						data.privacy = false;					}					uni.getSetting({						success: res => {							data.location = uni.getLocation ? res.authSetting['scope.userLocation'] : undefined;						},						complete: () => {							if(typeof data.location !='boolean' && typeof data.location !='undefined') data.location = null;							check();						},					})				});			},			// 更新位置			updateLocation(){				this.getLocation().then(res=>{					this.location.value = [res.longitude,res.latitude].join(',');					this.getStations(res.longitude,res.latitude)					this.$app.storage.set('USER_LOCATION',this.location.value);					return this.reverseGeocoder([res.latitude,res.longitude].join(','))				});			},			// 获取定位			getLocation(){				return new Promise((resolve,reject)=>{					// this.loading.visible = true;					if(uni.getLocation){						uni.getLocation({							success: res => resolve(res),							fail: err => {								console.log(err)								console.log('定位失败');								// this.location.visible = true;								this.getStations("","")							},							complete: () => {															}						})					}else{						console.log('微信版本太低,无定位接口可用');						resolve({longitude:'',latitude:''});					}				});			},			reverseGeocoder(latlon){				console.log(latlon)				let lat = latlon.split(",")[0]				let lng = latlon.split(",")[1]				let baiduLoc = this.convertGcj02ToBd09(lng,lat)				latlon = baiduLoc.lat+","+baiduLoc.lng				console.log(latlon)				return new Promise((resolve,reject)=>{					var BMap = new bmap.BMapWX({ 					            ak: 'vtQgaPzonb3H4qeUOWGr53ePcNCsmdMj' 					        }); 					BMap.regeocoding({						location:latlon,						success:res=>{														let code = res.originalData.result.addressComponent.adcode.substr(0,4)							for (var i = 0; i < this.city.data.length; i++) {								if(this.city.data[i].areaCode==code){									this.city.index = i									break;								}							}							console.log(res)						},						fail:err=>{							console.log(err)						}					})				});			},			get_paymentMsg(){				// maspStatus(1:待补缴,2:已补缴)realPredictServiceCost平台;maspAmount第三方				this.$api.base("post","/chargeApi/queryOrderList-arrearage",{},{}).then(res=>{					this.payment_msg=res.data				})			},			getBanners(){				this.$api.base("post","/userApi/getBanners",{},{}).then(res=>{					this.banners = res.banners				})			},			getAdswiper(){				this.$api.base("post","/userApi/getAdvertising",{},{}).then(res=>{					this.adBanner = res.banners				})			},			convertBdToTx(lng, lat) {  			    // 百度坐标系(BD09)转火星坐标系(GCJ-02,即腾讯地图使用的坐标系)  			    // 这里的转换公式是基于经验公式,可能存在一定的误差  			    let x_pi = 3.14159265358979324 * 3000.0 / 180.0;  			    let x = lng - 0.0065;  			    let y = lat - 0.006;  			    let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);  			    let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);  			    let lngs = z * Math.cos(theta);  			    let lats = z * Math.sin(theta);  			    return { lng: lngs, lat: lats };  			},			getStations(lng,lat){				this.$api.base("post","/chargeApi/getStations",{order:this.sorts.index,lat,lng},{}).then(res=>{					res.stationList.forEach(i=>{						var txPoint = this.convertBdToTx(i.lng,i.lat)						i.lng = txPoint.lng						i.lat = txPoint.lat					})					this.list.data = res.stationList					if(res.discountInfo){						this.discountInfo = res.discountInfo					}				})			},			// 设定导航栏高度			setAppNavigationHeight(){				this.$nextTick(()=>{					uni.createSelectorQuery().in(this).select("#app-navigation").boundingClientRect(data=>{						this.appNavigationHeight = data.height;					}).exec();				});			},			// 设置列表高度			setListHeight(){				this.$app.act.selectorQuery(this,"#list-box,#roller",true).then(res=>{					const win = uni.getWindowInfo();					const roller = res.find(i=>i.id=='roller');					const list = res.find(i=>i.id=='list-box');					this.list.height = win.windowHeight - list.top - this.appNavigationHeight + roller.height;				});			},			// 版头加载完成			bannerLoadCompleted(){				this.setListHeight();			},			changeSort(index){				this.sorts.index = index;				switch(index){					case 0:						this.list.data.sort((a,b)=>a.params.range-b.params.range)					break;					case 1:						this.list.data.sort((a,b)=>b.params.totalEmpty-a.params.totalEmpty)					break;					case 2:						this.list.data.sort((a,b)=>a.params.nowPrice-b.params.nowPrice)					break;				}			},			scrolltolower(){				console.log('到底')			},			gotoSiteDetail(item){				this.$app.url.goto('/pages/site/site?item='+JSON.stringify(item));			},			topage_coupon(){				let payment=this.payment_msg.realPredictServiceCost+this.payment_msg.maspAmount				this.$app.url.goto('/pages/coupon-buy/coupon-buy?payment='+payment)			},			// 确认隐私协议			agreePrivacyAuthorization(){				this.privacy.visible = false;				this.updateLocation();			},			// 打开隐私协议			openPrivacyContract(){				uni.openPrivacyContract();			},			// 拒绝隐私协议			refusePrivacy(){				this.privacy.visible = false;			},			convertGcj02ToBd09(lng, lat) {			    const x_pi = 3.14159265358979324 * 3000.0 / 180.0;			    const z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_pi);			    const theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_pi);			    const bd_lng = z * Math.cos(theta) + 0.0065;			    const bd_lat = z * Math.sin(theta) + 0.006;			    return {			        lng: bd_lng,			        lat: bd_lat			    };			}		}	}</script><style>@import url('index.css');.discount{	flex: 1;	text-align: right;	padding-right: 5px;}.discount view{	display: inline-flex;	align-items: center;	height: 22px;	border: 1px solid #ccc;	border-radius: 5px;	font-size: 12px;	color: #F59C79;	padding: 0 7px;	overflow: hidden;}</style>
 |