289 lines
5.9 KiB
Vue
289 lines
5.9 KiB
Vue
|
|
<template>
|
|||
|
|
<view>
|
|||
|
|
<u-navbar :is-back="true" title="设备录入" title-color="#000" :border-bottom="false" :background="bgc"
|
|||
|
|
id="navbar">
|
|||
|
|
</u-navbar>
|
|||
|
|
<view class="page">
|
|||
|
|
<view class="form-container">
|
|||
|
|
<view class="form-item">
|
|||
|
|
<text class="label">设备名称</text>
|
|||
|
|
<u-input v-model="deviceName" placeholder="请输入设备名称" />
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="form-item">
|
|||
|
|
<text class="label">SN码</text>
|
|||
|
|
<view class="sn-input-wrapper">
|
|||
|
|
<u-input v-model="sn" placeholder="请输入或扫码获取SN码" />
|
|||
|
|
<view class="scan-btn" @click="scanSNCode">
|
|||
|
|
<text class="scan-text">扫码</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="form-item">
|
|||
|
|
<text class="label">MAC地址</text>
|
|||
|
|
<view class="mac-display">{{ deviceInfo.mac }}</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
|
|||
|
|
<view class="submit-btn" @click="confirmAdd">
|
|||
|
|
<text>确认录入</text>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</view>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
export default {
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
bgc: {
|
|||
|
|
backgroundColor: "#fff",
|
|||
|
|
},
|
|||
|
|
deviceName: '',
|
|||
|
|
sn: '',
|
|||
|
|
deviceInfo: {},
|
|||
|
|
userid: ''
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
onLoad(options) {
|
|||
|
|
// 接收传递过来的设备信息
|
|||
|
|
if (options.deviceInfo) {
|
|||
|
|
this.deviceInfo = JSON.parse(decodeURIComponent(options.deviceInfo))
|
|||
|
|
this.deviceName = this.deviceInfo.modelName || '网关'
|
|||
|
|
}
|
|||
|
|
this.getinfo()
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
// 获取用户信息
|
|||
|
|
getinfo() {
|
|||
|
|
this.$u.get(`/system/user/profile`).then((res) => {
|
|||
|
|
if (res.code == 200) {
|
|||
|
|
this.userid = res.data.userId
|
|||
|
|
}
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
// 扫码获取SN
|
|||
|
|
scanSNCode() {
|
|||
|
|
uni.scanCode({
|
|||
|
|
onlyFromCamera: true,
|
|||
|
|
scanType: ['qrCode', 'barCode'],
|
|||
|
|
success: res => {
|
|||
|
|
console.log('扫码结果:', res);
|
|||
|
|
// 解析扫码结果
|
|||
|
|
let snValue = res.result;
|
|||
|
|
|
|||
|
|
// 如果是URL格式,尝试提取SN参数
|
|||
|
|
if (snValue.includes('?')) {
|
|||
|
|
function getQueryParam(url, paramName) {
|
|||
|
|
let regex = new RegExp(`[?&]${paramName}=([^&]*)`);
|
|||
|
|
let results = regex.exec(url);
|
|||
|
|
return results ? decodeURIComponent(results[1].replace(/\+/g, ' ')) : null;
|
|||
|
|
}
|
|||
|
|
let decodedValue = decodeURIComponent(snValue);
|
|||
|
|
let extractedSN = getQueryParam(decodedValue, 's') || getQueryParam(decodedValue, 'sn');
|
|||
|
|
if (extractedSN) {
|
|||
|
|
snValue = extractedSN;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.sn = snValue;
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '扫码成功',
|
|||
|
|
icon: 'success',
|
|||
|
|
duration: 1500
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
fail: err => {
|
|||
|
|
console.error('扫描失败:', err);
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '扫描失败,请重试',
|
|||
|
|
icon: 'none',
|
|||
|
|
duration: 2000
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
// 确认录入
|
|||
|
|
confirmAdd() {
|
|||
|
|
if (!this.deviceName.trim()) {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '请输入设备名称',
|
|||
|
|
icon: 'none'
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const mac = this.deviceInfo.name || this.deviceInfo.mac || '';
|
|||
|
|
if (!mac) {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '设备信息错误',
|
|||
|
|
icon: 'none'
|
|||
|
|
});
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const data = {
|
|||
|
|
mac: mac.slice(-12), // 确保是12位MAC
|
|||
|
|
pre: 'CTWG:',
|
|||
|
|
deviceName: this.deviceName,
|
|||
|
|
sn: this.sn || ''
|
|||
|
|
}
|
|||
|
|
console.log('录入参数:', data);
|
|||
|
|
|
|||
|
|
uni.showLoading({
|
|||
|
|
title: '录入中...'
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
this.$u.post(`/app/device/addDevice`, data).then((res) => {
|
|||
|
|
uni.hideLoading();
|
|||
|
|
if (res.code == 200) {
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '录入成功',
|
|||
|
|
icon: 'success',
|
|||
|
|
duration: 2000
|
|||
|
|
});
|
|||
|
|
// 延迟返回,让用户看到成功提示
|
|||
|
|
setTimeout(() => {
|
|||
|
|
uni.navigateBack({
|
|||
|
|
delta: 1
|
|||
|
|
});
|
|||
|
|
}, 1500);
|
|||
|
|
} else {
|
|||
|
|
console.log(res, '报错');
|
|||
|
|
uni.showToast({
|
|||
|
|
title: res.msg || '录入失败',
|
|||
|
|
icon: 'none',
|
|||
|
|
duration: 3000
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}).catch(err => {
|
|||
|
|
uni.hideLoading();
|
|||
|
|
console.error('录入失败:', err);
|
|||
|
|
uni.showToast({
|
|||
|
|
title: '录入失败,请重试',
|
|||
|
|
icon: 'none',
|
|||
|
|
duration: 3000
|
|||
|
|
});
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="less">
|
|||
|
|
page {
|
|||
|
|
background-color: #F7FAFE;
|
|||
|
|
min-height: 100vh;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.page {
|
|||
|
|
padding: 40rpx 32rpx;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.form-container {
|
|||
|
|
background: #FFFFFF;
|
|||
|
|
border-radius: 24rpx;
|
|||
|
|
padding: 40rpx;
|
|||
|
|
box-shadow: 0 8rpx 30rpx rgba(0, 0, 0, 0.04);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.form-item {
|
|||
|
|
margin-bottom: 40rpx;
|
|||
|
|
|
|||
|
|
&:last-child {
|
|||
|
|
margin-bottom: 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.label {
|
|||
|
|
display: block;
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
color: #333;
|
|||
|
|
font-weight: 500;
|
|||
|
|
margin-bottom: 20rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.mac-display {
|
|||
|
|
height: 88rpx;
|
|||
|
|
line-height: 88rpx;
|
|||
|
|
padding: 0 20rpx;
|
|||
|
|
background: #F5F5F5;
|
|||
|
|
border-radius: 16rpx;
|
|||
|
|
font-size: 28rpx;
|
|||
|
|
color: #666;
|
|||
|
|
font-family: monospace;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.sn-input-wrapper {
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
gap: 20rpx;
|
|||
|
|
|
|||
|
|
::v-deep .u-input {
|
|||
|
|
flex: 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.scan-btn {
|
|||
|
|
min-width: 100rpx;
|
|||
|
|
height: 60rpx;
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
background: #48893B;
|
|||
|
|
border-radius: 12rpx;
|
|||
|
|
padding: 0 20rpx;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
transition: all 0.3s;
|
|||
|
|
|
|||
|
|
&:active {
|
|||
|
|
opacity: 0.8;
|
|||
|
|
transform: scale(0.95);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.scan-text {
|
|||
|
|
font-size: 24rpx;
|
|||
|
|
color: #fff;
|
|||
|
|
font-weight: 500;
|
|||
|
|
white-space: nowrap;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
::v-deep .u-input__input {
|
|||
|
|
border: 1px solid #E0E0E0;
|
|||
|
|
border-radius: 16rpx;
|
|||
|
|
padding: 0 20rpx;
|
|||
|
|
box-sizing: border-box;
|
|||
|
|
height: 88rpx;
|
|||
|
|
line-height: 88rpx;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.submit-btn {
|
|||
|
|
margin-top: 60rpx;
|
|||
|
|
width: 100%;
|
|||
|
|
height: 96rpx;
|
|||
|
|
background: #48893B;
|
|||
|
|
border-radius: 50rpx;
|
|||
|
|
display: flex;
|
|||
|
|
align-items: center;
|
|||
|
|
justify-content: center;
|
|||
|
|
font-size: 32rpx;
|
|||
|
|
font-weight: 600;
|
|||
|
|
color: #FFFFFF;
|
|||
|
|
box-shadow: 0 10rpx 30rpx rgba(72, 137, 59, 0.4);
|
|||
|
|
transition: all 0.3s;
|
|||
|
|
|
|||
|
|
&:active {
|
|||
|
|
opacity: 0.9;
|
|||
|
|
transform: translateY(2rpx);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
text {
|
|||
|
|
color: #FFFFFF;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
</style>
|
|||
|
|
|