Sprinkler-app/page_newyemian/wgluru-add.vue

1308 lines
32 KiB
Vue
Raw Normal View History

2025-12-26 16:53:58 +08:00
<template>
2026-01-17 17:37:00 +08:00
<view class="page">
<u-navbar title="设备录入" :border-bottom="false" :background="bgc" title-color='#000' back-icon-color="#000" title-size='38' :custom-back="btns"
height='50'></u-navbar>
<view class="iptbox" @click="backpage()">
<input type="text" class="ips" v-model="mac" placeholder=" " style="margin-left: 32rpx;"
placeholder-class="my-placeholder" />
<view class="mini-btn" @click.stop="Binddevice()">蓝牙连接</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="storeId" placeholder="请扫描设备上的二维码" style="margin-left: 32rpx;"
placeholder-class="my-placeholder" />
<view class="mini-btn" @click="btnwl">网络控制</view>
</view>
<view class="lanyasj">
<view class="item">
<view class="label-box">
<u-icon name="info-circle" size="28" color="#52c41a"></u-icon>
<text class="label">版本号</text>
2025-12-26 16:53:58 +08:00
</view>
2026-01-17 17:37:00 +08:00
<view>
<text v-if="ver_data.ver" class="value">{{'V' + ver_data.ver}}</text>
<text v-else class="value">--</text>
<view class="apn-btn" @click.stop="fengm()" v-if="carstause">固件升级</view>
</view>
</view>
</view>
<view class="bot_btn">
<view class="btn1" @click="bind()">
录入
</view>
</view>
<u-mask :show="showbind" :z-index='100' />
<view class="tip_box" v-if="showbind">
<view class="top" v-if="showbind">
<view class="tip">
操作提示
</view>
<view class="ipt_box" style="justify-content: center;">
<view class="text" style="width: 80%;text-align: center;">
该mac号已有绑定sn码是否修改为当前sn码
2025-12-26 16:53:58 +08:00
</view>
</view>
2026-01-17 17:37:00 +08:00
</view>
<view class="bots">
<view class="bot_left" @click="showbind=false ">
取消
</view>
<view class="bot_right" @click="changeBind()">
确定
2025-12-26 16:53:58 +08:00
</view>
</view>
2026-01-17 17:37:00 +08:00
</view>
<u-mask :show="showApnModal" :z-index='100' />
<view class="tip_box" v-if="showApnModal">
<view class="top">
<view class="tip">修改APN</view>
<view class="ipt_box" style="justify-content: center;">
<input class="input" v-model="apnValue" placeholder="请输入APN" style="border: 1px solid #ccc; padding: 10rpx; width: 80%; text-align: center; border-radius: 10rpx; height: 60rpx;" />
</view>
</view>
<view class="bots">
<view class="bot_left" @click="showApnModal=false">取消</view>
<view class="bot_right" @click="confirmApn">确定</view>
</view>
</view>
<view class="float-container">
<view class="float-btn" @click="qrcode()">
<image src="https://api.ccttiot.com/smartmeter/img/static/uy7BNwAMIKwvstqFnRhs" mode="aspectFit"></image>
<!-- <text>扫码</text> -->
</view>
</view>
<!-- 进度条 -->
<view class="container" v-if="shengjiflag">
<image src="https://api.ccttiot.com/smartmeter/img/static/uquIy7wJmrNhjvy2maJf" mode=""></image>
<!-- 进度条背景 -->
<view class="progress-bar">
<!-- 进度条填充部分 -->
<view class="progress-fill" :style="{ width: progress + '%' }"></view>
</view>
<!-- 显示进度百分比 -->
<view class="progress-text">{{ progress }}%</view>
<view class="wz">
固件升级中请保持蓝牙连接
</view>
<view class="wz">
切记在蓝牙范围内以防升级失败
2025-12-26 16:53:58 +08:00
</view>
</view>
2026-01-17 17:37:00 +08:00
<!-- <view class="bot">
<view class="btn">
退款
</view>
</view> -->
2025-12-26 16:53:58 +08:00
</view>
</template>
<script>
2026-01-17 17:37:00 +08:00
const app = getApp();
var xBlufi = require("@/components/blufi/xBlufi.js");
let _this = null;
2025-12-26 16:53:58 +08:00
export default {
data() {
return {
2026-01-17 17:37:00 +08:00
devicesList: [
// {name:'110000',
// mac:'11111'}
],
searching: false,
texts: '正在扫描蓝牙设备...',
btnflag: true,
tishiflag: false,
option: '',
bluthlist: [], //蓝牙数组
// status: 'loading',
statusflag: false,
Bluetoothmac: '',
mac: '',
ishave: false,
ver_data: {},
deviceInfoss: {},
gps: {},
isband: false,
// status: false,
deviceIds: '',
name: '',
orderinfo: {},
dl: 0,
czmoney: true,
iscz: true,
banben: '请点击选择版本',
modelId: '',
2025-12-26 16:53:58 +08:00
bgc: {
2026-01-17 17:37:00 +08:00
backgroundColor: "#FAFDFD",
2025-12-26 16:53:58 +08:00
},
sn: '',
2026-01-17 17:37:00 +08:00
carstause: false,
isbands: false,
show: false,
list: [],
hardwareInfo: {},
showbind: false,
storeId:'',
deviceId:'',
file:'https://lxnapi.ccttiot.com/FlAnyIGlQIy6Ln-l5HWmiSiINwj7' ,//固件升级地址
intervalId: null,
version:'',
progress:0,
shengjiflag:false,
valuedian:1000,
xshu:'1',
x:'',
sn:'',
zhendong:'',
zdlyyc:true,
showApnModal: false,
apnValue: ''
2025-12-26 16:53:58 +08:00
}
},
2026-01-17 17:37:00 +08:00
onLoad(e) {
xBlufi.initXBlufi(1)
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
console.log(e)
this.mac = e.mac
this.Binddevice()
this.isbands = false
this.carstause = false
if(uni.getStorageSync('banben') || uni.getStorageSync('banbenid')){
this.banben = uni.getStorageSync('banben')
this.modelId = uni.getStorageSync('banbenid')
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
if(e.sn){
this.storeId = e.sn
}
},
onShow() {
// this.getlist()
// this.getbanben()
uni.setKeepScreenOn({
keepScreenOn: true
})
},
onUnload: function() {
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
wx.closeBLEConnection({
deviceId: this.deviceId,
})
uni.setKeepScreenOn({
keepScreenOn: false
})
},
onHide() {
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
uni.setKeepScreenOn({
keepScreenOn: false
})
},
onBeforeUnmount() {
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
},
watch: {
2025-12-26 16:53:58 +08:00
},
methods: {
2026-01-17 17:37:00 +08:00
// 点击进行重启
btncq(){
xBlufi.notifySendCustomData({
customData: '11reboot@'
})
},
// 获取版本号和文件
getbanben(){
this.$u.get(`/app/softVersion/latest`).then(res =>{
if(res.code == 200){
this.version = res.data.version
this.file = res.data.fileUrl
}
})
},
// 增加震动值
btnzdadd(){
if(this.zhendong == 10){
uni.showToast({
title: '最高值为10',
icon: 'none',
duration: 3000
})
return
}
this.zhendong = this.zhendong + 1
},
//减少震动值
btnzdjian(){
if(this.zhendong == 0){
uni.showToast({
title: '最低值为0',
icon: 'none',
duration: 3000
})
return
}
this.zhendong = this.zhendong - 1
},
// 点击确定震动
btnqdzd(){
this.$u.get(`/farm/beehive/iot/levelToZdxs?level=${this.zhendong}`).then(res => {
2025-12-26 16:53:58 +08:00
if (res.code == 200) {
2026-01-17 17:37:00 +08:00
xBlufi.notifySendCustomData({
customData: `11zdxs${res.data}@`
})
uni.showToast({
title: '设置成功',
icon: 'success',
duration: 3000
})
this.ver_data = {}
this.Binddevice()
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 3000
})
2025-12-26 16:53:58 +08:00
}
})
},
2026-01-17 17:37:00 +08:00
btnwl(){
uni.reLaunch({
url:'/page_newyemian/wgkongzhi?sn=' + this.storeId
})
},
// 开风扇
btnfsk(){
xBlufi.notifySendCustomData({
customData: "11fan100@"
})
uni.showToast({
title: '开启风扇命令成功',
icon: 'success',
duration:2000
})
this.ver_data = {}
this.Binddevice()
},
// 关风扇
btnfsg(){
xBlufi.notifySendCustomData({
customData: "11fan0@"
})
uni.showToast({
title: '关闭风扇命令成功',
icon: 'success',
duration:2000
})
this.ver_data = {}
this.Binddevice()
},
// 点击重置系数
btnczxs(){
xBlufi.notifySendCustomData({
customData: "11zlxs1@"
})
uni.showToast({
title: '重置系数命令成功',
icon: 'success',
duration:2000
})
this.ver_data = {}
this.Binddevice()
},
// 点击校准电量
btnjiaozhun(){
this.x = this.valuedian / this.ver_data.weight * this.ver_data.xs
console.log(this.x,this.valuedian,this.ver_data.weight,this.ver_data.xs);
this.x = this.x.toFixed(3)
setTimeout(()=>{
xBlufi.notifySendCustomData({
customData: "11zlxs" + this.x + '@'
})
this.ver_data = {}
this.Binddevice()
uni.showToast({
title: '发送校准命令成功',
icon: 'success',
duration:2000
})
},1000)
// this.$u.put(`app/beehive/admin/zlxs?sn=${this.sn}&zlxs=${this.x}`).then(res => {
// if(res.code == 200){
// uni.showToast({
// title: '校准成功',
// icon: 'success',
// duration:2000
// })
// setTimeout(()=>{
// this.ver_data = {}
// this.Binddevice()
// },1000)
// }else{
// uni.showToast({
// title: res.msg,
// icon: 'none'
// })
// }
// })
},
btnadd(){
this.valuedian = this.valuedian + 50
},
btnjian(){
this.valuedian = this.valuedian - 50
},
// 点击进行固件升级
fengm(){
var data = {
sum: 100,
http: this.file
}
xBlufi.notifySendCustomData({
customData: data
})
this.shengjiflag = true
this.startProgress()
},
// 固件升级进度
startProgress() {
this.intervalId = setInterval(() => {
if (this.progress < 100) {
} else {
clearInterval(this.intervalId); // 进度达到 100% 时清除定时器
console.log("加载完成");
}
}, 30); // 每 30 毫秒更新一次进度
},
ring() {
xBlufi.notifySendCustomData({
customData: "11clear_weight@"
})
this.ver_data = {}
this.Binddevice()
},
btns(){
uni.reLaunch({
url:'/page_newyemian/wgluru'
})
},
confirm(e) {
// console.log(e);
this.banben = e[0].label
this.modelId = e[0].value
uni.setStorageSync('banben', this.banben)
uni.setStorageSync('banbenid', this.modelId)
},
getlist() {
this.$u.get('/app/model/admin/all').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;
2025-12-26 16:53:58 +08:00
}
}
2026-01-17 17:37:00 +08:00
this.list = res.data.map(item => ({
value: item.modelId,
label: item.name
}));
} else {
2025-12-26 16:53:58 +08:00
uni.showToast({
2026-01-17 17:37:00 +08:00
title: res.msg,
icon: 'none',
duration: 2000
2025-12-26 16:53:58 +08:00
});
2026-01-17 17:37:00 +08:00
}
})
},
send() {
this.$u.post('/app/device/ring?sn=' + this.sn).then((res) => {
if (res.code === 200) {
} else {
2025-12-26 16:53:58 +08:00
uni.showToast({
2026-01-17 17:37:00 +08:00
title: res.msg,
2025-12-26 16:53:58 +08:00
icon: 'none',
duration: 2000
});
}
2026-01-17 17:37:00 +08:00
})
2025-12-26 16:53:58 +08:00
},
2026-01-17 17:37:00 +08:00
changeBind() {
this.$u.post(`/appVerify/updateSn?sn=` + this.sn + '&mac=' + this.mac + '&hardwareVersionId=' + this
.hardwareVersionId).then((res) => {
if (res.code === 200) {
2025-12-26 16:53:58 +08:00
uni.showToast({
2026-01-17 17:37:00 +08:00
title: '绑定成功',
icon: 'none',
2025-12-26 16:53:58 +08:00
duration: 2000
});
setTimeout(() => {
uni.navigateBack({
2026-01-17 17:37:00 +08:00
delta: 1 // delta值为1时表示返回的页面层数
2025-12-26 16:53:58 +08:00
});
2026-01-17 17:37:00 +08:00
}, 2000)
2025-12-26 16:53:58 +08:00
} else {
uni.showToast({
2026-01-17 17:37:00 +08:00
title: res.msg,
2025-12-26 16:53:58 +08:00
icon: 'none',
2026-01-17 17:37:00 +08:00
duration: 2000
2025-12-26 16:53:58 +08:00
});
}
2026-01-17 17:37:00 +08:00
})
},
bind() {
let data = {
sn: this.storeId,
mac: this.mac,
pre:'CTWG:'
}
this.$u.post('/device/device/addDevice', data).then((res) => {
if (res.code == 200) {
uni.showToast({
title: '录入成功',
icon: 'success',
duration: 2000
})
wx.closeBLEConnection({
deviceId: this.deviceId,
})
setTimeout(()=>{
uni.reLaunch({
url:'/page_newyemian/wgkongzhi?sn=' + this.storeId
})
},1500)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
}
})
},
qrcode() {
uni.scanCode({
onlyFromCamera: true,
scanType: ['qrCode'],
success: res => {
function getQueryParam(url, paramName) {
let regex = new RegExp(`[?&]${paramName}=([^&]*)`)
let results = regex.exec(url);
return results ? decodeURIComponent(results[1].replace(/\+/g, ' ')) : null
}
console.log(res,'000');
let sceneValue = res.result
let decodedValue = decodeURIComponent(sceneValue)
let id = getQueryParam(decodedValue, 's')
this.storeId = id
},
fail: err => {
console.error('扫描失败:', err)
uni.showToast({
title: '扫描失败',
icon: 'none'
})
}
})
},
Binddevice() {
this.zdlyyc = true
this.devicesList = [] // 清空设备列表
uni.showLoading({
title: '连接中..'
})
// 两秒后停止蓝牙搜索
setTimeout(() => {
xBlufi.notifyStartDiscoverBle({
'isStart': false
2025-12-26 16:53:58 +08:00
});
2026-01-17 17:37:00 +08:00
setTimeout(() => {
uni.hideLoading()
if (this.devicesList.length == 0) {
uni.showToast({
title: '暂无发现对应设备,请重试',
icon: 'none'
});
} 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');
// 与 this.mac 进行比较
if (macFromName == this.mac) {
// 如果相同,则将 this.ishave 设置为 true
console.log(device);
this.deviceInfoss = device
// this.ishave = true;
this.createBLEConnection(device)
console.log('对比正确1111111111');
} else {
console.log('对比错误');
}
});
}
}, 200)
// 判断是否存在浇花器设备
// this.status = true
}, 2000)
},
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"
});
// 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: "open"
});
xBlufi.notifySendCustomData({
customData: "11open"
});
// 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: "close"
});
xBlufi.notifySendCustomData({
customData: "11close"
});
// uni.hideLoading()
// vm.remakr()
},
fail(err) {
uni.hideLoading()
console.error('获取已连接蓝牙设备信息失败:', err);
}
});
} else {
console.log('手机未连接网络');
}
}
2025-12-26 16:53:58 +08:00
});
2026-01-17 17:37:00 +08:00
},
btnyc() {
this.titleflag = false
},
// 解析自定义数据
funListenDeviceMsgEvent: function(options) {
switch (options.type) {
case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED:
if (!options.result) {
this.ver_data = {}
this.carstause = false
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
if (options.result) {
let devicesarr = options.data
devicesarr.forEach(device => {
// 只添加以CTWG:开头的设备
const deviceName = device.name || device.localName || ''
// 严格检查设备名称必须以CTWG:开头
if (deviceName && deviceName.length >= 5 && deviceName.substring(0, 5) === 'CTWG:') {
this.devicesList.push(device);
}
});
// 循环结束后统一去重基于deviceId去重
let deviceMap = new Map()
this.devicesList.forEach(device => {
if (device.deviceId && !deviceMap.has(device.deviceId)) {
deviceMap.set(device.deviceId, device)
}
})
this.devicesList = Array.from(deviceMap.values())
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
console.log("连接回调:" + JSON.stringify(options));
if (options.result) {
uni.hideLoading();
this.carstause = true
uni.showToast({
title: '连接成功',
icon: 'none'
}); {
xBlufi.notifyInitBleEsp32({
deviceId: options.data.deviceId
});
this.deviceIds = options.data.deviceId
this.name = options.data.name
}
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
if (typeof options.data === 'string') {
if (options.data.indexOf("prom:") !== -1) {
console.log("选择固件升级收信息:", options.data, options.data.length);
console.log('固件升级中')
var indexOld = options.data.substring(options.data.indexOf('prom:'))
console.log("indexOld", indexOld);
var load_num = indexOld.substring(
indexOld.indexOf("prom:") + 5,
indexOld.indexOf("@")
)
this.progress = Number(load_num);
console.log("load_num", load_num);
console.log("升级进度:", this.progress)
if (this.progress === 6000) {
console.log('固件成功')
this.progress = 100
uni.showToast({
title: '固件升级成功',
icon: 'success',
duration: 2000
})
setTimeout(()=>{
this.ver_data = {}
this.shengjiflag = false
},2000)
}
if (this.progress === 9000) {
console.log('固件升级失败')
this.progress = 99
uni.showToast({
title: '固件升级失败',
icon: 'none',
duration: 2000
})
setTimeout(()=>{
this.ver_data = {}
this.shengjiflag = false
},1000)
}
}else{
this.ver_data = this.parseBluetoothData(options.data + ',')
if (options.data) {
}
console.log("1收到设备发来的自定义数据结果", options.data,this.ver_data);
if(this.zdlyyc == true){
this.zdlyyc = false
this.$u.get(`/farm/beehive/iot/zdxsToLevel?zdxs=${this.ver_data.zd}`).then(res => {
if (res.code == 200) {
this.zhendong = res.data
}
})
}
}
} else {
console.log("不是字符串:", options.data,this.ver_data);
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP:
if (options.result) {
} else {
}
this.searching = false
break
}
},
parseBluetoothData(data) {
const result = {};
const parts = data.split(',');
parts.forEach(part => {
if (part) {
// 使用正则表达式匹配键和值
const match = part.match(/^([a-zA-Z_]+):?([^@]+)/);
if (match) {
const key = match[1]; // 提取键
const value = match[2]; // 提取值
result[key] = value;
} else {
// 如果没有匹配到键值对,直接将该部分作为键,值为空
result[part] = '';
}
}
});
return result;
},
//4、建立连接
createBLEConnection(e) {
console.log('调用了')
xBlufi.notifyStartDiscoverBle({
'isStart': false
})
console.log(e, '蓝牙信息')
const deviceId = e.deviceId
this.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
})
},
// 点击重新搜索
Search() {
if (this.status) {
xBlufi.notifyStartDiscoverBle({
'isStart': true
});
// 重新搜索清空蓝牙数组
this.bluthlist = []
this.devicesList = []
// 重新搜索
// this.startBluetoothDevicesDiscovery()
this.statusflag = true
this.status = false
this.texts = '正在扫描蓝牙设备...'
setTimeout(() => {
this.statusflag = false
this.status = true
if (this.searching) {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
// 判断是否存在浇花器设备
if (this.devicesList.length == 0) {
uni.showToast({
title: '暂无发现对应设备,请重试',
icon: 'none'
});
} else {
this.texts = '扫描到以下设备,请点击连接!'
}
} else {
xBlufi.notifyStartDiscoverBle({
'isStart': true
});
}
}, 2000)
}
},
// 点击隐藏没有设备提示
btnhd() {
this.tishiflag = false
},
btnSetApn(){
this.apnValue = this.ver_data.apn || ''
this.showApnModal = true
},
confirmApn(){
// if(!this.apnValue) {
// uni.showToast({
// title: '请输入APN',
// icon: 'none'
// })
// return
// }
xBlufi.notifySendCustomData({
customData: `11apn${this.apnValue}@`
})
uni.showToast({
title: '设置成功',
icon: 'success'
})
this.showApnModal = false
this.ver_data = {}
this.Binddevice()
2025-12-26 16:53:58 +08:00
}
}
}
</script>
2026-01-17 17:37:00 +08:00
<style lang="scss">
2025-12-26 16:53:58 +08:00
page {
2026-01-17 17:37:00 +08:00
overflow-x: hidden;
background-color: #F3F3F3;
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
.jiaozhun{
display: flex;
padding: 50rpx;
2025-12-26 16:53:58 +08:00
box-sizing: border-box;
2026-01-17 17:37:00 +08:00
width: 100%;
align-items: center;
justify-content: space-between;
button{
height: 80rpx;
line-height: 80rpx;
background-color: #52c41a;
color: #fff;
}
.input{
input{
height: 80rpx;
line-height: 80rpx;
}
border: 1px solid #ccc;
border-radius: 20rpx;
display: flex;
width: 260rpx;
height: 80rpx;
text-align: center;
}
.view{
width: 200rpx;
height: 80rpx;
border-radius: 20rpx;
background-color: #52c41a;
color: #fff;
text-align: center;
line-height: 80rpx;
font-size: 28rpx;
}
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
.container {
display: flex;
flex-direction: column;
align-items: center;
height: 100vh; /* 全屏高度 */
background-color: #f0f0f0; /* 背景颜色 */
position: fixed;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 100%;
z-index: 99;
image{
width: 400rpx;
height: 500rpx;
margin-top: 260rpx;
margin-bottom: 80rpx;
}
.wz{
color: red;
margin-top: 20rpx;
}
}
/* 进度条背景 */
.progress-bar {
width: 80%; /* 进度条宽度 */
height: 20px; /* 进度条高度 */
background-color: #e0e0e0; /* 背景颜色 */
border-radius: 10px; /* 圆角 */
overflow: hidden; /* 隐藏超出部分 */
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
/* 进度条填充部分 */
.progress-fill {
height: 100%;
background-color: #7FAD76; /* 填充颜色 */
transition: width 0.1s ease; /* 平滑过渡 */
}
/* 进度百分比文字 */
.progress-text {
margin-top: 20px;
font-size: 24px;
color: #333;
}
.lanyasj{
margin: 15rpx auto 0;
width: 658rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 20rpx;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
padding: 30rpx 30rpx;
box-sizing: border-box;
.item{
width: 50%;
margin-top: 20rpx;
text-align: left;
display: flex;
flex-direction: column;
.label-box {
display: flex;
align-items: center;
margin-bottom: 8rpx;
}
.label{
font-size: 24rpx;
color: #999;
margin-left: 8rpx;
}
.value{
font-size: 28rpx;
color: #333;
font-weight: bold;
margin-bottom: 10rpx;
}
.apn-btn {
margin-left: 20rpx;
background-color: #52c41a;
color: #fff;
font-size: 24rpx;
padding: 4rpx 16rpx;
border-radius: 10rpx;
display: inline-block;
}
}
}
.page {
padding-bottom: 250rpx;
width: 750rpx;
height: 100%;
.float-container {
position: fixed;
right: 30rpx;
bottom: 760rpx;
display: flex;
flex-direction: column;
gap: 30rpx;
z-index: 99;
.float-btn {
width: 100rpx;
height: 100rpx;
background: #fff;
border-radius: 50%;
box-shadow: 0 4rpx 10rpx rgba(0,0,0,0.2);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: 24rpx;
color: #333;
image {
width: 60rpx;
height: 60rpx;
}
&.confirm-btn {
background: #52c41a;
color: #fff;
border: 2rpx solid #fff;
font-size: 32rpx;
}
}
}
.tip_box {
position: fixed;
left: 72rpx;
top: 628rpx;
width: 610rpx;
// height: 282rpx;
background: #FFFFFF;
border-radius: 30rpx 30rpx 30rpx 30rpx;
z-index: 110;
padding-bottom: 100rpx;
2025-12-26 16:53:58 +08:00
2026-01-17 17:37:00 +08:00
.top {
padding: 52rpx 38rpx 42rpx 36rpx;
.ipt_box {
margin-top: 22rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
.text {
width: 350rpx;
font-weight: 400;
font-size: 32rpx;
color: #3D3D3D;
}
.ipt {
padding: 10rpx 18rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-left: 26rpx;
width: 420rpx;
height: 64rpx;
border-radius: 0rpx 0rpx 0rpx 0rpx;
border: 2rpx solid #979797;
.input {
width: 80%;
}
}
}
.tip {
width: 100%;
text-align: center;
font-weight: 700;
font-size: 32rpx;
color: #3D3D3D;
}
.txt {
margin-top: 32rpx;
width: 100%;
text-align: center;
font-weight: 500;
font-size: 32rpx;
color: #3D3D3D;
}
}
.bots {
position: absolute;
width: 610rpx;
// border-top: 2rpx solid #D8D8D8;
display: flex;
flex-wrap: nowrap;
// height: 100%;
bottom: -20rpx;
.bot_left {
border-radius: 0rpx 0rpx 0rpx 30rpx;
width: 50%;
height: 86rpx;
display: flex;
align-items: center;
justify-content: center;
font-weight: 500;
font-size: 32rpx;
color: #3D3D3D;
background: #EEEEEE;
}
.bot_right {
border-radius: 0rpx 0rpx 30rpx 0rpx;
width: 50%;
height: 86rpx;
background: #4C97E7;
display: flex;
align-items: center;
justify-content: center;
color: #FFFFFF;
// border-left: 2rpx solid #D8D8D8;
font-weight: 500;
font-size: 32rpx;
// color: #4C97E7;
}
}
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
.imgs {
margin-top: 50rpx;
width: 100%;
display: flex;
justify-content: center;
position: relative;
.an{
width: 200rpx;
height: 60rpx;
color: #fff;
background-color: #52c41a;
border-radius: 10rpx;
position: absolute;
bottom: 0;
right: 30rpx;
text-align: center;
line-height: 60rpx;
}
image {
width: 300rpx;
height: 300rpx;
}
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
.btn {
margin: auto;
margin-top: 30rpx;
// position: fixed;
display: flex;
align-items: center;
justify-content: center;
// bottom: 100rpx;
// left: 46rpx;
width: 658rpx;
2025-12-26 16:53:58 +08:00
height: 88rpx;
2026-01-17 17:37:00 +08:00
background: #52c41a;
border-radius: 20rpx 20rpx 20rpx 20rpx;
font-weight: 500;
font-size: 32rpx;
color: #FFFFFF;
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
.tips {
margin: 28rpx auto 0;
width: 658rpx;
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
.iptbox {
2025-12-26 16:53:58 +08:00
display: flex;
align-items: center;
2026-01-17 17:37:00 +08:00
flex-wrap: nowrap;
padding: 22rpx;
margin: 15rpx auto 0;
width: 658rpx;
height: 88rpx;
background: #FFFFFF;
box-shadow: 0rpx 0rpx 8rpx 0rpx rgba(0, 0, 0, 0.15);
border-radius: 20rpx 20rpx 20rpx 20rpx;
.qrcode {
padding-right: 20rpx;
border-right: 2rpx solid #D8D8D8;
image {
width: 54rpx;
height: 54rpx;
}
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
.ips {
flex: 1;
min-width: 0;
}
image {
width: 18rpx;
height: 32rpx;
}
.my-placeholder {
font-weight: 400;
font-size: 32rpx;
color: #808080;
}
.mini-btn {
min-width: 140rpx;
padding: 0 20rpx;
height: 60rpx;
line-height: 60rpx;
text-align: center;
background: #52c41a;
2025-12-26 16:53:58 +08:00
color: #fff;
2026-01-17 17:37:00 +08:00
font-size: 26rpx;
border-radius: 30rpx;
margin-left: 10rpx;
flex-shrink: 0;
2025-12-26 16:53:58 +08:00
}
}
2026-01-17 17:37:00 +08:00
.bot_btn {
position: fixed;
bottom: 30rpx;
left: 0;
width: 100%;
display: flex;
flex-wrap: wrap;
padding: 20rpx 46rpx;
box-sizing: border-box;
justify-content: space-between;
background: transparent;
box-shadow: none;
pointer-events: none; /* Let clicks pass through empty space */
2025-12-26 16:53:58 +08:00
2026-01-17 17:37:00 +08:00
.btn1 {
pointer-events: auto;
margin-top: 20rpx;
margin-right: 0;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 80rpx;
background: #fff;
border-radius: 40rpx;
border: 2rpx solid #52c41a;
font-weight: 500;
font-size: 28rpx;
color: #52c41a;
box-shadow: 0 4rpx 10rpx rgba(0,0,0,0.1);
}
2025-12-26 16:53:58 +08:00
}
2026-01-17 17:37:00 +08:00
}
</style>