congming_huose-apk/subpackage/device/adddevice.vue

352 lines
7.0 KiB
Vue
Raw Normal View History

2025-11-08 11:30:06 +08:00
<template>
<view class="device-detail">
<view class="bj">
</view>
<!-- 自定义导航栏 -->
<view class="tabback" style="background-color: #fff;">
<view class="rtjt" @click="btnback">{{ $i18n.t('cancel') }}</view>
<view class="name">{{ $i18n.t('addDevice') }}</view>
<view style="width: 36rpx;"></view>
</view>
<view class="" style="background-color: #F3F5F6;">
<!-- 扫描说明文字 -->
<view class="scan-tip">
<text>{{ $i18n.t('tapToScanTip') }}</text>
</view>
<!-- 扫码按钮区域 -->
<view class="scan-container">
<view class="scan-button" @click="scanQRCode">
<!-- 外框四角 -->
<view class="outer-corner top-left"></view>
<view class="outer-corner top-right"></view>
<view class="outer-corner bottom-left"></view>
<view class="outer-corner bottom-right"></view>
<image style="width: 400rpx;height: 400rpx;" src="https://api.ccttiot.com/smartmeter/img/static/u4RbO9t9LQQEsfaua9k2" mode=""></image>
<!-- 中间扫描框图标 -->
<!-- <view class="scan-icon">
</view> -->
</view>
</view>
<!-- 选项列表 -->
<view class="options-list">
<view class="option-item" @click="manualInput">
<view class="option-icon"><image src="https://api.ccttiot.com/smartmeter/img/static/uqJHqdW3tH8Ijxhwqk7u" mode="aspectFill"></image></view>
<view class="option-text">{{ $i18n.t('manualInputCode') }}</view>
<view class="option-arrow"></view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
isFlashlightOn: false,
cameraPosition: 'back',
}
},
methods: {
scanQRCode() {
uni.scanCode({
onlyFromCamera: true,
scanType: ['qrCode'],
success: res => {
console.log(res);
uni.navigateTo({
url:'/subpackage/device/deviceaddroom?deviceId=' + res.result
})
},
fail: err => {
console.error('扫描失败:', err)
uni.showToast({
title: this.$i18n.t('scanFailed'),
icon: 'none'
})
}
})
},
// 点击返回上一级
btnback(){
uni.navigateBack()
},
// 切换手电筒
toggleFlashlight() {
this.isFlashlightOn = !this.isFlashlightOn;
uni.showToast({
title: this.isFlashlightOn ? this.$i18n.t('flashOn') : this.$i18n.t('flashOff'),
icon: 'none'
});
},
// 手动输入代码
manualInput() {
uni.navigateTo({
url:'/subpackage/device/shoudongadd'
})
},
// 添加第三方设备
addThirdParty() {
uni.showToast({
title: this.$i18n.t('thirdPartyFeature'),
icon: 'none'
});
},
// 相机扫描成功
onScanCode(e) {
console.log('扫描结果:', e.detail);
uni.showToast({
title: this.$i18n.t('scanSuccess') + ': ' + e.detail.result,
icon: 'success'
});
// 这里可以处理扫描到的二维码数据
},
// 相机初始化完成
onCameraInitDone(e) {
console.log('相机初始化完成');
},
// 相机错误
onCameraError(e) {
console.log('相机错误:', e.detail);
uni.showToast({
title: this.$i18n.t('cameraStartFailed'),
icon: 'none'
});
}
}
}
</script>
<style scoped lang="less">
.bj{
width: 100%;
height: 50vh;
position: fixed;
top: 0;
z-index: -1;
background-color: #0F0F0F;
}
.tabback {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 126rpx;
padding: 0 20rpx;
box-sizing: border-box;
background-color: #fff;
border: 1rpx solid #D8D8D8;
margin-top: 102rpx;
border-radius: 30rpx 30rpx 0 0;
.rtjt {
font-size: 36rpx;
color: #333;
}
.name {
font-size: 36rpx;
font-weight: bold;
color: #333;
}
}
.device-detail {
min-height: 100vh;
}
.scan-tip {
text-align: center;
padding: 40rpx 20rpx;
color: #666;
font-size: 28rpx;
}
.scan-container {
display: flex;
justify-content: center;
padding: 40rpx 20rpx;
}
.scan-button {
width: 600rpx;
height: 600rpx;
border-radius: 30rpx;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
position: relative;
&:active {
transform: scale(0.98);
box-shadow: 0 5rpx 20rpx rgba(0, 0, 0, 0.12);
}
.outer-corner {
position: absolute;
width: 80rpx;
height: 80rpx;
border: 4rpx solid #999;
&.top-left {
top: 30rpx;
left: 30rpx;
border-right: none;
border-bottom: none;
}
&.top-right {
top: 30rpx;
right: 30rpx;
border-left: none;
border-bottom: none;
}
&.bottom-left {
bottom: 30rpx;
left: 30rpx;
border-right: none;
border-top: none;
}
&.bottom-right {
bottom: 30rpx;
right: 30rpx;
border-left: none;
border-top: none;
}
}
.scan-icon {
width: 120rpx;
height: 120rpx;
display: flex;
align-items: center;
justify-content: center;
.qr-frame {
width: 80rpx;
height: 80rpx;
position: relative;
.corner {
position: absolute;
width: 20rpx;
height: 20rpx;
border: 3rpx solid #999;
&.tl {
top: 0;
left: 0;
border-right: none;
border-bottom: none;
}
&.tr {
top: 0;
right: 0;
border-left: none;
border-bottom: none;
}
&.bl {
bottom: 0;
left: 0;
border-right: none;
border-top: none;
}
&.br {
bottom: 0;
right: 0;
border-left: none;
border-top: none;
}
}
}
}
}
@keyframes scan {
0% {
top: 20rpx;
}
100% {
top: 580rpx;
}
}
.flashlight-btn {
display: flex;
justify-content: center;
margin: 40rpx 0;
.flashlight-icon {
width: 120rpx;
height: 60rpx;
background-color: #333;
border-radius: 30rpx;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 32rpx;
transition: all 0.3s ease;
&.active {
background-color: #007aff;
transform: scale(1.1);
}
.icon {
font-size: 28rpx;
}
}
}
.options-list {
padding: 0 20rpx;
margin-top: 40rpx;
background-color: #fff;
.option-item {
display: flex;
align-items: center;
padding: 30rpx 0;
border-bottom: 1rpx solid #f0f0f0;
.option-icon {
width: 80rpx;
height: 80rpx;
border-radius: 50%;
background-color: #f5f5f5;
display: flex;
align-items: center;
justify-content: center;
margin-right: 20rpx;
font-size: 24rpx;
image{
width: 80rpx;
height: 80rpx;
}
}
.option-text {
flex: 1;
font-size: 32rpx;
color: #333;
}
.option-arrow {
color: #ccc;
font-size: 32rpx;
}
}
}
</style>