From abbbec9cdba4019282b5039568dac599a306164a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Sun, 6 Apr 2025 18:17:50 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E7=9B=B8=E5=85=B3UI+=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/p2p.js | 2 +- manifest.json | 9 --- pages.json | 21 ++++++- pages/main/lockDetail.vue | 10 ++++ pages/p2p/p2pPlayer.vue | 51 ++++++++++------ pages/p2p/utils.js | 29 ---------- pages/p2p/xp2pManager.js | 118 -------------------------------------- stores/basic.js | 5 ++ utils/request.js | 4 +- 9 files changed, 72 insertions(+), 177 deletions(-) delete mode 100644 pages/p2p/utils.js delete mode 100644 pages/p2p/xp2pManager.js diff --git a/api/p2p.js b/api/p2p.js index 7f6d4a4..fb0d2a0 100644 --- a/api/p2p.js +++ b/api/p2p.js @@ -5,7 +5,7 @@ import request from '../utils/request' // 获取p2pInfo export function getP2pInfo(data) { return request({ - url: '/v1/tencentYun/getDeviceDetail', + url: '/passthrough', method: 'POST', data }) diff --git a/manifest.json b/manifest.json index 715ce32..ae4600e 100644 --- a/manifest.json +++ b/manifest.json @@ -29,15 +29,6 @@ "version": "latest", "provider": "wx1319af22356934bf", "export": "exportForXp2pPlugin.js" - }, - "wechat-p2p-player": { - "version": "latest", - "provider": "wx9e8fbc98ceac2628", - "export": "exportForPlayerPlugin.js" - }, - "wmpf-voip": { - "version": "latest", - "provider": "wxf830863afde621eb" } } }, diff --git a/pages.json b/pages.json index b85c5ba..be1321e 100644 --- a/pages.json +++ b/pages.json @@ -16,6 +16,7 @@ "style": { "navigationStyle": "custom", "navigationBarTitleText": "监控", + "disableScroll": true, "mp-weixin": { "usingComponents": { "iot-p2p-player-with-mjpg": "plugin://xp2p/iot-p2p-player-with-mjpg", @@ -23,8 +24,26 @@ } } } + }, + { + "path": "authorizeWechat", + "style": { + "navigationBarTitleText": "微信授权", + "disableScroll": true + } } - ] + ], + "plugins": { + "wechat-p2p-player": { + "version": "latest", + "provider": "wx9e8fbc98ceac2628", + "export": "exportForPlayerPlugin.js" + }, + "wmpf-voip": { + "version": "latest", + "provider": "wxf830863afde621eb" + } + } }, { "root": "pages/addDevice", diff --git a/pages/main/lockDetail.vue b/pages/main/lockDetail.vue index b4de880..018f1be 100644 --- a/pages/main/lockDetail.vue +++ b/pages/main/lockDetail.vue @@ -221,6 +221,16 @@ > 消息提醒 + + + 微信呼叫 + diff --git a/pages/p2p/p2pPlayer.vue b/pages/p2p/p2pPlayer.vue index 6afe085..16e9963 100644 --- a/pages/p2p/p2pPlayer.vue +++ b/pages/p2p/p2pPlayer.vue @@ -1,20 +1,31 @@ diff --git a/pages/p2p/utils.js b/pages/p2p/utils.js deleted file mode 100644 index 6d7d0c3..0000000 --- a/pages/p2p/utils.js +++ /dev/null @@ -1,29 +0,0 @@ -export const getUserId = () => { - return 1 -} - -export function compareVersion(ver1, ver2) { - const v1 = ver1.split('.') - const v2 = ver2.split('.') - const len = Math.max(v1.length, v2.length) - - while (v1.length < len) { - v1.push('0') - } - while (v2.length < len) { - v2.push('0') - } - - for (let i = 0; i < len; i++) { - const num1 = parseInt(v1[i]) - const num2 = parseInt(v2[i]) - - if (num1 > num2) { - return 1 - } else if (num1 < num2) { - return -1 - } - } - - return 0 -} diff --git a/pages/p2p/xp2pManager.js b/pages/p2p/xp2pManager.js deleted file mode 100644 index 6eefc30..0000000 --- a/pages/p2p/xp2pManager.js +++ /dev/null @@ -1,118 +0,0 @@ -import { getUserId, compareVersion } from './utils' - -let xp2pManager = null -export const getXp2pManager = () => { - if (!xp2pManager) { - let xp2pPlugin = requirePlugin('xp2p') - - console.log(11111, xp2pPlugin) - - const iotExports = xp2pPlugin.iot - const app = getApp() - - // 用户id,微信用户在此小程序中的唯一标识 - iotExports?.setUserId?.(getUserId() || 'demo') - - // 开发版才打插件log - if (app.pluginLogger && uni.getAccountInfoSync().miniProgram.envVersion === 'develop') { - iotExports?.setPluginLogger?.(app.pluginLogger) - } - - // 设置优先使用的打洞协议 - if ( - compareVersion(uni.getSystemInfoSync().SDKVersion, '3.4.1') >= 0 && - xp2pPlugin.p2p.setTcpFirst - ) { - const tcpFirstKey = 'tcpFirst' - const tcpFirstTime = parseInt(uni.getStorageSync(tcpFirstKey), 10) - const tcpFirst = !!(tcpFirstTime && Date.now() - tcpFirstTime < 3600000 * 24) // 24小时内有效 - console.log('tcpFirst', tcpFirst) - xp2pPlugin.p2p.setTcpFirst(tcpFirst) - - // 给index页用,方便测试时调整tcpFirst - app.tcpFirst = tcpFirst - app.toggleTcpFirst = async () => { - const modalRes = await uni.showModal({ - title: '确定切换 tcpFirst 吗?', - content: '切换后需要重新进入小程序' - }) - if (!modalRes || !modalRes.confirm) { - return - } - uni.setStorageSync(tcpFirstKey, tcpFirst ? '' : Date.now()) - app.restart() - } - } - - // 设置是否连接对端stun - if (xp2pPlugin.p2p.setCrossStunTurn) { - const crossStunTurnKey = 'crossStunTurn' - const crossStunTurnTime = parseInt(uni.getStorageSync(crossStunTurnKey), 10) - const crossStunTurn = !!(crossStunTurnTime && Date.now() - crossStunTurnTime < 3600000 * 24) // 24小时内有效 - xp2pPlugin.p2p.setCrossStunTurn(crossStunTurn) - // 给index页用,方便测试时调整crossStunTurn - app.crossStunTurn = crossStunTurn - app.toggleCrossStunTurn = async () => { - const modalRes = await uni.showModal({ - title: '确定切换 crossStunTurn 吗?', - content: '切换后需要重新进入小程序' - }) - if (!modalRes || !modalRes.confirm) { - return - } - uni.setStorageSync(crossStunTurnKey, crossStunTurn ? '' : Date.now()) - app.restart() - } - } - - // 设置切换端口 - if (xp2pPlugin.p2p.updateStunPort) { - const portKey = 'STUN_PORT' - const stunPort = uni.getStorageSync(portKey) || 20002 - xp2pPlugin.p2p.updateStunPort(stunPort) - app.stunPort = stunPort - app.togglePort = async port => { - const modalRes = await uni.showModal({ - title: '确定切换 stunPort 吗?', - content: '切换后需要重新进入小程序' - }) - if (!modalRes || !modalRes.confirm) { - return - } - uni.setStorageSync(portKey, port) - app.restart() - } - } - - // 设置切换配置跟随 - if (xp2pPlugin.p2p.setUseDeliveryConfig) { - const useDeliveryConfigKey = 'useDeliveryConfig' - const useDeliveryConfigTime = parseInt(uni.getStorageSync(useDeliveryConfigKey), 10) - const useDeliveryConfig = !!( - useDeliveryConfigTime && Date.now() - useDeliveryConfigTime < 3600000 * 24 - ) // 24小时内有效 - xp2pPlugin.p2p.setUseDeliveryConfig(useDeliveryConfig) - app.useDeliveryConfig = useDeliveryConfig - app.toggleUseDeliveryConfig = async () => { - const modalRes = await uni.showModal({ - title: '确定切换 使用设备跟随 吗?', - content: '切换后需要重新进入小程序' - }) - if (!modalRes || !modalRes.confirm) { - return - } - uni.setStorageSync(useDeliveryConfigKey, useDeliveryConfig ? '' : Date.now()) - app.restart() - } - } - - xp2pManager = iotExports.getXp2pManager() - app.logger?.log('xp2pManager', { - P2PPlayerVersion: xp2pManager.P2PPlayerVersion, - XP2PVersion: xp2pManager.XP2PVersion, - // uuid,插件随机生成的id,存储在小程序本地,删除小程序后会重新生成 - uuid: xp2pManager.uuid - }) - } - return xp2pManager -} diff --git a/stores/basic.js b/stores/basic.js index f62d83e..f74cac8 100644 --- a/stores/basic.js +++ b/stores/basic.js @@ -391,6 +391,11 @@ const pages = [ name: 'p2pPlayer', path: '/pages/p2p/p2pPlayer', tabBar: false + }, + { + name: 'authorizeWechat', + path: '/pages/p2p/authorizeWechat', + tabBar: false } ] diff --git a/utils/request.js b/utils/request.js index a1a0a1d..dabfeba 100644 --- a/utils/request.js +++ b/utils/request.js @@ -29,13 +29,13 @@ const request = config => { const timestamp = new Date().getTime() timer = setTimeout(() => { resolve({ code: -1, message: '网络访问失败,请检查网络是否正常' }) - }, 7200) + }, 30200) uni.request({ url: URL, method, header, data, - timeout: 7000, + timeout: 30000, async success(res) { const { statusCode, data } = res if (timer) { From b04550828d7cf1e15d65a358bb3f9f4964e14302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Sun, 6 Apr 2025 18:18:01 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E7=9B=B8=E5=85=B3UI+=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/p2p/authorizeWechat.vue | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 pages/p2p/authorizeWechat.vue diff --git a/pages/p2p/authorizeWechat.vue b/pages/p2p/authorizeWechat.vue new file mode 100644 index 0000000..6d4243c --- /dev/null +++ b/pages/p2p/authorizeWechat.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file From 920e5f3c3310e0202f8c8298035941709d8ffbbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Sun, 6 Apr 2025 18:47:39 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20=E7=9B=91=E6=8E=A7=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=B8=85=E6=99=B0=E5=BA=A6=E5=88=87=E6=8D=A2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/feature/recordList.vue | 34 +++++++++++++++++----------------- pages/p2p/p2pPlayer.vue | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/pages/feature/recordList.vue b/pages/feature/recordList.vue index 4ffef70..5bc9a95 100644 --- a/pages/feature/recordList.vue +++ b/pages/feature/recordList.vue @@ -384,36 +384,36 @@ diff --git a/pages/main/lockDetail.vue b/pages/main/lockDetail.vue index 018f1be..b2a3cee 100644 --- a/pages/main/lockDetail.vue +++ b/pages/main/lockDetail.vue @@ -223,7 +223,7 @@ - 授权微信 + 授权后,设备可呼叫该微信 + + + 授权 + + + 您已授权 + + 您已拒绝授权,请去设置中 + 打开语音、视频通话提醒开关 + + 打开设置 + + + + \ No newline at end of file + + const openSetting = () => { + uni.openSetting({ + success: res => { + console.log(res) + } + }) + } + + const getInfo = async () => { + const result = await passthrough({ + request_method: 'GET', + request_uri: '/api/v1/tencentYun/getWechatDeviceTicket', + post_args: { + lockId: $bluetooth.currentLockInfo.lockId + } + }) + return result + } + + const handleAuthorize = async () => { + if (pending.value) return + pending.value = true + uni.showLoading({ + title: '授权中...' + }) + const result = await getInfo() + if (result.code === 0) { + wx.requestDeviceVoIP({ + sn: result.data.WXIoTDeviceInfo.SN, + snTicket: result.data.WXIoTDeviceInfo.SNTicket, + modelId: result.data.WXIoTDeviceInfo.ModelId, + deviceName: '智能', + success() { + isAuthorized.value = true + uni.hideLoading() + pending.value = false + uni.showToast({ + title: '授权成功', + icon: 'none' + }) + }, + fail() { + isAuthorized.value = true + reject.value = true + uni.hideLoading() + pending.value = false + uni.showToast({ + title: '授权失败', + icon: 'none' + }) + } + }) + } else { + uni.hideLoading() + pending.value = false + uni.showToast({ + title: result.message, + icon: 'none' + }) + } + } + diff --git a/pages/p2p/p2pPlayer.vue b/pages/p2p/p2pPlayer.vue index 323f519..3057b2b 100644 --- a/pages/p2p/p2pPlayer.vue +++ b/pages/p2p/p2pPlayer.vue @@ -123,7 +123,7 @@ import { useBasicStore } from '@/stores/basic' import { onMounted, ref } from 'vue' import { onUnload } from '@dcloudio/uni-app' - import { getP2pInfo } from '@/api/p2p' + import { passthrough } from '@/api/sdk' const $bluetooth = useBluetoothStore() const $basic = useBasicStore() @@ -148,7 +148,7 @@ onMounted(async () => { buttonInfo.value = await $basic.getButtonInfo() - const { code, data, message } = await getP2pInfo({ + const { code, data, message } = await passthrough({ request_method: 'GET', request_uri: '/api/v1/tencentYun/getDeviceDetailData', post_args: { From ed76f58db04d612fd61c598cb86e29cb4154f56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Tue, 8 Apr 2025 15:33:12 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90wifi=E9=94=81?= =?UTF-8?q?=E9=85=8D=E7=BD=91=E4=B8=8E=E7=BB=91=E5=AE=9A=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.cjs | 17 +- config/env.js | 12 +- pages/addDevice/addLockGuid.vue | 4 +- pages/addDevice/bindLock.vue | 3 + pages/addDevice/distributionNetwork.vue | 424 ++++++++++-------------- pages/addDevice/searchDevice.vue | 2 +- pages/main/customBox.vue | 12 +- pages/p2p/authorizeWechat.vue | 9 +- pages/p2p/p2pPlayer.vue | 4 +- pages/setting/catEye.vue | 2 +- stores/bluetooth.js | 159 ++++++++- 11 files changed, 372 insertions(+), 276 deletions(-) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 2e0c9c9..3128e38 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -8,7 +8,8 @@ module.exports = { globals: { uni: 'writable', getApp: 'writable', - wx: 'writable' + wx: 'writable', + getCurrentPages: 'writable' }, // 指定如何解析语法 parser: 'vue-eslint-parser', @@ -41,17 +42,15 @@ module.exports = { 'no-var': 'error', // 要求使用 let 或 const 而不是 var 'no-multiple-empty-lines': ['error', { max: 1 }], // 不允许多个空行 'prefer-const': 'off', // 使用 let 关键字声明但在初始分配后从未重新分配的变量,要求使用 const - 'no-use-before-define': 'error', // 禁止在 函数/类/变量 定义之前使用它们 + 'no-use-before-define': 'off', // 禁止在 函数/类/变量 定义之前使用它们 'no-irregular-whitespace': 'off', // 禁止不规则的空白 'no-undef': 'error', // 禁止使用未声明的变量 - 'vue/script-setup-uses-vars': 'off', // 关闭此规则,因为它可能会干扰no-undef的检测 + 'no-unused-vars': 'error', // 禁止出现未使用过的变量 + 'vue/script-setup-uses-vars': 'error', // 确保script setup中的变量必须正确定义 'vue/no-undef-components': 'off', // 关闭组件未定义的检查 - 'vue/no-undef-properties': [ - 'error', - { - ignore: ['getDeviceInfo', 'getBluetoothDevices', 'stopGetBluetoothDevices'] - } - ], // 忽略特定方法的未定义检查 + 'vue/no-undef-properties': 'off', // 关闭属性未定义的检查 + 'vue/no-unused-vars': 'error', // 禁止Vue组件中出现未使用的变量 + 'import/no-unused-modules': 'off', // 关闭模块导出检查 'import/no-cycle': 0, 'no-nested-ternary': 0, 'import/prefer-default-export': 0, diff --git a/config/env.js b/config/env.js index d64d6c6..75636f8 100644 --- a/config/env.js +++ b/config/env.js @@ -9,14 +9,17 @@ uni.getSystemInfo({ const DEV = { name: 'dev', - baseUrl: 'https://dev.lock.star-lock.cn/api', - webviewBaseUrl: 'https://dev.lock.star-lock.cn', + appName: '星星锁Lite', + baseUrl: 'https://lock.dev.star-lock.cn/api', + webviewBaseUrl: 'https://lock.dev.star-lock.cn', version, buildNumber } + const PRE = { name: 'pre', - baseUrl: 'https://pre.lock.star-lock.cn/api', + appName: '星星锁Lite', + baseUrl: 'https://lock.pre.star-lock.cn/api', webviewBaseUrl: 'https://lock.xhjcn.ltd', version, buildNumber @@ -24,6 +27,7 @@ const PRE = { const XHJ = { name: 'xhj', + appName: '星星锁Lite', baseUrl: 'https://lock.xhjcn.ltd/api', webviewBaseUrl: 'https://lock.xhjcn.ltd', version, @@ -32,6 +36,7 @@ const XHJ = { const SKY = { name: 'sky', + appName: '星星锁Lite', baseUrl: 'https://lock.skychip.top/api', webviewBaseUrl: 'https://lock.skychip.top', version, @@ -40,6 +45,7 @@ const SKY = { const GE = { name: 'ge', + appName: '星星锁Lite', baseUrl: 'http://lock.ge.star-lock.cn/api', webviewBaseUrl: 'http://lock.ge.star-lock.cn', version, diff --git a/pages/addDevice/addLockGuid.vue b/pages/addDevice/addLockGuid.vue index 1f0c932..b3accef 100644 --- a/pages/addDevice/addLockGuid.vue +++ b/pages/addDevice/addLockGuid.vue @@ -12,10 +12,10 @@ - - diff --git a/pages/addDevice/searchDevice.vue b/pages/addDevice/searchDevice.vue index c1a7c66..abdb58f 100644 --- a/pages/addDevice/searchDevice.vue +++ b/pages/addDevice/searchDevice.vue @@ -139,7 +139,7 @@ } this.routeJump({ type: 'redirectTo', - name: 'selectAddress' + name: false ? 'selectAddress' : 'distributionNetwork' }) } else { uni.hideLoading() diff --git a/pages/main/customBox.vue b/pages/main/customBox.vue index 0893cda..2249512 100644 --- a/pages/main/customBox.vue +++ b/pages/main/customBox.vue @@ -13,12 +13,12 @@