From 7a3dddc6efa48810549e4c43e53216a73cbc7e5c Mon Sep 17 00:00:00 2001 From: Sliverber <2622874537@qq.com> Date: Wed, 17 Jul 2024 18:02:42 +0800 Subject: [PATCH] 111 --- page_user/changeCar.vue | 1810 ++++++++++++++++++++++++++++++++++---- page_user/vadio_back.vue | 2 +- pages/index/index.vue | 25 +- 3 files changed, 1646 insertions(+), 191 deletions(-) diff --git a/page_user/changeCar.vue b/page_user/changeCar.vue index c84b091..e80d35a 100644 --- a/page_user/changeCar.vue +++ b/page_user/changeCar.vue @@ -2,122 +2,168 @@ <view class="page"> <u-navbar title="换车骑行" :border-bottom="false" :background="bgc" title-color='#000' title-size='36' height='45' back-icon-color='#000'></u-navbar> - <view class="cont_box"> - <view class="tit"> - <image src="https://lxnapi.ccttiot.com/bike/img/static/uByIrgaV23PDGZWReKHW" mode=""></image> - 请选择换车原因 - </view> - <!-- https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau --> - <view class="choose_li"> - <view class="li_cont"> - <view class="img_box"> - <image src="https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau" mode=""></image> - </view> - 电量不足 - </view> - <view class="li_cont"> - <view class="img_box"> - <image src="https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau" mode=""></image> - </view> - 车辆损坏 + <view class="cont_box"> + <view class="tit"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/uByIrgaV23PDGZWReKHW" mode=""></image> + 请选择换车原因 + </view> + <!-- https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau --> + <view class="choose_li"> + <view class="li_cont" @click="checkIdx=1"> + <view class="img_box"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau" mode="" + v-if="checkIdx==1"></image> </view> + 电量不足 </view> - <view class="tit" style="margin-top: 20rpx;"> - - SN:2315721 + <view class="li_cont" @click="checkIdx=2"> + <view class="img_box"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau" mode="" + v-if="checkIdx==2"></image> + </view> + 车辆损坏 </view> </view> - <view class="cont_box"> - <view class="tit"> - <image src="https://lxnapi.ccttiot.com/bike/img/static/uByIrgaV23PDGZWReKHW" mode=""></image> - 请选择车辆故障部位 - </view> - <!-- https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau --> - <view class="txt"> - 车头故障 - </view> - <view class="checkbox"> - <view v-for="(item, index) in cbgz" :key="index" class="check_li" :class="item.checked === true ? 'act1' : ''" @click="toggleCheckbox(index)"> - {{ item.dictLabel }} - <image src="https://lxnapi.ccttiot.com/bike/img/static/ufYwbVclwhX64u4eGu6u" mode="" v-if="item.checked === true "></image> - </view> - </view> - <view class="txt"> - 车身故障 - </view> - <view class="checkbox"> - <view v-for="(item, index) in csgz" :key="index" class="check_li" :class="item.checked === true ? 'act1' : ''" @click="csCheckbox(index)"> - {{ item.dictLabel }} - <image src="https://lxnapi.ccttiot.com/bike/img/static/ufYwbVclwhX64u4eGu6u" mode="" v-if="item.checked === true "></image> - </view> - - </view> - <view class="txt"> - 特殊故障 - </view> - <view class="checkbox"> - <view v-for="(item, index) in tsgz" :key="index" class="check_li" :class="item.checked === true ? 'act1' : ''" @click="tsCheckbox(index)"> - {{ item.dictLabel }} - <image src="https://lxnapi.ccttiot.com/bike/img/static/ufYwbVclwhX64u4eGu6u" mode="" v-if="item.checked === true "></image> - </view> - </view> - <view class="input-container"> - <view class="placeholder" v-if="!textValue">如选项未涵盖,请输入故障问题</view> - <textarea class="custom-textarea" v-model="textValue" @focus="hidePlaceholder" style="border: none;" - @input="updateWordCount" @blur="showPlaceholder"></textarea> - <text class="word-count">{{ currentCount }}/500</text> + <view class="tit" style="margin-top: 20rpx;"> + + SN:{{orderinfo.sn}} + </view> + </view> + <view class="cont_box" v-show="checkIdx==2"> + <view class="tit"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/uByIrgaV23PDGZWReKHW" mode=""></image> + 请选择车辆故障部位 + </view> + <!-- https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau --> + <view class="txt"> + 车头故障 + </view> + <view class="checkbox"> + <view v-for="(item, index) in cbgz" :key="index" class="check_li" + :class="item.checked === true ? 'act1' : ''" @click="toggleCheckbox(index)"> + {{ item.dictLabel }} + <image src="https://lxnapi.ccttiot.com/bike/img/static/ufYwbVclwhX64u4eGu6u" mode="" + v-if="item.checked === true "></image> </view> </view> - <view class="cont_box"> - <view class="tit"> - <image src="https://lxnapi.ccttiot.com/bike/img/static/uByIrgaV23PDGZWReKHW" mode=""></image> - 请对故障部位拍照并环绕车身进行录像 - </view> - - <view class="icon"> - - <view class="imgbox" v-for="(item,index) in imglist " :key="index"> - <image :src="item" mode=""></image> - </view> - <view class="imgbox" @click="btn"> - <image src="https://api.ccttiot.com/smartmeter/img/static/uY8CPw9YE6JxPzcHUaqf" mode=""></image> - </view> - - </view> - <!-- https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau --> - + <view class="txt"> + 车身故障 </view> - <view class="tits"> - 点击扫码或输入车辆编号 - </view> - <view class="iptbox"> - <view class="qrcode" @click="qrcode()"> - <image src="https://api.ccttiot.com/smartmeter/img/static/uy7BNwAMIKwvstqFnRhs" mode=""></image> + <view class="checkbox"> + <view v-for="(item, index) in csgz" :key="index" class="check_li" + :class="item.checked === true ? 'act1' : ''" @click="csCheckbox(index)"> + {{ item.dictLabel }} + <image src="https://lxnapi.ccttiot.com/bike/img/static/ufYwbVclwhX64u4eGu6u" mode="" + v-if="item.checked === true "></image> </view> - <input type="text" class="ips" v-model="sn" placeholder="请扫描设备上的二维码" style="margin-left: 32rpx;" - placeholder-class="my-placeholder" /> - + </view> - - <view class="conts_box"> + <view class="txt"> + 特殊故障 + </view> + <view class="checkbox"> + <view v-for="(item, index) in tsgz" :key="index" class="check_li" + :class="item.checked === true ? 'act1' : ''" @click="tsCheckbox(index)"> + {{ item.dictLabel }} + <image src="https://lxnapi.ccttiot.com/bike/img/static/ufYwbVclwhX64u4eGu6u" mode="" + v-if="item.checked === true "></image> + </view> + </view> + <view class="input-container"> + <view class="placeholder" v-if="!textValue">如选项未涵盖,请输入故障问题</view> + <textarea class="custom-textarea" v-model="textValue" @focus="hidePlaceholder" style="border: none;" + @input="updateWordCount" @blur="showPlaceholder"></textarea> + <text class="word-count">{{ currentCount }}/500</text> + </view> + </view> + <view class="cont_box" v-if="checkIdx==2&&areainfo.returnVerify==0"> + <view class="tit"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/uByIrgaV23PDGZWReKHW" mode=""></image> + 请对故障部位拍照 + </view> + + <view class="icon"> + + <view class="imgbox" v-for="(item,index) in imglist " :key="index"> + <image :src="item" mode=""></image> + </view> + <view class="imgbox" @click="btn"> + <image src="https://api.ccttiot.com/smartmeter/img/static/uY8CPw9YE6JxPzcHUaqf" mode=""></image> + </view> + + </view> + <!-- https://lxnapi.ccttiot.com/bike/img/static/uZQYJi6D7tPy4CszHtau --> + + </view> + <view class="cont" v-if="areainfo.returnVerify==1"> + <view class="tip_txt" style="font-weight: 500;font-size: 32rpx;color: #3D3D3D;"> + 保持车辆录像的完整清晰,不要随意拍摄,确保视频中车辆出境,并且出现车牌号 + </view> + <view class="vadio_png1" @click="recordVideo"> + <image class="backimg" src="https://lxnapi.ccttiot.com/bike/img/static/uEP0UPJw6a1WuxA7ZlMo" mode="" + v-if="videoUrl==''"> + <image class="tip_img" src="https://lxnapi.ccttiot.com/bike/img/static/uXFG7Vee8MWx5y7pha2U" + mode=""></image> + </image> + <video class="vad" :src="videoUrl" controls="controls" style="width: 100%;" v-if="videoUrl!=''"></video> + <view class="glass" v-if="videoUrl!=''"></view> + <image class="tip_img" src="https://lxnapi.ccttiot.com/bike/img/static/uXFG7Vee8MWx5y7pha2U" mode="" + v-if="videoUrl!=''"></image> + </view> + </view> + <view class="tits"> + 点击扫码或输入车辆编号 + </view> + <view class="iptbox"> + <view class="qrcode" @click="qrcode()"> + <image src="https://api.ccttiot.com/smartmeter/img/static/uy7BNwAMIKwvstqFnRhs" mode=""></image> + </view> + <input type="text" class="ips" v-model="sncode" placeholder="请扫描设备上的二维码" style="margin-left: 32rpx;" + placeholder-class="my-placeholder" /> + + </view> + + <view class="conts_box" v-if="deviceinfo.sn"> + <view class="cont_li"> <view class="left"> <view class="km"> - 可继续行驶{{OrderdeviceInfos.remainingMileage}}公里 + 可继续行驶{{deviceinfo.remainingMileage}}公里 </view> <view class="speed"> - <view class="speeds" :style="{ width: OrderdeviceInfos.remainingPower + '%' }"> - + <view class="speeds" :style="{ width: deviceinfo.remainingPower + '%' }"> + </view> </view> <view class="NO"> - NO.{{OrderdeviceInfos.sn}} + NO.{{deviceinfo.sn}} </view> </view> <view class="right"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uqKmFMF9YHTX8lAQARSd" mode=""></image> </view> </view> - <view class="conts_box"> + <view class="cont_li" style="margin-top: 10rpx;"> + <view class="left" style="font-size: 32rpx;font-weight: 400;"> + 已骑行 + </view> + <view class="right" style="font-size: 32rpx;font-weight: 400;"> + {{timeString}} + </view> + </view> + <view class="cont_li" style="margin-top: 10rpx;"> + <view class="left" style="font-size: 32rpx;font-weight: 400;"> + 预估金额 + </view> + <view class="right" style="font-size: 32rpx;font-weight: 400;"> + {{money}}元 + </view> + </view> + <view class="txtss"> + 扫码开锁后将自动合并订单,骑行时间将继续计时 + </view> + </view> + + <!-- <view class="conts_box"> <view class="left"> 已骑行 </view> @@ -132,49 +178,1125 @@ <view class="right"> {{money}}元 </view> + </view> --> + <view class="btns" @click="subs(0)"> + 提交 + </view> + <view class="maskloadpage" v-if="maskloading"> + <view class="maskpage0" v-if="maskepage==0"> + <view class="top_info"> + <image :src="loadimg" mode=""></image> + <view class="masktxt"> + {{toploadtxt}} + </view> + </view> + <view class="masktips"> + {{tiptxt}} + </view> + <view class="tipsimg"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/ugvqmfB3QYujZ6SnfTia" mode=""></image> + </view> </view> + <view class="maskpage1" v-if="maskepage==4"> + <view class="top_info"> + <image :src="loadimg" mode=""></image> + <view class="masktxt"> + {{buletxt}} + </view> + </view> + <view class="masktips" style="width: 100%;"> + 请确保与车辆的距离小于3米 + </view> + <view class="tipsimg"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/ugvqmfB3QYujZ6SnfTia" mode=""></image> + </view> + + </view> + <!-- 不允许停车点外还车 --> + <view class="maskpage1" v-if="maskepage==5"> + <view class="top_info"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/uG3cbPgvPDzwlq6IHHxK" mode=""></image> + <view class="masktxt" v-if="orderinfo.sn"> + 蓝牙连接失败 + </view> + </view> + <view class="masktips" style="width: 100%;"> + 请确保手机蓝牙已经打开 + </view> + <view class="masktips" @click="totxtpage()" + style="width: 100%;color: #4C97E7;text-decoration-line: underline;margin-top: 0; font-size: 28rpx;"> + 点击查看教程 + </view> + <view class="tipsimg"> + <image src="https://lxnapi.ccttiot.com/bike/img/static/ugvqmfB3QYujZ6SnfTia" mode=""></image> + </view> + <view class="btn_box"> + + + + <view class="btn4" @click="closemask()"> + 返回 + + </view> + <view class="btn3" @click="subs(1)"> + 重新尝试 + </view> + </view> + </view> + </view> </view> </template> <script> + const app = getApp(); + var xBlufi = require("@/utils/blufi/xBlufi.js"); + let _this = null; export default { data() { return { bgc: { backgroundColor: "#fff", }, - cbgz: [ - ], - csgz: [ - ], + cbgz: [], + csgz: [], tsgz: [ - + ], textValue: '', currentCount: 0, imglist: [], token: '', - sn:'', - upurl:'' - + sn: '', + upurl: '', + checkIdx: 1, + maskloading: false, + maskepage: 0, + sn: 0, + mac: 0, + orderinfo: {}, + sncode: '', + money: '', + timer: null, + timeString: '', + deviceinfo: {}, + issend: false, + isback: false, + isopen: false, + upvideo: false, + + + maskloading: false, + toploadtxt: "开锁中0%", + loadimg: 'https://lxnapi.ccttiot.com/bike/img/static/urJQJnOI1DEjWatFqHYh', + tiptxt: '请定点停放,规范用车', + maskepage: 0, + backgps: {}, + buletxt: '', + + buleclose: false, + buleopen: false, + bulering: false, + bulerebort: false, + getnum: 0, + showvehicle: false, + vehicleNum: '', + gps: {}, + areainfo: {}, + areaId: '', + videoUrl: '' } }, onLoad(e) { - this.getlist() + this.getlist() + + }, + watch: { + sncode(newValue, oldValue) { + if (newValue && newValue.length === 7) { + this.getdevice(); + } + } + + + }, + + onHide() { + clearInterval(this.timer); + // 页面隐藏时清除定时器 + if (this.timers) { + clearInterval(this.timers); + this.timers = null; + console.log('定时器已清除'); + } + xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); + xBlufi.notifyStartDiscoverBle({ + 'isStart': false + }); + }, + onUnload() { + clearInterval(this.timer); + // 页面卸载时清除定时器 + if (this.timers) { + clearInterval(this.timers); + this.timers = null; + console.log('定时器已清除'); + } + xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); + xBlufi.notifyStartDiscoverBle({ + 'isStart': false + }); + }, + + onBeforeUnmount() { + clearInterval(this.timer); + if (this.timers) { + clearInterval(this.timers); + this.timers = null; + console.log('定时器已清除'); + } + xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); + xBlufi.notifyStartDiscoverBle({ + 'isStart': false + }); }, onShow() { - + if (uni.getStorageSync('adminAreaid')) { + this.areaId = uni.getStorageSync('adminAreaid') + + this.getArea() + } + this.$store.dispatch('userInfo', this.$u).then(() => { + this.getQiniuToken() + this.getisInOrder() + // 执行其他操作... + }); + let that = this + uni.getLocation({ + type: 'gcj02', + success: function(lb) { + + that.gps.latitude = lb.latitude; + that.gps.longitude = lb.longitude; + + }, + fail: function(error) { + uni.showToast({ + title: '未获取到定位信息,请点击设置勾选允许位置信息,即可使用全部功能', + icon: 'none', + duration: 2000 + }); + // that.getmarks() + // 在这里处理获取位置信息失败的情况 + } + + }) + + }, + computed: { + + userId() { + return this.$store.getters.userId; + }, }, methods: { + getQiniuToken() { + console.log('diaou'); + this.$u.get("/common/qiniu/uploadInfo").then((res) => { + if (res.code == 200) { + this.token = res.token + console.log(res, 'resres'); + this.upurl = res.domain + } + }); + // this.$u.get('https://v2.ielts.langsi.online/file/getToken').then(res => { + // console.log(res.data); + // this.token = res.data.token + // }).catch(err => { + // console.log(err) + // }) + + }, + btn() { + let _this = this + let math = 'static/' + _this.$u.guid(20) + uni.chooseImage({ + count: 9, + type: 'all', + success(res) { + // tempFilePath可以作为img标签的src属性显示图片 + const tempFilePaths = res.tempFiles + // let tempFilePaths = chooseImageRes.tempFilePaths; + // console.log(tempFilePaths) + // tempFilePaths.forEach(item=>{ + // // 上传图片到七牛云 + + // }) + wx.uploadFile({ + url: 'https://up-z2.qiniup.com', + name: 'file', + filePath: tempFilePaths[0].path, + formData: { + token: _this.token, //后端返回的token + key: 'smartmeter/img/' + math + }, + success: function(res) { + console.log(res, 'resres'); + let str = JSON.parse(res.data) + console.log(str.key) + _this.userImgs = _this.upurl + '/' + str.key + console.log(_this.userImgs) + _this.imglist.push(_this.userImgs) + } + }); + } + }) + + }, + getArea() { + + let id = this.areaId + this.$u.get("/app/area/" + id).then((res) => { + + if (res.code == 200) { + + this.areainfo = res.data + // this.areainfo.returnVerify = 0 + } else { + uni.showToast({ + title: res.msg, + icon: 'none', + duration: 2000 + }); + } + }); + }, + closemask() { + this.maskloading = false + }, + sub() { + let data = { + userId: this.orderinfo.userId, + detail: this.textValue, + sn: this.orderinfo.sn, + orderNo:this.orderinfo.orderNo, + types: [] // Initialize the type array + }; + if (this.areainfo.returnVerify == 0) { + data.picture = this.imglist.join(',') + } else { + data.picture = this.videoUrl + } + + + // Check for checked items in cbgz + this.cbgz.forEach(item => { + if (item.checked) { + data.types.push(item.dictValue); + } + }); + + // Check for checked items in csgz + this.csgz.forEach(item => { + if (item.checked) { + data.types.push(item.dictValue); + } + }); + + // Check for checked items in tsgz + this.tsgz.forEach(item => { + if (item.checked) { + data.types.push(item.dictValue); + } + }); + console.log(data, 'dadadad'); + this.$u.post("/appVerify/fault", data).then((res) => { + if (res.code == 200) { + this.issend = true + uni.showToast({ + title: '提交成功', + icon: 'none', + duration: 1000 + }); + + } else { + uni.showToast({ + title: res.msg, + icon: 'none', + duration: 1000 + }); + } + }); + }, + subvadio() { + let data = { + orderNo: this.orderinfo.orderNo, + + } + if (!this.orderinfo.videoUrl) { + data.videoUrl = this.videoUrl + } + if (this.orderinfo.videoUrl) { + data.videoUrl = this.orderinfo.videoUrl + ',' + this.videoUrl + } + this.$u.put('/appVerify/order/saveVideoUrl', data).then((res) => { + // uni.hideLoading()· + if (res.code === 200) { + this.upvideo = true + } else { + + } + }) + }, + recordVideo() { + // 调用录像API + uni.chooseVideo({ + sourceType: ['camera'], // 指定使用相机录像 + camera: 'back', // 指定使用后置摄像头,可选值有front、back + maxDuration: 15, // 最大录制时长(秒) + success: (res) => { + // 获取视频录制文件的临时路径 + this.videoPath = res.tempFilePath; + console.log(res.tempFilePath); + this.upload() + }, + fail: (err) => { + console.log('录像失败:', err); + } + }); + }, + upload() { + uni.showLoading({ + title: '上传中' + }) + let _this = this + let math = 'static/' + _this.$u.guid(20) + wx.uploadFile({ + url: 'https://up-z2.qiniup.com', + name: 'file', + filePath: this.videoPath, + formData: { + token: _this.token, //后端返回的token + key: 'bike/video/' + math + }, + success: function(res) { + uni.hideLoading() + console.log(res, 'resres'); + let str = JSON.parse(res.data) + console.log(str.key) + _this.videoUrl = _this.upurl + '/' + str.key + console.log(_this.userImgs) + // _this.imglist.push(_this.userImgs) + } + }); + }, + subs(num) { + if (this.orderinfo.sn === this.sncode) { + uni.showToast({ + title: '换车设备不能和当前设备相同', + icon: 'none', + duration: 1000 + }); + } else if (this.areainfo.returnVerify === 1 && this.videoUrl === '') { + uni.showToast({ + title: '请拍摄还车视频', + icon: 'none', + duration: 1000 + }); + } else if (this.areainfo.returnVerify === 0 && this.checkIdx === 2) { + if (this.imglist.length < 1) { + uni.showToast({ + title: '请对损坏部位拍照', + icon: 'none', + duration: 1000 + }); + } else { + uni.showToast({ + title: '请选择损坏部位', + icon: 'none', + duration: 1000 + }); + } + } else if (!this.deviceinfo.sn) { + uni.showToast({ + title: '请扫码或者输入车辆编号', + icon: 'none', + duration: 1000 + }); + } else { + if (num === 0) { + this.maskloading = true; + this.maskepage = 0; + this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/uRxPPoVoqmnmng6wKlij'; + let percentage = 0; + const interval = setInterval(() => { + if (percentage < 98) { + percentage += 2; // 每次增加的百分比,可以调整 + this.toploadtxt = `换车中${percentage}%`; + } else { + clearInterval(interval); + this.toploadtxt = "换车中98%"; + } + }, 40); // 每40毫秒更新一次,可以调整 + } + + if (!this.upvideo && this.orderinfo.returnVerify === 1) { + this.subvadio(); + } + + if (this.checkIdx === 2 && !this.issend) { + this.sub(); + } + + if (!this.isback) { + this.changeback(); + } else if (!this.isopen) { + this.changeOpne(); + } + + setTimeout(() => { + if (this.isback && this.isopen) { + this.loadimg = 'https://lxnapi.ccttiot.com/bike/img/static/ukD735zCS1yQXw2aGun8'; + this.toploadtxt = '换车成功'; + setTimeout(() => { + this.resetState(); + this.getisInOrder(); + uni.navigateBack({ + delta: 1 // delta值为1时表示返回的页面层数 + }); + }, 1000); + } + }, 2000); + } + }, + + resetState() { + this.isback = false; + this.isopen = false; + this.issend = false; + this.upvideo = false; + this.deviceinfo = {}; + this.maskloading = false; + this.sncode = ''; + }, + changeback() { + // this.mac=this.orderinfo.mac + // this.buleclose=true + // this.Binddevice() + this.$u.post('/appVerify/changeVehicle/lock?orderNo=' + this.orderinfo.orderNo + '&changeReason=' + this + .checkIdx).then((res) => { + + if (res.code == 200) { + this.isback = true + this.subs(1) + + } else { + // 处理接口返回错误的情况 + this.mac = this.orderinfo.mac + this.buleclose = true + this.Binddevice() + } + }).catch(error => { + // 处理接口请求失败的情况 + }); + }, + buleback() { + this.$u.post('/appVerify/changeVehicle/lock?orderNo=' + this.orderinfo.orderNo + '&changeReason=' + this + .checkIdx + '&isBluetooth=true' + '&lon=' + lb.longitude + + '&lat=' + lb.latitude).then((res) => { + if (res.code == 200) { + this.isback = true + this.subs(1) + + } + }).catch(error => { + // 处理接口请求失败的情况 + }); + }, + changeOpne() { + this.$u.post('/appVerify/changeVehicle/unlocking?orderNo=' + this.orderinfo.orderNo + '&newSn=' + this + .deviceinfo.sn).then((res) => { + if (res.code == 200) { + this.isopen = true + this.subs(1) + + } else { + this.mac = this.deviceinfo.mac + this.buleopen = true + this.Binddevice() + // 处理接口返回错误的情况 + } + }).catch(error => { + // 处理接口请求失败的情况 + }); + }, + changebuleOpne() { + this.$u.post('/appVerify/changeVehicle/unlocking?orderNo=' + this.orderinfo.orderNo + '&newSn=' + this + .deviceinfo.sn + '&isBluetooth=true' + '&lon=' + this.gps.longitude + '&lat=' + this.gps.latitude) + .then((res) => { + if (res.code == 200) { + this.isopen = true + this.subs(1) + + } + }).catch(error => { + // 处理接口请求失败的情况 + }); + }, + getdevice() { + this.$u.get('/app/device/info?sn=' + this.sncode).then((res) => { + if (res.code == 200) { + + this.deviceinfo = res.data + + } else { + // 处理接口返回错误的情况 + } + }).catch(error => { + // 处理接口请求失败的情况 + }); + }, + qrcode() { + 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.sncode = sn + console.log(res.result); + if (this.sncode != '') { + + this.getdevice() + } + + }, + fail: err => { + console.error('扫描失败:', err); + uni.showToast({ + title: '扫描失败', + icon: 'none' + }); + } + }); + }, + Binddevice() { + uni.getBluetoothAdapterState({ + success: function(res) { + console.log('蓝牙状态:', res.available) + }, + fail: function(res) { + console.log('获取蓝牙状态失败') + } + }) + this.maskloading = true + this.devicesList = [] + this.maskepage = 4 + this.buletxt = '蓝牙连接中' + // uni.showLoading({ + // title: '蓝牙扫描中..' + // }) + xBlufi.initXBlufi(1); + console.log("xBlufi", xBlufi.XMQTT_SYSTEM); + xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent); + xBlufi.notifyStartDiscoverBle({ + 'isStart': true + }); + + + // 两秒后停止蓝牙搜索 + setTimeout(() => { + xBlufi.notifyStartDiscoverBle({ + 'isStart': false + }); + setTimeout(() => { + // uni.hideLoading() + if (this.devicesList.length == 0) { + // uni.showToast({ + // title: '暂无发现对应设备,请靠近设备', + // icon: 'none', + // duration: 1500 + // }); + this.maskepage = 5 + } else { + let uniqueDevicesList = Array.from(new Set(this.devicesList)); + + // 将去重后的数组重新赋值给 this.devicesList + this.devicesList = uniqueDevicesList; + console.log(this.devicesList, 'this.devicesListthis.devicesList'); + let istrue = false + this.devicesList.forEach(device => { + // 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符) + let macFromName = device.name.substring(device.name.length - 12); + console.log(macFromName, 'macFromNamemacFromName'); + // 与 this.mac 进行比较 + if (macFromName == this.mac) { + // 如果相同,则将 this.ishave 设置为 true + console.log(device); + this.deviceInfoss = device + // this.ishave = true; + istrue = true + this.createBLEConnection(device) + + console.log('对比正确1111111111'); + } else { + console.log('对比错误'); + + } + }); + setTimeout(() => { + if (!istrue) { + this.buletxt = '蓝牙连接失败' + + + setTimeout(() => { + this.maskepage = 5 + }, 500) + } + + }, 500) + } + + + }, 200) + // 判断是否存在浇花器设备 + + // this.status = true + }, 5000) + + }, + reboot() { + let vm = this; // 将外部的 this 绑定到 vm 上 + uni.getNetworkType({ + success(res) { + if (res.networkType !== 'none') { + uni.getConnectedBluetoothDevices({ + success(res) { + console.log('已连接的蓝牙设备信息:', res); + // vm.dl = (vm.orderinfo.deviceAmount / vm.orderinfo.unitPrice).toFixed(2); // 使用 vm 访问 Vue 实例的属性 + xBlufi.notifySendCustomData({ + customData: "11reboot" + }); + // vm.maskloading=false + // uni.hideLoading() + // vm.remakr() + }, + fail(err) { + uni.hideLoading() + console.error('获取已连接蓝牙设备信息失败:', err); + } + }); + } else { + console.log('手机未连接网络'); + } + } + }); + }, + open() { + let vm = this; // 将外部的 this 绑定到 vm 上 + uni.getNetworkType({ + success(res) { + if (res.networkType !== 'none') { + uni.getConnectedBluetoothDevices({ + success(res) { + console.log('已连接的蓝牙设备信息:', res); + // vm.dl = (vm.orderinfo.deviceAmount / vm.orderinfo.unitPrice).toFixed(2); // 使用 vm 访问 Vue 实例的属性 + xBlufi.notifySendCustomData({ + customData: "11open" + }); + vm.maskepage = 0 + vm.toploadtxt = '换车中'; + vm.changebuleOpne() + // uni.hideLoading() + // vm.remakr() + }, + fail(err) { + // uni.hideLoading() + console.error('获取已连接蓝牙设备信息失败:', err); + } + }); + } else { + console.log('手机未连接网络'); + } + } + }); + }, + close() { + let vm = this; // 将外部的 this 绑定到 vm 上 + uni.getNetworkType({ + success(res) { + if (res.networkType !== 'none') { + uni.getConnectedBluetoothDevices({ + success(res) { + console.log('已连接的蓝牙设备信息:', res); + // vm.dl = (vm.orderinfo.deviceAmount / vm.orderinfo.unitPrice).toFixed(2); // 使用 vm 访问 Vue 实例的属性 + xBlufi.notifySendCustomData({ + customData: "11close" + }); + // vm.maskloading=false + vm.buleback() + vm.maskepage = 0 + vm.toploadtxt = '换车中'; + // uni.hideLoading() + // vm.remakr() + }, + fail(err) { + // uni.hideLoading() + console.error('获取已连接蓝牙设备信息失败:', err); + } + }); + } else { + console.log('手机未连接网络'); + } + } + }); + }, + funListenDeviceMsgEvent: function(options) { + switch (options.type) { + case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS: + if (options.result) { + let devicesarr = options.data + // this.devicesList = options.data + + devicesarr.forEach(device => { + + + // this.$u.get(`/app/device/${mac}/isBind`, data).then((res) => { + // if (res.data == false) { + this.devicesList.push(device); + + let uniqueDevicesList = Array.from(new Set(this.devicesList)); + + // 将去重后的数组重新赋值给 this.devicesList + this.devicesList = uniqueDevicesList; + + }); + } + break; + + case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED: + console.log("连接回调:" + JSON.stringify(options)); + if (options.result) { + // uni.hideLoading(); + + + xBlufi.notifyInitBleEsp32({ + deviceId: options.data.deviceId + }); + + // xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvents); + + // this.deviceIds = options.data.deviceId + // this.name = options.data.name + // 连接成功绑定设备 + // let params = { + // mac: this.Bluetoothmac, + // userId: this.$store.state.user.userId + // } + let systemInfo = uni.getSystemInfoSync(); + if (systemInfo.platform === 'android') { + // 当前设备是 Android + + } else if (systemInfo.platform === 'ios') { + // 当前设备是 iOS + // uni.navigateTo({ + // url: '/pages/wifilist/index?deviceId=' + options + // .data.deviceId + '&name=' + options.data.name + // }) + } + } + if (options.result == false) { + // this.loadingmask=false + this.carstause = false + if (this.maskepage == 4) { + this.buletxt = '设备连接失败' + + + setTimeout(() => { + this.maskepage = 5 + }, 800) + } + + // uni.showModal({ + // title: '很抱歉提醒你!', + // content: '小程序与设备异常断开', + // showCancel: false, + // success: function(res) { + // // uni.navigateBack({ + // // url: '../search/search' + // // }); + // } + // }); + // this.statusflag = false + // uni.hideLoading(); + } + break; + case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA: + + // this.ver_data = this.parseCustomData(options.data) + if (options.data) { + this.carstause = true + + + if (this.maskloading && this.maskepage == 4) { + // setTimeout(() => { + // this.maskloading = false + // }, 700) + if (this.buleclose == false && this.buleopen == false && this.bulerebort == false && + this + .bulering == false) { + if (this.buletxt == '蓝牙连接中') { + this.buletxt = '蓝牙连接成功!' + } + + } + if (this.buleclose) { + this.buleclose = false + this.close() + } + if (this.buleopen) { + this.buleopen = false + this.open() + } + if (this.bulerebort) { + this.buleopen = false + this.reboot() + } + if (this.bulering) { + this.bulering = false + this.ring() + } + + + } + + + + + + + } else { + this.carstause = false + if (this.maskepage == 4) { + this.buletxt = '设备连接失败' + + + setTimeout(() => { + this.maskepage = 5 + }, 800) + } + } + console.log("1收到设备发来的自定义数据结果:", options.data); + break; + case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED: { + console.log('状态', options.result) + if (options.result == false) { + this.carstause = false + if (this.maskepage == 4) { + this.buletxt = '设备连接失败' + + + setTimeout(() => { + this.maskepage = 5 + }, 800) + } + // uni.showToast({ + // title: '设备断开链接,请重新点击蓝牙链接', + // icon: 'none' + // }); + // uni.showModal({ + // title: '很抱歉提醒你!', + // content: '小程序与设备异常断开', + // showCancel: false, + // success: function(res) { + // // uni.navigateBack({ + // // url: '../search/search' + // // }); + // } + // }); + // this.statusflag = false + // uni.hideLoading(); + } + } + break; + case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP: + if (options.result) { + let uniqueDevicesList = Array.from(new Set(this.devicesList)); + + // 过滤出名称字段的前五个字母为 "CTPOW" 的项 + let filteredDevices = uniqueDevicesList.filter(device => device.name.substring(0, + 4) === + "BBLE"); + + // 将过滤后的数组重新赋值给 this.devicesList + this.devicesList = filteredDevices; + + // console.log('蓝牙停止搜索ok',this.devicesList); + } else { + //蓝牙停止搜索失败 + // console.log('蓝牙停止搜索失败'); + } + this.searching = false + // _this.setData({ + // searching: false + // }); + + break; + } + }, + + + // 解析自定义数据 + + + //4、建立连接 + createBLEConnection(e) { + console.log('调用了'); + xBlufi.notifyStartDiscoverBle({ + 'isStart': false + }); + console.log(e, '蓝牙信息') + const deviceId = e.deviceId + this.Bluetoothmac = e.localName.substring(5) //从第七位开始截取 只取后面的mac号 + console.log(this.Bluetoothmac, '11111'); + let name = e.name; + console.log('点击了,蓝牙准备连接的deviceId:' + e.deviceId); + xBlufi.notifyConnectBle({ + isStart: true, + deviceId: e.deviceId, + name + }); + // for (var i = 0; i < this.devicesList.length; i++) { + // if (e.deviceId === this.devicesList[i].deviceId) { + + // uni.showLoading({ + // title: '连接蓝牙设备中...' + // }); + // } + // } + }, + getisInOrder() { + // uni.showLoading({ + + // }) + this.orderinfo = {} + if (this.userId) { + this.$u.post('/app/user/isInOrder?userId=' + this.userId, ).then((res) => { + // uni.hideLoading() + if (res.code === 200) { + // this.freList=res.rows + this.orderinfo = res.data[0] + const createTimeTimestamp = new Date(this.orderinfo.unlockTime).getTime(); + this.$u.get('/app/device/info?sn=' + this.orderinfo.sn).then((res) => { + if (res.code == 200) { + + this.orderinfo.mac = res.data.mac + + } else { + // 处理接口返回错误的情况 + } + }).catch(error => { + // 处理接口请求失败的情况 + }); + // 定义定时器 + 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 { + uni.showToast({ + title: res.msg, + icon: 'none', + duration: 2000 + }); + } + }) + } + + }, + toggleCheckbox(index) { this.cbgz[index].checked = !this.cbgz[index].checked; this.$forceUpdate() }, - csCheckbox(index){ + csCheckbox(index) { this.csgz[index].checked = !this.csgz[index].checked; }, - tsCheckbox(index){ + tsCheckbox(index) { this.tsgz[index].checked = !this.tsgz[index].checked; }, hidePlaceholder() { @@ -185,14 +1307,23 @@ this.placeholderVisible = true; } }, - getlist(){ + getlist() { // checked this.$u.get("/appVerify/fault/allList?dictType=et_fault_type").then((res) => { - + if (res.code == 200) { - this.cbgz = res.data.headstock.map(item => ({...item, checked: false})); - this.csgz = res.data.body.map(item => ({...item, checked: false})); - this.tsgz = res.data.special.map(item => ({...item, checked: false})); + this.cbgz = res.data.headstock.map(item => ({ + ...item, + checked: false + })); + this.csgz = res.data.body.map(item => ({ + ...item, + checked: false + })); + this.tsgz = res.data.special.map(item => ({ + ...item, + checked: false + })); } else { uni.showToast({ title: '未登录,请登录后尝试', @@ -217,6 +1348,267 @@ // height: 530rpx; // background: linear-gradient( 180deg, #64B6A7 0%, rgba(255,255,255,0) 100%), #FFFFFF; border-radius: 0rpx 0rpx 0rpx 0rpx; + padding-bottom: 200rpx; + + .tip_box { + padding: 44rpx 36rpx; + font-weight: 400; + font-size: 32rpx; + color: #FFFFFF; + background: #64B6A7; + } + + .vadio_png1 { + position: relative; + width: 672rpx; + height: 370rpx; + + .backimg { + + width: 672rpx; + height: 370rpx; + + } + + .tip_img { + position: absolute; + top: 72rpx; + left: 210rpx; + width: 252rpx; + height: 194rpx; + z-index: 11; + } + + .vad { + width: 672rpx; + height: 370rpx; + border-radius: 40rpx; + z-index: 1; + } + + .glass { + position: absolute; + top: 0; + left: 0; + width: 672rpx; + height: 370rpx; + background: rgba(255, 255, 255, 0.2); + border-radius: 40rpx; + // box-shadow: 0 rgba(0, 0, 0, 0.1); + backdrop-filter: blur(10rpx); + -webkit-backdrop-filter: blur(10rpx); + /* For Safari */ + // border: 1rpx solid rgba(255, 255, 255, 0.3); + z-index: 10; + + } + + } + + .cont { + width: 100%; + padding: 0 39rpx; + + .tip_txt { + margin-top: 38rpx; + width: 100%; + font-weight: 400; + font-size: 28rpx; + color: #3D3D3D; + } + + .vadio_png { + margin-top: 52rpx; + + image { + width: 672rpx; + height: 370rpx; + } + } + + .btn { + position: fixed; + bottom: 100rpx; + left: 38rpx; + // margin-top: 128rpx; + display: flex; + align-items: center; + justify-content: center; + width: 680rpx; + height: 90rpx; + background: rgba(100, 182, 167, 0.5); + border-radius: 54rpx 54rpx 54rpx 54rpx; + z-index: 10; + font-weight: 500; + font-size: 40rpx; + color: #FFFFFF; + } + + .act1 { + background: #64B6A7; + } + } + + .maskloadpage { + + position: fixed; + padding: 46rpx; + bottom: 0; + width: 752rpx; + height: 780rpx; + background: #FFFFFF; + border-radius: 40rpx 40rpx 0rpx 0rpx; + z-index: 101; + box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15); + + .maskpage0 { + .top_info { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + + image { + margin-right: 16rpx; + width: 50rpx; + height: 50rpx; + } + + .masktxt { + font-weight: 500; + font-size: 44rpx; + color: #3D3D3D; + } + } + + .masktips { + margin-top: 20rpx; + width: 100%; + text-align: center; + font-weight: 400; + font-size: 32rpx; + color: #3D3D3D; + } + + .tipsimg { + margin-top: 60rpx; + display: flex; + // align-items: center; + justify-content: center; + width: 100%; + + image { + width: 554rpx; + height: 262rpx; + + } + } + } + + .maskpage1 { + .top_info { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + + image { + margin-right: 16rpx; + width: 50rpx; + height: 50rpx; + } + + .masktxt { + font-weight: 500; + font-size: 44rpx; + color: #3D3D3D; + } + } + + .masktips { + margin-top: 20rpx; + width: 100%; + text-align: center; + font-weight: 400; + font-size: 32rpx; + color: #3D3D3D; + } + + .tipsimg { + margin-top: 60rpx; + display: flex; + // align-items: center; + justify-content: center; + width: 100%; + + image { + width: 554rpx; + height: 262rpx; + + } + } + + .btn_box { + width: 750rpx; + padding: 0 36rpx; + position: absolute; + bottom: 60rpx; + left: 0; + display: flex; + justify-content: space-between; + align-items: center; + + .btn3 { + // margin-right: 16rpx; + display: flex; + align-items: center; + justify-content: center; + width: 300rpx; + height: 90rpx; + background: #4C97E7; + border-radius: 45rpx 45rpx 45rpx 45rpx; + + font-weight: 500; + font-size: 40rpx; + color: #FFFFFF; + } + + .btn4 { + display: flex; + align-items: center; + justify-content: center; + width: 300rpx; + height: 90rpx; + border-radius: 45rpx 45rpx 45rpx 45rpx; + border: 2rpx solid #808080; + + font-weight: 500; + font-size: 40rpx; + color: #808080; + } + } + } + + } + + + .btns { + position: fixed; + bottom: 70rpx; + left: 34rpx; + display: flex; + align-items: center; + justify-content: center; + font-weight: 500; + font-size: 40rpx; + color: #FFFFFF; + width: 680rpx; + height: 90rpx; + background: #64B6A7; + border-radius: 54rpx 54rpx 54rpx 54rpx; + z-index: 100; + } + .iptbox { display: flex; align-items: center; @@ -228,87 +1620,116 @@ background: #FFFFFF; box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15); border-radius: 20rpx 20rpx 20rpx 20rpx; - .qrcode{ + + .qrcode { padding-right: 20rpx; border-right: 2rpx solid #D8D8D8; - image{ + + image { width: 54rpx; height: 54rpx; } } + .ips { width: 630rpx; - + } - + image { width: 18rpx; height: 32rpx; } - + .my-placeholder { font-weight: 400; font-size: 32rpx; color: #808080; } } + .conts_box { width: 680rpx; - margin-top: 36rpx; margin: 0 auto; display: flex; - flex-wrap: nowrap; + flex-wrap: wrap; align-items: center; justify-content: space-between; - - .left { + margin-top: 38rpx; + background: #FFFFFF; + box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); + border-radius: 20rpx 20rpx 20rpx 20rpx; + padding-bottom: 20rpx; + + .txtss { + margin-top: 18rpx; + padding-left: 20rpx; + width: 100%; + font-weight: 500; + font-size: 28rpx; + color: #808080; + } + + .cont_li { + width: 100%; display: flex; - flex-wrap: wrap; - font-weight: 600; - font-size: 36rpx; - color: #3D3D3D; - - .km { - font-weight: 400; - font-size: 28rpx; + flex-wrap: nowrap; + align-items: center; + justify-content: space-between; + + .left { + padding-left: 20rpx; + display: flex; + flex-wrap: wrap; + font-weight: 600; + font-size: 36rpx; color: #3D3D3D; - } - - .speed { - margin-top: 18rpx; - width: 226rpx; - height: 22rpx; - background: #ccc; - border-radius: 16rpx 16rpx 16rpx 16rpx; - - .speeds { - // width: 90%; - height: 100%; - background: #64B6A7; + + .km { + font-weight: 400; + font-size: 28rpx; + color: #3D3D3D; + } + + .speed { + margin-top: 18rpx; + width: 226rpx; + height: 22rpx; + background: #ccc; border-radius: 16rpx 16rpx 16rpx 16rpx; + + .speeds { + // width: 90%; + height: 100%; + background: #64B6A7; + border-radius: 16rpx 16rpx 16rpx 16rpx; + } + } + + .NO { + width: 100%; + font-weight: 400; + font-size: 24rpx; + color: #3D3D3D; } } - - .NO { - font-weight: 400; - font-size: 24rpx; + + .right { + padding-right: 20rpx; + font-weight: 600; + font-size: 36rpx; color: #3D3D3D; + + image { + width: 244rpx; + height: 196rpx; + } } } - - .right { - font-weight: 600; - font-size: 36rpx; - color: #3D3D3D; - - image { - width: 244rpx; - height: 196rpx; - } - } + } - - .tits{ + + .tits { width: 680rpx; margin: 0 auto; font-weight: 400; @@ -316,40 +1737,45 @@ font-size: 36rpx; color: #3D3D3D; } - .cont_box{ - + + .cont_box { + margin: 0 auto; padding: 24rpx 32rpx; width: 680rpx; margin-top: 38rpx; background: #FFFFFF; - box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0,0,0,0.08); + box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08); border-radius: 20rpx 20rpx 20rpx 20rpx; - .tit{ + + .tit { width: 100%; display: flex; - flex-wrap: nowrap; + flex-wrap: nowrap; align-items: center; - image{ + + image { margin-right: 12rpx; width: 24rpx; height: 24rpx; } - + } - .choose_li{ + + .choose_li { margin-top: 34rpx; width: 100%; display: flex; flex-wrap: nowrap; align-items: center; + // justify-content: space-between; - .li_cont{ + .li_cont { width: 50%; display: flex; flex-wrap: nowrap; - - .img_box{ + + .img_box { margin-right: 30rpx; width: 38rpx; height: 38rpx; @@ -358,6 +1784,7 @@ } } } + .tip { display: flex; flex-wrap: nowrap; @@ -366,16 +1793,16 @@ font-size: 32rpx; color: #3D3D3D; line-height: 44rpx; - + .ipnt { margin-top: 10rpx; margin-right: 12rpx; color: #FF4444; font-size: 48rpx; - + } } - + .iptbox { display: flex; align-items: center; @@ -384,12 +1811,12 @@ height: 80rpx; border-radius: 20rpx 20rpx 20rpx 20rpx; border: 2rpx solid #979797; - + .ips { margin-left: 30rpx; width: 80%; } - + .iptbtn { display: flex; align-items: center; @@ -398,43 +1825,45 @@ height: 80rpx; background: #64B6A7; border-radius: 20rpx 20rpx 20rpx 20rpx; - + image { width: 37rpx; height: 37rpx; } } } - + .txt { margin-top: 18rpx; font-weight: 400; font-size: 28rpx; color: #3D3D3D; } + .icon { display: flex; flex-wrap: wrap; align-items: center; margin-top: 40rpx; - + .imgbox { width: 33%; - + image { width: 142rpx; height: 142rpx; } } - + } + .checkbox { display: flex; flex-wrap: wrap; - + .check_li { position: relative; - margin-right: 10rpx; + margin-right: 10rpx; margin-top: 18rpx; display: flex; align-items: center; @@ -443,7 +1872,8 @@ height: 65rpx; border-radius: 20rpx 20rpx 20rpx 20rpx; border: 2rpx solid #C7C7C7; - image{ + + image { position: absolute; right: 0; bottom: 0; @@ -451,18 +1881,21 @@ height: 20rpx; } } + .check_li:nth-child(4n) { - margin-right: 0; + margin-right: 0; } + .act1 { // background-image: url(https://api.ccttiot.com/smartmeter/img/static/uaqN5qdoGNCs7Dumzr3F); width: 142rpx; height: 65rpx; - // background-size: cover; - border: 2rpx solid #1E807A; + // background-size: cover; + border: 2rpx solid #1E807A; // background: #4C97E7; } } + .input-container { position: relative; width: 612rpx; @@ -476,7 +1909,7 @@ box-sizing: border-box; border: 2rpx solid #C7C7C7; } - + .placeholder { position: absolute; top: 18rpx; @@ -486,6 +1919,7 @@ pointer-events: none; /* 确保点击事件可以穿透到textarea上 */ } + .custom-textarea { width: 100%; height: 100%; @@ -496,7 +1930,7 @@ box-sizing: border-box; border: 1px solid #ccc; } - + .word-count { position: absolute; right: 10px; @@ -505,6 +1939,6 @@ color: #999; } } - + } </style> \ No newline at end of file diff --git a/page_user/vadio_back.vue b/page_user/vadio_back.vue index 7b067e5..0496e5d 100644 --- a/page_user/vadio_back.vue +++ b/page_user/vadio_back.vue @@ -165,7 +165,7 @@ filePath: this.videoPath, formData: { token: _this.token, //后端返回的token - key:'bike/vadio/'+math + key:'bike/video/'+math }, success: function(res) { uni.hideLoading() diff --git a/pages/index/index.vue b/pages/index/index.vue index d8b1cea..dd5ec44 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -284,6 +284,12 @@ <image src="https://api.ccttiot.com/smartmeter/img/static/uHTCZOVUbmBkKW4G0wuF" mode=""> </image> </view> + + </view> + <view class="changebiketip" @click="tochange()"> + 换车骑行 <view class="iconfont icon-xiangyou1"> + + </view> </view> </view> <view class="bot" style="margin-top: 20rpx;" v-if="orderinfo.status==0"> @@ -302,7 +308,7 @@ <view class="bot" style="margin-top: 20rpx;" v-if="orderinfo.status==2"> - <view class="btn" style=" margin-right: 16rpx;" v-if="OrderdeviceInfos.status==3" + <view class="btn" style=" margin-right: 16rpx;" v-if="OrderdeviceInfos.status==3||OrderdeviceInfos.status==6" @click="taploadmask (2)"> 临时锁车 </view> @@ -1265,6 +1271,11 @@ }, }, methods: { + tochange(){ + uni.navigateTo({ + url: '/page_user/changeCar' + }) + }, tovadio() { // this.seeDetail=true this.maskepage = 0 @@ -6011,7 +6022,17 @@ font-size: 36rpx; color: #3D3D3D; } - + .changebiketip{ + bottom: 20rpx; + left: 280rpx; + position: absolute; + display: flex; + flex-wrap: nowrap; + align-items: center; + font-weight: 400; + font-size: 28rpx; + color: #3D3D3D; + } .cont { margin-top: 30rpx; display: flex;