From c3f818ae608584717b3314933c9c94927d0a4d62 Mon Sep 17 00:00:00 2001 From: Sliverber <2622874537@qq.com> Date: Thu, 1 Aug 2024 10:03:54 +0800 Subject: [PATCH] 11 --- common/http.interceptor.js | 8 +- pages/bind_mac.vue | 422 ++++++++++++++++++++----------------- pages/index/index.vue | 94 +++++---- pages/login/login.vue | 2 +- 4 files changed, 288 insertions(+), 238 deletions(-) diff --git a/common/http.interceptor.js b/common/http.interceptor.js index 01c029b..9898003 100644 --- a/common/http.interceptor.js +++ b/common/http.interceptor.js @@ -22,10 +22,10 @@ const install = (Vue, vm) => { uni.setStorageSync('deptId', 100); Vue.prototype.$u.http.setConfig({ // baseUrl: 'http://61.174.243.28:15861', - baseUrl: 'http://192.168.2.46:8080', + // baseUrl: 'http://192.168.2.46:8080', // baseUrl: 'http://124.221.246.124:2289', // baseUrl: 'https://dianche.chuantewulian.cn/prod-api', - // baseUrl: 'https://dche.ccttiot.com/prod-api', + baseUrl: 'https://dche.ccttiot.com/prod-api', loadingText: '努力加载中~', loadingTime: 50000, @@ -52,9 +52,9 @@ const install = (Vue, vm) => { // 方式四,如果token放在了Storage本地存储中,拦截是每次请求都执行的 // 所以哪怕您重新登录修改了Storage,下一次的请求将会是最新值 - // const token = uni.getStorageSync('token'); + const token = uni.getStorageSync('token'); - const token = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjQ0ZDljYzBlLThjZjEtNGFkOC05OGFjLThlNThjMWIxYjQ3OSJ9.v-aMkp9t7Z_QfjfsZy6d_1Ng76hPYa0A--SWScMJY9to7UlNv9IxHQnTJylLKdYKGrr8fRZ47Bu12UPm1DgMQg" + // const token = "Bearer eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6IjQ0ZDljYzBlLThjZjEtNGFkOC05OGFjLThlNThjMWIxYjQ3OSJ9.v-aMkp9t7Z_QfjfsZy6d_1Ng76hPYa0A--SWScMJY9to7UlNv9IxHQnTJylLKdYKGrr8fRZ47Bu12UPm1DgMQg" // console.log("我是token", token) config.header.Authorization = token; diff --git a/pages/bind_mac.vue b/pages/bind_mac.vue index a0873f1..0691464 100644 --- a/pages/bind_mac.vue +++ b/pages/bind_mac.vue @@ -2,59 +2,61 @@ <view class="page"> <u-navbar title="添加设备" :border-bottom="false" :background="bgc" title-color='#262B37' title-size='38' height='50'></u-navbar> - <view class="iptbox" @click="backpage()"> - - <input type="text" class="ips" v-model="mac" placeholder=" " style="margin-left: 32rpx;" disabled - placeholder-class="my-placeholder" /> - <view class="iconfont icon-xiangyou1 "> - - </view> - + <view class="iptbox" @click="backpage()"> + + <input type="text" class="ips" v-model="mac" placeholder=" " style="margin-left: 32rpx;" disabled + placeholder-class="my-placeholder" /> + <view class="iconfont icon-xiangyou1 "> + </view> + + </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="sn" placeholder="请扫描设备上的二维码" style="margin-left: 32rpx;" placeholder-class="my-placeholder" /> - + </view> <view class="iptbox" @click="show=true"> - <view class=""> - 版本: 版本id: + <view class="" v-if="hardwareInfo.version"> + 版本:{{hardwareInfo.version}} 版本id:{{hardwareInfo.id}} + </view> + <view class="" v-else> + 请点击选择版本 </view> - </view> - <view class="tips"> - 版本介绍: + <view class="tips" v-if="hardwareInfo.version"> + 版本介绍:{{hardwareInfo.instructions}} </view> - <u-select v-model="show" :list="list" title='选择运营区' @confirm="confirm"></u-select> + <u-select v-model="show" :list="list" title='选择运营区' @confirm="confirm"></u-select> <view class="btn" @click="bind()"> 确认添加 </view> - <view class="bot_btn" > - - <view class="btn1" @click="Binddevice()"> + <view class="bot_btn"> + + <view class="btn1" @click="Binddevice()"> 蓝牙链接 </view> - <view class="btn1" @click="ring()" v-if="carstause"> + <view class="btn1" @click="ring()" v-if="carstause"> 响铃寻车 </view> - - <view class="btn1" @click="open()" v-if="carstause"> + + <view class="btn1" @click="open()" v-if="carstause"> 蓝牙开锁 </view> - <view class="btn1" @click="close()" v-if="carstause"> + <view class="btn1" @click="close()" v-if="carstause"> 蓝牙关锁 </view> - <view class="btn1" @click="reboot()" v-if="carstause"> + <view class="btn1" @click="reboot()" v-if="carstause"> 设备重启 </view> - <view class="btn1" @click="Binddevice()" v-if="isbands"> + <view class="btn1" @click="Binddevice()" v-if="isbands"> 接口响铃 </view> </view> - + <!-- <view class="bot"> <view class="btn"> 退款 @@ -94,26 +96,27 @@ name: '', orderinfo: {}, dl: 0, - czmoney:true, - iscz:true, + czmoney: true, + iscz: true, bgc: { backgroundColor: "#F7FAFE", }, - sn:'', - carstause:false, - isbands:false, - show:false, - list:[] - - + sn: '', + carstause: false, + isbands: false, + show: false, + list: [], + hardwareInfo: {} + + } }, onLoad(e) { - this.mac=e.mac + this.mac = e.mac this.Binddevice() - this.isbands=false - this.carstause=false + this.isbands = false + this.carstause = false }, onShow() { this.getlist() @@ -124,97 +127,117 @@ 'isStart': false }); }, - onHide(){ + onHide() { xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); xBlufi.notifyStartDiscoverBle({ 'isStart': false }); }, - onBeforeUnmount(){ + onBeforeUnmount() { xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent); xBlufi.notifyStartDiscoverBle({ 'isStart': false }); }, watch: { - - - + + + }, methods: { - confirm(e){ + confirm(e) { // console.log(e); - uni.setStorageSync('adminAreaid', e[0].value); - this.areaId= e[0].value - + uni.setStorageSync('hardwareVersionId', e[0].value); + this.hardwareVersionId = e[0].value + const hardwareVersionId =this.hardwareVersionId + if (hardwareVersionId) { + const matchedVersion = this.Versionlist.find(version => version.id === + hardwareVersionId); + if (matchedVersion) { + this.hardwareInfo = matchedVersion; + } + } + }, - getlist(){ + getlist() { this.$u.get('/app/hardwareVersion/list').then((res) => { if (res.code === 200) { + this.Versionlist = res.data + const hardwareVersionId = uni.getStorageSync('hardwareVersionId'); + + if (hardwareVersionId) { + this.hardwareVersionId=hardwareVersionId + const matchedVersion = this.Versionlist.find(version => version.id === + hardwareVersionId); + if (matchedVersion) { + this.hardwareInfo = matchedVersion; + } + } + this.list = res.data.map(item => ({ - value: item.id, - label: item.version - })); - }else{ - uni.showToast({ - title: res.msg, - icon: 'none', - duration: 2000 - }); - } - }) - }, - send(){ - this.$u.post('/app/device/ring?sn=' + this.sn).then((res) => { - if (res.code === 200) { - - }else{ - uni.showToast({ - title: res.msg, - icon: 'none', - duration: 2000 - }); - } - }) - }, - backpage(){ - uni.navigateBack({ - delta: 1 // delta值为1时表示返回的页面层数 - }); - }, - bind(){ - this.$u.post(`/appVerify/band?sn=`+this.sn+'&mac='+this.mac).then((res) => { - - if (res.code == 200) { - - uni.showToast({ - title: '绑定成功', - icon: 'none', - duration: 2000 - }); - setTimeout(()=>{ - uni.navigateBack({ - delta: 1 // delta值为1时表示返回的页面层数 - }); - },2000) - + value: item.id, + label: item.version + })); } else { uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }); - } }) }, - qrcode(){ + send() { + this.$u.post('/app/device/ring?sn=' + this.sn).then((res) => { + if (res.code === 200) { + + } else { + uni.showToast({ + title: res.msg, + icon: 'none', + duration: 2000 + }); + } + }) + }, + backpage() { + uni.navigateBack({ + delta: 1 // delta值为1时表示返回的页面层数 + }); + }, + bind() { + this.$u.post(`/appVerify/band?sn=` + this.sn + '&mac=' + this.mac+'&hardwareVersionId='+this.hardwareVersionId).then((res) => { + + if (res.code == 200) { + + uni.showToast({ + title: '绑定成功', + icon: 'none', + duration: 2000 + }); + setTimeout(() => { + uni.navigateBack({ + delta: 1 // delta值为1时表示返回的页面层数 + }); + }, 2000) + + } else { + uni.showToast({ + title: res.msg, + icon: 'none', + duration: 2000 + }); + + } + }) + }, + qrcode() { uni.scanCode({ onlyFromCamera: true, scanType: ['qrCode'], success: res => { - + let sn = null; let queryParams = res.result.split('?')[1]; if (queryParams) { @@ -226,13 +249,13 @@ } }); } - + this.sn = sn console.log(res.result); if (this.sn != '') { - + } - + }, fail: err => { console.error('扫描失败:', err); @@ -243,10 +266,10 @@ } }); }, - - Binddevice(){ + + Binddevice() { uni.showLoading({ - title:'连接中..' + title: '连接中..' }) xBlufi.initXBlufi(1); console.log("xBlufi", xBlufi.XMQTT_SYSTEM); @@ -254,14 +277,14 @@ xBlufi.notifyStartDiscoverBle({ 'isStart': true }); - - + + // 两秒后停止蓝牙搜索 setTimeout(() => { xBlufi.notifyStartDiscoverBle({ 'isStart': false }); - setTimeout(()=>{ + setTimeout(() => { uni.hideLoading() if (this.devicesList.length == 0) { uni.showToast({ @@ -270,14 +293,14 @@ }); } else { let uniqueDevicesList = Array.from(new Set(this.devicesList)); - + // 将去重后的数组重新赋值给 this.devicesList this.devicesList = uniqueDevicesList; // console.log(this.devicesList,'this.devicesListthis.devicesList'); this.devicesList.forEach(device => { // 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符) let macFromName = device.name.substring(device.name.length - 12); - console.log(macFromName,'macFromNamemacFromName'); + console.log(macFromName, 'macFromNamemacFromName'); // 与 this.mac 进行比较 if (macFromName == this.mac) { // 如果相同,则将 this.ishave 设置为 true @@ -285,22 +308,22 @@ this.deviceInfoss = device // this.ishave = true; this.createBLEConnection(device) - + console.log('对比正确1111111111'); } else { console.log('对比错误'); - + } }); } - },200) + }, 200) // 判断是否存在浇花器设备 - + // this.status = true }, 2000) - + }, - reboot(){ + reboot() { let vm = this; // 将外部的 this 绑定到 vm 上 uni.getNetworkType({ success(res) { @@ -316,7 +339,7 @@ // vm.remakr() }, fail(err) { - uni.hideLoading() + uni.hideLoading() console.error('获取已连接蓝牙设备信息失败:', err); } }); @@ -326,7 +349,7 @@ } }); }, - open(){ + open() { let vm = this; // 将外部的 this 绑定到 vm 上 uni.getNetworkType({ success(res) { @@ -342,7 +365,7 @@ // vm.remakr() }, fail(err) { - uni.hideLoading() + uni.hideLoading() console.error('获取已连接蓝牙设备信息失败:', err); } }); @@ -352,7 +375,7 @@ } }); }, - close(){ + close() { let vm = this; // 将外部的 this 绑定到 vm 上 uni.getNetworkType({ success(res) { @@ -368,7 +391,7 @@ // vm.remakr() }, fail(err) { - uni.hideLoading() + uni.hideLoading() console.error('获取已连接蓝牙设备信息失败:', err); } }); @@ -378,7 +401,7 @@ } }); }, - ring(){ + ring() { let vm = this; // 将外部的 this 绑定到 vm 上 uni.getNetworkType({ success(res) { @@ -394,7 +417,7 @@ // vm.remakr() }, fail(err) { - uni.hideLoading() + uni.hideLoading() console.error('获取已连接蓝牙设备信息失败:', err); } }); @@ -407,32 +430,32 @@ btnyc() { this.titleflag = false }, - + // 解析自定义数据 - + 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; - + + + // 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) { @@ -441,13 +464,13 @@ title: '连接成功', icon: 'none' }); { - + xBlufi.notifyInitBleEsp32({ deviceId: options.data.deviceId }); - + xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvents); - + this.deviceIds = options.data.deviceId this.name = options.data.name // 连接成功绑定设备 @@ -458,7 +481,7 @@ let systemInfo = uni.getSystemInfoSync(); if (systemInfo.platform === 'android') { // 当前设备是 Android - + } else if (systemInfo.platform === 'ios') { // 当前设备是 iOS // uni.navigateTo({ @@ -468,27 +491,27 @@ } } } - + break; case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA: - + // this.ver_data = this.parseCustomData(options.data) - if(options.data){ - this.carstause=true + if (options.data) { + this.carstause = true } // console.log("1收到设备发来的自定义数据结果:", this.ver_data); 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 { //蓝牙停止搜索失败 @@ -498,12 +521,12 @@ // _this.setData({ // searching: false // }); - + break; } }, - - + + //4、建立连接 createBLEConnection(e) { console.log('调用了'); @@ -523,7 +546,7 @@ }); // for (var i = 0; i < this.devicesList.length; i++) { // if (e.deviceId === this.devicesList[i].deviceId) { - + // uni.showLoading({ // title: '连接蓝牙设备中...' // }); @@ -567,16 +590,16 @@ } }, 2000) } - - + + }, funListenDeviceMsgEvents: function(options) { let that = this; switch (options.type) { case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED: { console.log('状态', options.result) - if( options.result==false){ - this.carstause=false + if (options.result == false) { + this.carstause = false uni.showToast({ title: '设备断开链接,请重新点击蓝牙链接', icon: 'none' @@ -592,11 +615,11 @@ // } // }); // this.statusflag = false - uni.hideLoading(); + uni.hideLoading(); } } break; - + case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_MY_DATA: this.loadPercent = options.data; this.loadText = '文件读取中' @@ -606,19 +629,19 @@ // this.isband = true // this.ver_data = this.parseCustomData(options.data) console.log("1收到设备发来的自定义数据结果:", options.data); - if(options.data){ - this.carstause=true + if (options.data) { + this.carstause = true } break; - + case xBlufi.XBLUFI_TYPE.TYPE_INIT_ESP32_RESULT: uni.hideLoading(); if (options.result) { console.log('初始化成功'); } else { console.log('初始化失败'); - - + + } break; } @@ -627,25 +650,25 @@ btnhd() { this.tishiflag = false }, - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + } } </script> @@ -659,7 +682,8 @@ .page { padding-bottom: 250rpx; width: 750rpx; - .btn{ + + .btn { margin: 160rpx auto; // position: fixed; display: flex; @@ -671,15 +695,17 @@ height: 88rpx; background: #FFCC25; border-radius: 20rpx 20rpx 20rpx 20rpx; - + font-weight: 500; font-size: 32rpx; color: #FFFFFF; } - .tips{ + + .tips { margin: 28rpx auto 0; width: 658rpx; } + .iptbox { display: flex; align-items: center; @@ -691,31 +717,35 @@ 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; } } - .bot_btn{ + + .bot_btn { position: fixed; bottom: 0; display: flex; @@ -725,12 +755,14 @@ // height: 330rpx; background: #fff; // background: linear-gradient( 180deg, #FFFFFF 0%, rgba(255,255,255,0) 100%); - 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: 0rpx 0rpx 0rpx 0rpx; + .btn:nth-child(4n) { - margin-right: 0; + margin-right: 0; } - .btn1{ + + .btn1 { margin-top: 10rpx; margin-right: 12rpx; display: flex; @@ -746,8 +778,8 @@ color: #3D3D3D; } } - - - + + + } </style> \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue index d453b5b..e1f989a 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -42,13 +42,13 @@ <view class="iconfont icon-xiangzuo" v-if="isCollapsed" @click="toggleOrderTips"></view> </view> - <view class="swiper_tips" style="background: rgba(255, 197, 197, 0.7);" v-if="netonlines==false"> + <view class="swiper_tips" style="background: rgba(255, 197, 197, 0.7);" v-if="netonlines==false"> <view class="cont"> <image src="https://lxnapi.ccttiot.com/bike/img/static/uJ4bst6OYzPYD8iEtyCJ" mode=""></image> <view class="scroll-container" ref="scrollContainer"> - <text class="txt" - style="font-weight: 400;font-size: 28rpx;color: #444444;">当前网络不可用,请检查你的网络设置</text> - + <text class="txt" + style="font-weight: 400;font-size: 28rpx;color: #444444;">当前网络不可用,请检查你的网络设置</text> + <!-- Duplicate the text for seamless scrolling --> </view> </view> @@ -321,7 +321,7 @@ <view class="changebiketip" @click="tochange()"> 换车骑行 <view class="iconfont icon-xiangyou1"> - + </view> </view> <view class="btn" style=" margin-right: 16rpx;" @@ -1056,7 +1056,7 @@ isupload: false, showparkinfo: false, parkinfo: {}, - netonlines:false + netonlines: false } }, watch: { @@ -1181,14 +1181,14 @@ }); if (this.seeDetail == false) { - let that = this + let that = this uni.getNetworkType({ success: function(res) { console.log(res.networkType); // 输出网络类型,如 "wifi", "4g", "3g", "2g", "none" if (res.networkType == 'none') { that.netonlines = false - - + + } else { that.netonlines = true uni.getLocation({ @@ -1198,16 +1198,16 @@ // that.longitude = 117.074552 // that.gps.latitude = 23.440359 // that.gps.longitude = 117.074552; - - - + + + that.gps.latitude = lb.latitude; that.gps.longitude = lb.longitude; - + that.latitude = lb.latitude; that.longitude = lb.longitude; - - + + console.log(that.areaInfo, 'that.areaInfo'); that.getArea() if (that.qParam != 'null' && that.showagre == false) { @@ -1215,7 +1215,7 @@ console.log(qParam, 'qParamqParamqParam'); // 第2步: URL解码q参数 let decodedUrl = decodeURIComponent(qParam); - + // 第3步: 使用正则表达式解析解码后的URL并提取查询参数 let sn = null; let queryParams = decodedUrl.split('?')[1]; @@ -1230,10 +1230,10 @@ } that.sn = sn if (that.sn != '') { - - + + setTimeout(() => { - + if (!that.orderinfo.status) { that.deviceInfo(1) that.qParam = null @@ -1244,13 +1244,13 @@ // this.showtcs=true } }, 700) - - + + } } // that.getmarks() - - + + // }, fail: function(error) { @@ -1262,19 +1262,19 @@ // that.getmarks() // 在这里处理获取位置信息失败的情况 } - + }) - - - - + + + + // console.log('有网络连接');\ - + } } }); - - + + } else { @@ -4354,7 +4354,9 @@ this.gps.sn = this.sn } } - + if (this.sn != '') { + this.gps.sn = this.sn + } setTimeout(() => { this.setMapScale() }, 300) @@ -4811,10 +4813,17 @@ duration: 4000 }); } else if (this.deviceInfos.status == 1) { + + if (this.areaId != res.data.areaId) { + this.getArea() + } // this.routePlanning(res.data.latitude, res.data.longitude) - this.showdevice = true - this.type = 1; - this.deviceIndex = 1; + setTimeout(() => { + this.showdevice = true + this.type = 1; + this.deviceIndex = 1; + }, 500) + } } } else { @@ -4937,9 +4946,16 @@ // this.routePlanning(res.data // .latitude, res.data // .longitude) - this.showdevice = true; - this.type = 1; - this.deviceIndex = 1; + if (this.areaId != res.data + .areaId) { + this.getArea() + } + // this.routePlanning(res.data.latitude, res.data.longitude) + setTimeout(() => { + this.showdevice = true + this.type = 1; + this.deviceIndex = 1; + }, 500) } } } else { @@ -6241,6 +6257,7 @@ 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; padding-top: 30rpx; + .changebiketip { bottom: 40rpx; left: 320rpx; @@ -6252,6 +6269,7 @@ font-size: 28rpx; color: #3D3D3D; } + .btn { display: flex; justify-content: center; diff --git a/pages/login/login.vue b/pages/login/login.vue index c4dac13..31edcc8 100644 --- a/pages/login/login.vue +++ b/pages/login/login.vue @@ -18,7 +18,7 @@ </view> --> <view class="pages2" v-if="deptId==100&&pageindex==0"> <view class="imgbox"> - <image src="https://lxnapi.ccttiot.com/bike/img/static/uX6A5Dlyr4lvGFNuqfPK" mode=""></image> + <image src="https://lxnapi.ccttiot.com/bike/img/static/umJTSzDVtnfpyYrZY0VJ" mode=""></image> </view> <button class="button" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber" style="margin-top: 30rpx;">