858 lines
22 KiB
Vue
858 lines
22 KiB
Vue
<template>
|
||
<view class="pages">
|
||
<app-top-push-notice />
|
||
<view class="title">
|
||
<view class="title_li" style="display: flex;align-items: center;">
|
||
<view class="text">{{ $i18n.t('deviceList') }}</view>
|
||
<!-- <view class="btns" @click="toControl()">
|
||
控制台
|
||
</view> -->
|
||
</view>
|
||
<image src="https://api.ccttiot.com/smartmeter/img/static/uYsM9Nn95AK9c3JkUqvb" mode="widthFix"></image>
|
||
<!-- <u-icon name="grid-fill" color="#2979ff" size="28"></u-icon> -->
|
||
<text class="sm" v-if="showBluetoothStatusText && texts">{{texts}}</text>
|
||
</view>
|
||
<view class="dblist" v-for="(item, index) in devicesList" :key="index" @tap="choose(item)">
|
||
<view class="lt device-thumb-wrap">
|
||
<image class="device-thumb" :src="getDeviceImageByMacPrefix(item)" mode="aspectFill" />
|
||
</view>
|
||
<view class="cen">
|
||
<view class="device-line mac-line">
|
||
<text class="device-mac-text">{{$i18n.t('macLabel')}}{{item.localName.slice(-12)}}</text>
|
||
</view>
|
||
<view class="device-line rssi-line">
|
||
<text class="rssi-text">{{$i18n.t('bluetoothSignal')}}{{item.RSSI}}</text>
|
||
<text v-if="item.isBand" class="sn-text">{{ $i18n.t('snPrefix') }}{{item.sn}}</text>
|
||
</view>
|
||
<!-- <view class="device-line status-line">
|
||
<text class="status-text" :class="{ 'status-text--registered': item.isBand }">
|
||
{{ item.isBand ? $i18n.t('registered') : $i18n.t('notRegistered') }}
|
||
</text>
|
||
</view> -->
|
||
</view>
|
||
<view class="rt">
|
||
<!-- bindBtnState: 0 不展示 | 1 绑定 | 2 已绑定 -->
|
||
<view
|
||
v-if="item.bindBtnState === 1"
|
||
class="bind-btn"
|
||
:id="item.deviceId"
|
||
>{{ $i18n.t('bindAction') }}</view>
|
||
<view
|
||
v-if="item.bindBtnState === 2"
|
||
class="bind-btn bind-btn--bound"
|
||
:id="item.deviceId"
|
||
>{{ $i18n.t('deviceAlreadyBound') }}</view>
|
||
</view>
|
||
</view>
|
||
<!-- <view class="" style="width: 400rpx;margin: auto;" v-if="devicesList.length == 0 || devicesList == [] || devicesList == null || devicesList == undefined">
|
||
<image src="https://api.ccttiot.com/smartmeter/img/static/VhMNQ3Nf43oSKKbsPPPk" style="margin-top: 300rpx;width: 400rpx;height: 400rpx;" mode="aspectFit"></image>
|
||
</view> -->
|
||
<view class="anniu">
|
||
<view style="width: 200rpx;" @click="backPage">{{ $i18n.t('back') }}</view>
|
||
<view style="width: 450rpx;" @click="Search">{{ $i18n.t('rescan') }}</view>
|
||
</view>
|
||
<!-- 加载状态 -->
|
||
<view class="containers" v-show="statusflag">
|
||
<uni-section>
|
||
<uni-load-more :status="loadMoreStatus" />
|
||
</uni-section>
|
||
</view>
|
||
|
||
|
||
</view>
|
||
</template>
|
||
|
||
<script>
|
||
const app = getApp();
|
||
var xBlufi = require("@/common/blufi/xBlufi.js")
|
||
let _this = null;
|
||
|
||
// 设备名中出现的四位厂商前缀 → 产品图(AUYK 等常在名称前部,不能仅用「后 12 位的前 4 位」)
|
||
const MAC_PREFIX_DEVICE_IMAGE = {
|
||
AUYK: 'https://api.ccttiot.com/image-1765181560094.png',
|
||
AUYG: 'https://api.ccttiot.com/203d6d03e1e65ad7410f42148b88b4e1-1758263531361.png',
|
||
AUMC: 'https://api.ccttiot.com/image-1761117712383.png',
|
||
AUHW: 'https://api.ccttiot.com/image-1765184024743.png',
|
||
AUSQ: 'https://api.ccttiot.com/image-1765184056827.png',
|
||
AUBL: 'https://api.ccttiot.com/image-1765184040649.png',
|
||
AUGW: 'https://api.ccttiot.com/ad93702b02429b8adf394569460b8b2a-1758263546164.png'
|
||
}
|
||
const KNOWN_MAC_PREFIXES = Object.keys(MAC_PREFIX_DEVICE_IMAGE)
|
||
const DEFAULT_MAC_PREFIX_IMAGE = MAC_PREFIX_DEVICE_IMAGE.AUGW
|
||
export default {
|
||
data() {
|
||
return {
|
||
titleflag: false, //提示隐藏
|
||
bgc: {
|
||
backgroundColor: "#F7FAFE",
|
||
},
|
||
devicesList: [],
|
||
devicesLists: [],
|
||
searching: false,
|
||
// 蓝牙权限未授权时不展示;授权后按真实状态赋值
|
||
showBluetoothStatusText: false,
|
||
texts: '',
|
||
btnflag: true,
|
||
tishiflag: false,
|
||
option: '',
|
||
bluthlist: [], //蓝牙数组
|
||
loadMoreStatus: 'loading',
|
||
statusflag: false,
|
||
Bluetoothmac: '',
|
||
gps: {},
|
||
mac: '',
|
||
// 首次扫描完成后为 true,「重新扫描」才可用(沿用原逻辑)
|
||
status: false,
|
||
deviceinfo: null,
|
||
sn: '',
|
||
// 绑定弹窗
|
||
showBindModal: false,
|
||
bindFormSn: '',
|
||
bindFormMac: ''
|
||
}
|
||
},
|
||
onLoad(e) {
|
||
if (e.sn) {
|
||
this.sn = e.sn
|
||
}
|
||
xBlufi.initXBlufi(1)
|
||
},
|
||
onShow: function() {
|
||
this.bluthlist = []
|
||
this.devicesList = []
|
||
this.devicesLists = []
|
||
this.showBluetoothStatusText = false
|
||
this.texts = ''
|
||
this.$forceUpdate()
|
||
// 先检测蓝牙适配器:未授权则不展示下方状态文案;其它错误展示对应状态
|
||
uni.openBluetoothAdapter({
|
||
success: () => {
|
||
this.showBluetoothStatusText = true
|
||
this.texts = this.$i18n.t('scanningBluetooth')
|
||
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
|
||
xBlufi.notifyStartDiscoverBle({ 'isStart': true })
|
||
setTimeout(() => {
|
||
xBlufi.notifyStartDiscoverBle({ 'isStart': false })
|
||
if (this.devicesList.length == 0) {
|
||
this.tishiflag = true
|
||
this.texts = this.$i18n.t('scanCompleteNoDevice')
|
||
} else {
|
||
this.texts = this.$i18n.t('devicesFound')
|
||
}
|
||
this.status = true
|
||
this.$forceUpdate()
|
||
}, 2000)
|
||
},
|
||
fail: (err) => {
|
||
this.applyBluetoothAdapterFail(err)
|
||
this.$forceUpdate()
|
||
}
|
||
})
|
||
},
|
||
onUnload: function() {
|
||
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent)
|
||
xBlufi.notifyStartDiscoverBle({
|
||
'isStart': false
|
||
})
|
||
},
|
||
onHide() {
|
||
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent)
|
||
xBlufi.notifyStartDiscoverBle({
|
||
'isStart': false
|
||
})
|
||
},
|
||
onBeforeUnmount() {
|
||
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent)
|
||
xBlufi.notifyStartDiscoverBle({
|
||
'isStart': false
|
||
})
|
||
},
|
||
mounted() {
|
||
|
||
},
|
||
methods: {
|
||
/** 接口 userId 有有效值视为已绑定用户(不可再绑) */
|
||
hasBoundUserId(userId) {
|
||
if (userId === null || userId === undefined) return false
|
||
if (typeof userId === 'number') return !isNaN(userId) && userId !== 0
|
||
const s = String(userId).trim()
|
||
return s !== '' && s !== 'null' && s !== 'undefined'
|
||
},
|
||
/** 从广播名解析已知四位型号前缀(与配图表一致),用于带入录入页匹配产品 */
|
||
resolveKnownMacPrefix(raw) {
|
||
try {
|
||
if (raw === undefined || raw === null || raw === '') return ''
|
||
const upper = String(raw).toUpperCase()
|
||
let hitPrefix = null
|
||
let hitIndex = Infinity
|
||
for (let i = 0; i < KNOWN_MAC_PREFIXES.length; i++) {
|
||
const p = KNOWN_MAC_PREFIXES[i]
|
||
const idx = upper.indexOf(p)
|
||
if (idx !== -1 && idx < hitIndex) {
|
||
hitIndex = idx
|
||
hitPrefix = p
|
||
}
|
||
}
|
||
if (hitPrefix) return hitPrefix
|
||
const hexOnly = String(raw).replace(/[^0-9A-Fa-f]/g, '')
|
||
if (hexOnly.length >= 12) {
|
||
const tail = hexOnly.slice(-12)
|
||
const p2 = tail.substring(0, 4).toUpperCase()
|
||
if (MAC_PREFIX_DEVICE_IMAGE[p2]) return p2
|
||
}
|
||
const s = String(raw)
|
||
if (s.length >= 12) {
|
||
const p3 = s.slice(-12).substring(0, 4).toUpperCase()
|
||
if (MAC_PREFIX_DEVICE_IMAGE[p3]) return p3
|
||
}
|
||
return ''
|
||
} catch (e) {
|
||
return ''
|
||
}
|
||
},
|
||
getMacPrefixFromItem(item) {
|
||
const raw = item && (item.localName != null && item.localName !== '' ? item.localName : item.name)
|
||
return this.resolveKnownMacPrefix(raw)
|
||
},
|
||
// 根据设备名中的 MAC(后 12 位)前四位匹配产品图
|
||
getDeviceImageByMacPrefix(item) {
|
||
try {
|
||
const raw = item && (item.localName != null && item.localName !== '' ? item.localName : item.name)
|
||
const prefix = this.resolveKnownMacPrefix(raw)
|
||
return prefix ? MAC_PREFIX_DEVICE_IMAGE[prefix] : DEFAULT_MAC_PREFIX_IMAGE
|
||
} catch (e) {
|
||
return DEFAULT_MAC_PREFIX_IMAGE
|
||
}
|
||
},
|
||
// 是否为「用户未授予蓝牙权限」(此时不展示标题下状态文案)
|
||
isBluetoothPermissionDenied(err) {
|
||
const msg = (err && err.errMsg ? String(err.errMsg) : '').toLowerCase()
|
||
return msg.includes('auth deny') || msg.includes('authorize') || msg.includes('system permission denied')
|
||
},
|
||
// 根据 openBluetoothAdapter 失败结果设置展示文案(非权限问题时展示具体状态)
|
||
applyBluetoothAdapterFail(err) {
|
||
if (this.isBluetoothPermissionDenied(err)) {
|
||
this.showBluetoothStatusText = false
|
||
this.texts = ''
|
||
return
|
||
}
|
||
this.showBluetoothStatusText = true
|
||
const errMsg = err && err.errMsg ? err.errMsg : ''
|
||
const t = this.$i18n && this.$i18n.t ? this.$i18n.t.bind(this.$i18n) : (k) => k
|
||
if (errMsg.includes('not available') || errMsg.includes('unavailable')) {
|
||
this.texts = t('bluetoothUnavailable')
|
||
} else if (errMsg.includes('open fail')) {
|
||
this.texts = t('bluetoothOpenFailed')
|
||
} else if (errMsg.includes('bluetooth service unavailable')) {
|
||
this.texts = t('bluetoothServiceUnavailable')
|
||
} else {
|
||
this.texts = (t('bluetoothInitFailed') || '') + (errMsg || '')
|
||
}
|
||
},
|
||
replay(){
|
||
uni.reLaunch({
|
||
url:'/pages/luru/index'
|
||
})
|
||
},
|
||
backPage(){
|
||
uni.navigateBack()
|
||
},
|
||
toControl(){
|
||
uni.redirectTo({
|
||
url:'/pages/luru/controlDevice'
|
||
})
|
||
},
|
||
fetchDevicesBoundStatus() {
|
||
// 提取所有设备的 MAC 地址,并通过 Set 去重
|
||
let uniqueDevices = Array.from(new Set(this.devicesList.map(item => item.localName.slice(-12))))
|
||
// 重新构建去重后的 devicesList
|
||
this.devicesList = uniqueDevices.map(mac => {
|
||
return this.devicesList.find(item => item.localName.slice(-12) === mac)
|
||
})
|
||
// 拼接成字符串
|
||
const macs = uniqueDevices
|
||
// 向批量接口请求录入状态
|
||
let array = macs
|
||
this.$http.post(`/app/device/simpleListByMacList`,array).then((res) => {
|
||
const resultList = res.data // 获取接口返回的数据数组
|
||
console.log(res,'请求')
|
||
// 遍历 devicesList 并对比 mac 地址
|
||
this.devicesList.forEach(device => {
|
||
const mac = device.localName.slice(-12)
|
||
const matchingResult = resultList.find(result => result.mac === mac)
|
||
device.boundByUser = false
|
||
if (matchingResult) {
|
||
device.sn = matchingResult.sn
|
||
device.isBand = true
|
||
const uid = matchingResult.userId !== undefined && matchingResult.userId !== null ? matchingResult.userId : matchingResult.user_id
|
||
device.boundByUser = this.hasBoundUserId(uid)
|
||
} else {
|
||
device.isBand = false
|
||
}
|
||
device.bindBtnState = device.boundByUser ? 2 : 1
|
||
})
|
||
// 对 devicesList 进行排序,将 isBand 为 false 的设备排在前面
|
||
this.devicesList.sort((a, b) => {
|
||
return (a.isBand === false ? -1 : 1) - (b.isBand === false ? -1 : 1)
|
||
})
|
||
this.$forceUpdate() // 强制更新视图
|
||
console.log(this.devicesList, 'Updated devicesList')
|
||
}).catch((error) => {
|
||
console.error('批量获取设备录入状态失败', error)
|
||
})
|
||
},
|
||
choose(e) {
|
||
if (e.bindBtnState === 0) {
|
||
return
|
||
}
|
||
if (e.bindBtnState === 2) {
|
||
uni.showToast({
|
||
title: this.$i18n.t('deviceAlreadyBound'),
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
const nm = e.name || e.localName || ''
|
||
let Bluetoothmac = nm.slice(-12)
|
||
this.bindFormMac = Bluetoothmac
|
||
this.bindFormSn = ''
|
||
const prefix = this.getMacPrefixFromItem(e)
|
||
const prefixQs = prefix ? ('&prefix=' + encodeURIComponent(prefix)) : ''
|
||
this.$http.get(`/app/device/detailByMac?mac=${Bluetoothmac}`).then(res => {
|
||
if (res.code == 200) {
|
||
if (res.data) {
|
||
uni.navigateTo({
|
||
url: '/subpackage/device/deviceaddroom?deviceId=' + e.sn
|
||
})
|
||
} else {
|
||
uni.navigateTo({
|
||
url: '/pages/luru/bind_mac?mac=' + Bluetoothmac + prefixQs
|
||
})
|
||
}
|
||
}
|
||
})
|
||
},
|
||
// 关闭绑定弹窗
|
||
closeBindModal() {
|
||
this.showBindModal = false
|
||
this.bindFormSn = ''
|
||
this.bindFormMac = ''
|
||
},
|
||
// 确认绑定
|
||
getbangd() {
|
||
if (!this.bindFormMac) {
|
||
uni.showToast({
|
||
title: this.$i18n.t('macInvalid'),
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
this.$http.put(`/bst/device/bind`, {
|
||
mac: this.bindFormMac,
|
||
sn: this.bindFormSn,
|
||
spaceId: uni.getStorageSync('kjid')
|
||
}).then(res => {
|
||
if (res.code == 200) {
|
||
uni.showToast({
|
||
title: this.$i18n.t('bindSucceeded'),
|
||
icon: 'success',
|
||
duration: 2000
|
||
})
|
||
this.showBindModal = false
|
||
setTimeout(() => {
|
||
uni.reLaunch({
|
||
url: '/pages/index/index'
|
||
})
|
||
}, 1500)
|
||
} else {
|
||
uni.showToast({
|
||
title: res.msg || this.$i18n.t('bindFailed'),
|
||
icon: 'none',
|
||
duration: 3000
|
||
})
|
||
}
|
||
})
|
||
},
|
||
|
||
funListenDeviceMsgEvent: function(options) {
|
||
switch (options.type) {
|
||
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
|
||
if (options.result) {
|
||
this.devicesLists = options.data
|
||
console.log('搜索的设备',options);
|
||
}
|
||
break
|
||
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
|
||
console.log("连接回调:" + JSON.stringify(options))
|
||
if (options.result) {
|
||
uni.hideLoading()
|
||
uni.showToast({
|
||
title: this.$i18n.t('connectionSuccess'),
|
||
icon: 'none'
|
||
}); {
|
||
console.log("连接回调options.data.deviceId:" + options.data.deviceId,
|
||
"连接回调options.data.name:" + options.data.name);
|
||
xBlufi.notifyInitBleEsp32({
|
||
deviceId: options.data.deviceId
|
||
})
|
||
}
|
||
}
|
||
break;
|
||
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
|
||
if (!options.result) {
|
||
console.log("蓝牙未开启", options);
|
||
uni.showToast({
|
||
title: this.$i18n.t('bluetoothNotEnabled'),
|
||
icon: 'none',
|
||
duration: 3000
|
||
});
|
||
if (this.showBluetoothStatusText) {
|
||
this.texts = this.$i18n.t('bluetoothNotEnabled')
|
||
}
|
||
this.tishiflag = true
|
||
} else {
|
||
this.searching = true
|
||
if (this.showBluetoothStatusText) {
|
||
this.texts = this.$i18n.t('scanningBluetooth')
|
||
}
|
||
}
|
||
break;
|
||
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP:
|
||
if (options.result) {
|
||
let uniqueDevicesList = Array.from(new Set(this.devicesLists))
|
||
// 将去重后的数组重新赋值给 this.devicesList
|
||
this.devicesLists = uniqueDevicesList
|
||
let list = []
|
||
uniqueDevicesList.forEach(device => {
|
||
// 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符)
|
||
let macFromName = device.name.substring(device.name.length - 12)
|
||
// console.log(macFromName)
|
||
// 与 this.mac 进行比较
|
||
device.bindBtnState = 0
|
||
list.push(device)
|
||
});
|
||
setTimeout(() => {
|
||
this.devicesList = list
|
||
let uniqueDevicesList = Array.from(new Set(this.devicesList))
|
||
// 将去重后的数组重新赋值给 this.devicesList
|
||
this.devicesList = uniqueDevicesList
|
||
this.fetchDevicesBoundStatus()
|
||
}, 200)
|
||
|
||
console.log('蓝牙停止搜索ok')
|
||
} else {
|
||
//蓝牙停止搜索失败
|
||
console.log('蓝牙停止搜索失败')
|
||
}
|
||
this.searching = false
|
||
break;
|
||
}
|
||
},
|
||
// 点击重新搜索
|
||
Search() {
|
||
if (!this.status) return
|
||
uni.openBluetoothAdapter({
|
||
success: () => {
|
||
this.showBluetoothStatusText = true
|
||
xBlufi.notifyStartDiscoverBle({
|
||
'isStart': true
|
||
})
|
||
this.bluthlist = []
|
||
this.devicesList = []
|
||
this.devicesLists = []
|
||
this.statusflag = true
|
||
this.loadMoreStatus = 'loading'
|
||
this.texts = this.$i18n.t('scanningBluetooth')
|
||
setTimeout(() => {
|
||
this.statusflag = false
|
||
if (this.searching) {
|
||
if (this.devicesList.length == 0) {
|
||
this.tishiflag = true
|
||
this.texts = this.$i18n.t('scanCompleteNoDevice')
|
||
} else {
|
||
this.texts = this.$i18n.t('devicesFound')
|
||
}
|
||
xBlufi.notifyStartDiscoverBle({
|
||
'isStart': false
|
||
})
|
||
} else {
|
||
xBlufi.notifyStartDiscoverBle({
|
||
'isStart': true
|
||
})
|
||
}
|
||
}, 2000)
|
||
},
|
||
fail: (err) => {
|
||
this.applyBluetoothAdapterFail(err)
|
||
this.$forceUpdate()
|
||
}
|
||
})
|
||
},
|
||
}
|
||
}
|
||
</script>
|
||
|
||
<style lang="scss">
|
||
page {
|
||
background-color: #F7FAFE !important;
|
||
}
|
||
.tabback{
|
||
width: 750rpx;
|
||
height: 130rpx;
|
||
background: #FCFCFC;
|
||
border-radius: 0rpx 0rpx 0rpx 0rpx;
|
||
position: fixed;
|
||
top: 0;
|
||
left: 0;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
padding: 0 28rpx;
|
||
box-sizing: border-box;
|
||
border-bottom: 1px solid #D8D8D8;
|
||
padding-top: 52rpx;
|
||
z-index: 999;
|
||
.name{
|
||
font-size: 36rpx;
|
||
color: #3D3D3D;
|
||
}
|
||
.rtjt {
|
||
font-size: 36rpx;
|
||
}
|
||
}
|
||
.containers {
|
||
width: 100%;
|
||
height: 100vh;
|
||
position: fixed;
|
||
top: 0;
|
||
padding-top: 130rpx;
|
||
box-sizing: border-box;
|
||
left: 0;
|
||
z-index: 999 !important;
|
||
/* background-color: #fff; */
|
||
z-index: 99;
|
||
}
|
||
|
||
.pages {
|
||
padding-top: 136rpx !important;
|
||
padding: 0 66rpx;
|
||
box-sizing: border-box;
|
||
padding-bottom: 200rpx;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.modal-overlay {
|
||
position: fixed;
|
||
top: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
background: rgba(0, 0, 0, 0.5);
|
||
display: flex;
|
||
justify-content: center;
|
||
align-items: center;
|
||
z-index: 1000;
|
||
}
|
||
|
||
.modal {
|
||
width: 300px;
|
||
background: #fff;
|
||
border-radius: 8px;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.modal-content {
|
||
padding: 20px;
|
||
}
|
||
|
||
.modal-title {
|
||
font-size: 18px;
|
||
margin-bottom: 10px;
|
||
text-align: center;
|
||
}
|
||
|
||
.modal-body {
|
||
font-size: 16px;
|
||
margin-bottom: 20px;
|
||
text-align: center;
|
||
}
|
||
|
||
.modal-footer {
|
||
display: flex;
|
||
justify-content: space-around;
|
||
}
|
||
|
||
.modal-footer button {
|
||
width: 80px;
|
||
height: 60rpx;
|
||
padding: 10px;
|
||
background: #8883F0;
|
||
color: #fff;
|
||
border: none;
|
||
border-radius: 4px;
|
||
|
||
}
|
||
|
||
.btn {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
background: #8883F0;
|
||
width: 80px;
|
||
height: 60rpx;
|
||
color: #fff;
|
||
border-radius: 4px;
|
||
}
|
||
|
||
.modal-footer button:first-of-type {
|
||
background: #ccc;
|
||
}
|
||
|
||
// text{
|
||
// display: block;
|
||
// }
|
||
|
||
.sm {
|
||
color: #77808D;
|
||
border-radius: 0rpx 0rpx 0rpx 0rpx;
|
||
// margin-top: 48rpx;
|
||
display: inline-block;
|
||
}
|
||
.title {
|
||
margin-bottom: 84rpx;
|
||
|
||
image {
|
||
display: inline-block;
|
||
width: 48rpx;
|
||
height: 48rpx;
|
||
vertical-align: bottom;
|
||
margin-right: 10rpx;
|
||
}
|
||
|
||
|
||
}
|
||
.title_li{
|
||
display: flex;
|
||
flex-wrap: nowrap;
|
||
align-items: center;
|
||
.text{
|
||
font-weight: 400;
|
||
font-size: 70rpx;
|
||
color: #262B37;
|
||
|
||
text-align: left;
|
||
font-style: normal;
|
||
text-transform: none;
|
||
display: block;
|
||
|
||
}
|
||
.btns{
|
||
margin-left: 30rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
width: 138rpx;
|
||
height: 50rpx;
|
||
background: #F14C4C;
|
||
border-radius: 31rpx 31rpx 31rpx 31rpx;
|
||
font-weight: 500;
|
||
font-size: 24rpx;
|
||
color: #FFFFFF;
|
||
}
|
||
}
|
||
|
||
|
||
.dblist {
|
||
display: flex;
|
||
align-items: stretch;
|
||
width: 100%;
|
||
margin-top: 34rpx;
|
||
background: #FFFFFF;
|
||
box-shadow: 0rpx 8rpx 40rpx 0rpx rgba(0, 0, 0, 0.06);
|
||
padding: 24rpx 20rpx 24rpx 18rpx;
|
||
box-sizing: border-box;
|
||
border-radius: 16rpx;
|
||
border: 1rpx solid rgba(0, 0, 0, 0.04);
|
||
|
||
.lt {
|
||
flex-shrink: 0;
|
||
padding-left: 10rpx;
|
||
box-sizing: border-box;
|
||
margin-right: 20rpx;
|
||
align-self: center;
|
||
|
||
&.device-thumb-wrap {
|
||
width: 120rpx;
|
||
height: 120rpx;
|
||
border-radius: 16rpx;
|
||
overflow: hidden;
|
||
background: #f3f4f6;
|
||
}
|
||
|
||
.device-thumb {
|
||
width: 120rpx;
|
||
height: 120rpx;
|
||
display: block;
|
||
}
|
||
}
|
||
|
||
.cen {
|
||
flex: 1;
|
||
min-width: 0;
|
||
padding-left: 4rpx;
|
||
box-sizing: border-box;
|
||
display: flex;
|
||
flex-direction: column;
|
||
justify-content: center;
|
||
text-align: left;
|
||
|
||
.device-line {
|
||
width: 100%;
|
||
}
|
||
|
||
.mac-line {
|
||
.device-mac-text {
|
||
display: block;
|
||
white-space: nowrap;
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
font-size: 28rpx;
|
||
font-weight: 500;
|
||
color: #1a1a1a;
|
||
line-height: 1.45;
|
||
}
|
||
}
|
||
|
||
.rssi-line {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
align-items: baseline;
|
||
margin-top: 12rpx;
|
||
|
||
.rssi-text {
|
||
font-size: 24rpx;
|
||
color: #5c6370;
|
||
line-height: 1.4;
|
||
margin-right: 16rpx;
|
||
}
|
||
|
||
.sn-text {
|
||
font-size: 22rpx;
|
||
color: #8b9199;
|
||
}
|
||
}
|
||
|
||
/* 第三行:录入状态,纯文案左对齐 */
|
||
.status-line {
|
||
margin-top: 14rpx;
|
||
text-align: left;
|
||
}
|
||
|
||
.status-text {
|
||
font-size: 24rpx;
|
||
font-weight: 500;
|
||
line-height: 1.4;
|
||
color: #2563eb;
|
||
}
|
||
|
||
.status-text--registered {
|
||
color: #6b7280;
|
||
font-weight: 400;
|
||
}
|
||
}
|
||
|
||
.rt {
|
||
flex-shrink: 0;
|
||
margin-left: 16rpx;
|
||
padding-right: 4rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
align-self: center;
|
||
|
||
.bind-btn {
|
||
min-width: 112rpx;
|
||
padding: 0 26rpx;
|
||
height: 64rpx;
|
||
line-height: 64rpx;
|
||
text-align: center;
|
||
font-size: 26rpx;
|
||
font-weight: 600;
|
||
color: #ffffff;
|
||
background: #0f0f0f;
|
||
border: 2rpx solid #0f0f0f;
|
||
border-radius: 32rpx;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.bind-btn--bound {
|
||
color: #6b7280;
|
||
background: #e5e7eb;
|
||
border-color: #e5e7eb;
|
||
font-weight: 500;
|
||
}
|
||
}
|
||
}
|
||
|
||
.anniu {
|
||
padding: 0 40rpx;
|
||
width: 100%;
|
||
box-sizing: border-box;
|
||
position: fixed;
|
||
left: 0;
|
||
bottom: 60rpx;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
view {
|
||
background: #000;
|
||
border-radius: 52rpx 52rpx 52rpx 52rpx;
|
||
color: #fff;
|
||
height: 80rpx;
|
||
line-height: 80rpx;
|
||
text-align: center;
|
||
}
|
||
}
|
||
|
||
.mask {
|
||
width: 622rpx;
|
||
height: 710rpx;
|
||
background: #FFFFFF;
|
||
filter: blur(0px);
|
||
border-radius: 20rpx;
|
||
position: fixed;
|
||
top: 475rpx;
|
||
left: 50%;
|
||
transform: translateX(-50%);
|
||
padding-top: 38rpx;
|
||
padding-left: 60rpx;
|
||
padding-right: 60rpx;
|
||
box-sizing: border-box;
|
||
|
||
.titles {
|
||
font-size: 48rpx;
|
||
color: #262B37;
|
||
line-height: 70rpx;
|
||
text-align: center;
|
||
margin-bottom: 24rpx;
|
||
}
|
||
|
||
text {
|
||
display: block;
|
||
font-size: 32rpx;
|
||
color: #262B37;
|
||
line-height: 56rpx;
|
||
text-align: left;
|
||
}
|
||
|
||
button {
|
||
margin-top: 46rpx;
|
||
width: 266rpx;
|
||
height: 96rpx;
|
||
background: #8883F0;
|
||
border-radius: 52rpx 52rpx 52rpx 52rpx;
|
||
color: #fff;
|
||
text-align: center;
|
||
line-height: 96rpx;
|
||
}
|
||
}
|
||
</style> |