var http = require('../../utils/request') Page({ data: { statusBarHeight: 44, scanning: false, deviceId: '', error: '' }, onBack: function () { wx.navigateBack({ fail: function () { wx.reLaunch({ url: '/pages/index/index' }) } }) }, onLoad: function () { var app = getApp() this.setData({ statusBarHeight: app.globalData.statusBarHeight }) }, onScan: function () { var self = this self.setData({ scanning: true, error: '' }) wx.scanCode({ onlyFromCamera: true, scanType: ['qrCode'], success: function (res) { var deviceId = self.parseDeviceId(res.result) if (!deviceId) { self.setData({ scanning: false, error: '无效的设备二维码' }) return } self.bindDevice(deviceId) }, fail: function () { self.setData({ scanning: false }) } }) }, parseDeviceId: function (content) { content = (content || '').trim() if (/^[0-9A-Fa-f]{16}$/.test(content)) return content if (/^[0-9A-Fa-f]+([ _-][0-9A-Fa-f]+)+$/.test(content)) return content try { var url = new URL(content) var id = url.searchParams.get('device_id') || url.searchParams.get('id') return id || null } catch (e) { return null } }, bindDevice: function (deviceId) { var self = this self.setData({ scanning: true, error: '' }) http.post('/api/v1/device/bind', { device_id: deviceId }).then(function (data) { self.setData({ scanning: false }) wx.redirectTo({ url: '/pages/ble-connect/ble-connect?device_id=' + encodeURIComponent(deviceId) + '&bind_token=' + encodeURIComponent(data.bind_token || '') }) }).catch(function (err) { self.setData({ scanning: false }) if (err && err.code === 2001) { wx.showToast({ title: '已绑定设备', icon: 'none' }) setTimeout(function () { wx.navigateBack() }, 1500) } else { self.setData({ error: err.message || '绑定失败' }) } }) }, onManualInput: function () { var self = this wx.showModal({ title: '手动输入设备号', editable: true, placeholderText: '请输入设备ID,如 672B6D5A 4DCD861', success: function (res) { if (res.confirm && res.content) { var deviceId = self.parseDeviceId(res.content) if (deviceId) { self.bindDevice(deviceId) } else { wx.showToast({ title: '设备号格式不正确', icon: 'none' }) } } } }) } })