wx-starlock/pages/addDevice/distributionNetwork.vue
2025-05-04 14:46:20 +08:00

225 lines
5.7 KiB
Vue

<template>
<view>
<view class="mt-4">
<view class="mt-18 mx-8 flex flex-col">
<view class="text-lg font-bold mb-4">请选择WiFi并输入密码</view>
<view class="pt-2 pb-3 border-b-2 border-b-solid border-gray-200">
<picker
mode="selector"
:range="wifiList"
:value="wifiIndex"
@change="changeWifi"
range-key="SSID"
>
<view class="flex items-center">
<view class="mr-4">WiFi</view>
<view>{{ wifiList[wifiIndex]?.SSID ?? '请选择WiFi' }}</view>
<view class="ml-a">
<up-icon name="arrow-right" size="24rpx"></up-icon>
</view>
</view>
</picker>
</view>
<view class="py-2 border-b-2 border-b-solid border-gray-200 flex items-center">
<view>密码</view>
<view class="flex-1">
<up-input
:customStyle="{
padding: '0 28rpx',
outline: 'none',
height: '80rpx',
backgroundColor: '#FFFFFF',
border: 0
}"
:maxlength="20"
placeholder-class="!text-base !line-height-[80rpx]"
placeholder="请输入密码"
:type="showPassword ? 'text' : 'password'"
@change="handleInput"
>
<template #suffix>
<up-icon
:name="showPassword ? 'eye-fill' : 'eye-off'"
size="42rpx"
@click="togglePassword"
></up-icon>
</template>
</up-input>
</view>
</view>
</view>
<view
class="fixed bottom-[calc(env(safe-area-inset-bottom)+32rpx)] w-686rpx mx-4 h-88rpx text-center text-white bg-[#63b8af] leading-[88rpx] rounded-44rpx font-bold"
@click="connectWifi"
>
连接
</view>
</view>
</view>
</template>
<script setup>
import { onMounted, onUnmounted, ref } from 'vue'
import { useBluetoothStore } from '@/stores/bluetooth'
import { useUserStore } from '@/stores/user'
import { useBasicStore } from '@/stores/basic'
import { passthrough } from '@/api/sdk'
const $bluetooth = useBluetoothStore()
const $user = useUserStore()
const $basic = useBasicStore()
const wifiList = ref([])
const wifiIndex = ref()
const password = ref('')
const showPassword = ref(false)
const pending = ref(false)
const requestResult = ref(false)
onMounted(async () => {
uni.showLoading({
title: '搜索中',
mask: true
})
const result = await $bluetooth.getWifiList({
uid: $user.userInfo.uid.toString()
})
if (result.code !== 0) {
uni.showModal({
title: '提示',
content: '搜索失败,请返回重试',
showCancel: false,
success: () => {
uni.navigateBack()
}
})
}
listenEvent()
})
onUnmounted(() => {
uni.$off('wifiList')
uni.$off('distributionNetworkResult')
})
const listenEvent = () => {
uni.$on('wifiList', async data => {
if (data.status === 0) {
wifiList.value = data.wifiList
if (wifiList.value.length > 0) {
wifiIndex.value = 0
}
uni.hideLoading()
} else {
uni.showModal({
title: '提示',
content: '搜索失败,请返回重试',
showCancel: false,
success: () => {
uni.navigateBack()
}
})
}
})
uni.$on('distributionNetworkResult', async data => {
requestResult.value = false
uni.hideLoading()
pending.value = false
if (data.status === 0) {
$basic.routeJump({
type: 'redirectTo',
name: 'bindLock'
})
setTimeout(() => {
uni.showToast({
title: '连接成功',
icon: 'none'
})
}, 1000)
} else {
uni.showToast({
title: '连接失败,请重试',
icon: 'none'
})
}
})
}
const togglePassword = () => {
showPassword.value = !showPassword.value
}
const changeWifi = e => {
wifiIndex.value = e.detail.value
}
const connectWifi = async () => {
if (password.value.length < 8) {
uni.showToast({
title: '密码长度不能小于8位',
icon: 'none'
})
return
}
if (pending.value) return
pending.value = true
uni.showLoading({
title: '连接中...'
})
const result = await passthrough({
request_method: 'GET',
request_uri: '/api/v1/tencentYun/getTencentTriple',
post_args: {
serialNum0: $bluetooth.currentLockInfo.lockConfig.serialNum0
}
})
if (result.code === 0) {
$bluetooth.updateCurrentLockInfo({
...$bluetooth.currentLockInfo,
tencentYunLock: result.data
})
const res = await $bluetooth.distributionNetwork({
SSID: wifiList.value[wifiIndex.value].SSID,
password: password.value,
json: JSON.stringify(result.data)
})
if (res.code === 0) {
requestResult.value = true
setTimeout(() => {
pending.value = false
if (requestResult.value) {
uni.showToast({
title: '配网失败,请检查密码是否正确',
icon: 'none'
})
}
}, 10000)
} else {
pending.value = false
uni.showToast({
title: res.message,
icon: 'none'
})
}
} else {
uni.hideLoading()
pending.value = false
uni.showToast({
title: result.message,
icon: 'none'
})
}
}
const handleInput = e => {
password.value = e
}
</script>