<template> <view class="page"> <view class="tab_top"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uVcMTydm81zCMhHomXl1" mode="" @click="topage(6)"> </image> <view class="txts"> 创享出行 </view> <!-- <view class="txts"> 嵛你出行 </view> --> </view> <!-- <u-navbar :is-back="false" title="共享电动车" :border-bottom="false" :background="bgc" title-color='#2E4975' title-size='36' height='36'></u-navbar> --> <map class="map" id="map" ref="map" :scale="zoomSize" show-location v-if="showmap" :latitude="latitude" :longitude="longitude" :show-location="true" :markers="markers" :polygons="polyline" @markertap="onMarkerTap"> </map> <view class="my-location" @click="setMapScale"> <image class="img" src="https://lxnapi.ccttiot.com/bike/img/static/uBgKFW3JgiBfjM4ea3uV" ></image> </view> <view class="park" @click="toggleIconAndCallout"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uRiYQZQEb3l2LsltEsyW" mode=""></image> </view> <view class="botmbox2" v-if="showdevice"> <view class="close" @click="close()"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uBeBBKwQu2K2ZBdT7iN7" mode=""></image> </view> <view class="page1" v-if="deviceIndex==0"> <view class="top"> <view class="left"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uD9pXetaMb5dmw8aSvoM" mode=""></image> </view> <view class="top_center"> <view class="cent_top"> 车辆编号:{{deviceInfos.sn}} </view> <view class="cent_bot"> 骑行前请检查车辆状态 </view> </view> <view class="top_right" @click="findBike()"> 响铃寻车 </view> </view> <view class="center"> <view class="center_left"> <view class="center_left_top"> 剩余骑行 </view> <view class="center_left_bot"> {{deviceInfos.remainingMileage}}公里 </view> </view> <view class="center_right"> <view class="center_right_top"> 预约费(10分钟) </view> <view class="center_right_bot"> {{areaInfo.appointmentServiceFee}} <span>元</span> </view> </view> </view> <view class="bot"> <view class=" left_btn" @click="Reserve()"> 预约用车 </view> <view class="right_btn" @click="deviceInfo(1)"> 解锁用车 </view> </view> <view class="tips" @click="topage(7)"> 发现坏车 > </view> </view> <view class="page2" v-if="deviceIndex==1"> <view class="top"> <!-- <view class="left"> <view class="text"> 可行驶53公里 </view> <view class="ele"> <image src="https://api.ccttiot.com/smartmeter/img/static/upbpFLv4dkl88Syk2VKW" mode=""></image> 电量充足 </view> </view> --> <view class="right"> <view class="text"> 剩余骑行 </view> <view class="txt"> {{deviceInfos.remainingMileage}}<span style="font-size: 40rpx;">公里</span> </view> </view> <view class="right"> <view class="text"> 剩余电量 </view> <view class="txt" style="font-size: 36rpx;"> {{ deviceInfos.remainingPower}}% <!-- {{startingPrice}}<span style="font-size: 40rpx;">元</span> --> </view> <view class="speed"> <view class="speeds" :style="{ width: deviceInfos.remainingPower + '%' }"> </view> </view> </view> </view> <view class="center"> <!-- <view class="card" :class="freeListIndex==0?'act1':''" @click="freeListIndex=0" v-if="orderinfo.ruleId==null"> <image src="https://api.ccttiot.com/smartmeter/img/static/uYg1WNJJH1VK7RdldKE1" mode="" v-if="freeListIndex==0"></image> <view class="tit"> 计时收费 </view> <view class="nmtxt"> <view class="left"> 起步价 </view> <view class="right"> {{startingPrice}}元(含{{startingHowManyMinutes}}分钟) </view> </view> <view class="nmtxt"> <view class="left"> 时长费 </view> <view class="right"> {{timeFee}}元/{{ timeMinutes}}分钟 </view> </view> <view class="tip"> 超出起步价包含时长后收取 </view> </view> --> <view class="card" v-for="(item,index ) in freList" :key="index" @click.stop="changefree(item,index+1)" :class="freeListIndex==index+1?'act1':''"> <image src="https://api.ccttiot.com/smartmeter/img/static/uYg1WNJJH1VK7RdldKE1" mode="" v-if="freeListIndex==index+1"></image> <view v-if="item.ridingRule==1"> <view class="tit"> {{item.name}} </view> <view style="padding: 18rpx;"> <view class="nmtxt"> <view class="left"> 起步价 </view> <view class="right"> {{item.ridingRuleJson.startingPrice}}元(含{{item.ridingRuleJson.startingTime}}<span v-if="item.rentalUnit=='minutes'">分钟</span><span v-if="item.rentalUnit=='hours'">小时</span><span v-if="item.rentalUnit=='day'">天</span>) </view> </view> <view class="nmtxt"> <view class="left"> 超出费 </view> <view class="right"> {{item.ridingRuleJson.timeoutPrice}}元/{{ item.ridingRuleJson.timeoutTime}}<span v-if="item.rentalUnit=='minutes'">分钟</span><span v-if="item.rentalUnit=='hours'">小时</span><span v-if="item.rentalUnit=='day'">天</span> </view> </view> </view> <!-- <view class="tips" @click.stop='feedetail(item,index+1)'> 查看详情 <view class="iconfont icon-chakanxiangqing"></view> </view> --> </view> <view v-if="item.ridingRule==2"> <view class="tit"> {{item.name}} </view> <view style="padding: 18rpx;"> <view class="nmtxt text-ellipsis" v-for="(items, indexs) in item.ridingRuleJson.rule" :key="indexs" style="margin-top: 10rpx;" v-if="indexs<2"> <view class="left " style="font-size: 28rpx;"> {{items.start}}-{{items.end}}<span v-if="item.rentalUnit=='minutes'">分钟</span> <span v-if="item.rentalUnit=='hours'">小时</span> <span v-if="item.rentalUnit=='day'">天</span>, 每{{items.eachUnit}}<span v-if="item.rentalUnit=='minutes'">分钟</span> <span v-if="item.rentalUnit=='hours'">小时</span> <span v-if="item.rentalUnit=='day'">天</span>/{{items.fee}}元 <span v-if="indexs==1">...</span> </view> <view class="right"></view> </view> </view> <!-- <view class="nmtxt"> <view class="left"> </view> <view class="right"> 原价 <span style=" text-decoration: line-through;">{{item.originalFee}}元</span> </view> </view> <view class="tip"> 超出起步价包含时长后收取 </view> --> </view> <view class="tips_btn" @click.stop='feedetail(item,index+1)'> 查看详情 </view> </view> </view> <view class="bot" style="margin-top: 20rpx;"> <view class="btn" @click="sub1()" v-if="type==1"> 确认开锁 </view> <!-- <view class="btn" @click="sub6()" v-if="type==1&&orderinfo.ruleId!=null"> 确认开锁 </view> <view class="btn" @click="sub2()" v-if="type==1&&freeListIndex!=0"> 确认套餐 </view> --> <!-- <view class="btn" @click="sub3()" v-if="type==2&&freeListIndex==0&&orderinfo.ruleId==null"> 确认预约 </view> --> <!-- <view class="btn" @click="sub5()" v-if="type==2&&orderinfo.ruleId!=null"> 确认预约 </view> --> <view class="btn" @click="sub3()" v-if="type==2"> 确认预约 </view> </view> </view> <view class="page3" v-if="deviceIndex==2"> <view class="bot_btn"> <view class="info"> <view class="left"> 预估金额:{{money}}<span>元</span> </view> <!-- <view style="width: 10rpx;" v-if="orderinfo.ruleId!=null"> </view> --> <view class="right"> {{timeString}} </view> </view> <view class="card"> <view class="tit"> 电单车 </view> <view class="cont"> <view class="left"> <view class="text"> 可继续行驶53公里 </view> <view class="speed"> <view class="speeds" :style="{ width: OrderdeviceInfos.remainingPower + '%' }"> </view> </view> <view class="mac"> NO.{{orderinfo.sn}} </view> </view> <view class="right"> <image src="https://api.ccttiot.com/smartmeter/img/static/uHTCZOVUbmBkKW4G0wuF" mode=""> </image> </view> </view> </view> <view class="bot" style="margin-top: 20rpx;" v-if="orderinfo.status==0"> <view class="btn" style=" margin-right: 16rpx;" @click="unlockdevice()"> 解锁骑行 </view> <view class="btn1" @click="cancel()" v-if="orderinfo.ruleId==null"> 取消预约 </view> <view class="btn1" @click="cancel1()" v-if="orderinfo.ruleId!=null"> 取消预约 </view> </view> <view class="bot" style="margin-top: 20rpx;" v-if="orderinfo.status==2"> <view class="btn" style=" margin-right: 16rpx;" v-if="OrderdeviceInfos.status==3" @click="loackdevice()"> 临时锁车 </view> <view class="btn" style=" margin-right: 16rpx;" v-if="OrderdeviceInfos.status==4" @click="unloackdevices()"> 解锁用车 </view> <view class="btn1" @click="backDevice()"> 还车 </view> </view> <!-- <view class="bot" style="margin-top: 20rpx;"> <view class="btn1" > 临时锁车 </view> <view class="btn" > 还车 </view> </view> --> </view> </view> <view class="page4" v-if="deviceIndex==3"> <view class="bot_btn"> <view class="time"> 使用时间:{{timeString}} </view> <view class="price"> {{orderinfo.totalFee}}<span>元</span> </view> <view class="toinfo" @click="tofeeDetail()"> 查看骑行费明细 > </view> <view class="btn" @click="topay()" v-if="orderinfo.status==1"> 去支付 </view> <view class="btn" @click="topay1()" v-if="orderinfo.status==3"> 去支付 </view> </view> </view> </view> <view class="botmbox" v-if="showindex==0"> <view class="top_btn" @tap="qecodelock()"> <image src="https://api.ccttiot.com/smartmeter/img/static/un6Wi8CefEjy04qzvn67" mode=""></image> 扫码开锁 </view> <view class="bot_btn"> <view class="cont" @click="topage(1)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uGDkCwxDNH9oFORX2XNU" mode=""></image> <view class="text"> 押金充值 </view> </view> <!-- <view class="cont" @click="topage(2)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uFHC2R6R3pgUOTShLxoQ" mode="" style="width: 28rpx;height: 28rpx;"></image> <view class="text"> 计费规则 </view> </view> --> <view class="cont" @click="topage(3)"> <image src="https://api.ccttiot.com/smartmeter/img/static/utP4rdOzXLlQPx6Ug8cO" mode="" ></image> <view class="text"> 用车指南 </view> </view> <view class="cont" @click="topage(4)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uFaJV6NJGhmmodpEuWMy" mode="" ></image> <view class="text"> 编号开锁 </view> </view> <view class="cont"@click="topage(5)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uucc9g8b2MM6G9vp8HWa" mode="" ></image> <view class="text"> 故障上报 </view> </view> </view> <view class="guangggao"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uvHYQhuouHZQQL3qfLzP" mode=""></image> </view> </view> <view class="tipss_box"> <swiper class="swiper" circular :autoplay="autoplay" :interval="interval" :duration="duration"> <swiper-item v-if="orderinfo.status"> <view class="tipss" v-if="orderinfo.status" @click="starTime"> 您有正在进行中的订单 <view class="iconfont icon-xiangyou1" style="margin-left: 20rpx;"> </view> </view> </swiper-item> <swiper-item> <view class="tipss"> 点击车辆可以预约用车 </view> </swiper-item> <swiper-item> <view class="tipss" @click="changetips"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uJnO5qX8ggJvL1Nf7PQt" mode=""></image> 文明骑行,须知 <view class="iconfont icon-xiangyou1"> </view> </view> </swiper-item> </swiper> <!-- <swiper class="swiper" :style="{ height: swiperHeight + 'rpx' }" :current='curtitidx' circular :autoplay="autoplay" interval='500'> <swiper-item> <view class="tipss" v-if="orderinfo.status" @click="starTime"> 您有正在进行中的订单 <view class="iconfont icon-xiangyou1" style="margin-left: 20rpx;"> </view> </view> </swiper-item> <swiper-item> <view class="tipss"> 点击车辆可以预约用车 </view> </swiper-item> <swiper-item> <view class="tipss" @click="changetips"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uJnO5qX8ggJvL1Nf7PQt" mode=""></image> 文明骑行,须知 <view class="iconfont icon-xiangyou1"> </view> </view> </swiper-item> </swiper> --> <!-- <view class="tipss" v-if="orderinfo.status" @click="starTime"> --> </view> <u-mask :show="showtcs" @click="showtc = false" :z-index='100' /> <u-mask :show="showTips" @click="show = false" :z-index='100' /> <view class="pops" v-if="showtcs"> <view class="tit"> {{orderinfo.rule.name}} </view> <view class="text"> <view class="yuan"> </view> <span>在套餐时间为结束是可随意进行车辆预约和解锁</span> </view> <view class="text"> <view class="yuan"> </view> <span>车辆二维码模糊可使用下方编号开锁</span> <view class="time"> </view> </view> <view class="time"> {{timeString}}后 </view> <view class="time" style="color:#3D3D3D ;font-size: 28rpx;"> 您将失去该套餐 </view> <view class="btn" @click="showtcs=false" style="margin-bottom: 50rpx;"> 我已知晓 </view> </view> <view class="pops" v-if="showTips" > <view class="tit"> 安全骑行 禁止超载 </view> <view class="cont" v-html="areaInfo.agreement" > </view> <!-- <view class="text"> <view class="yuan"> </view> <span>临时锁车:相当于拔钥匙,还在租借中</span> </view> <view class="text"> <view class="yuan"> </view> <span>结束订单:在还车点结束订单,押金可在【个人中心-押金】申请押金退还</span> </view> <view class="text"> <view class="yuan"> </view> <span>严禁超载:一辆车最多坐两个人</span> </view> <view class="text"> <view class="yuan"> </view> <span>请爱护车辆,且注意查看车辆剩余电量</span> </view> --> <view class="btn" @click="changetips()"> 我已阅读同意 </view> </view> <view class="feeDetail" v-if="showfeeDetail"> <view class="close" @click="showfeeDetail=false"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uBeBBKwQu2K2ZBdT7iN7" mode=""></image> </view> <view class="feeCard"> <view class="tit1"> 收费价格说明 </view> <view class="cont"> <view class="left"> 免费时长 </view> <view class="right" style="color:#3D3D3D ;"> {{freeInfo.freeRideTime}}分钟 </view> </view> <view class="cont" v-if="freeInfo.ridingRule==1"> <view class="left"> 起步价 </view> <view class="right"> {{freeInfo.ridingRuleJson.startingPrice}}元(含{{freeInfo.ridingRuleJson.startingTime}}<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span><span v-if="freeInfo.rentalUnit=='hours'">小时</span><span v-if="freeInfo.rentalUnit=='day'">天</span>) </view> </view> <view class="cont" v-if="freeInfo.ridingRule==1"> <view class="left"> 超起步价后 </view> <view class="right"> {{freeInfo.ridingRuleJson.timeoutPrice}}元/{{ freeInfo.ridingRuleJson.timeoutTime}}<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span><span v-if="freeInfo.rentalUnit=='hours'">小时</span><span v-if="freeInfo.rentalUnit=='day'">天</span> </view> </view> <view class="cont" v-if="freeInfo.ridingRule==2"> <view class="left"> 计费规则 </view> <view class="right"> <view class="li" v-for="(items,index) in freeInfo.ridingRuleJson.rule" v-if="index!=freeInfo.ridingRuleJson.rule.length-1"> {{items.start}}-{{items.end}}<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span> <span v-if="freeInfo.rentalUnit=='hours'">小时</span> <span v-if="freeInfo.rentalUnit=='day'">天</span>, 每{{items.eachUnit}}<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span> <span v-if="freeInfo.rentalUnit=='hours'">小时</span> <span v-if="freeInfo.rentalUnit=='day'">天</span>/{{items.fee}}元 </view> <view class="li" v-for="(items,index) in freeInfo.ridingRuleJson.rule" v-if="index==freeInfo.ridingRuleJson.rule.length-1"> >{{items.start}}<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span> <span v-if="freeInfo.rentalUnit=='hours'">小时</span> <span v-if="freeInfo.rentalUnit=='day'">天</span>, 每{{items.eachUnit}}<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span> <span v-if="freeInfo.rentalUnit=='hours'">小时</span> <span v-if="freeInfo.rentalUnit=='day'">天</span>/{{items.fee}}元 </view> </view> </view> <view class="cont"> <view class="left"> </view> <view class="right" style="font-size: 24rpx;color: #808080;"> 不足1<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span> <span v-if="freeInfo.rentalUnit=='hours'">小时</span> <span v-if="freeInfo.rentalUnit=='day'">天</span>,按1<span v-if="freeInfo.rentalUnit=='minutes'">分钟</span> <span v-if="freeInfo.rentalUnit=='hours'">小时</span> <span v-if="freeInfo.rentalUnit=='day'">天</span>算 </view> </view> <view class="cont"> <view class="left"> 调度费 </view> <view class="right" style="color:#3D3D3D ;"> {{areaInfo.vehicleManagementFee}}元(停车点外还车) </view> </view> <view class="cont"> <view class="left"> </view> <view class="right" style="color:#3D3D3D ;"> {{areaInfo.dispatchFee}}元(运营区域外还车) </view> </view> <view class="cont"> <view class="left"> </view> <view class="right"> P点外归还设备将收取调度费 </view> </view> <!-- <view class="cont"> <view class="left"> 支付订单后 </view> <view class="right" style="color:#3D3D3D ;"> 自动退押金 </view> </view> --> </view> <view class="feeCard" v-html='freeInfo.instructions'> </view> </view> <view class="bottom_more" v-if="showindex==1"> <view class="close" @click="showindex=0"> <image src="https://api.ccttiot.com/smartmeter/img/static/uM76uO46a5cZOkFlffnX" mode=""></image> </view> <div class="tit"> 更多用车服务 </div> <div class="contbox" style="width: 100%;"> <view class="cont_li" @click="topage(1)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uGDkCwxDNH9oFORX2XNU" mode=""></image> <view class="txt"> 押金充值 </view> </view> <!-- <view class="cont_li" @click="topage(2)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uFHC2R6R3pgUOTShLxoQ" mode=""></image> <view class="txt"> 计费规则 </view> </view> --> <view class="cont_li" @click="topage(3)"> <image src="https://api.ccttiot.com/smartmeter/img/static/utP4rdOzXLlQPx6Ug8cO" mode=""></image> <view class="txt"> 用车指南 </view> </view> <view class="cont_li" @click="topage(4)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uFaJV6NJGhmmodpEuWMy" mode=""></image> <view class="txt"> 编号开锁 </view> </view> <!-- <view class="cont_li"> <image src="https://api.ccttiot.com/smartmeter/img/static/ulQHy1cQ28kiMLI0T0Uh" mode=""></image> <view class="txt"> 查看停车点 </view> </view> --> <view class="cont_li" @click="topage(5)"> <image src="https://api.ccttiot.com/smartmeter/img/static/uucc9g8b2MM6G9vp8HWa" mode=""></image> <view class="txt"> 故障上报 </view> </view> <view class="cont_li" @click="topage(6)"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uW1XRPQfJTD6sLimkln5" mode=""></image> <view class="txt"> 个人中心 </view> </view> </div> </view> </view> </template> <script> export default { data() { return { bgc: { backgroundColor: "#F7FAFE", }, showIconAndCallout: false, // 控制是否显示iconPath和callout showindex: 0, show: false, latitude: '', longitude: '', isMap: false, zoomSize: 16, markers: [], polyline: [], areas: [], gps: {}, deviceInfos: {}, OrderdeviceInfos: {}, showdevice: false, deviceIndex: 0, type: 0, freList: [], freeListIndex: 0, freeInfo: {}, socket: null, sn: '', eventKey: 0, orderinfo: {}, timer: null, timeString: '', money: 0, showtc: false, showtcs: false, areaInfo: {}, // feeInfo:{}, showfeeDetail: false, seeDetail: false, showmap: true, userinfo: {}, parkingList: [], timer: null, listData: [], oldMarkers: [], curtitidx: 0, swiperHeight: 50, background: ['color1', 'color2', 'color3'], indicatorDots: true, autoplay: true, interval: 2000, duration: 500, showTips:false, // userId:this.$store.getters.userId, } }, watch: { userId(newValue, oldValue) { // 处理userId变化的逻辑 console.log('userId 发生变化', newValue, oldValue); this.getisInOrder() } }, onLoad(e) { console.log(e, 'eeeeeeeeeeeeeeeeeee'); if (e.q) { let qParam = e.q; // 第2步: URL解码q参数 let decodedUrl = decodeURIComponent(qParam); // 第3步: 使用正则表达式解析解码后的URL并提取查询参数 let sn = null; let queryParams = decodedUrl.split('?')[1]; if (queryParams) { let params = queryParams.split('&'); params.forEach(param => { let [key, value] = param.split('='); if (key === 'sn') { sn = value; } }); } this.sn = sn if (this.sn != '') { setTimeout(() => { if (!this.orderinfo.status) { this.deviceInfo(1) // this.showdevice = true // this.deviceIndex = 1 // this.type = 1 } }, 1000) } } if (e.sn) { this.sn = e.sn if (this.sn != '') { setTimeout(() => { if (!this.orderinfo.status) { this.deviceInfo(1) // this.showdevice = true // this.deviceIndex = 1 // this.type = 1 } }, 1000) } } setTimeout(()=>{ this.$store.commit('SET_SHOWTIPS', true); },500) }, onShow() { if (this.seeDetail == false) { if (uni.getStorageSync('role')) { let abb = uni.getStorageSync('role') } let that = this uni.getLocation({ type: 'wgs84', success: function(lb) { that.gps.latitude = lb.latitude; that.gps.longitude = lb.longitude; // that.gps.latitude = '26.940805', // that.gps.longitude = '120.356157'; that.latitude = Number(lb.latitude.toFixed(5)) - 0.005 that.longitude = Number(lb.longitude.toFixed(5)) + 0.005 console.log(that.areaInfo, 'that.areaInfo'); that.getArea() // that.getmarks() // }, fail: function(error) { uni.showToast({ title: '未获取到定位信息,请点击设置勾选允许位置信息,即可使用全部功能', icon: 'none', duration: 2000 }); // that.getmarks() // 在这里处理获取位置信息失败的情况 } }) } else { this.getinfo() } this.timer = setInterval(() => { // console.log('定时器运行中...'); this.getmarks() // 在这里执行你的逻辑 }, 3000); // 每秒执行一次 }, onHide() { // 页面隐藏时清除定时器 if (this.timer) { clearInterval(this.timer); this.timer = null; console.log('定时器已清除'); } }, onUnload() { // 页面卸载时清除定时器 if (this.timer) { clearInterval(this.timer); this.timer = null; console.log('定时器已清除'); } }, computed: { appointmentServiceFee() { return this.$store.getters.appointmentServiceFee; }, dispatchFee() { return this.$store.getters.dispatchFee; }, vehicleManagementFee() { return this.$store.getters.vehicleManagementFee; }, startingPrice() { return this.$store.getters.startingPrice; }, timeFee() { return this.$store.getters.timeFee; }, timeMinutes() { return this.$store.getters.timeMinutes; }, startingHowManyMinutes() { return this.$store.getters.startingHowManyMinutes; }, userId() { return this.$store.getters.userId; }, // showTips() { // return this.$store.getters.showTips; // }, isMeal() { return this.$store.getters.isMeal; }, }, methods: { changetips() { if (this.showTips) { uni.setStorageSync('hasShownPopup', false); this.showTips=uni.getStorageSync('hasShownPopup') } else { uni.setStorageSync('hasShownPopup', true); this.showTips=uni.getStorageSync('hasShownPopup') } }, toggleIconAndCallout() { this.showIconAndCallout = !this.showIconAndCallout; if (this.showIconAndCallout) { const newMarkers = []; this.parkingList.forEach(item => { newMarkers.push({ id: parseFloat(item.parkingId), latitude: parseFloat(item.latitude), longitude: parseFloat(item.longitude), width: 20, height: 40, iconPath: 'https://lxnapi.ccttiot.com/bike/img/static/u9yz0bKCWKyev0JYpTne', callout: { content: item.parkingName, // 修改为你想要显示的文字内容 color: '#ffffff', // 修改为文字颜色 fontSize: 14, // 修改为文字大小 borderRadius: 10, // 修改为气泡圆角大小 bgColor: '#000000', // 修改为气泡背景颜色 padding: 6, // 修改为气泡内边距 display: 'ALWAYS' // 修改为气泡的显示策略 } }); }); this.$set(this, 'markers', [...this.markers, ...newMarkers]); } else { const parkingIds = this.parkingList.map(item => parseFloat(item.parkingId)); this.$set(this, 'markers', this.markers.filter(marker => !parkingIds.includes(marker.id))); } }, getMyLocation() { uni.createMapContext("map", this).moveToLocation({ longitude: this.longitude, latitude: this.latitude, }); }, async setMapScale(e, val) { let mapContext = uni.createMapContext('map', this); let setScale = () => { return new Promise((resolve, reject) => { mapContext.getScale({ success: r => { resolve() } }) }) }; await setScale(); mapContext.moveToLocation({ success: (res) => { const timer = setTimeout(() => { clearTimeout(timer); }, 500); }, }) }, // 查看费用详情 tofeeDetail() { uni.navigateTo({ url: '/page_user/ckmx?orderId=' + this.orderinfo.orderNo }) }, // 扫码开锁 qecodelock() { this.seeDetail = true uni.scanCode({ onlyFromCamera: true, scanType: ['qrCode'], success: res => { let sn = null; let queryParams = res.result.split('?')[1]; if (queryParams) { let params = queryParams.split('&'); params.forEach(param => { let [key, value] = param.split('='); if (key === 'sn') { sn = value; } }); } this.sn = sn if (this.sn != '') { setTimeout(() => { if (!this.orderinfo.status) { this.deviceInfo(1) } }, 1000) } }, fail: err => { // console.error('扫描失败:', err); // uni.showToast({ // title: '扫描失败', // icon: 'none' // }); } }); }, feedetail(item, index) { this.freeInfo = item this.seeDetail = true try { const itemStr = encodeURIComponent(JSON.stringify(item)); uni.navigateTo({ url: `/page_user/jfgz?item=${itemStr}` }); } catch (error) { console.error('Error serializing item:', error); } // this.showfeeDetail = true this.freeListIndex = index }, // 无套餐取消预约 cancel() { this.$u.post('/appVerify/device/cancelAppointment?userId=' + this.userId + '&orderNo=' + this.orderinfo .orderNo).then((res) => { if (res.code === 200) { this.getisInOrder() } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) }, // 套餐取消预约 cancel1() { this.$u.post('/appVerify/device/cancelAppointment?userId=' + this.userId + '&orderNo=' + this.orderinfo .orderNo + '&ruleId=' + this.orderinfo.ruleId).then((res) => { if (res.code === 200) { this.getisInOrder() } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) }, backDevice() { this.$u.post('/appVerify/device/return?returnType=1&orderNo=' + this.orderinfo.orderNo).then((res) => { if (res.code === 200) { this.getisInOrder() } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) }, // 套餐直接开锁 sub6() { if (this.orderinfo.ruleId) { let data = { userId: this.userId, sn: this.sn, // ruleId: this.freeInfo.ruleId, // money: this.freeInfo.fee, mark: "套餐直接开锁", // type: '1', ruleId: this.orderinfo.ruleId, orderNo: this.orderinfo.orderNo } this.$u.post('/appVerify/device/snSwitch', data).then((res) => { if (res.code === 200) { this.getisInOrder() } else { } }) } else { uni.showToast({ title: '请选择套餐', icon: 'none', duration: 2000 }); } }, // 预约解锁骑行 unlockdevice() { if (this.orderinfo.ruleId == null) { let data = { userId: this.userId, sn: this.orderinfo.sn, // ruleId: this.freeInfo.ruleId, // money: this.freeInfo.fee, mark: "预约开锁", // type: '1', orderNo: this.orderinfo.orderNo } this.$u.post('/appVerify/device/snSwitch', data).then((res) => { if (res.code == 200) { this.getisInOrder() } else { this.getisInOrder() uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { let data = { userId: this.userId, sn: this.orderinfo.sn, // ruleId: this.freeInfo.ruleId, // money: this.freeInfo.fee, mark: "套餐预约开锁", // type: '1', ruleId: this.orderinfo.ruleId, orderNo: this.orderinfo.orderNo } this.$u.post('/appVerify/device/snSwitch', data).then((res) => { if (res.code === 200) { this.getisInOrder() } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } }, unloackdevices() { this.$u.post('/appVerify/device/unlock?sn=' + this.OrderdeviceInfos.sn + '&orderNo=' + this.orderinfo .orderNo).then((res) => { if (res.code === 200) { this.getisInOrder() } else { } }) }, // ;临时锁车 loackdevice() { this.$u.post('/appVerify/device/lock?sn=' + this.OrderdeviceInfos.sn + '&orderNo=' + this.orderinfo .orderNo).then((res) => { if (res.code === 200) { this.getisInOrder() } else { } }) }, starTime() { this.seeDetail = false clearInterval(this.timer) this.timer = null this.$u.get('/app/device/info?sn=' + this.orderinfo.sn).then((res) => { if (res.code === 200) { this.OrderdeviceInfos = res.data } }) // 预约中 if (this.orderinfo.status == 0) { this.showdevice = true this.deviceIndex = 2 const createTimeTimestamp = new Date(this.orderinfo.createTime).getTime(); // 定义定时器 this.timer = setInterval(() => { const currentTime = Date.now(); const timePassed = currentTime - createTimeTimestamp; const secondsPassed = Math.floor(timePassed / 1000); // 转换为时分秒格式 const hours = Math.floor(secondsPassed / 3600); const minutes = Math.floor((secondsPassed % 3600) / 60); const seconds = secondsPassed % 60; const timeString = `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`; const totalMinutes = hours * 60 + minutes; const tenMinuteIntervals = Math.floor(totalMinutes / 10) + 1; this.money = tenMinuteIntervals * parseFloat(this.areaInfo.appointmentServiceFee) // 每隔十分钟增加费用 if (minutes % 10 === 0 && seconds === 0) { } this.timeString = timeString // console.log("已经过去了:" + timeString); }, 1000); } else if (this.orderinfo.status == 1) { // 取消预约 // this.topay() const createTimeTimestamp = new Date(this.orderinfo.appointmentStartTime).getTime(); // 定义定时器 const currentTime = new Date(this.orderinfo.appointmentEndTime).getTime();; const timePassed = currentTime - createTimeTimestamp; const secondsPassed = Math.floor(timePassed / 1000); // 转换为时分秒格式 const hours = Math.floor(secondsPassed / 3600); const minutes = Math.floor((secondsPassed % 3600) / 60); const seconds = secondsPassed % 60; const timeString = `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`; const totalMinutes = hours * 60 + minutes; const tenMinuteIntervals = Math.floor(totalMinutes / 10) + 1; this.timeString = timeString // console.log("已经过去了:" + timeString); this.showdevice = true this.deviceIndex = 3 } else if (this.orderinfo.status == 2) { // 开始骑行 // this.topay() this.showdevice = true this.deviceIndex = 2 const createTimeTimestamp = new Date(this.orderinfo.unlockTime).getTime(); // 定义定时器 this.timer = setInterval(() => { const currentTime = Date.now(); const timePassed = currentTime - createTimeTimestamp; const secondsPassed = Math.floor(timePassed / 1000); // 转换为时分秒格式 const hours = Math.floor(secondsPassed / 3600); const minutes = Math.floor((secondsPassed % 3600) / 60); const seconds = secondsPassed % 60; const timeString = `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`; let totalMinutes = hours * 60 + minutes; let totalTime; if (this.orderinfo.rule.rentalUnit === 'minutes') { totalTime = totalMinutes; } else if (this.orderinfo.rule.rentalUnit === 'hours') { totalTime = hours + minutes / 60; } else if (this.orderinfo.rule.rentalUnit === 'day') { totalTime = hours / 24 + minutes / 1440; } // 计费规则计算 if (this.orderinfo.rule.ridingRule == 1) { const ridingRuleJson = JSON.parse(this.orderinfo.rule.ridingRuleJson); const timeoutTime = parseFloat(ridingRuleJson.timeoutTime); const startingPrice = parseFloat(ridingRuleJson.startingPrice); const startingTime = parseFloat(ridingRuleJson.startingTime); const timeoutPrice = parseFloat(ridingRuleJson.timeoutPrice); let totalCharge; if (totalTime <= startingTime) { totalCharge = startingPrice; } else { const extraTime = totalTime - startingTime; const extraCharge = Math.ceil(extraTime / timeoutTime) * timeoutPrice; totalCharge = startingPrice + extraCharge; } // 更新money值 this.money = totalCharge + this.orderinfo.appointmentFee } else if (this.orderinfo.rule.ridingRule == 2) { const ridingRuleJson = JSON.parse(this.orderinfo.rule.ridingRuleJson); const rules = ridingRuleJson.rule; let totalCharge = 0; for (let rule of rules) { const start = parseFloat(rule.start); const end = parseFloat(rule.end); const eachUnit = parseFloat(rule.eachUnit); const fee = parseFloat(rule.fee); if (totalTime > start && (end === 9999 || totalTime <= end)) { // 所有时间都按照该区间的费率来计算 totalCharge = Math.ceil(totalTime / eachUnit) * fee; break; } } // 更新money值 this.money = totalCharge + this.orderinfo.appointmentFee } // 更新时间字符串 this.timeString = timeString; }, 1000); } else if (this.orderinfo.status == 3) { // 骑行结束 // this.topay() const createTimeTimestamp = new Date(this.orderinfo.createTime).getTime(); // 定义定时器 const currentTime = Date.now(); const timePassed = currentTime - createTimeTimestamp; const secondsPassed = Math.floor(timePassed / 1000); // 转换为时分秒格式 const hours = Math.floor(secondsPassed / 3600); const minutes = Math.floor((secondsPassed % 3600) / 60); const seconds = secondsPassed % 60; const timeString = `${hours < 10 ? '0' : ''}${hours}:${minutes < 10 ? '0' : ''}${minutes}:${seconds < 10 ? '0' : ''}${seconds}`; const tenMinuteIntervals = Math.floor((hours * 60 + minutes) / 10) + 1; // 加1是因为不满十分钟也算一个十分钟 this.timeString = timeString // console.log("已经过去了:" + timeString); this.showdevice = true this.deviceIndex = 3 } // 将 createTime 转换为时间戳 }, // 取消预约支付 topay() { let data = { userId: this.userId, sn: this.orderinfo.sn, orderNo: this.orderinfo.orderNo, // money: this.freeInfo.fee, mark: "订单支付", type: '2' } console.log('点击了'); let that = this this.$u.post('/appVerify/pre/order', data).then((res) => { if (res.code === 200) { // this.freList=res.rows uni.requestPayment({ provider: 'wxpay', timeStamp: res.data.timeStamp, nonceStr: res.data.nonceStr, package: res.data.packageVal, signType: res.data.signType, paySign: res.data.paySign, success(res) { // 支付成功逻辑 that.getisInOrder() }, fail(err) { // 支付失败逻辑 uni.showToast({ title: '支付失败', icon: 'none', duration: 2000 }); } }); } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) }, // 骑行结束支付 topay1() { let data = { userId: this.userId, sn: this.orderinfo.sn, orderNo: this.orderinfo.orderNo, // money: this.freeInfo.fee, mark: "订单支付", type: '1' } console.log('点击了'); let that = this this.$u.post('/appVerify/pre/order', data).then((res) => { if (res.code === 200) { // this.freList=res.rows uni.requestPayment({ provider: 'wxpay', timeStamp: res.data.timeStamp, nonceStr: res.data.nonceStr, package: res.data.packageVal, signType: res.data.signType, paySign: res.data.paySign, success(res) { console.log('支付成功'); // 支付成功逻辑 that.getisInOrder() }, fail(err) { // 支付失败逻辑 uni.showToast({ title: '支付失败', icon: 'none', duration: 2000 }); } }); } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) }, topage(num) { if (num == 0) { // uni.navigateTo({ // url:'' // }) } else if (num == 1) { let that = this wx.login({ success(res) { if (res.code) { console.log('登录!', res); let data = { wxOpenId: res.code, }; let areaId = uni.getStorageSync('areaId'); that.$u.post('/loginByopenid?jsCode=' + res.code + '&areaId=' + areaId).then( res => { uni.hideLoading(); if (res.code == 200) { uni.setStorageSync('token', res.token); if (that.areaInfo.authentication == 1) { that.$u.get("/getAppInfo").then((res) => { console.log('进入跳转'); if (res.code == 200) { that.userinfo = res.user that.$store.commit('SET_USERID', res.user .userId); if (res.user.isAuthentication == 0) { that.seeDetail = true uni.navigateTo({ url: "/page_user/idcard_test" }) } else { uni.navigateTo({ url: '/page_user/yj' }) } } else { uni.showToast({ title: '未登录,请登录后尝试', icon: 'none', duration: 2000 }); } }); } else { uni.navigateTo({ url: '/page_user/yj' }) } } else if (res.code == 501) { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } else { // console.log("老用户登录",res.data) uni.redirectTo({ url: '/pages/login/login' }) } }); } }, }); } else if (num == 2) { uni.navigateTo({ url: '/page_user/jfgz' }) } else if (num == 3) { uni.navigateTo({ url: '/page_user/yczn' }) } else if (num == 4) { uni.navigateTo({ url: '/page_user/bhks' }) } else if (num == 5) { uni.navigateTo({ url: '/page_user/gzsb' }) } else if (num == 6) { let that = this wx.login({ success(res) { if (res.code) { console.log('登录!', res); let data = { wxOpenId: res.code, }; let areaId = uni.getStorageSync('areaId'); that.$u.post('/loginByopenid?jsCode=' + res.code + '&areaId=' + areaId).then( res => { uni.hideLoading(); if (res.code == 200) { uni.setStorageSync('token', res.token); if (that.areaInfo.authentication == 1) { that.$u.get("/getAppInfo").then((res) => { console.log('进入跳转'); if (res.code == 200) { that.userinfo = res.user that.$store.commit('SET_USERID', res.user .userId); if (res.user.isAuthentication == 0) { that.seeDetail = true uni.navigateTo({ url: "/page_user/idcard_test" }) } else { uni.navigateTo({ url: '/pages/my' }) } } else { uni.showToast({ title: '未登录,请登录后尝试', icon: 'none', duration: 2000 }); } }); } else { uni.navigateTo({ url: '/pages/my' }) } } else if (res.code == 501) { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } else { // console.log("老用户登录",res.data) uni.redirectTo({ url: '/pages/login/login' }) } }); } }, }); } else if (num == 7) { uni.navigateTo({ url: '/page_user/gzsb?sn=' + this.sn }) } }, createWebSocket() { // 创建 WebSocket 实例,传入 token let token = uni.getStorageSync('token') let that = this this.socket = uni.connectSocket({ url: `ws://192.168.2.8:8080/appVerify/ws/${this.eventKey}`, // WebSocket 服务器地址 header: { 'Authorization': token // 设置 Authorization 请求头 }, success(res) { console.log('WebSocket 连接成功', res); }, fail(err) { console.error('WebSocket 连接失败', err); } }); // 监听 WebSocket 接收到消息事件 this.socket.onMessage(res => { console.log('收到消息:', res.data); }); // 监听 WebSocket 错误事件 this.socket.onError(err => { console.error('WebSocket 错误:', err); }); // 监听 WebSocket 连接关闭事件 this.socket.onClose(() => { console.log('WebSocket 连接已关闭'); }); }, sendMessage() { // console.log('发送了消息'); // 发送消息给服务器 this.socket.send({ data: 'Hello, server!' }); }, closeConnection() { // 关闭 WebSocket 连接 this.socket.close({ code: 1000, // 关闭连接的代码 reason: 'Closing connection' // 关闭连接的原因 }); }, sub5() { if (this.orderinfo.ruleId) { this.$u.post('/appVerify/device/appointment?userId=' + this.userId + '&sn=' + this.sn + '&ruleId=' + this .orderinfo.ruleId + '&type=2' + '&orderNo=' + this.orderinfo.orderNo).then((res) => { if (res.code === 200) { uni.showLoading({ title: '预约中...' }) setTimeout(() => { this.getisInOrder() uni.hideLoading() }, 1000) // this.freList=res.rows } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { uni.showToast({ title: '请选择套餐', icon: 'none', duration: 2000 }); } }, // 确认开锁 sub1() { if (this.areaInfo.authentication == 1) { if (this.userinfo.isAuthentication == 0) { this.seeDetail = true uni.navigateTo({ url: "/page_user/idcard_test" }) } } else { if (this.freeInfo.ruleId) { let data = { userId: this.userId, sn: this.sn, ruleId: this.freeInfo.ruleId, // money: this.freeInfo.fee, mark: "确认开锁", type: '1' } this.$u.post('/appVerify/device/snSwitch', data).then((res) => { this.seeDetail = false if (res.code === 200) { this.getisInOrder() } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { uni.showToast({ title: '请选择套餐', icon: 'none', duration: 2000 }); } } }, // 开锁购买套餐 sub2() { if (this.freeInfo.ruleId) { let data = { userId: this.userId, sn: this.sn, ruleId: this.freeInfo.ruleId, // money: this.freeInfo.fee, isAppointment: false, mark: "套餐开锁", type: '3' } this.$u.post('/appVerify/pre/order', data).then((res) => { if (res.code === 200) { // this.freList=res.rows uni.requestPayment({ provider: 'wxpay', timeStamp: res.data.timeStamp, nonceStr: res.data.nonceStr, package: res.data.packageVal, signType: res.data.signType, paySign: res.data.paySign, success(res) { // 支付成功逻辑 this.showdevice = false this.deviceIndex = 0 this.mac = '' this.type = 0 this.freeInfo = {} this.freeListIndex = 0 this.getisInOrder() }, fail(err) { // 支付失败逻辑 uni.showToast({ title: '支付失败', icon: 'none', duration: 2000 }); } }); } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { uni.showToast({ title: '请选择套餐', icon: 'none', duration: 2000 }); } }, // 确认预约 sub3() { if (this.areaInfo.authentication == 1) { if (this.userinfo.isAuthentication == 0) { this.seeDetail = true uni.navigateTo({ url: "/page_user/idcard_test" }) } else { if (this.freeInfo.ruleId) { let data = { userId: this.userId, sn: this.sn, ruleId: this.freeInfo.ruleId, // isAppointment: true, // money: this.freeInfo.fee, mark: "预约购买套餐", type: '2' } this.$u.post('/appVerify/device/appointment?userId=' + this.userId + '&sn=' + this.sn + '&ruleId=' + this .freeInfo.ruleId).then((res) => { this.seeDetail = false if (res.code === 200) { uni.showLoading({ title: '预约中...' }) setTimeout(() => { this.getisInOrder() uni.hideLoading() }, 1000) // this.freList=res.rows } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { uni.showToast({ title: '请选择套餐', icon: 'none', duration: 2000 }); } } } else { if (this.freeInfo.ruleId) { let data = { userId: this.userId, sn: this.sn, ruleId: this.freeInfo.ruleId, // isAppointment: true, // money: this.freeInfo.fee, mark: "预约购买套餐", type: '2' } this.$u.post('/appVerify/device/appointment?userId=' + this.userId + '&sn=' + this.sn + '&ruleId=' + this .freeInfo.ruleId).then((res) => { this.seeDetail = false if (res.code === 200) { uni.showLoading({ title: '预约中...' }) setTimeout(() => { this.getisInOrder() uni.hideLoading() }, 1000) // this.freList=res.rows } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { uni.showToast({ title: '请选择套餐', icon: 'none', duration: 2000 }); } } }, // 预约购买套餐 sub4() { if (this.freeInfo.ruleId) { let data = { userId: this.userId, sn: this.sn, ruleId: this.freeInfo.ruleId, isAppointment: true, // money: this.freeInfo.fee, mark: "预约购买套餐", type: '3' } console.log('点击了'); this.$u.post('/appVerify/pre/order', data).then((res) => { if (res.code === 200) { // this.freList=res.rows uni.requestPayment({ provider: 'wxpay', timeStamp: res.data.timeStamp, nonceStr: res.data.nonceStr, package: res.data.packageVal, signType: res.data.signType, paySign: res.data.paySign, success(res) { // 支付成功逻辑 this.showdevice = false this.deviceIndex = 0 this.mac = '' this.type = 0 this.freeInfo = {} this.freeListIndex = 0 this.getisInOrder() }, fail(err) { // 支付失败逻辑 uni.showToast({ title: '支付失败', icon: 'none', duration: 2000 }); } }); } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { uni.showToast({ title: '请选择套餐', icon: 'none', duration: 2000 }); } }, getisInOrder() { this.orderinfo = {} if (this.userId) { this.$u.post('/app/user/isInOrder?userId=' + this.userId, ).then((res) => { if (res.code === 200) { // this.freList=res.rows if (res.data != '') { this.orderinfo = res.data[0] this.starTime() } else { this.orderinfo = {} this.showdevice = false this.deviceIndex = 0 } } else { } }) } }, changefree(item, index) { this.freeInfo = item this.freeListIndex = index }, getlist() { this.freList = [] let data = { areaId: this.areaInfo.areaId } this.$u.get('/app/fee/list?', data).then((res) => { if (res.code === 200) { this.freList = res.data.map(item => { try { item.ridingRuleJson = JSON.parse(item.ridingRuleJson); } catch (e) { console.error('Invalid JSON in ridingRuleJson:', item.ridingRuleJson); } return item; }); console.log(this.freList, ' this.freList this.freList'); } else { uni.showToast({ title: '未登录,请登录后尝试', icon: 'none', duration: 1000 }); } }) }, // 发现坏车 // 预约车辆 Reserve() { if (this.$store.getters.userId == undefined) { // this.$u.get("/getAppInfo").then((res) => { // console.log('进入跳转'); // if(res.code==200){ // this.$store.commit('SET_USERID', res.user.userId); // } // }); this.$store.dispatch('userInfo', this.$u).then(() => { this.deviceIndex = 1 this.type = 2 console.log(this.$store.getters.userId, 'this.$store.getters.userIdthis.$store.getters.userId'); // 执行其他操作... }); } else { this.deviceIndex = 1 this.type = 2 } }, // 关闭弹出 close() { this.showdevice = false this.deviceIndex = 0 this.sn = '' this.type = 0 this.freeInfo = {} this.freeListIndex = 0 }, // 扫码的方法 scanQRCode() { uni.scanCode({ onlyFromCamera: true, scanType: ['qrCode'], success: res => { console.log('扫描结果:', res); this.sn = res.sn this.type = 1 }, fail: err => { console.error('扫描失败:', err); uni.showToast({ title: '扫描失败', icon: 'none' }); } }); }, findBike() { this.$u.post('/app/device/ring?sn=' + this.sn).then((res) => { if (res.code === 200) { } }) }, onMarkerTap(e) { if (e.type === 'markertap') { console.log('点击了标记:', e.markerId); // 这里可以根据需要处理点击标记的逻辑 // 阻止事件冒泡\ this.sn = e.markerId this.deviceInfo(0) } }, deviceInfo(num) { let that = this if (uni.getStorageSync('token')) { this.$u.get('/app/device/info?sn=' + this.sn).then((res) => { if (res.code === 200) { this.deviceInfos = res.data if (num == 0) { // this.showindex = 0 this.showdevice = true this.type = 0 } else { // this.showindex = 1 this.showdevice = true this.type = 1 this.deviceIndex = 1 } } else { this.showdevice = false this.deviceIndex = 0 this.type = 0 uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else { wx.login({ success(res) { if (res.code) { console.log('登录!', res); let data = { wxOpenId: res.code, }; let areaId = uni.getStorageSync('areaId'); that.$u.post('/loginByopenid?jsCode=' + res.code + '&areaId=' + areaId).then( res => { uni.hideLoading(); if (res.code == 200) { uni.setStorageSync('token', res.token); that.$u.get('/app/device/info?sn=' + that.sn).then((res) => { if (res.code === 200) { that.deviceInfos = res.data that.showindex = 0 that.showdevice = true } else { that.showdevice = false that.deviceIndex = 0 that.type = 0 uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }) } else if (res.code == 501) { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } else { // console.log("老用户登录",res.data) uni.redirectTo({ url: '/pages/login/login' }) } }); } }, }); } }, // onMapTap(e) { // console.log('点击了地图非标记区域:', e); // // 这里可以根据需要处理点击地图非标记区域的逻辑 // }, getmarks() { let data = { areaId: this.areaInfo.areaId }; this.$u.get(`/app/allVehicleByArea`, data).then((res) => { if (res.code === 200) { this.listData = res.data; const newMarkers = this.listData.map(item => ({ id: parseFloat(item.sn), latitude: parseFloat(item.latitude), longitude: parseFloat(item.longitude), width: 40, height: 28, iconPath: 'https://api.ccttiot.com/smartmeter/img/static/uF9qLejuAZErNTrRuHq7', })); // 检查新数据和旧数据是否有变化 if (this.oldMarkers.length === 0 || this.isMarkersChanged(newMarkers)) { console.log('有变化'); this.markers = newMarkers; this.oldMarkers = [...newMarkers]; } } else { // 处理接口返回错误的情况 } }).catch(error => { // 处理接口请求失败的情况 }); }, isMarkersChanged(newMarkers) { if (this.oldMarkers.length !== newMarkers.length) { return true; } for (let i = 0; i < newMarkers.length; i++) { if (this.oldMarkers[i].id !== newMarkers[i].id || this.oldMarkers[i].latitude !== newMarkers[i].latitude || this.oldMarkers[i].longitude !== newMarkers[i].longitude) { return true; } } return false; }, getinfo() { if (uni.getStorageSync('token')) { this.$u.get("/getAppInfo").then((res) => { if (res.code == 200) { this.$store.commit('SET_USERID', res.user.userId); this.userinfo = res.user } else { setTimeout(() => { this.getinfo() }, ) // let that =this // wx.login({ // success(res) { // if (res.code) { // console.log('登录!', res); // let data = { // wxOpenId: res.code, // }; // let areaId = uni.getStorageSync('areaId'); // that.$u.post('/loginByopenid?jsCode=' + res.code + '&areaId=' + areaId).then( // res => { // uni.hideLoading(); // if (res.code == 200) { // uni.setStorageSync('token', res.token); // that.$u.get('/app/device/info?sn=' + that.sn).then((res) => { // if (res.code === 200) { // } else { // } // }) // } else if (res.code == 501) { // uni.showToast({ // title: res.msg, // icon: 'none', // duration: 2000 // }); // } else { // // console.log("老用户登录",res.data) // uni.redirectTo({ // url: '/pages/login/login' // }) // } // }); // } // }, // }); } }); } }, getArea() { this.showmap = false // 发送请求获取数据 this.areaInfo = {} this.polyline = [] this.$u.get('/app/area/info?', this.gps).then((res) => { this.showmap = true if (res.code === 200) { // 处理接口返回的数据,将边界数据转换为地图组件需要的折线结构 const polylines = this.convertBoundaryToPolyline(res.data.boundaryStr) // console.log(polylines,'polylinespolylinespolylines'); // .filter(area => area.boundaryStr) // 过滤掉boundary为空的数据 // .map(area => this.convertBoundaryToPolyline(area.boundaryStr)); // 更新折线数据 this.areaInfo = res.data this.polyline.push(polylines) console.log(); // console.log(this.areaInfo, 'areaInfoareaInfo'); uni.setStorageSync('areaId', res.data.areaId); this.getinfo() this.getmarks() this.getlist() this.getParking() if (uni.getStorageSync('token')) { this.getisInOrder() } const hasShownPopup = uni.getStorageSync('hasShownPopup'); console.log(hasShownPopup, 'hasShownPopup'); if (hasShownPopup === '' || hasShownPopup === null) { console.log('1111111111'); this.showTips = true; uni.setStorageSync('hasShownPopup', true); } else { console.log('222'); this.showTips = uni.getStorageSync('hasShownPopup'); console.log(this.showTips, 'this.showTips'); } this.setMapScale() // if(!hasShownPopup){ // console.log(typeof(hasShownPopup),'hasShownPopuphasShownPopup'); // this.showTips=uni.getStorageSync('hasShownPopup') // }else{ // this.showTips=true // uni.setStorageSync('hasShownPopup', true); // } // this.$store.commit('SET_SHOWTIPS', true); // console.log(this.polyline); } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); } }).catch(error => { console.error("Error fetching area data:", error); }); }, // getArea() { // // 发送请求获取数据 // this.$u.get('/app/area/list',this.gps).then((res) => { // if (res.code === 200) { // // 处理接口返回的数据,将边界数据转换为地图组件需要的折线结构 // const polylines = res.rows // .filter(area => area.boundaryStr) // 过滤掉boundary为空的数据 // .map(area => this.convertBoundaryToPolyline(area.boundaryStr)); // // 更新折线数据 // this.polyline = polylines; // this.getlist() // // console.log(this.polyline); // } // }).catch(error => { // console.error("Error fetching area data:", error); // }); // }, convertBoundaryToPolylines(boundaries) { return boundaries.map(boundary => { if (!boundary) return null; let coords; try { coords = JSON.parse(boundary); } catch (error) { console.error("Error parsing boundary JSON:", error); return null; } if (!Array.isArray(coords)) { console.error("Parsed boundary is not an array:", coords); return null; } const points = coords.map(coord => ({ latitude: coord[1], longitude: coord[0] })); return { points: points, fillColor: "#55888840", //填充颜色 strokeColor: "#558888", //描边颜色 strokeWidth: 2, //描边宽度 zIndex: 1, //层级 }; }).filter(polyline => polyline !== null); // 过滤掉无效的折线数据 }, getParking() { // 发送请求获取数据 // this.polyline=[] let data = { areaId: this.areaInfo.areaId } this.$u.get('/app/parking/list?', data).then((res) => { if (res.code === 200) { // 处理接口返回的数据 const validBoundaries = res.rows.map(row => row.boundaryStr).filter(boundary => typeof boundary === 'string' && boundary.trim() !== ''); const polylines = this.convertBoundaryToPolylines(validBoundaries); // 将处理后的数据添加到 this.polyline 中 this.polyline = this.polyline.concat(polylines); this.parkingList = res.rows // console.log(this.polyline); } }).catch(error => { console.error("Error fetching parking data:", error); }); }, convertBoundaryToPolyline(boundary) { if (!boundary) return null; const points = JSON.parse(boundary).map(coord => ({ latitude: coord[1], longitude: coord[0] })); const polyline = { points: points, fillColor: "#55888840", //填充颜色 strokeColor: "#22FF00", //描边颜色 strokeWidth: 2, //描边宽度 zIndex: 1, //层级 }; return polyline; }, // convertBoundaryToPolylines(boundaries) { // // 确保 boundaries 是一个有效的数组 // if (!Array.isArray(boundaries)) { // console.error("Boundaries is not an array:", boundaries); // return []; // } // return boundaries.map(boundary => { // if (!boundary) return null; // let coords; // try { // coords = JSON.parse(boundary); // } catch (error) { // console.error("Error parsing boundary JSON:", error); // return null; // } // if (!Array.isArray(coords)) { // console.error("Parsed boundary is not an array:", coords); // return null; // } // const points = coords.map(coord => ({ // latitude: coord[1], // longitude: coord[0] // })); // return { // points: points, // fillColor: "#55888840", //填充颜色 // strokeColor: "#22FF00", //描边颜色 // strokeWidth: 2, //描边宽度 // zIndex: 1, //层级 // }; // }).filter(polyline => polyline !== null); // 过滤掉无效的折线数据 // }, } } </script> <style> .uni-margin-wrap { width: 690rpx; width: 100%; } .swiper { height: 300rpx; } .swiper-item { display: block; height: 300rpx; line-height: 300rpx; text-align: center; } .swiper-list { margin-top: 40rpx; margin-bottom: 0; } .uni-common-mt { margin-top: 60rpx; position: relative; } .info { position: absolute; right: 20rpx; } .uni-padding-wrap { width: 550rpx; padding: 0 100rpx; } </style> <style lang="scss"> page { // background-color: ; } .page { width: 750rpx; .tab_top { position: fixed; top: 0rpx; left: 0; width: 750rpx; height: 250rpx; z-index: 1; background: linear-gradient(to bottom, rgba(255, 255, 255, 0.8), transparent); image { position: absolute; left: 30rpx; bottom: 90rpx; width: 60rpx; height: 60rpx; } .txts { position: absolute; left: 300rpx; bottom: 90rpx; font-weight: 500; font-size: 36rpx; color: #3D3D3D; font-family: AlibabaPuHuiTi, AlibabaPuHuiTi; } } .my-location { position: fixed; display: flex; align-items: center; justify-content: center; right: 30rpx; bottom: 520rpx; // background-color: #fff; border-radius: 50%; width: 82rpx; height: 82rpx; z-index: 10; .img { width: 82rpx; height: 82rpx; } } .park { position: fixed; display: flex; align-items: center; justify-content: center; right: 30rpx; bottom: 600rpx; // background-color: #fff; border-radius: 50%; width: 82rpx; height: 82rpx; z-index: 10; .img { width: 82rpx; height: 82rpx; } } .feeDetail { padding: 36rpx 22rpx; position: fixed; display: flex; flex-wrap: wrap; bottom: 0; left: 0; width: 750rpx; height: 900rpx; background: #F7F7F7; box-shadow: 0rpx 4rpx 10rpx 0rpx rgba(0, 0, 0, 0.3); border-radius: 53rpx 53rpx 0 0; z-index: 200; overflow-y: auto; /* Enable vertical scrolling */ .close { position: absolute; top: 20rpx; right: 40rpx; width: 30rpx; height: 30rpx; } .feeCard { margin-top: 20rpx; padding: 38rpx; width: 708rpx; // height: 710rpx; background: #FFFFFF; border-radius: 32rpx 32rpx 32rpx 32rpx; .tit1 { font-weight: 500; font-size: 32rpx; color: #3D3D3D; } .cont { width: 100%; margin-top: 26rpx; display: flex; flex-wrap: nowrap; .left { width: 40%; font-weight: 600; font-size: 28rpx; color: #3D3D3D; } .right { width: 60%; display: flex; flex-wrap: wrap; font-weight: 500; font-size: 28rpx; color: #FF4444; .li { width: 100%; } } } } } .tipss_box { width: 370rpx; height: 73rpx; position: fixed; bottom: 520rpx; left: 38rpx; .swiper { height: 80rpx; .tipss { // position: fixed; margin-top: 15rpx; display: flex; align-items: center; justify-content: center; flex-wrap: nowrap; image { margin-right: 15rpx; width: 24rpx; height: 24rpx; } width: 350rpx; height: 64rpx; background: #FFFFFF; box-shadow: 0rpx 4rpx 10rpx 0rpx rgba(0, 0, 0, 0.3); border-radius: 53rpx 53rpx 53rpx 53rpx; } } } .map { width: 750rpx; height: 76vh; } .botmbox2 { position: fixed; bottom: 0; padding: 40rpx 32rpx; width: 750rpx; // height: 272rpx; background: #fff; border-radius: 50rpx 50rpx 0 0; z-index: 100; .close { position: absolute; top: 20rpx; right: 40rpx; width: 35rpx; height: 35rpx; } .page1 { .top { margin-top: 20rpx; display: flex; flex-wrap: nowrap; align-items: center; padding-bottom: 28rpx; border-bottom: 2rpx solid #D8D8D8; .left { width: 56rpx; height: 56rpx; image { width: 56rpx; height: 56rpx; } } .top_center { width: 50%; display: flex; flex-wrap: wrap; margin-left: 28rpx; .cent_top { width: 100%; font-weight: 500; font-size: 28rpx; color: #3D3D3D; } .cent_bot { font-weight: 500; font-size: 24rpx; color: #ccc; } } .top_right { display: flex; align-items: center; justify-content: center; margin-left: auto; margin-right: 35rpx; width: 160rpx; height: 60rpx; border-radius: 0rpx 0rpx 0rpx 0rpx; border: 2rpx solid #4C97E7; font-weight: 500; font-size: 28rpx; color: #4C97E7; } } .center { margin-top: 42rpx; display: flex; flex-wrap: nowrap; // justify-content: space-around; padding-bottom: 28rpx; border-bottom: 2rpx solid #D8D8D8; .center_left { width: 50%; display: flex; flex-wrap: wrap; justify-content: center; .center_left_top { width: 100%; text-align: center; font-weight: 400; font-size: 24rpx; color: #808080; } .center_left_bot { margin-top: 32rpx; width: 100%; text-align: center; font-weight: 500; font-size: 60rpx; color: #3D3D3D; } } .center_right { width: 50%; display: flex; flex-wrap: wrap; justify-content: center; .center_right_top { width: 100%; text-align: center; font-weight: 400; font-size: 24rpx; color: #808080; } .center_right_bot { margin-top: 32rpx; width: 100%; text-align: center; font-weight: 500; font-size: 60rpx; color: #3D3D3D; } } } .bot { margin-top: 42rpx; display: flex; flex-wrap: nowrap; justify-content: space-between; .left_btn { display: flex; align-items: center; justify-content: center; padding-bottom: 2rpx; width: 338rpx; height: 90rpx; border-radius: 45rpx 45rpx 45rpx 45rpx; border: 2rpx solid #808080; font-weight: 500; font-size: 40rpx; color: #808080; } .right_btn { display: flex; align-items: center; justify-content: center; padding-bottom: 2rpx; width: 338rpx; height: 90rpx; background: #4C97E7; border-radius: 45rpx 45rpx 45rpx 45rpx; font-weight: 500; font-size: 40rpx; color: #FFFFFF; } } .tips { margin-top: 42rpx; width: 100%; text-align: center; font-weight: 400; font-size: 28rpx; color: #3D3D3D; } } .page2 { .top { display: flex; flex-wrap: nowrap; width: 100%; height: 284rpx; .left { display: flex; flex-wrap: wrap; justify-content: center; width: 50%; padding-top: 68rpx; .text { font-weight: 400; font-size: 24rpx; color: #808080; } .ele { width: 100%; display: flex; flex-wrap: nowrap; // align-items: center; justify-content: center; font-weight: 400; font-size: 40rpx; color: #4C97E7; image { margin-right: 18rpx; width: 22rpx; height: 48rpx; } } } .right { width: 50%; padding-top: 68rpx; display: flex; flex-wrap: wrap; justify-content: center; .text { text-align: center; width: 100%; font-weight: 400; font-size: 24rpx; color: #808080; } .speed { margin-top: 18rpx; width: 226rpx; height: 22rpx; background: #ccc; border-radius: 16rpx 16rpx 16rpx 16rpx; .speeds { // width: 90%; height: 100%; background: #77B8FD; border-radius: 16rpx 16rpx 16rpx 16rpx; } } .txt { width: 100%; display: flex; flex-wrap: nowrap; // align-items: center; // align-items: center; justify-content: center; font-weight: 500; font-size: 72rpx; color: #3D3D3D; span { font-weight: 700; margin-top: 30rpx; } } } } .center::-webkit-scrollbar { display: none; } .center { width: 100%; display: flex; flex-wrap: nowrap; overflow-x: auto; // 添加水平滚动条 margin-bottom: 200rpx; white-space: nowrap; // 确保子元素不换行 .card { width: 500rpx !important; // 确保宽度被应用 height: 288rpx; margin-right: 20rpx; position: relative; background: #FFFFFF; box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 16rpx; border: 2rpx solid #fff; image { position: absolute; top: 0; right: 0; width: 82rpx; height: 50rpx; } .tips_btn { display: flex; align-items: center; justify-content: center; position: absolute; bottom: 0; width: 350rpx; height: 70rpx; background: #4C97E7; border-radius: 0rpx 0rpx 16rpx 16rpx; font-weight: 500; font-size: 28rpx; color: #FFFFFF; } .tit { padding: 18rpx 0 0 18rpx; width: 350rpx; display: flex; align-items: center; font-weight: 500; font-size: 36rpx; color: #3D3D3D; } .nmtxt { width: 100%; margin-top: 22rpx; display: flex; justify-content: space-between; align-items: center; .left { font-weight: 400; font-size: 28rpx; color: #3D3D3D; } .right { font-weight: 400; font-size: 28rpx; color: #3D3D3D; } .red { font-weight: 400; font-size: 36rpx; color: #FF4444; } } .tip { margin-top: 14rpx; font-weight: 400; font-size: 20rpx; color: #808080; } .tips { display: flex; align-items: center; margin-left: auto; font-size: 30rpx; color: #3D3D3D; .icon-chakanxiangqing { font-size: 30rpx; color: #3D3D3D; font-weight: 600; } } } .act1 { border: 2rpx solid #4C97E7; } } .bot { display: flex; align-items: center; justify-content: center; position: absolute; bottom: 0; left: 0; width: 750rpx; height: 184rpx; background: #FFFFFF; box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08), 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 0rpx 0rpx 0rpx 0rpx; .btn { display: flex; justify-content: center; align-items: center; width: 680rpx; height: 90rpx; background: #4C97E7; border-radius: 54rpx 54rpx 54rpx 54rpx; font-weight: 500; font-size: 40rpx; color: #FFFFFF; } } } .page3 { .bot_btn { width: 750rpx; height: 648rpx; background: #fff; box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 50rpx 50rpx 0 0; .info { padding: 0 60rpx; display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-between; width: 708rpx; height: 100rpx; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; } view {} .card { margin-top: 12rpx; padding: 20rpx 30rpx; width: 708rpx; height: 288rpx; background: #FFFFFF; border-radius: 20rpx 20rpx 20rpx 20rpx; .tit { font-weight: 500; font-size: 36rpx; color: #3D3D3D; } .cont { display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-between; .left { .text { font-weight: 400; font-size: 28rpx; color: #3D3D3D; } .speed { margin-top: 18rpx; width: 226rpx; height: 22rpx; background: #EFEFEF; border-radius: 16rpx 16rpx 16rpx 16rpx; .speeds { // width: 90%; height: 100%; background: #77B8FD; border-radius: 16rpx 0rpx 0rpx 16rpx; } } .mac { margin-top: 18rpx; } } .right { image { width: 244rpx; height: 196rpx; font-weight: 400; font-size: 24rpx; color: #3D3D3D; } } } } .bot { display: flex; align-items: center; justify-content: center; position: absolute; bottom: 0; left: 0; width: 750rpx; height: 184rpx; background: #FFFFFF; box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08), 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 0rpx 0rpx 0rpx 0rpx; .btn { display: flex; justify-content: center; align-items: center; width: 338rpx; height: 90rpx; background: #4C97E7; border-radius: 54rpx 54rpx 54rpx 54rpx; font-weight: 500; font-size: 40rpx; color: #FFFFFF; } .btn1 { display: flex; justify-content: center; align-items: center; width: 338rpx; height: 90rpx; border-radius: 45rpx 45rpx 45rpx 45rpx; border: 2rpx solid #808080; font-weight: 500; font-size: 40rpx; color: #808080; } } } } .page4 { .bot_btn { // padding: 26rpx 34rpx 48rpx 34rpx; // position: fixed; // display: flex; // flex-wrap: wrap; // justify-content: center; // bottom: 0; width: 750rpx; height: 420rpx; background: #FFFFFF; box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 30rpx; .time { // height: 88rpx; width: 100%; text-align: center; padding-bottom: 24rpx; font-weight: 400; font-size: 28rpx; color: #3D3D3D; border-bottom: 2rpx solid #EFEFEF; } .price { margin-top: 22rpx; width: 100%; text-align: center; font-weight: 500; font-size: 72rpx; color: #3D3D3D; span { font-size: 28rpx; font-weight: 500; } } .toinfo { // margin-top: 12rpx; width: 100%; text-align: center; font-weight: 400; font-size: 24rpx; color: #3D3D3D; } .btn { margin-top: 34rpx; display: flex; align-items: center; justify-content: center; width: 680rpx; height: 90rpx; background: #4C97E7; border-radius: 54rpx 54rpx 54rpx 54rpx; font-weight: 500; font-size: 40rpx; color: #FFFFFF; } } } } .botmbox { position: fixed; bottom: 0; padding: 40rpx 32rpx; width: 750rpx; // height: 272rpx; background: #fff; border-radius: 50rpx 50rpx 0 0; .guangggao { margin-top: 34rpx; image { width: 686rpx; height: 160rpx; border-radius: 10rpx 10rpx 10rpx 10rpx; } } .top_btn { display: flex; flex-wrap: nowrap; align-items: center; justify-content: center; width: 686rpx; height: 90rpx; background: #4C97E7; border-radius: 54rpx 54rpx 54rpx 54rpx; font-weight: 500; font-size: 40rpx; color: #FFFFFF; image { width: 56rpx; height: 56rpx; margin-right: 4rpx; } } .bot_btn { margin-top: 34rpx; display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-between; .cont { display: flex; flex-wrap: wrap; justify-content: center; width: 112rpx; image { width: 44rpx; height:44rpx; } .text { margin-top: 12rpx; width: 112rpx; text-align: center; font-weight: 400; font-size: 28rpx; color: #3D3D3D; } } } } .pops { padding: 46rpx 36rpx; position: fixed; top: 400rpx; left: 74rpx; width: 604rpx; // height: 606rpx; background: #fff; border-radius: 20rpx 20rpx 20rpx 20rpx; z-index: 110; .time { margin-top: 20rpx; text-align: center; font-weight: 500; font-size: 48rpx; color: #4C97E7; } .cont{ height: 300rpx; overflow-x: hidden; overflow-y: auto; } .tit { // width: 604rpx; text-align: center; font-weight: 500; font-size: 36rpx; color: #3D3D3D; margin-bottom: 54rpx; } .text { margin-top: 36rpx; display: flex; flex-wrap: wrap; // align-items: center; .yuan { margin-top: 10rpx; margin-right: 12rpx; width: 20rpx; height: 20rpx; background: #000; border-radius: 50%; } span { width: 90%; font-weight: 400; font-size: 28rpx; color: #3D3D3D; } } .btn { margin-left: 40rpx; margin-top: 50rpx; display: flex; align-items: center; justify-content: center; width: 470rpx; height: 90rpx; background: #4C97E7; border-radius: 54rpx 54rpx 54rpx 54rpx; font-weight: 500; font-size: 40rpx; color: #FFFFFF; } } .bottom_more { position: fixed; bottom: 0; width: 750rpx; height: 530rpx; background: linear-gradient(180deg, #EEF5FD 20%, rgba(255, 255, 255, 0)30%), #FFFFFF; border-radius: 30rpx; padding: 48rpx 36rpx; z-index: 30; .close { position: absolute; right: 32rpx; top: 32rpx; width: 32rpx; height: 32rpx; image { width: 32rpx; height: 32rpx; } } .tit { font-weight: 500; font-size: 44rpx; color: #3D3D3D; } .contbox { margin-top: 44rpx; width: 100%; display: flex; flex-wrap: wrap; .cont_li { margin-top: 22rpx; display: flex; flex-wrap: wrap; // align-items: center; justify-content: center; width: 158rpx; height: 124rpx; background: #FFFFFF; box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 16rpx 16rpx 16rpx 16rpx; margin-right: 10rpx; image { margin-top: 18rpx; width: 46rpx; height: 46rpx; } .txt { width: 100%; margin-top: 10rpx; text-align: center; font-weight: 400; font-size: 24rpx; color: #3D3D3D; } } } } } </style>