congming_huose-apk/subpackage/device/adddevice.vue

352 lines
7.0 KiB
Vue
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>