feat: 新增sky分支

This commit is contained in:
liyi 2025-10-27 09:58:13 +08:00
parent ada5dfdff5
commit 5b66f6f9cb
11 changed files with 1701 additions and 1300 deletions

View File

@ -1,56 +1,72 @@
let version = '-'
let buildNumber = '-'
uni.getSystemInfo({
success(res) {
version = res.appVersion
buildNumber = res.appVersionCode
}
success(res) {
version = res.appVersion
buildNumber = res.appVersionCode
}
})
const DEV = {
name: 'dev',
appName: '星星锁Lite',
baseUrl: 'https://lock.dev.star-lock.cn/api',
webviewBaseUrl: 'https://lock.dev.star-lock.cn',
version,
buildNumber
name: 'dev',
appName: '星星锁Lite',
baseUrl: 'https://lock.dev.star-lock.cn/api',
webviewBaseUrl: 'https://lock.dev.star-lock.cn',
officialEmail: '',
officialWebsite: '',
version,
buildNumber
}
const PRE = {
name: 'pre',
appName: '星星锁Lite',
baseUrl: 'https://lock.pre.star-lock.cn/api',
webviewBaseUrl: 'https://lock.xhjcn.ltd',
version,
buildNumber
name: 'pre',
appName: '星星锁Lite',
baseUrl: 'https://lock.pre.star-lock.cn/api',
webviewBaseUrl: 'https://lock.xhjcn.ltd',
officialEmail: '',
officialWebsite: '',
version,
buildNumber
}
const XHJ = {
name: 'xhj',
appName: '星星锁Lite',
baseUrl: 'https://lock.xhjcn.ltd/api',
webviewBaseUrl: 'https://lock.xhjcn.ltd',
version,
buildNumber
name: 'xhj',
appName: '星星锁Lite',
baseUrl: 'https://lock.xhjcn.ltd/api',
webviewBaseUrl: 'https://lock.xhjcn.ltd',
officialEmail: '',
officialWebsite: '',
version,
buildNumber
}
const SKY = {
name: 'sky',
appName: '锁通通',
baseUrl: 'https://lock.skychip.top/api',
webviewBaseUrl: 'https://lock.skychip.top',
version,
buildNumber
name: 'sky',
appName: '锁通通',
baseUrl: 'https://lock.skychip.top/api',
webviewBaseUrl: 'https://lock.skychip.top',
officialEmail: 'contact@skychip.top',
officialWebsite: 'www.skychip.top',
version,
buildNumber
}
const GE = {
name: 'ge',
appName: '星星锁Lite',
baseUrl: 'http://lock.ge.star-lock.cn/api',
webviewBaseUrl: 'http://lock.ge.star-lock.cn',
version,
buildNumber
name: 'ge',
appName: '星星锁Lite',
baseUrl: 'http://lock.ge.star-lock.cn/api',
webviewBaseUrl: 'http://lock.ge.star-lock.cn',
officialEmail: '',
officialWebsite: '',
version,
buildNumber
}
// 更换环境的时候 切换导出就行
export default { DEV, PRE, XHJ, SKY, GE }
export default {
DEV,
PRE,
XHJ,
SKY,
GE
}

View File

@ -20,9 +20,7 @@
"optimization" : {
"subPackages" : true
},
"plugins" : {
}
"plugins" : {}
},
"vueVersion" : "3",
"app-plus" : {

1328
pages.json

File diff suppressed because it is too large Load Diff

View File

@ -142,11 +142,11 @@
const { code, message } = await bindLockAdmin(params)
console.log('添加锁返回', code, message)
if (code === 0) {
this.updateLockSearch({
await this.updateLockSearch({
...this.lockSearch,
pageNo: 1
})
this.getLockList(this.lockSearch)
await this.getLockList(this.lockSearch)
setTimeout(() => {
uni.hideLoading()
this.backAndToast('添加成功', 2)
@ -204,7 +204,7 @@
line-height: 96rpx;
color: #ffffff;
text-align: center;
background: #4777ee;
background: #4777ee;
border-radius: 16rpx;
}
</style>

View File

@ -3,79 +3,104 @@
<scroll-view
v-if="deviceInfo"
scroll-y="true"
:style="{ height: deviceInfo.windowHeight - deviceInfo.safeArea.top + 'px' }"
:style="{
height: deviceInfo.windowHeight - deviceInfo.safeArea.top + 'px'
}"
@refresherrefresh="refresher"
:refresher-enabled="true"
:refresher-triggered="refresherTriggered"
>
<view class="days" v-if="$bluetooth.currentLockInfo.days"
>钥匙将在{{ $bluetooth.currentLockInfo.days }}天后失效</view
>
<view class="lock-name">{{ $bluetooth.currentLockInfo.lockAlias }}</view>
<view class="top">
<view class="select-lock-row">
<image
class="top-background"
src="https://oss-lock.xhjcn.ltd/mp/background_main.jpg"
src="https://cos-lock.skychip.top/mp/icon_add_round.png"
mode="aspectFill"
style="width: 48rpx; height: 48rpx"
@click="toSearchDevice"
></image>
<view style="width: 100%; height: 50rpx">
<view class="power" @click="powerTip">
<!-- 普通 picker -->
<picker :range="pickerOptions" @change="onPickerChange">
<view class="lock-name">
<text>
{{ $bluetooth.currentLockInfo.lockAlias }}
</text>
<image
class="power-icon"
:src="$lock.getPowerIcon($bluetooth.currentLockInfo.electricQuantity)"
class="icon-down"
src="https://cos-lock.skychip.top/mp/icon_down.png"
mode="aspectFill"
></image>
<view class="power-text">{{ $bluetooth.currentLockInfo.electricQuantity }}%</view>
<image
class="power-tips"
src="https://cos-lock.skychip.top/mp/icon_tips.png"
mode="aspectFill"
></image>
</view>
</view>
<view class="switch" @click="openDoorOperate('open')" @longpress="openDoorOperate('close')">
<SwitchLoading :size="220" ref="sLoading"></SwitchLoading>
</view>
<view class="switch-text">点击开锁长按闭锁</view>
<view class="bottom">
<view class="bottom-side">
<image
class="bottom-icon"
src="https://cos-lock.skychip.top/mp/icon_role.png"
mode="aspectFill"
></image>
<view>{{
$lock.getRole(
$bluetooth.currentLockInfo.userType,
$bluetooth.currentLockInfo.keyRight
)
}}</view>
</view>
<view class="bottom-side">
<image
class="bottom-icon"
:src="
$bluetooth.currentLockInfo.appUnlockOnline
? 'https://cos-lock.skychip.top/mp/icon_cloud_active.png'
: 'https://cos-lock.skychip.top/mp/icon_cloud.png'
"
mode="aspectFill"
style="width: 40rpx; height: 40rpx"
></image>
<view
:style="{
color: $bluetooth.currentLockInfo.appUnlockOnline ? '#4777ee' : '#a3a3a3'
}"
>手机需联网</view
>
</image>
</view>
</picker>
<view class="power" @click="powerTip">
<image
class="power-icon"
:src="$lock.getPowerIcon($bluetooth.currentLockInfo.electricQuantity)"
mode="aspectFill"
></image>
<view class="power-text">{{ $bluetooth.currentLockInfo.electricQuantity }}%</view>
<image
class="power-tips"
src="https://cos-lock.skychip.top/mp/icon_tips.png"
mode="aspectFill"
>
</image>
</view>
</view>
<view
class="open-lock-btn"
@click="openDoorOperate('open')"
@longpress="openDoorOperate('close')"
>
<image
class="open-lock-btn-image-1"
ref="sLoading"
src="https://cos-lock.skychip.top/mp/icon_main_openLockBtn_center.png"
></image>
<image
class="open-lock-btn-image-2"
:class="{ rotate: isRotating }"
src="https://cos-lock.skychip.top/mp/icon_main_openLockBtn_circle.png"
></image>
</view>
<view class="days" v-if="$bluetooth.currentLockInfo.days"
>钥匙将在{{ $bluetooth.currentLockInfo.days }}天后失效
</view>
<view class="switch-text">点击开锁长按闭锁</view>
<view class="other-text">
<view class="bottom-side">
<image
class="bottom-icon"
style="width: 32rpx; height: 32rpx"
src="https://cos-lock.skychip.top/mp/icon_role.png"
mode="aspectFill"
></image>
<view>{{
$lock.getRole($bluetooth.currentLockInfo.userType, $bluetooth.currentLockInfo.keyRight)
}}</view>
</view>
<view class="bottom-side">
<image
class="bottom-icon"
:src="
$bluetooth.currentLockInfo.appUnlockOnline
? 'https://cos-lock.skychip.top/mp/icon_cloud_active.png'
: 'https://cos-lock.skychip.top/mp/icon_cloud.png'
"
mode="aspectFill"
style="width: 40rpx; height: 40rpx"
></image>
<view
:style="{
color: $bluetooth.currentLockInfo.appUnlockOnline ? '#4777ee' : '#a3a3a3'
}"
>手机需联网</view
>
</view>
</view>
<view class="menu">
<view class="menu-title">
<image class="menu-image" src="https://oss-lock.xhjcn.ltd/mp/icon_menu.png"></image>
<view>功能</view>
</view>
<view class="menu-main">
<view
v-if="
@ -86,8 +111,8 @@
@click="$basic.routeJump({ name: 'keyList' })"
>
<image
class="menu-main-image transform-scale-90"
src="https://cos-lock.skychip.top/mp/icon_key.png"
class="menu-main-image"
src="https://cos-lock.skychip.top/mp/icon_main_electronicKey.png"
></image>
<view>电子钥匙</view>
</view>
@ -102,8 +127,9 @@
>
<image
class="menu-main-image"
src="https://cos-lock.skychip.top/mp/icon_password_green.png"
></image>
src="https://cos-lock.skychip.top/mp/icon_main_password.png"
>
</image>
<view>密码</view>
</view>
<view
@ -117,7 +143,7 @@
>
<image
class="menu-main-image transform-scale-110"
src="https://cos-lock.skychip.top/mp/icon_card.png"
src="https://cos-lock.skychip.top/mp/icon_main_icCard.png"
></image>
<view></view>
</view>
@ -132,8 +158,9 @@
>
<image
class="menu-main-image"
src="https://cos-lock.skychip.top/mp/icon_fingerprint.png"
></image>
src="https://cos-lock.skychip.top/mp/icon_main_fingerprint.png"
>
</image>
<view>指纹</view>
</view>
<view
@ -147,7 +174,7 @@
>
<image
class="menu-main-image"
src="https://cos-lock.skychip.top/mp/icon_remote.png"
src="https://cos-lock.skychip.top/mp/icon_main_remoteControl.png"
></image>
<view>遥控</view>
</view>
@ -177,7 +204,7 @@
>
<image
class="menu-main-image"
src="https://cos-lock.skychip.top/mp/icon_palm_vein.png"
src="https://cos-lock.skychip.top/mp/icon_palm.png"
></image>
<view>掌静脉</view>
</view>
@ -188,7 +215,7 @@
>
<image
class="menu-main-image transform-scale-140"
src="https://oss-lock.xhjcn.ltd/mp/icon_control.png"
src="https://oss-lock.xhjcn.ltd/mp/icon_catEyes.png"
></image>
<view>监控</view>
</view>
@ -202,7 +229,7 @@
>
<image
class="menu-main-image transform-scale-140"
src="https://cos-lock.skychip.top/mp/icon_admin_black.png"
src="https://cos-lock.skychip.top/mp/icon_main_authorizedAdmin.png"
></image>
<view>授权管理员</view>
</view>
@ -213,7 +240,7 @@
>
<image
class="menu-main-image"
src="https://cos-lock.skychip.top/mp/icon_record.png"
src="https://cos-lock.skychip.top/mp/icon_main_operatingRecord.png"
></image>
<view>操作记录</view>
</view>
@ -224,57 +251,31 @@
>
<image
class="menu-main-image"
src="https://cos-lock.skychip.top/mp/icon_record.png"
src="https://cos-lock.skychip.top/mp/icon_main_operatingRecord.png"
></image>
<view>门锁记录</view>
</view>
<view
v-if="
$bluetooth.currentLockInfo.keyRight === 1 &&
$bluetooth.currentLockInfo.transportType !== transportType.TRANSPORT_TENCENT_YUN
"
class="menu-main-view"
@click="$basic.routeJump({ name: 'messageReminder' })"
>
<view class="menu-main-view" @click="$basic.routeJump({ name: 'setting' })">
<image
class="menu-main-image transform-scale-110"
src="https://cos-lock.skychip.top/mp/icon_remind.png"
src="https://cos-lock.skychip.top/mp/icon_main_set.png"
></image>
<view>消息提醒</view>
</view>
<view
class="menu-main-view transform-scale-105"
v-if="$bluetooth.currentLockInfo.transportType === transportType.TRANSPORT_TENCENT_YUN"
@click="$basic.routeJump({ name: 'authorizeWechat' })"
>
<image
class="menu-main-image"
src="https://oss-lock.xhjcn.ltd/mp/icon_wechat_call.png"
></image>
<view>微信呼叫</view>
<view>设置</view>
</view>
</view>
</view>
<view
class="setting"
@click="$basic.routeJump({ name: 'setting' })"
v-if="$bluetooth.currentLockInfo.transportType !== transportType.TRANSPORT_TENCENT_YUN"
>
<image class="setting-image" src="https://cos-lock.skychip.top/mp/icon_setting.png"></image>
<view class="setting-text">设置</view>
<image
class="setting-arrow"
mode="aspectFill"
src="https://oss-lock.xhjcn.ltd/mp/icon_arrow.png"
></image>
</view>
<view
v-if="$bluetooth.currentLockInfo.transportType === transportType.TRANSPORT_TENCENT_YUN"
class="fixed bottom-[calc(env(safe-area-inset-bottom)+120rpx)] mt-4 rounded-3xl w-686 h-80 line-height-80rpx text-center mx-32rpx bg-#ec433c text-white text-xl font-bold"
@click="deleteLock"
>删除
</view>
</scroll-view>
<view v-else class="not-devices-box">
<image class="menu-main-image" src="https://cos-lock.skychip.top/mp/icon_noData.png"></image>
<text>暂无智能锁</text>
<image
src="https://cos-lock.skychip.top/mp/icon_add_round.png"
mode="aspectFill"
class="button-add-big"
@click="toSearchDevice"
></image>
</view>
<up-popup
:show="show"
@close="closePopup"
@ -303,7 +304,7 @@
<script setup>
import { timeFormat } from 'uview-plus'
import { onMounted, ref } from 'vue'
import { onMounted, onUnmounted, ref } from 'vue'
import { useBluetoothStore } from '@/stores/bluetooth'
import { useBasicStore } from '@/stores/basic'
import SwitchLoading from '@/components/SwitchLoading/SwitchLoading.vue'
@ -312,6 +313,9 @@
import { getLockDetailRequest, getLockNetTokenRequest, deleteLockRequest } from '@/api/lock'
import { deleteKeyRequest } from '@/api/key'
import { transportType } from '@/constant/transportType'
import { loginRequest } from '@/api/user'
import { setStorage, getStorage } from '@/utils/storage'
import { onLoad, onShow } from '@dcloudio/uni-app' // UniApp
// #ifdef APP-PLUS
import { requestPermission } from '@/uni_modules/xhj-record'
@ -322,7 +326,7 @@
const $lock = useLockStore()
const $user = useUserStore()
const sLoading = ref(null)
// const sLoading = ref(null)
const time = ref(0)
const onlineToken = ref('0')
@ -333,9 +337,133 @@
const deviceInfo = ref(null)
//
const isRotating = ref(false)
//
const pickerOptions = ref([])
// picker 使
const selectedIndex = ref(0)
//
const selectedText = ref(pickerOptions.value[0])
onMounted(async () => {
deviceInfo.value = await $basic.getDeviceInfo()
await getServeTime()
try {
// #ifdef MP-WEIXIN
const accountInfo = uni.getAccountInfoSync()
getApp().globalData.appid = accountInfo.miniProgram.appId
getApp().globalData.envVersion = accountInfo.miniProgram.envVersion
// #endif
uni.showLoading({
title: '加载中',
mask: true
})
const token = getStorage('token')
const list = getStorage('lockList')
const userInfo = getStorage('userInfo')
if (token) {
await Promise.all([$lock.getLockList($lock.lockSearch), $user.getUserInfo()]).then(res => {
pending.value = false
uni.hideLoading()
if (res[0].code === -1 && res[1] === -1 && list && userInfo) {
uni.showToast({
title: '网络访问失败,请检查网络是否正常',
icon: 'none'
})
$lock.updateLockList(list)
$user.updateUserInfo(userInfo)
$user.updateLoginStatus(true)
}
})
} else {
// uni.login() Promise
await new Promise((resolve, reject) => {
uni.login({
provider: 'weixin',
success: async loginRes => {
try {
const { code, data } = await loginRequest({
js_code: loginRes.code
})
if (code === 0) {
await setStorage('openid', data.openid)
if (data.accessToken) {
setStorage('token', data.accessToken)
const list = getStorage('lockList')
const userInfo = getStorage('userInfo')
if (!list && !userInfo) {
await $lock.getLockList($lock.lockSearch)
await $user.getUserInfo()
await $user.updateLoginStatus(true)
}
} else {
$user.updateLoginStatus(false)
}
resolve() // resolve Promise
} else {
throw new Error('登录请求失败')
}
} catch (err) {
console.error('登录过程出错:', err)
reject(err) // reject Promise
}
},
fail: err => {
console.error('微信登录失败:', err)
reject(err) // reject Promise
}
})
})
}
//
const lock = list.flatMap(item => item.lockList)
console.log('lock', lock)
if (lock) {
const defaultShowLockIndex = 0
const data = {
...lock[defaultShowLockIndex],
name: lock[defaultShowLockIndex].bluetooth.bluetoothDeviceName,
deviceId: lock[defaultShowLockIndex].bluetooth.bluetoothDeviceId,
commKey: lock[defaultShowLockIndex].bluetooth.privateKey,
signKey: lock[defaultShowLockIndex].bluetooth.signKey,
publicKey: lock[defaultShowLockIndex].bluetooth.publicKey
}
await $bluetooth.updateKeyId(lock[defaultShowLockIndex].keyId.toString())
await $bluetooth.updateCurrentLockInfo(data)
pickerOptions.value = lock.map(item => item.lockAlias)
}
if (Object.keys($bluetooth.currentLockInfo).length !== 0) {
if (!($bluetooth.bluetoothStatus === 0 || $bluetooth.bluetoothStatus === -1)) {
$bluetooth.getBluetoothStatus()
return
}
let result = true
if (!$bluetooth.isInitBluetooth) {
result = await $bluetooth.initAndListenBluetooth()
}
if (!result) {
$bluetooth.checkSetting()
}
}
//
deviceInfo.value = await $basic.getDeviceInfo()
await getServeTime()
} catch (err) {
console.error('初始化过程出错:', err)
uni.showToast({
title: '登录失败,请重试',
icon: 'none'
})
} finally {
uni.hideLoading() // loading
}
})
const jumpToPlayer = async () => {
@ -350,10 +478,27 @@
return
}
// #endif
$basic.routeJump({ name: 'p2pPlayer' })
$basic.routeJump({
name: 'p2pPlayer'
})
}
const openDoorOperate = async type => {
if (!($bluetooth.bluetoothStatus === 0 || $bluetooth.bluetoothStatus === -1)) {
$bluetooth.getBluetoothStatus()
return
}
let result = true
if (!$bluetooth.isInitBluetooth) {
result = await $bluetooth.initAndListenBluetooth()
}
if (!result) {
$bluetooth.checkSetting()
}
isRotating.value = true
const timestamp = new Date().getTime()
if (
$bluetooth.currentLockInfo.faceAuthentication === 1 &&
@ -365,20 +510,23 @@
content: '开门前需进行实名认证小程序暂不支持请使用APP认证开门',
showCancel: false
})
isRotating.value = false
return
}
if (pending.value) {
isRotating.value = false
return
}
if ($bluetooth.currentLockInfo.appUnlockOnline && type !== 'close') {
const netWork = await $basic.getNetworkType()
if (!netWork) {
isRotating.value = false
return
}
}
uni.vibrateLong()
pending.value = true
sLoading.value.open()
if (type === 'close') {
uni.showToast({
title: `正在尝试闭锁……`,
@ -388,9 +536,11 @@
// if ($bluetooth.currentLockInfo.appUnlockOnline && type !== 'close') {
if ($bluetooth.currentLockInfo.appUnlockOnline) {
const result = await getNetToken()
if (!result) {
sLoading.value.close()
// sLoading.value.close()
pending.value = false
isRotating.value = false
return
}
}
@ -400,6 +550,7 @@
} else {
openMode = $bluetooth.currentLockInfo.appUnlockOnline ? 1 : 0
}
const { code } = await $bluetooth.openDoor({
name: $bluetooth.currentLockInfo.name,
uid: $user.userInfo.uid.toString(),
@ -465,8 +616,9 @@
icon: 'none'
})
}
sLoading.value.close()
pending.value = false
isRotating.value = false
}
const closePopup = () => {
@ -510,7 +662,10 @@
lockId: $bluetooth.currentLockInfo.lockId
})
if (code === 0) {
$bluetooth.updateCurrentLockInfo({ ...$bluetooth.currentLockInfo, ...data })
$bluetooth.updateCurrentLockInfo({
...$bluetooth.currentLockInfo,
...data
})
uni.showToast({
title: '刷新成功',
icon: 'none'
@ -524,6 +679,12 @@
refresherTriggered.value = false
}
const toSearchDevice = async () => {
$basic.routeJump({
name: 'addLockGuid'
})
}
const deleteLock = async () => {
const netWork = await $basic.getNetworkType()
if (!netWork) {
@ -575,6 +736,27 @@
}
})
}
// picker
const onPickerChange = async e => {
const list = getStorage('lockList')
//
const lock = list.flatMap(item => item.lockList)
if (lock) {
const defaultShowLockIndex = e.detail.value
const data = {
...lock[defaultShowLockIndex],
name: lock[defaultShowLockIndex].bluetooth.bluetoothDeviceName,
deviceId: lock[defaultShowLockIndex].bluetooth.bluetoothDeviceId,
commKey: lock[defaultShowLockIndex].bluetooth.privateKey,
signKey: lock[defaultShowLockIndex].bluetooth.signKey,
publicKey: lock[defaultShowLockIndex].bluetooth.publicKey
}
await $bluetooth.updateKeyId(lock[defaultShowLockIndex].keyId.toString())
await $bluetooth.updateCurrentLockInfo(data)
pickerOptions.value = lock.map(item => item.lockAlias)
}
}
</script>
<style lang="scss" scoped>
@ -626,14 +808,6 @@
background: #faecc9;
}
.lock-name {
padding: 32rpx 32rpx 0 32rpx;
font-size: 32rpx;
font-weight: bold;
text-align: center;
word-break: break-all;
}
.top {
position: relative;
width: 686rpx;
@ -670,32 +844,21 @@
align-items: center;
justify-content: flex-end;
height: 50rpx;
padding-top: 18rpx;
.power-icon {
width: 50rpx;
height: 30rpx;
margin-right: 10rpx;
}
.power-text {
margin-right: 10rpx;
font-size: 32rpx;
font-weight: bold;
line-height: 50rpx;
}
.power-tips {
width: 40rpx;
height: 40rpx;
margin-right: 32rpx;
}
}
.switch-text {
margin-top: 10rpx;
text-align: center;
}
}
.bottom {
@ -759,8 +922,8 @@
margin-bottom: 48rpx;
.menu-main-image {
width: 40rpx;
height: 40rpx;
width: 48rpx;
height: 48rpx;
margin-bottom: 10rpx;
}
}
@ -796,4 +959,138 @@
margin-left: 32rpx;
}
}
.not-devices-box {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: gray;
font-size: 24rpx;
width: 100%;
height: 100vh;
gap: 20rpx;
position: relative;
image {
width: 320rpx;
height: 240rpx;
}
.add-new-lock {
background-color: #4777ee;
color: white;
}
.button-add-big {
position: absolute;
width: 88rpx;
height: 88rpx;
right: 55rpx;
bottom: 55rpx;
}
}
.select-lock-row {
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 15rpx;
padding: 8rpx 24rpx;
.lock-name {
display: flex;
align-items: center;
justify-content: center;
gap: 18rpx;
border-radius: 50rpx;
margin-top: 24rpx;
margin-bottom: 32rpx;
font-size: 32rpx;
background-color: #4777ee;
color: white;
padding: 12rpx 32rpx;
.icon-down {
width: 32rpx;
height: 32rpx;
}
}
.power {
display: flex;
align-items: center;
gap: 12rpx;
.power-icon {
width: 50rpx;
height: 30rpx;
}
.power-text {
font-size: 32rpx;
}
.power-tips {
width: 40rpx;
height: 40rpx;
}
}
}
.open-lock-btn {
display: flex;
justify-content: center;
position: relative;
height: 480rpx;
margin-top: 18rpx;
margin-bottom: 18rpx;
.open-lock-btn-image-1 {
width: 480rpx;
height: 480rpx;
position: absolute;
}
.open-lock-btn-image-2 {
width: 480rpx;
height: 480rpx;
position: absolute;
transition: transform 0.6s ease-in-out;
}
}
/* 旋转动画 class */
.rotate {
animation: rotate 2s linear infinite; /* 无限旋转动画 */
}
@keyframes rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.switch-text {
margin-top: 35rpx;
font-size: 32rpx;
color: #414141;
text-align: center;
}
.other-text {
display: flex;
align-items: center;
justify-content: center;
gap: 15rpx;
margin-top: 35rpx;
.bottom-side {
display: flex;
align-items: center;
font-size: 32rpx;
gap: 10rpx;
}
.bottom-icon {
width: 48rpx;
height: 48rpx;
}
}
</style>

View File

@ -1,448 +1,543 @@
<template>
<view v-if="buttonInfo">
<view v-if="isLogin">
<view class="view">
<view class="view-button" @click="toUsereInfo">
<view>个人信息</view>
<image
class="icon-arrow"
src="https://oss-lock.xhjcn.ltd/mp/icon_arrow.png"
mode="aspectFill"
></image>
</view>
<view class="view-line"></view>
<!-- #ifdef MP-WEIXIN -->
<label for="contact">
<view class="view-button">
<view>客服</view>
<image
class="icon-arrow"
src="https://oss-lock.xhjcn.ltd/mp/icon_arrow.png"
mode="aspectFill"
></image>
</view>
</label>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<view @click="toContact">
<view class="view-button">
<view>客服</view>
<image
class="icon-arrow"
src="https://oss-lock.xhjcn.ltd/mp/icon_arrow.png"
mode="aspectFill"
></image>
</view>
</view>
<!-- #endif -->
<view class="view-line"></view>
<view class="view-button" @click="toWebview()">
<view>公司介绍</view>
<image
class="icon-arrow"
src="https://oss-lock.xhjcn.ltd/mp/icon_arrow.png"
mode="aspectFill"
></image>
</view>
<view class="view-line"></view>
<view class="view-button" @click="toWebview('userAgreement')">
<view>用户协议</view>
<image
class="icon-arrow"
src="https://oss-lock.xhjcn.ltd/mp/icon_arrow.png"
mode="aspectFill"
></image>
</view>
<view class="view-line"></view>
<view class="view-button" @click="toWebview('privacy')">
<view>隐私政策</view>
<image
class="icon-arrow"
src="https://oss-lock.xhjcn.ltd/mp/icon_arrow.png"
mode="aspectFill"
></image>
</view>
</view>
<view class="env" v-if="env">
<view class="env-text">{{ env.name }} {{ env.version }}+{{ env.buildNumber }}</view>
<view>{{ env.baseUrl.split('/').slice(0, 3).join('/') }}</view>
<view
v-if="!(envVersion === 'release' || nodeEnv === 'production') && env"
class="env-button"
@click="show = true"
>切换环境</view
>
</view>
<!-- #ifdef MP-WEIXIN -->
<label for="changePhone">
<view class="switch-account">切换账号</view>
</label>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<view class="switch-account !bg-red-500" @click="logout">退出</view>
<view class="delete-account" @click="deleteAccount">删除账号</view>
<!-- #endif -->
</view>
<view v-else>
<view class="tips">因智能门锁与账号绑定登录为手机号登录</view>
<label for="phone">
<view class="button-login">登录</view>
</label>
<view class="env" v-if="env">
<view class="env-text">{{ env.name }} {{ env.version }}+{{ env.buildNumber }}</view>
<view>{{ env.baseUrl.split('/').slice(0, 3).join('/') }}</view>
<view
v-if="!(envVersion === 'release' || nodeEnv === 'production') && env"
class="env-button"
@click="show = true"
>
切换环境
</view>
</view>
</view>
</view>
<button open-type="contact" style="display: none" id="contact"></button>
<button
open-type="getPhoneNumber"
style="display: none"
id="phone"
@getphonenumber="getphonenumber"
></button>
<button
open-type="getPhoneNumber"
style="display: none"
id="changePhone"
@getphonenumber="changePhone"
></button>
<up-action-sheet
:actions="envList"
:closeOnClickOverlay="true"
title="切换环境"
cancelText="取消"
:closeOnClickAction="true"
:show="show"
:safeAreaInsetBottom="true"
@close="show = false"
@select="selectEnv"
></up-action-sheet>
<view v-if="buttonInfo">
<view v-if="isLogin">
<view class="account-info" @click="toUsereInfo">
<image class="avatar" :src="userInfo.headUrl" mode="aspectFill"></image>
<view class="account-nickname">
<text class="nickname">{{ userInfo.nickname }}</text>
<text class="account">{{ userInfo.mobile }}</text>
</view>
</view>
<view class="follow-official-account">
<text>关注公众号接收更多消息提醒</text>
<!-- #ifdef MP-WEIXIN -->
<official-account><view class="follow-btn">关注公众号</view></official-account>
<!-- #endif -->
<view class="follow-btn" @click="jumpToWeChatfficialAccount">关注公众号</view>
</view>
<label for="contact">
<view class="option-item">
<view class="icon-label">
<image class="left-icon" src="https://cos-lock.skychip.top/mp/icon_customer_service.png">
</image>
<text>人工客服</text>
</view>
<image class="icon-arrow" src="https://cos-lock.skychip.top/mp/icon_arrow.png" mode="aspectFill">
</image>
</view>
</label>
<view class="view">
<!-- #ifdef APP-PLUS -->
<view @click="toContact">
<view class="view-button">
<view>客服</view>
<image class="icon-arrow" src="https://cos-lock.skychip.top/mp/icon_arrow.png"
mode="aspectFill">
</image>
</view>
</view>
<!-- #endif -->
<view class="view-button">
<view>邮箱 / 商务合作</view>
<text class="right-text">{{env.officialEmail}}</text>
</view>
<view class="view-line"></view>
<view class="view-button">
<view>官网</view>
<text class="right-text">{{env.officialWebsite}}</text>
</view>
<view class="view-line"></view>
<view class="view-button" @click="toWebview()">
<view>公司介绍</view>
<image class="icon-arrow" src="https://cos-lock.skychip.top/mp/icon_arrow.png" mode="aspectFill">
</image>
</view>
<view class="view-line"></view>
<view class="view-button" @click="toWebview('userAgreement')">
<view>用户协议</view>
<image class="icon-arrow" src="https://cos-lock.skychip.top/mp/icon_arrow.png" mode="aspectFill">
</image>
</view>
<view class="view-line"></view>
<view class="view-button" @click="toWebview('privacy')">
<view>隐私政策</view>
<image class="icon-arrow" src="https://cos-lock.skychip.top/mp/icon_arrow.png" mode="aspectFill">
</image>
</view>
</view>
<view class="env" v-if="env">
<view class="env-text">{{ env.name }} {{ env.version }}+{{ env.buildNumber }}</view>
<view>{{ env.baseUrl.split('/').slice(0, 3).join('/') }}</view>
<view v-if="!(envVersion === 'release' || nodeEnv === 'production') && env" class="env-button"
@click="show = true">切换环境</view>
</view>
<!-- #ifdef MP-WEIXIN -->
<label for="changePhone">
<view class="switch-account">切换账号</view>
</label>
<!-- #endif -->
<!-- #ifdef APP-PLUS -->
<view class="switch-account !bg-red-500" @click="logout">退出</view>
<view class="delete-account" @click="deleteAccount">删除账号</view>
<!-- #endif -->
</view>
<view v-else>
<view class="tips">因智能门锁与账号绑定登录为手机号登录</view>
<label for="phone">
<view class="button-login">登录</view>
</label>
<view class="env" v-if="env">
<view class="env-text">{{ env.name }} {{ env.version }}+{{ env.buildNumber }}</view>
<view>{{ env.baseUrl.split('/').slice(0, 3).join('/') }}</view>
<view v-if="!(envVersion === 'release' || nodeEnv === 'production') && env" class="env-button"
@click="show = true">
切换环境
</view>
</view>
</view>
</view>
<button open-type="contact" style="display: none" id="contact"></button>
<button open-type="getPhoneNumber" style="display: none" id="phone" @getphonenumber="getphonenumber"></button>
<button open-type="getPhoneNumber" style="display: none" id="changePhone" @getphonenumber="changePhone"></button>
<up-action-sheet :actions="envList" :closeOnClickOverlay="true" title="切换环境" cancelText="取消"
:closeOnClickAction="true" :show="show" :safeAreaInsetBottom="true" @close="show = false"
@select="selectEnv"></up-action-sheet>
</template>
<script>
import { mapState, mapActions } from 'pinia'
import { useBasicStore } from '@/stores/basic'
import { useUserStore } from '@/stores/user'
import { useLockStore } from '@/stores/lock'
import { phoneLoginRequest, logoutRequest } from '@/api/user'
import env from '@/config/env'
import { setStorage, getStorage, removeStorage } from '@/utils/storage'
import { useNotificationStore } from '@/stores/notification'
import { getAppInfoRequest } from '@/api/system'
import {
mapState,
mapActions
} from 'pinia'
import {
useBasicStore
} from '@/stores/basic'
import {
useUserStore
} from '@/stores/user'
import {
useLockStore
} from '@/stores/lock'
import {
phoneLoginRequest,
logoutRequest
} from '@/api/user'
import env from '@/config/env'
import {
setStorage,
getStorage,
removeStorage
} from '@/utils/storage'
import {
useNotificationStore
} from '@/stores/notification'
import {
getAppInfoRequest
} from '@/api/system'
import {
loginRequest
} from '@/api/user'
export default {
data() {
return {
buttonInfo: null,
env: null,
envVersion: '',
envList: [],
show: false,
nodeEnv: ''
}
},
computed: {
...mapState(useUserStore, ['isLogin', 'userInfo']),
...mapState(useLockStore, ['lockSearch']),
...mapState(useNotificationStore, ['notificationSearch'])
},
async onLoad() {
this.buttonInfo = await this.getButtonInfo()
this.env = await env[await getApp().globalData.getEnvConfig()]
this.envVersion = getApp().globalData.envVersion
this.nodeEnv = process.env.NODE_ENV
export default {
data() {
return {
buttonInfo: null,
env: null,
envVersion: '',
envList: [],
show: false,
nodeEnv: ''
}
},
computed: {
...mapState(useUserStore, ['isLogin']),
...mapState(useLockStore, ['lockSearch']),
...mapState(useNotificationStore, ['notificationSearch'])
},
async onLoad() {
this.buttonInfo = await this.getButtonInfo()
this.env = await env[await getApp().globalData.getEnvConfig()]
this.envVersion = getApp().globalData.envVersion
this.nodeEnv = process.env.NODE_ENV
// eslint-disable-next-line guard-for-in,no-restricted-syntax
for (let key in env) {
this.envList.push({
...env[key],
key
})
}
},
methods: {
...mapActions(useBasicStore, ['getButtonInfo', 'routeJump']),
...mapActions(useLockStore, ['getLockList', 'updateLockSearch']),
...mapActions(useNotificationStore, ['getNotificationList', 'updateNotificationSearch']),
...mapActions(useUserStore, [
'updateLoginStatus',
'phoneLogin',
'updateUserInfo',
'getUserInfo',
'checkSession'
]),
deleteAccount() {
uni.showModal({
title: '提示',
content: '删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?',
success: res => {
if (res.confirm) {
this.routeJump({
name: 'deleteAccount'
})
}
}
})
},
selectEnv(env) {
setStorage('envVersion', env.key)
removeStorage('token')
removeStorage('openid')
removeStorage('userInfo')
removeStorage('lockList')
uni.reLaunch({
url: '/pages/main/home'
})
},
toContact() {
getAppInfoRequest().then(res => {
if (res.code === 0) {
plus.runtime.openURL(res.data.wechat_service_url)
}
})
},
async changePhone(res) {
if (res.detail.errMsg === 'getPhoneNumber:fail user deny') {
return
}
// eslint-disable-next-line guard-for-in,no-restricted-syntax
for (let key in env) {
this.envList.push({
...env[key],
key
})
}
},
methods: {
...mapActions(useBasicStore, ['getButtonInfo', 'routeJump']),
...mapActions(useLockStore, ['getLockList', 'updateLockSearch']),
...mapActions(useNotificationStore, ['getNotificationList', 'updateNotificationSearch']),
...mapActions(useUserStore, [
'updateLoginStatus',
'phoneLogin',
'updateUserInfo',
'getUserInfo',
'checkSession'
]),
deleteAccount() {
uni.showModal({
title: '提示',
content: '删除账号后,你的所有信息及相关记录都会从平台彻底删除,且不可恢复,是否删除?',
success: res => {
if (res.confirm) {
this.routeJump({
name: 'deleteAccount'
})
}
}
})
},
selectEnv(env) {
setStorage('envVersion', env.key)
removeStorage('token')
removeStorage('openid')
removeStorage('userInfo')
removeStorage('lockList')
uni.reLaunch({
url: '/pages/main/home'
})
},
toContact() {
getAppInfoRequest().then(res => {
if (res.code === 0) {
plus.runtime.openURL(res.data.wechat_service_url)
}
})
},
async changePhone(res) {
if (res.detail.errMsg === 'getPhoneNumber:fail user deny') {
return
}
const that = this
uni.showLoading({
title: '登录中'
})
uni.login({
provider: 'weixin',
async success(loginRes) {
const openid = getStorage('openid')
const { code, data, message } = await phoneLoginRequest({
encryptedData: res.detail.encryptedData,
iv: res.detail.iv,
rebind: true,
openid,
js_code: loginRes.code
})
uni.hideLoading()
if (code === 0) {
removeStorage('userInfo')
removeStorage('lockList')
setStorage('token', data.accessToken)
that.updateLockSearch({
...that.lockSearch,
pageNo: 1
})
that.getUserInfo()
that.getLockList(that.lockSearch)
that.updateNotificationSearch({
pageNo: 1
})
that.getNotificationList(that.notificationSearch)
uni.showToast({
title: '账号切换成功',
icon: 'none'
})
} else if (code === 438) {
/* empty */
} else {
uni.showToast({
title: message,
icon: 'none'
})
}
},
fail() {
uni.hideLoading()
uni.showToast({
title: '登录失败,请重试'
})
}
})
},
async getphonenumber(data) {
if (data.detail.errMsg === 'getPhoneNumber:fail user deny') {
return
}
const that = this
uni.showLoading({
title: '登录中'
})
uni.login({
provider: 'weixin',
async success(loginRes) {
const result = await that.phoneLogin({
encryptedData: data.detail.encryptedData,
iv: data.detail.iv,
code: loginRes.code
})
uni.hideLoading()
if (!result) {
uni.showToast({
title: result.message,
icon: 'none'
})
}
},
fail() {
uni.hideLoading()
uni.showToast({
title: '登录失败,请重试'
})
}
})
},
toUsereInfo() {
this.routeJump({
name: 'userInfo'
})
},
toWebview(type) {
this.routeJump({
name: 'webview',
params: {
type
}
})
},
logout() {
uni.showModal({
title: '提示',
content: '确定退出登录吗?',
success: async res => {
if (res.confirm) {
await logoutRequest()
removeStorage('token')
removeStorage('openid')
removeStorage('userInfo')
removeStorage('lockList')
this.routeJump({
name: 'login',
type: 'reLaunch'
})
}
}
})
}
}
}
const that = this
uni.showLoading({
title: '登录中'
})
uni.login({
provider: 'weixin',
async success(loginRes) {
const openid = getStorage('openid')
const {
code,
data,
message
} = await phoneLoginRequest({
encryptedData: res.detail.encryptedData,
iv: res.detail.iv,
rebind: true,
openid,
js_code: loginRes.code
})
uni.hideLoading()
if (code === 0) {
removeStorage('userInfo')
removeStorage('lockList')
setStorage('token', data.accessToken)
that.updateLockSearch({
...that.lockSearch,
pageNo: 1
})
that.getUserInfo()
that.getLockList(that.lockSearch)
that.updateNotificationSearch({
pageNo: 1
})
that.getNotificationList(that.notificationSearch)
uni.showToast({
title: '账号切换成功',
icon: 'none'
})
} else if (code === 438) {
/* empty */
} else {
uni.showToast({
title: message,
icon: 'none'
})
}
},
fail() {
uni.hideLoading()
uni.showToast({
title: '登录失败,请重试'
})
}
})
},
async getphonenumber(data) {
if (data.detail.errMsg === 'getPhoneNumber:fail user deny') {
return
}
const that = this
uni.showLoading({
title: '登录中'
})
uni.login({
provider: 'weixin',
async success(loginRes) {
const result = await that.phoneLogin({
encryptedData: data.detail.encryptedData,
iv: data.detail.iv,
code: loginRes.code
})
uni.hideLoading()
if (!result) {
uni.showToast({
title: result.message,
icon: 'none'
})
}
},
fail() {
uni.hideLoading()
uni.showToast({
title: '登录失败,请重试'
})
}
})
},
toUsereInfo() {
this.routeJump({
name: 'userInfo'
})
},
toWebview(type) {
this.routeJump({
name: 'webview',
params: {
type
}
})
},
jumpToWeChatfficialAccount(){
},
logout() {
uni.showModal({
title: '提示',
content: '确定退出登录吗?',
success: async res => {
if (res.confirm) {
await logoutRequest()
removeStorage('token')
removeStorage('openid')
removeStorage('userInfo')
removeStorage('lockList')
this.routeJump({
name: 'login',
type: 'reLaunch'
})
}
}
})
}
}
}
</script>
<style lang="scss">
page {
background-color: $uni-bg-color-grey;
}
page {
background-color: $uni-bg-color-grey;
}
</style>
<style scoped lang="scss">
.background-image {
width: 710rpx;
height: 156rpx;
margin-top: 32rpx;
margin-left: 20rpx;
border-radius: 32rpx;
}
.background-image {
width: 710rpx;
height: 156rpx;
margin-top: 32rpx;
margin-left: 20rpx;
border-radius: 32rpx;
}
.view {
width: 710rpx;
margin-top: 32rpx;
margin-left: 20rpx;
background: #ffffff;
border-radius: 32rpx;
}
.view {
background: #ffffff;
border-radius: 16rpx;
display: flex;
flex-direction: column;
align-items: center;
margin: 20rpx 20rpx;
padding: 20rpx 20rpx;
gap: 20rpx;
}
.view-button {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20rpx 0 40rpx;
font-size: 32rpx;
font-weight: bold;
line-height: 80rpx;
color: #292826;
}
.follow-official-account {
margin: 20rpx 20rpx;
background-image: url('https://cos-lock.skychip.top/mp/follow_official_account_bg.png');
background-size: cover;
background-position: center;
background-repeat: no-repeat;
height: 88rpx;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: space-between;
color: white;
font-weight: 400;
font-size: 28rpx;
padding-left: 20rpx;
padding-right: 20rpx;
.icon-arrow {
width: 40rpx;
height: 40rpx;
}
.follow-btn {
display: flex;
align-items: center;
padding: 12rpx 20rpx;
background-color: white;
border-radius: 16rpx;
color: #4777ee;
}
}
.view-line {
width: 100%;
height: 3rpx;
background: #ebebeb;
}
.account-info {
margin: 20rpx 20rpx;
padding-left: 20rpx;
padding-top: 20rpx;
padding-bottom: 20rpx;
padding-right: 20rpx;
display: flex;
gap: 18rpx;
align-items: center;
border-radius: 16rpx;
background-color: white;
.switch-account {
position: absolute;
bottom: 120rpx;
width: 600rpx;
height: 80rpx;
margin-left: 75rpx;
font-size: 40rpx;
font-weight: bold;
line-height: 80rpx;
color: #ffffff;
text-align: center;
background: #4777ee;
border-radius: 46rpx;
}
.avatar {
width: 120rpx;
height: 120rpx;
}
.delete-account {
position: absolute;
right: 75rpx;
bottom: 60rpx;
font-size: 28rpx;
color: #666;
}
.account-nickname {
display: flex;
flex-direction: column;
gap: 12rpx;
.env {
position: absolute;
bottom: 240rpx;
width: 600rpx;
margin-left: 75rpx;
line-height: 80rpx;
text-align: center;
.nickname {
font-size: 32rpx;
font-weight: 600;
}
.env-text {
font-size: 30rpx;
font-weight: bold;
color: #999999;
}
.account {
font-size: 24rpx;
color: gray;
font-weight: 500;
}
}
}
.env-button {
font-size: 0.8rem;
color: #022b7c;
text-align: right;
text-decoration: underline;
background: inherit;
}
}
.view-button {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
border-radius: 16rpx;
font-size: 28rpx;
.button-login {
width: 650rpx;
height: 120rpx;
margin-left: 50rpx;
font-size: 48rpx;
font-weight: bold;
line-height: 120rpx;
color: #ffffff;
text-align: center;
background: #4777ee;
border-radius: 46rpx;
}
.right-text {
font-size: 28rpx;
color: gray;
}
}
.tips {
padding: 32rpx 0;
margin-top: 25vh;
font-size: 28rpx;
color: #999999;
text-align: center;
}
</style>
.icon-arrow {
width: 40rpx;
height: 40rpx;
}
.view-line {
width: 100%;
height: 3rpx;
background: #ebebeb;
}
.switch-account {
position: absolute;
bottom: 120rpx;
width: 600rpx;
height: 80rpx;
margin-left: 75rpx;
font-size: 40rpx;
font-weight: bold;
line-height: 80rpx;
color: #ffffff;
text-align: center;
background: #4777ee;
border-radius: 46rpx;
}
.delete-account {
position: absolute;
right: 75rpx;
bottom: 60rpx;
font-size: 28rpx;
color: #666;
}
.env {
position: absolute;
bottom: 240rpx;
width: 600rpx;
margin-left: 75rpx;
line-height: 80rpx;
text-align: center;
.env-text {
font-size: 30rpx;
font-weight: bold;
color: #999999;
}
.env-button {
font-size: 0.8rem;
color: #022b7c;
text-align: right;
text-decoration: underline;
background: inherit;
}
}
.button-login {
width: 650rpx;
height: 120rpx;
margin-left: 50rpx;
font-size: 48rpx;
font-weight: bold;
line-height: 120rpx;
color: #ffffff;
text-align: center;
background: #4777ee;
border-radius: 46rpx;
}
.tips {
padding: 32rpx 0;
margin-top: 25vh;
font-size: 28rpx;
color: #999999;
text-align: center;
}
.option-item {
background-color: white;
display: flex;
padding: 20rpx 20rpx;
margin-left: 20rpx;
margin-right: 20rpx;
border-radius: 16rpx;
align-items: center;
justify-content: space-between;
.left-icon {
width: 52rpx;
height: 52rpx;
}
.icon-label {
display: flex;
align-items: center;
gap: 12rpx;
}
}
</style>

View File

@ -71,7 +71,7 @@
</view>
<view
:class="[
canSubmit ? 'bg-[#5eb7ac]' : 'bg-[#9d9da3]',
canSubmit ? 'bg-[#4777ee]' : 'bg-[#9d9da3]',
'mx-4',
'h-100',
'text-white',

View File

@ -570,6 +570,7 @@
authUid: $user.userInfo.uid.toString(),
keyId: $bluetooth.keyId.toString()
})
console.log('resetDeviceCode', resetDeviceCode)
if (resetDeviceCode === 0 || resetDeviceCode === -2) {
const { code, message } = await deleteLockRequest({
lockId: $bluetooth.currentLockInfo.lockId
@ -602,11 +603,12 @@
})
if (code === 0) {
uni.hideLoading()
$lock.updateLockSearch({
await $lock.updateLockSearch({
...$lock.lockSearch,
pageNo: 1
})
$lock.getLockList($lock.lockSearch)
await $lock.getLockList($lock.lockSearch)
await $bluetooth.updateCurrentLockInfo({})
$basic.backAndToast('删除成功', 2)
} else {
uni.hideLoading()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -299,12 +299,14 @@ export const useBluetoothStore = defineStore('ble', {
},
// 监听蓝牙设备连接状态
onBluetoothConnectStatus() {
const that = this
uni.onBLEConnectionStateChange(function (res) {
if (res.deviceId === that.currentLockInfo.deviceId) {
// 使用箭头函数,直接继承外层的 this组件实例
uni.onBLEConnectionStateChange(res => {
// 直接访问 this.currentLockInfo最新值
if (res.deviceId === this.currentLockInfo?.deviceId) {
console.log('设备连接状态改变', res)
that.updateCurrentLockInfo({
...that.currentLockInfo,
// 更新 currentLockInfo确保是响应式更新
this.updateCurrentLockInfo({
...this.currentLockInfo,
connected: res.connected
})
}
@ -1027,7 +1029,7 @@ export const useBluetoothStore = defineStore('ble', {
fail(res) {
if (res.errCode === 10006) {
uni.showToast({
title: '连接失败,请靠近设备并保持设备处于唤醒状态',
title: '连接失败,请靠近设备并保持设备处于唤醒状态1',
icon: 'none'
})
}
@ -1039,7 +1041,7 @@ export const useBluetoothStore = defineStore('ble', {
fail(res) {
if (res.errCode === 10006) {
uni.showToast({
title: '连接失败,请靠近设备并保持设备处于唤醒状态',
title: '连接失败,请靠近设备并保持设备处于唤醒状态2',
icon: 'none'
})
}
@ -1191,6 +1193,7 @@ export const useBluetoothStore = defineStore('ble', {
uuid &&
uuid.slice(2, 8) === '758824' &&
(uuid.slice(30, 32) === '01' ||
uuid.slice(30, 32) === '03' ||
that.bindedDeviceNameList.includes(that.currentLockInfo.name))
) {
uni.stopBluetoothDevicesDiscovery()
@ -1458,20 +1461,17 @@ export const useBluetoothStore = defineStore('ble', {
)
// #ifdef APP-PLUS
setTimeout(
() => {
uni.writeBLECharacteristicValue({
deviceId: that.currentLockInfo.deviceId,
serviceId: that.currentLockInfo.serviceId,
characteristicId: that.currentLockInfo.writeCharacteristicId,
value: writeData.buffer,
fail(res) {
console.log('写入失败', res)
}
})
},
(i + 1) * 250
)
setTimeout(() => {
uni.writeBLECharacteristicValue({
deviceId: that.currentLockInfo.deviceId,
serviceId: that.currentLockInfo.serviceId,
characteristicId: that.currentLockInfo.writeCharacteristicId,
value: writeData.buffer,
fail(res) {
console.log('写入失败', res)
}
})
}, (i + 1) * 250)
// #endif
// #ifdef MP
@ -2320,6 +2320,7 @@ export const useBluetoothStore = defineStore('ble', {
this.currentLockInfo.transportType !== transportType.TRANSPORT_TENCENT_YUN
) {
const searchResult = await this.searchAndConnectDevice()
console.log('searchResult', searchResult)
if (searchResult.code === 0) {
log.info({
code: searchResult.code,