From e3a54bd1e655ac9cc95751baed8d73135b307744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Sat, 24 Aug 2024 14:25:05 +0800 Subject: [PATCH 01/27] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=85=A8=E9=83=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/check.js | 12 ++ api/geocode.js | 12 ++ api/lock.js | 9 + manifest.json | 64 +------ pages.json | 22 ++- pages/bindLock/bindLock.vue | 186 +++++++++++++++++++ pages/home/home.vue | 25 ++- pages/index/index.vue | 6 +- pages/searchDevice/searchDevice.vue | 150 ++++++++++++++- pages/selectAddress/selectAddress.vue | 256 ++++++++++++++++++++++++++ static/images/icon_add.png | Bin 4447 -> 880 bytes static/images/icon_add_round.png | Bin 0 -> 4447 bytes static/images/icon_address.png | Bin 0 -> 1813 bytes static/images/icon_door_lock.png | Bin 0 -> 3495 bytes stores/basic.js | 27 +++ stores/bluetooth.js | 78 +++++--- stores/user.js | 2 +- utils/request.js | 1 + 18 files changed, 755 insertions(+), 95 deletions(-) create mode 100644 api/check.js create mode 100644 api/geocode.js create mode 100644 pages/bindLock/bindLock.vue create mode 100644 pages/selectAddress/selectAddress.vue create mode 100644 static/images/icon_add_round.png create mode 100644 static/images/icon_address.png create mode 100755 static/images/icon_door_lock.png diff --git a/api/check.js b/api/check.js new file mode 100644 index 0000000..215667c --- /dev/null +++ b/api/check.js @@ -0,0 +1,12 @@ +import request from '../utils/request' + +// check 检查模块 + +// 获取服务器时间 +export function getServerDatetime(data) { + return request({ + url: '/check/getServerDatetime', + method: 'POST', + data + }) +} diff --git a/api/geocode.js b/api/geocode.js new file mode 100644 index 0000000..dd85388 --- /dev/null +++ b/api/geocode.js @@ -0,0 +1,12 @@ +import request from '../utils/request' + +// geocode 地理编码模块 + +// 获取地址信息 +export function getGeocodeAddress(data) { + return request({ + url: '/geocode/getAddress', + method: 'POST', + data + }) +} diff --git a/api/lock.js b/api/lock.js index d1f39b7..9931b27 100644 --- a/api/lock.js +++ b/api/lock.js @@ -10,3 +10,12 @@ export function getLockListRequest(data) { data }) } + +// 绑定锁管理员 +export function bindLockAdmin(data) { + return request({ + url: '/v2/lock/bindAdmin', + method: 'POST', + data + }) +} diff --git a/manifest.json b/manifest.json index 5330fd3..35562d9 100644 --- a/manifest.json +++ b/manifest.json @@ -5,49 +5,6 @@ "versionName" : "1.0.0", "versionCode" : "100", "transformPx" : false, - /* 5+App特有相关 */ - "app-plus" : { - "usingComponents" : true, - "nvueStyleCompiler" : "uni-app", - "compilerVersion" : 3, - "splashscreen" : { - "alwaysShowBeforeRender" : true, - "waiting" : true, - "autoclose" : true, - "delay" : 0 - }, - /* 模块配置 */ - "modules" : {}, - /* 应用发布信息 */ - "distribute" : { - /* android打包配置 */ - "android" : { - "permissions" : [ - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "", - "" - ] - }, - /* ios打包配置 */ - "ios" : {}, - /* SDK配置 */ - "sdkConfigs" : {} - } - }, - /* 快应用特有相关 */ - "quickapp" : {}, /* 小程序特有相关 */ "mp-weixin" : { "appid" : "wx9829a39e65550757", @@ -55,20 +12,17 @@ "urlCheck" : true, "minified" : true }, + "permission": { + "scope.bluetooth": { + "desc": "蓝牙将用于控制和管理您的智能门锁" + }, + "scope.userLocation": { + "desc": "获取您的位置信息将用于智能门锁的位置服务" + } + }, + "requiredPrivateInfos": ["getLocation"], "usingComponents" : true, "lazyCodeLoading" : "requiredComponents" }, - "mp-alipay" : { - "usingComponents" : true - }, - "mp-baidu" : { - "usingComponents" : true - }, - "mp-toutiao" : { - "usingComponents" : true - }, - "uniStatistics" : { - "enable" : false - }, "vueVersion" : "3" } diff --git a/pages.json b/pages.json index 9c0ec72..cba01fd 100644 --- a/pages.json +++ b/pages.json @@ -17,6 +17,16 @@ "navigationStyle": "default" } }, + { + "path": "pages/selectAddress/selectAddress", + "style": { + "navigationBarTitleText": "锁地址", + "navigationBarTextStyle": "white", + "navigationBarBackgroundColor": "#63b8af", + "navigationStyle": "default", + "disableScroll": true + } + }, { "path": "pages/mine/mine", "style": { @@ -110,10 +120,20 @@ "navigationStyle": "default" } }, + { + "path": "pages/bindLock/bindLock", + "style": { + "navigationBarTitleText": "添加锁", + "navigationBarTextStyle": "white", + "navigationBarBackgroundColor": "#63b8af", + "navigationStyle": "default" + } + }, { "path": "pages/searchDevice/searchDevice", "style": { - "navigationBarTitleText": "搜索", + "disableScroll": true, + "navigationBarTitleText": "附近设备", "navigationBarTextStyle": "white", "navigationBarBackgroundColor": "#63b8af", "navigationStyle": "default" diff --git a/pages/bindLock/bindLock.vue b/pages/bindLock/bindLock.vue new file mode 100644 index 0000000..d88b2d3 --- /dev/null +++ b/pages/bindLock/bindLock.vue @@ -0,0 +1,186 @@ + + + + + + + diff --git a/pages/home/home.vue b/pages/home/home.vue index d96a461..57f6010 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -2,8 +2,8 @@ - - + 填加锁时,手机必须在锁旁边 @@ -32,9 +33,9 @@ {{getRole(lock.userType)}} - {{lock.lockName}} + {{lock.lockAlias}} - {{ getTimeLimit(lock.keyType) }} + {{ getTimeLimit(lock.keyType) }} {{ timeFormat(lock.startDate, 'yyyy-mm-dd h:M') }} {{ timeFormat(lock.endDate, 'yyyy-mm-dd h:M ') + getTimeLimit(lock.keyType) }} @@ -45,7 +46,7 @@ - @@ -63,6 +64,7 @@ import { useBluetoothStore } from '@/stores/bluetooth' import { useBasicStore } from '@/stores/basic' import { mapState, mapActions } from 'pinia' + import { getServerDatetime } from '@/api/check' export default { data() { @@ -74,7 +76,8 @@ }, refresherTriggered: false, focus: false, - penging: true + penging: true, + deviceInfo: null } }, computed: { @@ -86,6 +89,8 @@ uni.showLoading({ title: '加载中' }) + this.deviceInfo = await this.getDeviceInfo() + console.log(this.deviceInfo) const token = uni.getStorageSync('token') if(token) { this.updateLoginStatus(true) @@ -102,7 +107,7 @@ ...mapActions(useUserStore, ['updateUserInfo', 'updateLoginStatus', 'login']), ...mapActions(useLockStore, ['getLockList', 'getRole', 'getTimeLimit']), ...mapActions(useBluetoothStore, ['getBluetoothStatus', 'initAndListenBluetooth', 'updateCurrentLockInfo', 'checkSetting']), - ...mapActions(useBasicStore, ['routeJump']), + ...mapActions(useBasicStore, ['routeJump', 'getDeviceInfo']), async nextPage() { if(this.lockList.length < this.lockTotal) { this.search.pageNo++ @@ -116,6 +121,10 @@ this.refresherTriggered = true this.search.pageNo = 1 await this.getLockList(this.search) + uni.showToast({ + title: '刷新成功', + icon: 'none' + }) this.refresherTriggered = false }, async changeSearch(data) { diff --git a/pages/index/index.vue b/pages/index/index.vue index c4ed272..dc0afa9 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -164,12 +164,12 @@ console.log('添加用户返回', addUserCode) }, getLockStatusResult() { - const timnestamp = parseInt(new Date().getTime() / 1000) + const timestamp = parseInt(new Date().getTime() / 1000) this.getLockStatus({ name: this.currentLockInfo.name, uid: this.authUid, - nowTime: timnestamp, - localTime: timnestamp + nowTime: timestamp, + localTime: timestamp }) } } diff --git a/pages/searchDevice/searchDevice.vue b/pages/searchDevice/searchDevice.vue index 608c2be..2cc7af6 100644 --- a/pages/searchDevice/searchDevice.vue +++ b/pages/searchDevice/searchDevice.vue @@ -1,17 +1,161 @@ + + diff --git a/pages/selectAddress/selectAddress.vue b/pages/selectAddress/selectAddress.vue new file mode 100644 index 0000000..516ade8 --- /dev/null +++ b/pages/selectAddress/selectAddress.vue @@ -0,0 +1,256 @@ + + + + + + + diff --git a/static/images/icon_add.png b/static/images/icon_add.png index d0f9a4d9e417a0708aa4e6b772c4222262585c56..937c30ba4f057d8692209e55f28367f53a7e7b92 100644 GIT binary patch literal 880 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>VAk?D?cuA*yqlX-&l%iFejs;7a#M@!!xTx^&VVZui_;jFJss221bbmJD864uV*%JC}i!Dk7rM4c*G@QzmM+#!%J(m_@=D{P zFu!2fZ79Ifbl`FxKnQ(U*WfzA^}>NG=GIaiER704V;uxIm>eHy^50BU8jikPi5r(G!utoi|Q1YpWT1^>U;e?|5i;mIuL5Kv_g=1iH7rj z6^RA&ziBENJ9HU+@or-Ll{sI@2wCF44D%baJWZ9^svi%FJI+>>OWuD%P9gbYxn(3P z``RW+h1ErWJALxfG;$C?IJz56QfI~m~t)KJa}3dBhQQ4UflL9yH>L0Ezzd9PCgIJm%}1B#Np zOkoGZ4(^>{W4BK8fJg$D0qYDVAI4=2!3{v}hn4JqbQI*y9afqJ5^Q)BeBf-^E(_K@ zl};WJ!D1`6Gc5(`J$g=JKBG~Xs)0Hihlq8u2HS~QS`cL>dntnwx)}SC?UHPb$dZtTh-;f;OInank;pA^%W_F6 z+i@wywG^SO-6*seN=>%;PT$w}Z}|RnKIi> zP5?msBLq-E{^xLbS-`KqQ%;s9pt479766KjwVCn3Xs^$Oc1On^h^J2HzPhGlT16YP zd>OA8%&ETig!%f!ludbDJlhHb(Bjvrrl+e=FO&hYv*kA@FaT0&KI!u&x0Z#0L;;8p zW_TY(Fg*SFu~{k(CP`GfCX5p8Q?(Ho18^Yhsx*XnA6<0UN2!1dP}>UtrfdFG--=)$ z4j{@F0J?fLE>9drfgyl5DB!@>*6@H3--a&F{W|}lqgJVq_ai*UZN2{fr?mdX-c&YQ zZ++yUgTu-7SUR`VQyk99S~Sfv+LrW_SuCsZd73J%fhKFdv1n5O7DSL(gFtLAql(!X ze5U$*8{h0muuyT6JdEP55Ie@LIpktf(VV%C$d5#vP?1g=?3ZQe+-lKo#pWK9c7xFWaZ$1_vhdzD03YjYO zQKdwLS%57IiX2&J<7rDYg(!?P1u43cT$9P11{!h#-wtxQ6mBlAr*o{Rcv}ckjA_Fy zSQ+TXlENi1e7_roJKeLfLdk?xL_sD+ERgm156}BxN`1E^%z}!HcnRw<(KMChB46Lu z1=>;p*4S4@F%yobVpb7S3`79J(p=H-{o9>x%=n;F@<9 zQ|}sp31{~BDqev7>dxV4J#_96lQ3YJO&r-UTlHn=vO z*a$N^*}b2CuH92=_3_3oa7^b#}rWynN3cwblj0R_byc? z$O@uz+qgqkXUJ->sW2#rS9s$2tnS{tqlokc2JBPp{8KB+QOvOO!zm!1o-)!&)&4K)F9IfBb3ARaK{G$w7U01!4j)X}~*anJTF z6F&XzJ87_*8MP6xMz8cOY5v@lNbX3!DZuxXU88_8k$*(M{`J>P`4#Q!^J)18Ou>sszuQx7ywI;8%97#}Fcd%Je5^)q zB<)ZCg$XQT6S%Q^Oz!U7OJNQFrFYNwi?aC0dc54-_p>dYXWf3h?c_rnfZSgNrWGBw zuddiVgToh;>IUsV^zs3FT-#_+)-or$HOUqXpSkudLo4h1I1(E^TOU59Z^1bEJdw0AXaK2@}jYb*d zZHkB7jzK7%lIs_b;eIJidx!Rj(l>#OOGkCL!C10T`KCN~{2ItwKQKEup9W@p=k!XZ zl#i9i2mFeW1FxJ$af7E%wXfzv$}q9l$v3J@ZW~mFsC%Eft3}v==EbmdU9S|-{|SBs5w6qD>>THyyOUGYh(u(-r)+Tm;Ovtx@%%Y_0m zc&l5B11!pG9pQoEPa}tdk5M@XVFyDua3o*dq=(+vEaGw;r?X@WiWbrfPVDd!}SS)>ttoCpvXpa^^sHG=Y zAK1((hQNXW0E!z;ywbMW zn&ONHl{G|UEsiLH>mcH-$DZ;5V+>G6zZ81d!|gHvp6scOHbEF<=D7@%A(Fo=lMcSM zjr#^51Zlec6cwaD-$`$}0$4)D_;u6{!%_9&*L~qKW&RT0`jA_qSKjpW$elY<`}Jkq z&k>I`md+P-^tUaV>svfc;L9;sL-rZcY%sV(``>T3cOZ->{<|e!!j(7O$xNJ3-{;~P zmm@iupt_c#r>5n`z_pAG+W;GsH?g0T{Gn7?- z@SfpiKYp>Kj?`VR@)&Nry2PL44>c7?^@$R&qdeV5H(&#(=D%Ku6Bmh>)YdF(M;wa3-M`;2S8r_S9cv7i=ZbWzUNXlNf+f@`^|u;Z+B zUAHHwEIj}HGa4ex{`&<YyP5^qrnWyFbJ59v8vMUbu_x8 z@HMHmNef@9>nc(Jy31QI{BN01y~@z%0K*j%Qh_4PCQuosBB6PqC^5`$;J#l+8ugK4 znSc675fpqAMJL^4<;lr+7%umlbw$o%LyyWhi2-g!{QPlQABE?8bNwvTTDHK|H(=Ya z*Cr;mIfhO`#-M~A-JenV!{wJ~sEL_WAZ#U>KO8PptVg;!U0Ih^Kp(?!`oS{Um!6#t)LNAjOa;03BLg!)1Q?69x%lmf9T*m(2Q-95BgGT~AL9?=6#yAbc}v1rfqZ%- zza4yVdQB=OXF1LcS&0K_`$YFKxnrb2L+E=pOHt0Io&6k~*hi3eMdWnQ-i!u1hV?0|mfQ5ILn#-tP#v zZ+BXmJ(&%$cGC0u?+sGHg6<`^921~QQXF{m-57){ENx+SzT34jaDeYzBTBW%a!xk~ zOiOz{ydS+>kOQs@x;2=raes;KMNFXAx?W|sB8e(`cG?hSs2eH{TIn_JyK)V1LJ5PJ zwFHgGZ8pFtBXn@~&UDquq8rT~ZoX>Zut<%!EuAkzu**?OjjeQmz5#UNlHB+=R$I@K ziL@dw2X?I;5pO&yJTuR@EAW3q>ht>igR23+50dO$TA_mFt1%Y>x30dIA@m`4Jnio2 z4H7ido7kR2LvVG5NmHmi!jN*veDPb-gc6@2hb5(jud9Capyz-rff;?v&w+lR?(EV@ zjp=)X;a}~DG3s|XsQg8+#v==nBQe~ejH#t>Q9Gg2z>pXH-V>@DFYfdD&vA6>An?*n z8S0;4g6O|c1CyJcCpHsGRDnJLQ>%6ldiVV9P$l5b5VhM8f8I#>dH)fClP{<@9N0g| z-i2A}j47!dgaUc3EW;v=0e1GLE zf(cWrH=gYA@P4(6RJ^ge__Ag#t?%pXgaOIhlwQzqv`QInN;XOXA=_Cmk-WbdR1(~z zvz{>=u?sqFS|6R=%KZEH4T-1&k1hjl{M|LS=YV_X{f&tH@Tc>sj9UXneuCAqPXumy?e1(mgqo4pS+T&9 zLxFa>`i*Ww&Hh@+{3ziHSIhUc8C>g^Obm=4vLlT8CaZ=vgZWC(lJ?HEy~`F0z8 zJjtjKaExEXHh0X&Dqw$f@FaDP+u&o-X2lQBYx5WL8UglWGN4eo{54mT+b=={>2@Ul zZt7#$pe6T%+3lg#pNjegoFtEE3$f?OlaAt?KNd8Ps*UZa5#nKRbuKB+lFH;x>F5S` zvom5IJLAEjZL^Foc&Fc*YO9g0AnUX~F;U;O(e6=5{OgzN6KrSAD?jHewknf!cVCoE zem$mjYppz#o4Z~27C&*8hz%1zEr60`R@-vH2eWWnx5+nq9;FlL{cg zbHq%mQJf&_fgZQ^6>Y{y3~oE|o#`9OB~R9~Y?6+{_5L^823M{yuGxS?087jpmTs6Q ztMT-b`-KT*cvMbqe_pWbKD*9LAcs+9%PwA~jX2~kDu81s6*d)&d{Gi$`;&t2tW3l< zKKWPmVrjyhy!G{PiOGDaliN8RHR_pvM(cl!PA2Zx8Ft{CE-`c*p+niFw^pvCZzt8i zB~at+ndTG94r{VpDu{}cqgd^Pkpw6bWk6QJ8&Zm~vh{9sRYV-aMXIqRo9eiN4P3a9 z!f)0M*galsjN70Fw$LvD!7WfMQVji;QcP)l@C8YbO{i+300E2wD`8z{Xq+zAj-XVq zvGw54S+O?#MiGxHV_t8SsE5Xcp@G;}-t28a2(koeIv*zO^ z6T(nm$Nl5&rsec(YGdf=#qX|>`Devn%0Q?|`(EuH#OK83HJ53F;n#H%Up%Wyt`iov zjX2?@A0m6+peA)+V)L6;3e(Wl94v;N?*GqDI^)E+Klx6Y|E3F3MkDSkKU-S#qEw!B zgi9md>W1!O=s_9|4z`;6V$!1g`~Uwll*oo&{j3ezrarin|6&5H&F#%9O}vx-2O!&G Af&c&j diff --git a/static/images/icon_add_round.png b/static/images/icon_add_round.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f9a4d9e417a0708aa4e6b772c4222262585c56 GIT binary patch literal 4447 zcmcgw`9D;9`2UQS`cL>dntnwx)}SC?UHPb$dZtTh-;f;OInank;pA^%W_F6 z+i@wywG^SO-6*seN=>%;PT$w}Z}|RnKIi> zP5?msBLq-E{^xLbS-`KqQ%;s9pt479766KjwVCn3Xs^$Oc1On^h^J2HzPhGlT16YP zd>OA8%&ETig!%f!ludbDJlhHb(Bjvrrl+e=FO&hYv*kA@FaT0&KI!u&x0Z#0L;;8p zW_TY(Fg*SFu~{k(CP`GfCX5p8Q?(Ho18^Yhsx*XnA6<0UN2!1dP}>UtrfdFG--=)$ z4j{@F0J?fLE>9drfgyl5DB!@>*6@H3--a&F{W|}lqgJVq_ai*UZN2{fr?mdX-c&YQ zZ++yUgTu-7SUR`VQyk99S~Sfv+LrW_SuCsZd73J%fhKFdv1n5O7DSL(gFtLAql(!X ze5U$*8{h0muuyT6JdEP55Ie@LIpktf(VV%C$d5#vP?1g=?3ZQe+-lKo#pWK9c7xFWaZ$1_vhdzD03YjYO zQKdwLS%57IiX2&J<7rDYg(!?P1u43cT$9P11{!h#-wtxQ6mBlAr*o{Rcv}ckjA_Fy zSQ+TXlENi1e7_roJKeLfLdk?xL_sD+ERgm156}BxN`1E^%z}!HcnRw<(KMChB46Lu z1=>;p*4S4@F%yobVpb7S3`79J(p=H-{o9>x%=n;F@<9 zQ|}sp31{~BDqev7>dxV4J#_96lQ3YJO&r-UTlHn=vO z*a$N^*}b2CuH92=_3_3oa7^b#}rWynN3cwblj0R_byc? z$O@uz+qgqkXUJ->sW2#rS9s$2tnS{tqlokc2JBPp{8KB+QOvOO!zm!1o-)!&)&4K)F9IfBb3ARaK{G$w7U01!4j)X}~*anJTF z6F&XzJ87_*8MP6xMz8cOY5v@lNbX3!DZuxXU88_8k$*(M{`J>P`4#Q!^J)18Ou>sszuQx7ywI;8%97#}Fcd%Je5^)q zB<)ZCg$XQT6S%Q^Oz!U7OJNQFrFYNwi?aC0dc54-_p>dYXWf3h?c_rnfZSgNrWGBw zuddiVgToh;>IUsV^zs3FT-#_+)-or$HOUqXpSkudLo4h1I1(E^TOU59Z^1bEJdw0AXaK2@}jYb*d zZHkB7jzK7%lIs_b;eIJidx!Rj(l>#OOGkCL!C10T`KCN~{2ItwKQKEup9W@p=k!XZ zl#i9i2mFeW1FxJ$af7E%wXfzv$}q9l$v3J@ZW~mFsC%Eft3}v==EbmdU9S|-{|SBs5w6qD>>THyyOUGYh(u(-r)+Tm;Ovtx@%%Y_0m zc&l5B11!pG9pQoEPa}tdk5M@XVFyDua3o*dq=(+vEaGw;r?X@WiWbrfPVDd!}SS)>ttoCpvXpa^^sHG=Y zAK1((hQNXW0E!z;ywbMW zn&ONHl{G|UEsiLH>mcH-$DZ;5V+>G6zZ81d!|gHvp6scOHbEF<=D7@%A(Fo=lMcSM zjr#^51Zlec6cwaD-$`$}0$4)D_;u6{!%_9&*L~qKW&RT0`jA_qSKjpW$elY<`}Jkq z&k>I`md+P-^tUaV>svfc;L9;sL-rZcY%sV(``>T3cOZ->{<|e!!j(7O$xNJ3-{;~P zmm@iupt_c#r>5n`z_pAG+W;GsH?g0T{Gn7?- z@SfpiKYp>Kj?`VR@)&Nry2PL44>c7?^@$R&qdeV5H(&#(=D%Ku6Bmh>)YdF(M;wa3-M`;2S8r_S9cv7i=ZbWzUNXlNf+f@`^|u;Z+B zUAHHwEIj}HGa4ex{`&<YyP5^qrnWyFbJ59v8vMUbu_x8 z@HMHmNef@9>nc(Jy31QI{BN01y~@z%0K*j%Qh_4PCQuosBB6PqC^5`$;J#l+8ugK4 znSc675fpqAMJL^4<;lr+7%umlbw$o%LyyWhi2-g!{QPlQABE?8bNwvTTDHK|H(=Ya z*Cr;mIfhO`#-M~A-JenV!{wJ~sEL_WAZ#U>KO8PptVg;!U0Ih^Kp(?!`oS{Um!6#t)LNAjOa;03BLg!)1Q?69x%lmf9T*m(2Q-95BgGT~AL9?=6#yAbc}v1rfqZ%- zza4yVdQB=OXF1LcS&0K_`$YFKxnrb2L+E=pOHt0Io&6k~*hi3eMdWnQ-i!u1hV?0|mfQ5ILn#-tP#v zZ+BXmJ(&%$cGC0u?+sGHg6<`^921~QQXF{m-57){ENx+SzT34jaDeYzBTBW%a!xk~ zOiOz{ydS+>kOQs@x;2=raes;KMNFXAx?W|sB8e(`cG?hSs2eH{TIn_JyK)V1LJ5PJ zwFHgGZ8pFtBXn@~&UDquq8rT~ZoX>Zut<%!EuAkzu**?OjjeQmz5#UNlHB+=R$I@K ziL@dw2X?I;5pO&yJTuR@EAW3q>ht>igR23+50dO$TA_mFt1%Y>x30dIA@m`4Jnio2 z4H7ido7kR2LvVG5NmHmi!jN*veDPb-gc6@2hb5(jud9Capyz-rff;?v&w+lR?(EV@ zjp=)X;a}~DG3s|XsQg8+#v==nBQe~ejH#t>Q9Gg2z>pXH-V>@DFYfdD&vA6>An?*n z8S0;4g6O|c1CyJcCpHsGRDnJLQ>%6ldiVV9P$l5b5VhM8f8I#>dH)fClP{<@9N0g| z-i2A}j47!dgaUc3EW;v=0e1GLE zf(cWrH=gYA@P4(6RJ^ge__Ag#t?%pXgaOIhlwQzqv`QInN;XOXA=_Cmk-WbdR1(~z zvz{>=u?sqFS|6R=%KZEH4T-1&k1hjl{M|LS=YV_X{f&tH@Tc>sj9UXneuCAqPXumy?e1(mgqo4pS+T&9 zLxFa>`i*Ww&Hh@+{3ziHSIhUc8C>g^Obm=4vLlT8CaZ=vgZWC(lJ?HEy~`F0z8 zJjtjKaExEXHh0X&Dqw$f@FaDP+u&o-X2lQBYx5WL8UglWGN4eo{54mT+b=={>2@Ul zZt7#$pe6T%+3lg#pNjegoFtEE3$f?OlaAt?KNd8Ps*UZa5#nKRbuKB+lFH;x>F5S` zvom5IJLAEjZL^Foc&Fc*YO9g0AnUX~F;U;O(e6=5{OgzN6KrSAD?jHewknf!cVCoE zem$mjYppz#o4Z~27C&*8hz%1zEr60`R@-vH2eWWnx5+nq9;FlL{cg zbHq%mQJf&_fgZQ^6>Y{y3~oE|o#`9OB~R9~Y?6+{_5L^823M{yuGxS?087jpmTs6Q ztMT-b`-KT*cvMbqe_pWbKD*9LAcs+9%PwA~jX2~kDu81s6*d)&d{Gi$`;&t2tW3l< zKKWPmVrjyhy!G{PiOGDaliN8RHR_pvM(cl!PA2Zx8Ft{CE-`c*p+niFw^pvCZzt8i zB~at+ndTG94r{VpDu{}cqgd^Pkpw6bWk6QJ8&Zm~vh{9sRYV-aMXIqRo9eiN4P3a9 z!f)0M*galsjN70Fw$LvD!7WfMQVji;QcP)l@C8YbO{i+300E2wD`8z{Xq+zAj-XVq zvGw54S+O?#MiGxHV_t8SsE5Xcp@G;}-t28a2(koeIv*zO^ z6T(nm$Nl5&rsec(YGdf=#qX|>`Devn%0Q?|`(EuH#OK83HJ53F;n#H%Up%Wyt`iov zjX2?@A0m6+peA)+V)L6;3e(Wl94v;N?*GqDI^)E+Klx6Y|E3F3MkDSkKU-S#qEw!B zgi9md>W1!O=s_9|4z`;6V$!1g`~Uwll*oo&{j3ezrarin|6&5H&F#%9O}vx-2O!&G Af&c&j literal 0 HcmV?d00001 diff --git a/static/images/icon_address.png b/static/images/icon_address.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ddd5e85d9439344be96586863e86149601fa36 GIT binary patch literal 1813 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 0 + }, // 添加用户 async addLockUser(data) { const { name, authUid, uid, keyId, openMode, keyType, startDate, expireDate, useCountLimit, isRound, weekRound, - startHour, startMin, endHour, endMin, role, password, publicKey, commKey } = data + startHour, startMin, endHour, endMin, role, password } = data const length = 2 + 40 + 20 + 40 + 20 + 1 + 1 + 4 + 4 + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 20 + 4 + 1 + 16 const headArray = this.createPackageHeader(3, length) const conentArray = new Uint8Array(length) @@ -825,7 +855,7 @@ export const useBluetoothStore = defineStore('ble', { conentArray.set(md5Array, 166) - const cebArray = sm4.encrypt(conentArray, commKey, { mode: 'ecb', output: 'array' }) + const cebArray = sm4.encrypt(conentArray, this.currentLockInfo.commKey, { mode: 'ecb', output: 'array' }) const packageArray = this.createPackageEnd(headArray, cebArray) await this.writeBLECharacteristicValue(packageArray) diff --git a/stores/user.js b/stores/user.js index 5aa4988..e89fd61 100644 --- a/stores/user.js +++ b/stores/user.js @@ -22,7 +22,7 @@ export const useUserStore = defineStore('user', { this.isLogin = status }, async login() { - uni.setStorageSync('token', '3021|MZv7iEf0NwjCPSGx4QWs37zOjeVN3GrSJ2v7D56L7db1fcc5') + uni.setStorageSync('token', '3023|pZ1aoVlMKJBTBTGWlsZPpbLvxc8txcHbrJx2ljrf49c7efe0') const { code, data } = await getUserInfoRequest() await useLockStore().getLockList({ pageNo: 1, diff --git a/utils/request.js b/utils/request.js index f7567ae..4cea802 100644 --- a/utils/request.js +++ b/utils/request.js @@ -74,6 +74,7 @@ const request = (config) => { code: res?.data?.errorCode, res: res?.data?.data, token: header?.authorization || '', + message: res?.data?.errorMsg, duration: new Date().getTime() - timestamp }) } From 04376b94df4d1277f09954e247d64eabf94123af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Mon, 26 Aug 2024 14:13:36 +0800 Subject: [PATCH 02/27] =?UTF-8?q?1.=20=E5=AE=8C=E6=88=90=E9=94=81=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5UI=E5=8F=8A=E5=BC=80=E5=85=B3=E9=94=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/lock.js | 9 + components/SwitchLoading/SwitchLoading.vue | 95 ++++++ pages/home/home.vue | 15 +- pages/lockDetail/lockDetail.vue | 318 ++++++++++++++++++++- static/images/background_main.jpg | Bin 0 -> 51592 bytes static/images/icon_cloud.png | Bin 0 -> 1770 bytes static/images/icon_cloud_active.png | Bin 0 -> 1810 bytes static/images/icon_lock_transparent.png | Bin 0 -> 1285 bytes static/images/icon_menu.png | Bin 0 -> 1522 bytes static/images/icon_role.png | Bin 0 -> 2454 bytes static/images/icon_setting.png | Bin 0 -> 2594 bytes static/images/icon_tips.png | Bin 0 -> 1809 bytes stores/bluetooth.js | 10 +- stores/user.js | 2 +- 14 files changed, 438 insertions(+), 11 deletions(-) create mode 100644 components/SwitchLoading/SwitchLoading.vue create mode 100644 static/images/background_main.jpg create mode 100644 static/images/icon_cloud.png create mode 100644 static/images/icon_cloud_active.png create mode 100644 static/images/icon_lock_transparent.png create mode 100644 static/images/icon_menu.png create mode 100644 static/images/icon_role.png create mode 100644 static/images/icon_setting.png create mode 100644 static/images/icon_tips.png diff --git a/api/lock.js b/api/lock.js index 9931b27..1be2222 100644 --- a/api/lock.js +++ b/api/lock.js @@ -19,3 +19,12 @@ export function bindLockAdmin(data) { data }) } + +// 获取手机联网token +export function getLockNetTokenRequest(data) { + return request({ + url: '/lock/getLockNetToken', + method: 'POST', + data + }) +} diff --git a/components/SwitchLoading/SwitchLoading.vue b/components/SwitchLoading/SwitchLoading.vue new file mode 100644 index 0000000..569f1cb --- /dev/null +++ b/components/SwitchLoading/SwitchLoading.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/pages/home/home.vue b/pages/home/home.vue index 57f6010..261ca59 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -64,7 +64,6 @@ import { useBluetoothStore } from '@/stores/bluetooth' import { useBasicStore } from '@/stores/basic' import { mapState, mapActions } from 'pinia' - import { getServerDatetime } from '@/api/check' export default { data() { @@ -106,7 +105,8 @@ timeFormat, ...mapActions(useUserStore, ['updateUserInfo', 'updateLoginStatus', 'login']), ...mapActions(useLockStore, ['getLockList', 'getRole', 'getTimeLimit']), - ...mapActions(useBluetoothStore, ['getBluetoothStatus', 'initAndListenBluetooth', 'updateCurrentLockInfo', 'checkSetting']), + ...mapActions(useBluetoothStore, ['getBluetoothStatus', 'initAndListenBluetooth', 'updateCurrentLockInfo', + 'checkSetting', 'updateKeyId']), ...mapActions(useBasicStore, ['routeJump', 'getDeviceInfo']), async nextPage() { if(this.lockList.length < this.lockTotal) { @@ -172,7 +172,16 @@ result = await this.initAndListenBluetooth() } if(result) { - this.updateCurrentLockInfo(lock) + const data = { + ...lock, + name: lock.bluetooth.bluetoothDeviceName, + deviceId: lock.bluetooth.bluetoothDeviceId, + commKey: lock.bluetooth.privateKey, + signKey: lock.bluetooth.signKey, + publicKey: lock.bluetooth.publicKey, + } + this.updateKeyId(lock.keyId) + this.updateCurrentLockInfo(data) this.routeJump({ name: 'lockDetail' }) diff --git a/pages/lockDetail/lockDetail.vue b/pages/lockDetail/lockDetail.vue index 608c2be..d7637d1 100644 --- a/pages/lockDetail/lockDetail.vue +++ b/pages/lockDetail/lockDetail.vue @@ -1,17 +1,327 @@ - diff --git a/static/images/background_main.jpg b/static/images/background_main.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53c25b11a693299535fff1476af488c4dc9f7d2c GIT binary patch literal 51592 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 O7(8A5T-G@yGywpOZx9^- literal 0 HcmV?d00001 diff --git a/static/images/icon_menu.png b/static/images/icon_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..2311ee0ec0351734bf256bc5e5ab3cb0a2861304 GIT binary patch literal 1522 zcmVPx)tVu*cRCr$PUF(_KAP}_sQ4g1^EOBM=^`L%|Zx!RnK1n-^0mJV2uMw~_!&5Li zpZE)nz&UjE4E{s`1Q!7XKmi0tAb9w24=_#Bk2O~FJYR!j=OX+=0o+Lcc{-gQ$bX9b zGSBlb7ia_wVp9Mh@y~Ek2m=b}n*gS1lGZG(KKJ*@;UO2g_Rl>CpaA(P0*atLmsus= z1yGQDsmOJn=g+Jf@u8*&tOf9=aLE)wVL)qSw+O)4`epfdv?^HFlS4rb)(YmC1faEk zAzfzq_q9JL8ukJO$*Pgn86fg-c{fed@1q`Jo@aQoX&vBdDOw}$$a#KA@M-Tx6M))+ zZ$ya*_I~DJKoeDD_DaSsjZ*}0)PkYS9VHKw0DvB;BnHv*x{3gf#(#*s5+X`Wu=O|9 zBn8kE?*0l}1W;lKIO;{9VPw?<$P)8tPSGEXp`!4I)4R zfIxXoMge$b7L1Dm0D#DXK4gaEB_yA1rRB=-P zbPFGsP;1S3HOz{bv-CAChYCbyTNr1!4inD$dU#1+9$pe1L;`C8Xnw)gkSGExVsA*l z2*7v~*iuan1s1g4kTwZGYyET!e*-x!iqy=ar4E`~_@Q`mjiP81SC@X&EnM~a1H1yw z!$8F$sV=Hx<$gDcEMXOUl!r+GB)_SO7OU9a+`>yPN1LKKU}44F!jDKZS;o;WzO9Tj zvuKDsr5AznNMQqWina*(E=_d{S2uHjG21i;sJt)Xn@(GFuv_?U3r1Qimw`4`8l@KU z7ne87M$rAeKi$F`(bS-rB!I(Dzvb2=xAo_i$LH(_)O;Can*7JBuogf`w{Ugx zSfcXG<8=h890+08|2i?Pa^R7$R!DbR&e5UJ^@(7l`W*8SlsZeJ9SfH&Uis~P9Evva zoe^rS4ljmS5p$N_BmifzGn}*&NF?GSz#bqj_e}%_5c(> za0G&f&mMpR2#!GT@Yw@U0KpLm9zJ^j3LrQF!NX?{Kmi0tAb9xf0Vsgr2m}wGJpcs| z9D(5BYsbQqL%19Z-*OAT2!3=6A6G@Y0?4px;l+>vb+C0c?3GKR6v1F3sBt-zH-iTf z0k4M-L{^Qe(jcM+ssrUoxA1|;s!>&oNmN?$T@5BtoDbAstze!nxrGBBf!P8`pQzi} ze<%n+$gKX`#AzgIb}!oVIo}Tg@(jsZ;h>i#dkd>rlT#?kFHG}sc61AG3U_~n(Jj0` zPTJN;8v>y2n{MH4Nh?@dw{GE8tZNGb=OL@t-NFS0rS+@d9NI(jHW`$^KRlq_Sq!oQ z_~#amSiWz4IV|_N&VUGCogBAtQO?%kkS#Fzdbo3mB>}v024F8llHWP`%Mg(2Sb76S z+d&)vn-Ep3aUev1gO-mW5biw4;%?!$3F9)uPx;P)S5VRCr$PolADyI1EKqE9-dX484YAA93#^UW13pEbf(6n>r;QMOKM;_>cgF z8g<7cMFN)(AgRw~%3oT*u>~%U`<7ix3rq=ULg3m038-uLWaowk^!u;ZFU7^z%k*RA z>iOR`zqj)Lm+SQ3?cd*ietnw%Eq{G2FchF0AooCotbMso|CS0rzdk)f6|=CK1%?2$ zfO%6%F_iZ#o3N@e2Q?HL(C@!qpEuzf8a%V`TS)~{RhiZUtAzx#g<{t1n2K7nkj~#j z0qOzFt=S8xsirzG?zIvI&`#l;YWWiO3#hsBr&^3yE(D;?;ruXlswt5=pqP6=zx{sw zGfk7(>Kw2Ysc1qfe!Vir^7iuh^uVYGSGgS&lwAe%*Q}3d$Gn$!11LwKdgXYW z1zfMbdIzx9KNo;Tf^#t_r_V2sPcH0TgTm9_T^I}v?OxOfh15&GJpowjOLst{I~fi4 zmaF>JzHZI$-Tsd5Xmke@QBSW5gp8pa7HBW(&`I8n&eesfzU&GpYFMv19J;#K90#i4 z9^hQ}p%ziX07{*4y&QmmQgaG*4Cn->w%fSeVMOT)C=wbqRmZ{spo*%5dBlDeW7cZ( zXu@^_6q)_r)pKzaqN36X2TlkrmQ30S52)0cCRW{P6oEz~%%_4HdX{S3DC)^jQE`|@ z6x-01;--%Ts9T5!01b6F5TK%BK!IzCA+lvdBwwI?HD5pvZsD{NiZS(-tU>Gi% z>;mZM4y1-%O$Bv9lR+mEPy?d^faY6CD)vu6Z2%=Ll%nR?1}3}Pq-#JmR=F*WiLT@m z(7JbA0~$3)%Mf1&k6I!DrCJIomw*Ds${bYBSk#sPKtr99QOB=Yu8V>K4h*@<9eo>3 z6Tn(qy#OVxaxET@s2N1#@6`JYG#7z;@0rpVOQj9-uc3GcbkcNU1BXq>4ICO{>;2a0 z+pEycK0wlr(!tlJ0jPjP-toeYh}Z{nwJ zfFj1#2!$=2)Ot)_)N`?|g`au?N?jZvv1QbCQU9-;zTPPG~m0;pCfq~^O;W8SnoRt~xh4p9M%5TfBc1WwI~hD>mcaUQi{ z<(sY{9u4!Qyq5ZCIShqF6VNgSWO8VYd8?e3A2I6=DC%Hur%PZ2Fk9^1PLf)FPip>R z3gx*X$;9XmC`SdfRfuaqGzaw3Z|-<|)N=tSawBFmC`;3lZJXx#u^b0~Ew}_!l8+LAU5b=_ zycxjvmwheoGm-$gzI4K=#JXER6_r%URODt7PO_=$1ziIg5Yn!2O1_h1eIisxaleFn zK$mW#r#4)JaO?G45NX+_=NRtUJp`cA)if76q~7h}v2r#&zo)a+54jhB*r%>hVB1I6 zfO0p+iH1PcYsDvODfscjy6!wj~x!}&oxqQ=2k&R0`rrR4W6lz9%$5n z@p9j-3k9_bRW&EH{=2rKrh*!KaAeiIyDC*wQ?1o|3&rQ6)J;LHjLS7d>v|e$Y8B?a zg!kf;=763hoD+dB_Y0KAK<39MI6q~3iu=PE!%>~4fI3jkdmw0?!L$6Mq^9ieBq84| zVhvDGsR^KsbIlpTWk0g~H=4(6+R1Askbd@xDWHaM&bbn*jwqD($}cKw1goo~MlG9h+c5)FIeA~k=Prr2QdX-sb#OuH zRnG)aZ8#%@J_}V%NDa1`G~tW@=AN=B+n~u4tGyJmc3o8kRdkHIP+l|S_U|`alt)R# zTUcjSQZ+!8;0zDu9Z;oPRi|AzsQ{|6T8|peDaxv}4}3~URREQq5S=B2Nu$ijllb05 z7XvCZ`sq|bXs^?~3_=8`(AcMgb5RLtN_3WpGap$~awzSslrx5^JsV0=BTu))aT%i2 zV*|>)n>*qB+bse}PZ5DwfO127!nv;*Tu9Fl>R~{+`BTDq9MG7M4zHpdK%ddOcoNQf zwv`iq-$oFi%+NmkEU)87E5U_y! zM_J7u0eYpHeUxxQ9dEC4V3;3bHNOieVu)1FwzvY3ZD>HrHzlWfwgnVfyp9m&?nl=M^3m4{ z320x=*jJ|l8vQhh3uyQwG&UJdDpCO*Q9-LW#YP{r6UM~dpzMW4_toA$=$GqdDv;j& zW&SBXIbIZ3T-{!*Cscc!y|D8WS7TA0j zboS578zO+kXs-DmD?~|Ftk7dYG~YST5f>^RBpp;!O#N#1G;?^ U+sm4Kj{pDw07*qoM6N<$g1l;ct^fc4 literal 0 HcmV?d00001 diff --git a/static/images/icon_setting.png b/static/images/icon_setting.png new file mode 100644 index 0000000000000000000000000000000000000000..6834c06bd6bd0864bb05c00a29667ee2f08297f1 GIT binary patch literal 2594 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 literal 0 HcmV?d00001 diff --git a/static/images/icon_tips.png b/static/images/icon_tips.png new file mode 100644 index 0000000000000000000000000000000000000000..5dcd7a1b548880886d3cd8fa59de8bed2401de91 GIT binary patch literal 1809 zcma)7>pPSQAO1ZvV?xFpjMLIPLyD$tm&+xQ!{f9&lSq*$t7+JBng|=4Fa~9mD{8A* zOU_KlArwlU(w0(QIkb`(TICdaRm2=#`ycFw`*7VK?+^Da^78zVr2dUM0FXFr*L`a$ z_y?-QHSTaY(zPZ?%)TF;p{Cn#3V_(fadq;E5B!k-JV(odl5VAsnxw(wiARqBK?!s! z3Y3oMpbHdSj#Oj!lUuhQnme8l}7afbd6i39Q z6g^mDs^009cmL9esqst83l7g@GjHTqElQ*-ZF+Qq!_FlO+LAu=Q>g8o(W`Gwm)Z`n zTRBMJ0z1MrM4%RzUc8a%gQtiB-4{G|lsBwSke63h6xz$o_;EU7kT%)Ycy9xFF=N+n-Ppb z!)vyvJSsPD)#Swe>o%}aJHbrlQVipuOOGKm$UVNztw=2g@iOOH4_$clA2V+Ky~ZD4 z&MP24X^V=gN)%3mnYJ>vMQe68slar}d0OamuDH$?A{mVCma3w$)dP#Q^v)(DiMpWt zZUL{wnc}ley$WH{t4ogN7zV3Jyrp)wAHyKzW|9fE&%l3lZmue1|Afos8%fG2LL=Uk z5O>qv=(v|5@W)rVMOE&qpw~~QXb8Ge9a)ChjQ_AoCa&@i=i@n&?i*APvgUY_9 zI{Dl)cE{UD6?H|Eo}@0SL3Gou|EPWm{4NIM9xhm8vuPN|Cu?TV@whT9f7C zt~eDrS~NfZ!n}PgBZJD}zoUF)pr3Fy2qFfZ4D;&p&pD(%)5#$?t9rSwg=g{r?B zGiC$4Qhq*LF(Bt^k4J?&6p$c%10aR7<9kFKFiFOSoo8@B4=-c>=xHE`)`nP}dAN?4n$`XlHaJPVg*pkBsNW-9b%V&#Vg4#74Z` zwjehWHLQT}9q_XreN7zW@LIEqddGF+KzN0M!*=@m)sN}!)DNgWIe$2IYkX*(@UkTV zJ3U(>I{YW%>{V8Itdy96aCJs6EKc725_XZtmnK(nBtnPil(e5@-?TVR?kB+$p}7?| zZ4`H}k=xLlE5@^R(+*JrGTR#xO2!U3h5ILKt;;?m-TuV;lUALg-K<@a7+O|t`)Y(W zda5l)kjk3uq7{|Dwy!u~L+43C6P;YqXg^XcN1o2i zaC-Y4CD)gYp>ApTvsIvDM~?mZ;g8$5;FPaTT1V1X_j%%t(e*U?oo}LIgz4su+BN4ev(3J|L<RTg8yt@M{S>(S8^8dsbjjv!bUlrr<#g;riPkd(WTM*=k3d=jVN`3%vr; zGHX>)a1-VFAWe$wDS9aNpsR@gc+_~> b^}TGp$HZ{W2UR2f+Q$LM&C|8UnJfH1XB{m6 literal 0 HcmV?d00001 diff --git a/stores/bluetooth.js b/stores/bluetooth.js index 2e67edf..8c9307b 100644 --- a/stores/bluetooth.js +++ b/stores/bluetooth.js @@ -67,6 +67,10 @@ export const useBluetoothStore = defineStore('ble', { } }, actions: { + // 更新keyId + updateKeyId(keyId) { + this.keyId = keyId + }, // 二进制转字符串 uint8ArrayToString(uint8Array) { let str = '' @@ -900,11 +904,12 @@ export const useBluetoothStore = defineStore('ble', { conentArray.set(this.timestampToArray(openTime), 63) - conentArray.set(this.currentLockInfo.token, 67) + conentArray.set(this.currentLockInfo.token || this.timestampToArray(openTime), 67) conentArray[71] = 16 - const md5Array = this.md5Encrypte(name + uid, this.currentLockInfo.token, this.currentLockInfo.signKey) + + const md5Array = this.md5Encrypte(name + uid, this.currentLockInfo.token || this.timestampToArray(openTime), this.currentLockInfo.signKey) conentArray.set(md5Array, 72) @@ -915,7 +920,6 @@ export const useBluetoothStore = defineStore('ble', { const cebArray = sm4.encrypt(conentArray, this.currentLockInfo.commKey, { mode: 'ecb', output: 'array' }) const packageArray = this.createPackageEnd(headArray, cebArray) - await this.writeBLECharacteristicValue(packageArray) return this.getWriteResult(this.openDoor, data) diff --git a/stores/user.js b/stores/user.js index e89fd61..16d047e 100644 --- a/stores/user.js +++ b/stores/user.js @@ -22,7 +22,7 @@ export const useUserStore = defineStore('user', { this.isLogin = status }, async login() { - uni.setStorageSync('token', '3023|pZ1aoVlMKJBTBTGWlsZPpbLvxc8txcHbrJx2ljrf49c7efe0') + uni.setStorageSync('token', '3028|6WkZCHj5yzLlXW3z3ylc1TDhtKYvF3jHB6e4eTWr22681e3e') const { code, data } = await getUserInfoRequest() await useLockStore().getLockList({ pageNo: 1, From f4d61306154bb1b5a53082c48fdd8fbe2047b1f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Mon, 26 Aug 2024 14:16:15 +0800 Subject: [PATCH 03/27] =?UTF-8?q?1.=20=E5=AE=8C=E6=88=90=E9=94=81=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5UI=E5=8F=8A=E5=BC=80=E5=85=B3=E9=94=81?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/lockDetail/lockDetail.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/lockDetail/lockDetail.vue b/pages/lockDetail/lockDetail.vue index d7637d1..6153516 100644 --- a/pages/lockDetail/lockDetail.vue +++ b/pages/lockDetail/lockDetail.vue @@ -122,7 +122,7 @@ export default { this.$refs.loading.close() this.pending = false uni.showToast({ - title: '联网开锁失败', + title: '联网开锁失败,请保证网络畅通', icon: 'none' }) return @@ -148,7 +148,7 @@ export default { }) } else { uni.showToast({ - title: '开锁失败', + title: '开锁失败,请保证在锁附近', icon: 'none' }) } From 6bcda7adb9b9ed1f65af8dccc0fd99facf26f9fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Mon, 26 Aug 2024 17:33:53 +0800 Subject: [PATCH 04/27] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E4=B8=8E=E5=88=87=E6=8D=A2=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/user.js | 18 +++++++ config/env.js | 2 +- manifest.json | 2 +- pages/home/home.vue | 79 +++++++++++++++++++++++---- pages/lockDetail/lockDetail.vue | 14 ++--- pages/mine/mine.vue | 94 +++++++++++++++++++++++++++++++-- stores/user.js | 46 +++++++++++----- 7 files changed, 219 insertions(+), 36 deletions(-) diff --git a/api/user.js b/api/user.js index 2c2d68d..81e7b8f 100644 --- a/api/user.js +++ b/api/user.js @@ -55,3 +55,21 @@ export function getEmailCodeRequest(data) { data }) } + +// 登录 +export function loginRequest(data) { + return request({ + url: '/wechat/mini/login', + method: 'POST', + data + }) +} + +// 注册 +export function phoneLoginRequest(data) { + return request({ + url: '/wechat/mini/phone/login ', + method: 'POST', + data + }) +} diff --git a/config/env.js b/config/env.js index e30867e..d42cdfb 100644 --- a/config/env.js +++ b/config/env.js @@ -22,4 +22,4 @@ const PROD = { } // 更换环境的时候 切换导出就行 -export default PRE +export default DEV diff --git a/manifest.json b/manifest.json index 35562d9..66d0780 100644 --- a/manifest.json +++ b/manifest.json @@ -7,7 +7,7 @@ "transformPx" : false, /* 小程序特有相关 */ "mp-weixin" : { - "appid" : "wx9829a39e65550757", + "appid" : "wx10c16cfd90808097", "setting" : { "urlCheck" : true, "minified" : true diff --git a/pages/home/home.vue b/pages/home/home.vue index 261ca59..47186cb 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -50,15 +50,18 @@ class="button-add" @click="toSearchDevice"> - + + + + diff --git a/pages/createPassword/createPassword.vue b/pages/createPassword/createPassword.vue new file mode 100644 index 0000000..608c2be --- /dev/null +++ b/pages/createPassword/createPassword.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/pages/home/home.vue b/pages/home/home.vue index 47186cb..9254472 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -239,7 +239,7 @@ signKey: lock.bluetooth.signKey, publicKey: lock.bluetooth.publicKey, } - this.updateKeyId(lock.keyId) + this.updateKeyId(lock.keyId.toString()) this.updateCurrentLockInfo(data) this.routeJump({ name: 'lockDetail' diff --git a/pages/keyList/keyList.vue b/pages/keyList/keyList.vue new file mode 100644 index 0000000..608c2be --- /dev/null +++ b/pages/keyList/keyList.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/pages/lockDetail/lockDetail.vue b/pages/lockDetail/lockDetail.vue index 9b07dbc..36c4726 100644 --- a/pages/lockDetail/lockDetail.vue +++ b/pages/lockDetail/lockDetail.vue @@ -33,17 +33,18 @@ + class="menu-main-view" @click="routeJump({ name: 'keyList' })"> 电子钥匙 - + 密码 - + 设置 @@ -53,6 +54,7 @@ diff --git a/pages/passwordList/passwordList.vue b/pages/passwordList/passwordList.vue new file mode 100644 index 0000000..608c2be --- /dev/null +++ b/pages/passwordList/passwordList.vue @@ -0,0 +1,17 @@ + + + + + diff --git a/pages/setting/setting.vue b/pages/setting/setting.vue new file mode 100644 index 0000000..2197fe8 --- /dev/null +++ b/pages/setting/setting.vue @@ -0,0 +1,198 @@ + + + + + + + diff --git a/stores/basic.js b/stores/basic.js index daa6e11..314ed7d 100644 --- a/stores/basic.js +++ b/stores/basic.js @@ -71,6 +71,31 @@ const pages = [ name: 'bindLock', path: '/pages/bindLock/bindLock', tabBar: false + }, + { + name: 'setting', + path: '/pages/setting/setting', + tabBar: false + }, + { + name: 'keyList', + path: '/pages/keyList/keyList', + tabBar: false + }, + { + name: 'createKey', + path: '/pages/createKey/createKey', + tabBar: false + }, + { + name: 'passwordList', + path: '/pages/passwordList/passwordList', + tabBar: false + }, + { + name: 'createPassword', + path: '/pages/createPassword/createPassword', + tabBar: false } ] diff --git a/stores/bluetooth.js b/stores/bluetooth.js index 8c9307b..1c83539 100644 --- a/stores/bluetooth.js +++ b/stores/bluetooth.js @@ -941,10 +941,10 @@ export const useBluetoothStore = defineStore('ble', { for(let i = 0; i < authUid.length; i++) { conentArray[i + 42] = authUid.charCodeAt(i) } - conentArray.set(this.currentLockInfo.token, 62) + conentArray.set(this.currentLockInfo.token || new Uint8Array([0, 0, 0, 0]), 62) conentArray[66] = 16 - const md5Array = this.md5Encrypte(name, this.currentLockInfo.token, this.currentLockInfo.publicKey) + const md5Array = this.md5Encrypte(name, this.currentLockInfo.token || new Uint8Array([0, 0, 0, 0]), this.currentLockInfo.publicKey) conentArray.set(md5Array, 67) const cebArray = sm4.encrypt(conentArray, this.currentLockInfo.commKey, { mode: 'ecb', output: 'array' }) From 2fc7ad7ed725531b1e6ae33d3ea39ce0d44fa98f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Tue, 27 Aug 2024 10:12:56 +0800 Subject: [PATCH 06/27] =?UTF-8?q?1.=20=E5=AE=8C=E6=88=90=E6=89=8B=E6=9C=BA?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E7=A0=81=E4=BF=AE=E6=94=B9=E8=B4=A6=E5=8F=B7?= =?UTF-8?q?=E5=AF=86=E7=A0=81=E5=8A=9F=E8=83=BD=202.=20=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E8=B4=A6=E5=8F=B7=E7=BB=91=E5=AE=9A=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/user.js | 21 ++++- pages/home/home.vue | 17 +--- pages/mine/mine.vue | 30 +++---- pages/updatePassword/updatePassword.vue | 110 ++++++++++++++++++------ pages/userInfo/userInfo.vue | 60 ++++++++++--- stores/user.js | 40 ++++++--- 6 files changed, 195 insertions(+), 83 deletions(-) diff --git a/api/user.js b/api/user.js index 81e7b8f..f5f091a 100644 --- a/api/user.js +++ b/api/user.js @@ -68,8 +68,27 @@ export function loginRequest(data) { // 注册 export function phoneLoginRequest(data) { return request({ - url: '/wechat/mini/phone/login ', + url: '/wechat/mini/phone/login', method: 'POST', data }) } + +// 更换绑定手机号 +export function rebindPhoneRequest(data) { + return request({ + url: '/wechat/mini/rebindPhone', + method: 'POST', + data + }) +} + +// 验证码更换密码 +export function changePasswordRequest(data) { + return request({ + url: '/wechat/mini/changePassword', + method: 'POST', + data + }) +} + diff --git a/pages/home/home.vue b/pages/home/home.vue index 9254472..8fc9500 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -105,7 +105,7 @@ }, methods: { timeFormat, - ...mapActions(useUserStore, ['updateUserInfo', 'updateLoginStatus', 'getPhone']), + ...mapActions(useUserStore, ['updateUserInfo', 'updateLoginStatus', 'phoneLogin', 'getUserInfo']), ...mapActions(useLockStore, ['getLockList', 'getRole', 'getTimeLimit']), ...mapActions(useBluetoothStore, ['getBluetoothStatus', 'initAndListenBluetooth', 'updateCurrentLockInfo', 'checkSetting', 'updateKeyId']), @@ -153,14 +153,11 @@ if(data.detail.errMsg === 'getPhoneNumber:fail user deny') { return } - const result = await this.getPhone({ + const result = await this.phoneLogin({ encryptedData: data.detail.encryptedData, iv: data.detail.iv }) - if(result) { - this.getUserInfo() - this.getLockList(this.search) - } else { + if(!result) { uni.showToast({ title: '登录失败,请重试', icon: 'none' @@ -190,14 +187,6 @@ this.search.searchStr = data await this.getLockList(this.search) }, - async getUserInfo() { - const { code, data } = await getUserInfoRequest() - if(code === 0) { - this.updateUserInfo(data) - this.updateLoginStatus(true) - } - return code - }, getFocus() { this.focus = true }, diff --git a/pages/mine/mine.vue b/pages/mine/mine.vue index 7be172b..4961512 100644 --- a/pages/mine/mine.vue +++ b/pages/mine/mine.vue @@ -69,11 +69,19 @@ methods: { ...mapActions(useBasicStore, ['getButtonInfo', 'routeJump']), ...mapActions(useLockStore, ['getLockList']), - ...mapActions(useUserStore, ['updateLoginStatus', 'getPhone', 'updateUserInfo']), + ...mapActions(useUserStore, ['updateLoginStatus', 'phoneLogin', 'updateUserInfo', 'getUserInfo', 'checkSession']), async changePhone(res) { if(res.detail.errMsg === 'getPhoneNumber:fail user deny') { return } + const result = await this.checkSession() + if(!result) { + uni.showToast({ + title: '登录失败,请重试', + icon: 'none' + }) + return + } const openid = uni.getStorageSync('openid') const { code, data, message } = await phoneLoginRequest({ encryptedData: res.detail.encryptedData, @@ -83,8 +91,6 @@ }) if(code === 0) { uni.setStorageSync('token', data.accessToken) - console.log('token', data.accessToken,uni.getStorageSync('token')) - this.getUserInfo() this.getLockList({ pageNo: 1, pageSize: 50 @@ -104,31 +110,17 @@ if(data.detail.errMsg === 'getPhoneNumber:fail user deny') { return } - const result = await this.getPhone({ + const result = await this.phoneLogin({ encryptedData: data.detail.encryptedData, iv: data.detail.iv }) - if(result) { - this.getUserInfo() - this.getLockList({ - pageNo: 1, - pageSize: 50 - }) - } else { + if(!result) { uni.showToast({ title: '登录失败,请重试', icon: 'none' }) } }, - async getUserInfo() { - const { code, data } = await getUserInfoRequest() - if(code === 0) { - this.updateUserInfo(data) - this.updateLoginStatus(true) - } - return code - }, toUsereInfo() { this.routeJump({ name: 'userInfo' diff --git a/pages/updatePassword/updatePassword.vue b/pages/updatePassword/updatePassword.vue index 11462b3..e07943e 100644 --- a/pages/updatePassword/updatePassword.vue +++ b/pages/updatePassword/updatePassword.vue @@ -1,11 +1,12 @@ @@ -67,4 +110,16 @@ page { font-size: 24rpx; color: #999999; } + +.button { + margin: 32rpx; + width: 686rpx; + height: 88rpx; + background-color: #df282d; + color: white; + text-align: center; + line-height: 88rpx; + border-radius: 44rpx; + font-weight: bold; +} diff --git a/pages/keyList/keyList.vue b/pages/keyList/keyList.vue index 1685d50..303b8ce 100644 --- a/pages/keyList/keyList.vue +++ b/pages/keyList/keyList.vue @@ -20,7 +20,12 @@ - {{ key.keyName }} + + {{ key.keyName }} + + {{ getKeyStatus(key.keyStatus) }} + + {{ key.timeText }} @@ -67,7 +72,8 @@ export default { }, async onLoad() { uni.showLoading({ - title: '加载中' + title: '加载中', + mask: true }) this.deviceInfo = await this.getDeviceInfo() this.updateKeySearch({ @@ -80,7 +86,7 @@ export default { }, methods: { ...mapActions(useBasicStore, ['routeJump', 'getDeviceInfo']), - ...mapActions(useLockStore, ['getKeyList', 'updateCurrentKeyInfo', 'updateKeySearch']), + ...mapActions(useLockStore, ['getKeyList', 'updateCurrentKeyInfo', 'updateKeySearch', 'getKeyStatus']), toKeyDetail(key) { this.updateCurrentKeyInfo(key) this.routeJump({ @@ -195,7 +201,10 @@ export default { } }, async changeSearch(data) { - this.keySearch.searchStr = data + this.updateKeySearch({ + ...this.keySearch, + searchStr: data + }) const { code, meesage } = await this.getKeyList(this.keySearch) }, }, @@ -262,6 +271,7 @@ page { .key-right { margin-left: 32rpx; margin-right: 32rpx; + width: 574rpx; .key-right-top { font-size: 32rpx; @@ -274,6 +284,12 @@ page { color: #999999; } } + + .key-status { + margin-left: auto; + font-size: 26rpx; + color: #63b8af; + } } .line { diff --git a/pages/mine/mine.vue b/pages/mine/mine.vue index 4961512..33b64d3 100644 --- a/pages/mine/mine.vue +++ b/pages/mine/mine.vue @@ -61,14 +61,15 @@ } }, computed: { - ...mapState(useUserStore, ['isLogin']) + ...mapState(useUserStore, ['isLogin']), + ...mapState(useLockStore, ['lockSearch']) }, async onLoad() { this.buttonInfo = await this.getButtonInfo() }, methods: { ...mapActions(useBasicStore, ['getButtonInfo', 'routeJump']), - ...mapActions(useLockStore, ['getLockList']), + ...mapActions(useLockStore, ['getLockList', 'updateLockSearch']), ...mapActions(useUserStore, ['updateLoginStatus', 'phoneLogin', 'updateUserInfo', 'getUserInfo', 'checkSession']), async changePhone(res) { if(res.detail.errMsg === 'getPhoneNumber:fail user deny') { @@ -91,10 +92,11 @@ }) if(code === 0) { uni.setStorageSync('token', data.accessToken) - this.getLockList({ - pageNo: 1, - pageSize: 50 + this.updateLockSearch({ + ...that.lockSearch, + pageNo: 1 }) + this.getLockList(this.lockSearch) uni.showToast({ title: '账号切换成功', icon: 'none' diff --git a/pages/passwordDetail/passwordDetail.vue b/pages/passwordDetail/passwordDetail.vue index de74e75..7cdc813 100644 --- a/pages/passwordDetail/passwordDetail.vue +++ b/pages/passwordDetail/passwordDetail.vue @@ -25,24 +25,94 @@ {{ timeFormat(currentPasswordInfo.sendDate, 'yyyy-mm-dd h:M') }} 密码生成后,请在当日23:59前使用一次进行激活,否则过0点后未激活则失效。 + 删除密码 @@ -68,4 +138,16 @@ page { font-size: 24rpx; color: #999999; } + +.button { + margin: 32rpx; + width: 686rpx; + height: 88rpx; + background-color: #df282d; + color: white; + text-align: center; + line-height: 88rpx; + border-radius: 44rpx; + font-weight: bold; +} diff --git a/pages/passwordList/passwordList.vue b/pages/passwordList/passwordList.vue index 4a541ae..da16990 100644 --- a/pages/passwordList/passwordList.vue +++ b/pages/passwordList/passwordList.vue @@ -6,7 +6,7 @@ + v-model="passwordSearch.searchStr" bgColor="#ffffff" :showAction="false" maxlength="20"> @@ -48,11 +48,6 @@ import { deletePsaawordRequest, resetPsaawordListRequest } from '@/api/keyboardP export default { data () { return { - search: { - pageNo: 1, - pageSize: 50, - searchStr: '' - }, deviceInfo: null, refresherTriggered: false, requestFinished: false, @@ -67,22 +62,26 @@ export default { computed: { ...mapState(useUserStore, ['userInfo']), ...mapState(useBluetoothStore, ['currentLockInfo', 'keyId']), - ...mapState(useLockStore, ['passwordTotal', 'passwordList']), + ...mapState(useLockStore, ['passwordTotal', 'passwordList', 'passwordSearch']), }, async onLoad() { uni.showLoading({ - title: '加载中' + title: '加载中', + mask: true }) this.deviceInfo = await this.getDeviceInfo() - this.search.lockStatus = this.currentLockInfo.lockStatus - this.search.lockId = this.currentLockInfo.lockId - const { code, meesage } = await this.getPasswordList(this.search) + this.updatePasswordSearch({ + ...this.passwordSearch, + lockId: this.currentLockInfo.lockId, + lockStatus: this.currentLockInfo.lockStatus + }) + const { code, meesage } = await this.getPasswordList(this.passwordSearch) this.requestFinished = true uni.hideLoading() }, methods: { ...mapActions(useBasicStore, ['routeJump', 'getDeviceInfo']), - ...mapActions(useLockStore, ['getPasswordList', 'updateCurrentPasswordInfo']), + ...mapActions(useLockStore, ['getPasswordList', 'updateCurrentPasswordInfo', 'updatePasswordSearch']), ...mapActions(useBluetoothStore, ['resetLockPassword', 'setLockPassword']), toPasswordDetail(password) { this.updateCurrentPasswordInfo(password) @@ -128,8 +127,11 @@ export default { title: '删除成功', icon: 'none' }) - that.search.pageNo = 1 - await that.getPasswordList(that.search) + that.updatePasswordSearch({ + ...that.passwordSearch, + pageNo: 1 + }) + await that.getPasswordList(that.passwordSearch) } else { uni.hideLoading() uni.showToast({ @@ -170,8 +172,11 @@ export default { title: '重置密码成功', icon: 'none' }) - that.search.pageNo = 1 - that.getPasswordList(that.search) + that.updatePasswordSearch({ + ...that.passwordSearch, + pageNo: 1 + }) + that.getPasswordList(that.passwordSearch) } else { uni.showToast({ title: message, @@ -195,8 +200,11 @@ export default { }, async refresherList() { this.refresherTriggered = true - this.search.pageNo = 1 - const { code, meesage } = await this.getPasswordList(this.search) + this.updatePasswordSearch({ + ...this.passwordSearch, + pageNo: 1 + }) + const { code, meesage } = await this.getPasswordList(this.passwordSearch) if(code === 0) { uni.showToast({ title: '刷新成功', @@ -206,22 +214,28 @@ export default { this.refresherTriggered = false }, async nextPage() { - if(this.passwordTotal <= this.search.pageNo * this.search.pageSize) { + if(this.passwordTotal <= this.passwordSearch.pageNo * this.passwordSearch.pageSize) { return } - const pageNo = this.search.pageNo + 1 + const pageNo = this.passwordSearch.pageNo + 1 const params = { - ...this.search, + ...this.passwordSearch, pageNo } const { code, meesage } = await this.getPasswordList(params) if(code === 0) { - this.search.pageNo = pageNo + that.updatePasswordSearch({ + ...that.passwordSearch, + pageNo + }) } }, async changeSearch(data) { - this.search.searchStr = data - const { code, meesage } = await this.getPasswordList(this.search) + this.updatePasswordSearch({ + ...this.passwordSearch, + searchStr: data + }) + const { code, meesage } = await this.getPasswordList(this.passwordSearch) }, }, } diff --git a/pages/searchDevice/searchDevice.vue b/pages/searchDevice/searchDevice.vue index 1445fcb..3a33715 100644 --- a/pages/searchDevice/searchDevice.vue +++ b/pages/searchDevice/searchDevice.vue @@ -47,7 +47,7 @@ export default { async connect(device) { uni.showLoading({ title: '连接中', - // mask: true + mask: true }) const { code: serverTimestampCode, message } = await this.updateServerTimestamp() if(serverTimestampCode !== 0) { diff --git a/pages/setting/setting.vue b/pages/setting/setting.vue index 14aa37d..3b6b6d1 100644 --- a/pages/setting/setting.vue +++ b/pages/setting/setting.vue @@ -58,17 +58,19 @@ export default { }, computed: { ...mapState(useUserStore, ['userInfo']), - ...mapState(useBluetoothStore, ['keyId', 'currentLockInfo']) + ...mapState(useBluetoothStore, ['keyId', 'currentLockInfo']), + ...mapState(useLockStore, ['lockSearch']) }, onLoad() { this.unlockApp = this.currentLockInfo.lockSetting.appUnlockOnline }, methods: { ...mapActions(useBluetoothStore, ['resetDevice', 'updateCurrentLockInfo']), - ...mapActions(useLockStore, ['getLockList']), + ...mapActions(useLockStore, ['getLockList', 'updateLockSearch']), async changeUnlockApp(value) { uni.showLoading({ - title: '更新中' + title: '更新中', + mask: true }) const { code, message } = await updateLockSettingRequest({ lockId: this.currentLockInfo.lockId, @@ -100,7 +102,8 @@ export default { success: async function (res) { if (res.confirm) { uni.showLoading({ - title: '删除中' + title: '删除中', + mask: true }) if(that.currentLockInfo.userType === 110301) { const { code: resetDeviceCode } = await that.resetDevice({ @@ -114,10 +117,11 @@ export default { }) if(code === 0) { uni.hideLoading() - that.getLockList({ - pageNo: 1, - pageSize: 50 + that.updateLockSearch({ + ...that.lockSearch, + pageNo: 1 }) + that.getLockList(that.lockSearch) uni.navigateBack({ delta: 2, complete: () => { @@ -148,10 +152,11 @@ export default { }) if(code === 0) { uni.hideLoading() - that.getLockList({ - pageNo: 1, - pageSize: 50 + that.updateLockSearch({ + ...that.lockSearch, + pageNo: 1 }) + that.getLockList(that.lockSearch) uni.navigateBack({ delta: 2, complete: () => { diff --git a/stores/lock.js b/stores/lock.js index f9da539..8071158 100644 --- a/stores/lock.js +++ b/stores/lock.js @@ -14,12 +14,24 @@ export const useLockStore = defineStore('lock', { lockList: [], // 锁总数 lockTotal: 0, + // 锁列表搜索数据 + lockSearch: { + pageNo: 1, + pageSize: 50, + searchStr: '' + }, // 密码列表 passwordList: [], // 密码总数 passwordTotal: 0, // 当前密码详情 currentPasswordInfo: {}, + // 密码列表搜索数据 + passwordSearch: { + pageNo: 1, + pageSize: 50, + searchStr: '' + }, // 电子钥匙总数 keyTotal: 0, // 电子钥匙列表 @@ -33,12 +45,18 @@ export const useLockStore = defineStore('lock', { searchStr: '', endDate: '0', startDate: '0', - keyStatus: [110401,110402], + keyStatus: [110401,110402,110412], keyRight: 0 }, } }, actions: { + updateLockSearch(search) { + this.lockSearch = search + }, + updatePasswordSearch(search) { + this.passwordSearch = search + }, updateKeySearch(search) { this.keySearch = search }, @@ -55,6 +73,17 @@ export const useLockStore = defineStore('lock', { return '普通用户' } }, + getKeyStatus(keyStatus) { + if(keyStatus === 110401) { + return '正常' + } else if(keyStatus === 110402) { + return '待接收' + } else if(keyStatus === 110412) { + return '已过期' + } else { + return '' + } + }, getTimeLimit(keyType) { if(keyType === 1) { return '永久' diff --git a/stores/user.js b/stores/user.js index 879fdc6..c074d18 100644 --- a/stores/user.js +++ b/stores/user.js @@ -37,10 +37,11 @@ export const useUserStore = defineStore('user', { if(code === 0) { uni.setStorageSync('token', data.accessToken) this.getUserInfo() - useLockStore().getLockList({ - pageNo: 1, - pageSize: 50 + useLockStore().updateLockSearch({ + ...useLockStore().lockSearch, + pageNo: 1 }) + useLockStore().getLockList(useLockStore().lockSearch) return true } else { return false From 86c398b754d324cd7b49a8e8b1e965b6442cba6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Thu, 29 Aug 2024 16:18:49 +0800 Subject: [PATCH 10/27] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E5=AE=89=E5=8D=93?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E8=93=9D=E7=89=99=E6=90=9C=E7=B4=A2=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=AE=9A=E4=BD=8D=E6=9D=83=E9=99=90=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=202.=20=E5=88=A0=E9=99=A4=E4=BB=A5=E5=89=8D=E7=9A=84?= =?UTF-8?q?=E8=93=9D=E7=89=99=E6=93=8D=E4=BD=9Cdemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages.json | 3 - pages/index/index.vue | 205 ------------------------------------------ stores/bluetooth.js | 17 ++++ 3 files changed, 17 insertions(+), 208 deletions(-) delete mode 100644 pages/index/index.vue diff --git a/pages.json b/pages.json index e51e3c5..c8331f0 100644 --- a/pages.json +++ b/pages.json @@ -21,9 +21,6 @@ { "path": "pages/mine/mine" }, - { - "path": "pages/index/index" - }, { "path": "pages/userInfo/userInfo", "style": { diff --git a/pages/index/index.vue b/pages/index/index.vue deleted file mode 100644 index dc0afa9..0000000 --- a/pages/index/index.vue +++ /dev/null @@ -1,205 +0,0 @@ - - - - - diff --git a/stores/bluetooth.js b/stores/bluetooth.js index 9bbf236..33a66f1 100644 --- a/stores/bluetooth.js +++ b/stores/bluetooth.js @@ -373,6 +373,19 @@ export const useBluetoothStore = defineStore('ble', { }, fail: async function (res) { console.log('开始搜索失败', res) + if(res.errno === 1509008) { + uni.showModal({ + title: '提示', + content: '安卓手机蓝牙功能需要定位权限,请前往设置开启微信的定位权限后再试', + showCancel: false, + confirmText: '重试', + success(res) { + if (res.confirm) { + that.getBluetoothDevices() + } + } + }) + } if(res.errCode === 10000) { // 重新初始化蓝牙适配器 await that.initBluetooth() @@ -550,6 +563,10 @@ export const useBluetoothStore = defineStore('ble', { }) }, fail(res) { + if(res.errno === 1509007) { + resolve(true) + return + } uni.showToast({ title: '连接失败,请靠近设备并保持设备处于唤醒状态', icon: 'none' From 053d14db4702ec01a289a21e4b75a70061b38f55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Thu, 29 Aug 2024 17:40:41 +0800 Subject: [PATCH 11/27] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=89=E5=8D=93?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=9B=9E=E9=80=80toast=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/bindLock/bindLock.vue | 20 +++--------- pages/createKey/createKey.vue | 11 ++----- pages/createPassword/createPassword.vue | 12 ++----- pages/keyDetail/keyDetail.vue | 11 ++----- pages/mine/mine.vue | 8 +++-- pages/passwordDetail/passwordDetail.vue | 13 +++----- pages/setting/setting.vue | 22 +++---------- pages/updateEmail/updateEmail.vue | 11 ++----- pages/updateName/updateName.vue | 11 ++----- pages/updatePassword/updatePassword.vue | 15 ++------- .../updateSafeQuestion/updateSafeQuestion.vue | 11 ++----- pages/userInfo/userInfo.vue | 20 ++++++------ pages/verifyEmail/verifyEmail.vue | 31 ------------------- stores/basic.js | 15 +++++++++ 14 files changed, 60 insertions(+), 151 deletions(-) diff --git a/pages/bindLock/bindLock.vue b/pages/bindLock/bindLock.vue index 9565c4b..c8232df 100644 --- a/pages/bindLock/bindLock.vue +++ b/pages/bindLock/bindLock.vue @@ -14,6 +14,7 @@ import { useUserStore } from '@/stores/user' import { mapActions, mapState } from 'pinia' import { bindLockAdmin } from '@/api/lock' import { useLockStore } from '@/stores/lock' +import { useBasicStore } from '@/stores/basic' export default { data () { @@ -34,6 +35,7 @@ export default { methods: { ...mapActions(useBluetoothStore, ['addLockUser']), ...mapActions(useLockStore, ['getLockList', 'updateLockSearch']), + ...mapActions(useBasicStore, ['backAndToast']), uopdateName(data) { this.name = data.detail.value }, @@ -71,15 +73,8 @@ export default { password }) if(addUserCode !== 0) { - uni.navigateBack({ - complete() { - uni.showToast({ - title: '添加失败,请重试', - icon: 'none' - }) - } - }) uni.hideLoading() + this.backAndToast('添加失败,请重试') return } const params = { @@ -122,14 +117,7 @@ export default { }) this.getLockList(this.lockSearch) uni.hideLoading() - uni.navigateBack({ - complete() { - uni.showToast({ - title: '添加成功', - icon: 'none' - }) - } - }) + this.backAndToast('添加成功') } else { uni.hideLoading() uni.showToast({ diff --git a/pages/createKey/createKey.vue b/pages/createKey/createKey.vue index 382e175..fc327aa 100644 --- a/pages/createKey/createKey.vue +++ b/pages/createKey/createKey.vue @@ -80,7 +80,7 @@ export default { this.temporaryInvalidTime = this.setTime() }, methods: { - ...mapActions(useBasicStore, ['getDeviceInfo']), + ...mapActions(useBasicStore, ['getDeviceInfo', 'backAndToast']), ...mapActions(useLockStore, ['getKeyList', 'updateKeySearch']), setTime () { const now = new Date() @@ -154,14 +154,7 @@ export default { pageNo: 1 }) this.getKeyList(this.keySearch) - uni.navigateBack({ - complete: () => { - uni.showToast({ - title: '钥匙已发送', - icon: 'none' - }) - } - }) + this.backAndToast('钥匙已发送') } else if(code === 425) { this.pending = false await this.createKey(type, true) diff --git a/pages/createPassword/createPassword.vue b/pages/createPassword/createPassword.vue index 414a987..dd1dfad 100644 --- a/pages/createPassword/createPassword.vue +++ b/pages/createPassword/createPassword.vue @@ -70,7 +70,7 @@ export default { this.temporaryTime = this.setTime() }, methods: { - ...mapActions(useBasicStore, ['getDeviceInfo']), + ...mapActions(useBasicStore, ['getDeviceInfo', 'backAndToast']), ...mapActions(useLockStore, ['getPasswordList', 'updatePasswordSearch']), setTime() { const now = new Date() @@ -80,6 +80,7 @@ export default { return now.getTime() }, async createPassword(type) { + const that = this if((type === 'temporary' && this.temporaryName === '') || (type === 'permanent' && this.permanentName === '')) { uni.showToast({ title: '名称不能为空', @@ -131,14 +132,7 @@ export default { uni.setClipboardData({ data: data.keyboardPwd, success: () => { - uni.navigateBack({ - complete: () => { - uni.showToast({ - title: '复制成功', - icon: 'none' - }) - } - }) + that.backAndToast('复制成功') } }) } diff --git a/pages/keyDetail/keyDetail.vue b/pages/keyDetail/keyDetail.vue index 4aaf07f..aa9aa4a 100644 --- a/pages/keyDetail/keyDetail.vue +++ b/pages/keyDetail/keyDetail.vue @@ -33,6 +33,7 @@ import { mapActions, mapState } from 'pinia' import { useLockStore } from '@/stores/lock' import { timeFormat } from 'uview-plus' import { deleteKeyRequest } from '@/api/key' +import { useBasicStore } from '@/stores/basic' export default { data () { @@ -44,6 +45,7 @@ export default { methods: { timeFormat, ...mapActions(useLockStore, ['updateKeySearch', 'getKeyList']), + ...mapActions(useBasicStore, ['backAndToast']), async deleteKey () { const that = this uni.showModal({ @@ -65,14 +67,7 @@ export default { pageNo: 1 }) await that.getKeyList(that.keySearch) - uni.navigateBack({ - complete: () => { - uni.showToast({ - title: '删除成功', - icon: 'none' - }) - } - }) + that.backAndToast('删除成功') } else { uni.hideLoading() uni.showToast({ diff --git a/pages/mine/mine.vue b/pages/mine/mine.vue index 33b64d3..a1fbc73 100644 --- a/pages/mine/mine.vue +++ b/pages/mine/mine.vue @@ -52,7 +52,7 @@ import { useUserStore } from '@/stores/user' import { useLockStore } from '@/stores/lock' import { mapState, mapActions } from 'pinia' - import { getUserInfoRequest, phoneLoginRequest } from '@/api/user' + import { phoneLoginRequest } from '@/api/user' export default { data() { @@ -70,7 +70,8 @@ methods: { ...mapActions(useBasicStore, ['getButtonInfo', 'routeJump']), ...mapActions(useLockStore, ['getLockList', 'updateLockSearch']), - ...mapActions(useUserStore, ['updateLoginStatus', 'phoneLogin', 'updateUserInfo', 'getUserInfo', 'checkSession']), + ...mapActions(useUserStore, ['updateLoginStatus', 'phoneLogin', 'updateUserInfo', 'getUserInfo', + 'checkSession']), async changePhone(res) { if(res.detail.errMsg === 'getPhoneNumber:fail user deny') { return @@ -93,9 +94,10 @@ if(code === 0) { uni.setStorageSync('token', data.accessToken) this.updateLockSearch({ - ...that.lockSearch, + ...this.lockSearch, pageNo: 1 }) + this.getUserInfo() this.getLockList(this.lockSearch) uni.showToast({ title: '账号切换成功', diff --git a/pages/passwordDetail/passwordDetail.vue b/pages/passwordDetail/passwordDetail.vue index 7cdc813..abfd8bc 100644 --- a/pages/passwordDetail/passwordDetail.vue +++ b/pages/passwordDetail/passwordDetail.vue @@ -36,6 +36,7 @@ import { timeFormat } from 'uview-plus' import { deletePsaawordRequest } from '@/api/keyboardPwd' import { useBluetoothStore } from '@/stores/bluetooth' import { useUserStore } from '@/stores/user' +import { useBasicStore } from '@/stores/basic' export default { data () { @@ -44,12 +45,13 @@ export default { computed: { ...mapState(useLockStore, ['currentPasswordInfo', 'passwordSearch']), ...mapState(useBluetoothStore, ['currentLockInfo', 'keyId']), - ...mapState(useUserStore, ['userInfo']), + ...mapState(useUserStore, ['userInfo']) }, methods: { timeFormat, ...mapActions(useBluetoothStore, ['setLockPassword']), ...mapActions(useLockStore, ['updatePasswordSearch', 'getPasswordList']), + ...mapActions(useBasicStore, ['backAndToast']), async deletePassword () { const that = this uni.showModal({ @@ -86,14 +88,7 @@ export default { pageNo: 1 }) that.getPasswordList(that.passwordSearch) - uni.navigateBack({ - complete: () => { - uni.showToast({ - title: '删除成功', - icon: 'none' - }) - } - }) + that.backAndToast('删除成功') } else { uni.hideLoading() uni.showToast({ diff --git a/pages/setting/setting.vue b/pages/setting/setting.vue index 3b6b6d1..dd5b8f6 100644 --- a/pages/setting/setting.vue +++ b/pages/setting/setting.vue @@ -49,6 +49,7 @@ import { deleteLockRequest } from '@/api/lock' import { useLockStore } from '@/stores/lock' import { updateLockSettingRequest } from '@/api/lockSetting' import { deleteKeyRequest } from '@/api/key' +import { useBasicStore } from '@/stores/basic' export default { data () { @@ -67,6 +68,7 @@ export default { methods: { ...mapActions(useBluetoothStore, ['resetDevice', 'updateCurrentLockInfo']), ...mapActions(useLockStore, ['getLockList', 'updateLockSearch']), + ...mapActions(useBasicStore, ['backAndToast']), async changeUnlockApp(value) { uni.showLoading({ title: '更新中', @@ -122,15 +124,7 @@ export default { pageNo: 1 }) that.getLockList(that.lockSearch) - uni.navigateBack({ - delta: 2, - complete: () => { - uni.showToast({ - title: '删除成功', - icon: 'none' - }) - } - }) + that.backAndToast('删除成功', 2) uni.navigateBack() } else { uni.hideLoading() @@ -157,15 +151,7 @@ export default { pageNo: 1 }) that.getLockList(that.lockSearch) - uni.navigateBack({ - delta: 2, - complete: () => { - uni.showToast({ - title: '删除成功', - icon: 'none' - }) - } - }) + that.backAndToast('删除成功', 2) uni.navigateBack() } else { uni.hideLoading() diff --git a/pages/updateEmail/updateEmail.vue b/pages/updateEmail/updateEmail.vue index cc45226..59136d1 100644 --- a/pages/updateEmail/updateEmail.vue +++ b/pages/updateEmail/updateEmail.vue @@ -42,7 +42,7 @@ export default { }, methods: { ...mapActions(useUserStore, ['updateUserInfo']), - ...mapActions(useBasicStore, ['routeJump']), + ...mapActions(useBasicStore, ['routeJump', 'backAndToast']), updateInputEmail(data) { this.email = data.detail.value }, @@ -100,14 +100,7 @@ export default { ...this.userInfo, email: this.email }) - uni.navigateBack({ - complete () { - uni.showToast({ - title: '邮箱更新成功', - icon: 'none' - }) - } - }) + this.backAndToast('邮箱绑定成功') } else { uni.showToast({ title: message, diff --git a/pages/updateName/updateName.vue b/pages/updateName/updateName.vue index 97f7538..572c12b 100644 --- a/pages/updateName/updateName.vue +++ b/pages/updateName/updateName.vue @@ -10,6 +10,7 @@ import { mapActions, mapState } from 'pinia' import { useUserStore } from '@/stores/user' import { updateUserInfoRequest } from '@/api/user' +import { useBasicStore } from '@/stores/basic' export default { data() { @@ -26,6 +27,7 @@ export default { }, methods: { ...mapActions(useUserStore, ['updateUserInfo']), + ...mapActions(useBasicStore, ['backAndToast']), updateInput(data) { this.nickname = data.detail.value console.log(data) @@ -50,14 +52,7 @@ export default { ...this.userInfo, nickname: this.nickname }) - uni.navigateBack({ - complete() { - uni.showToast({ - title: '昵称更新成功', - icon: 'none' - }) - } - }) + this.backAndToast('昵称更新成功') } else { uni.showToast({ title: '昵称更新失败', diff --git a/pages/updatePassword/updatePassword.vue b/pages/updatePassword/updatePassword.vue index e07943e..87e9317 100644 --- a/pages/updatePassword/updatePassword.vue +++ b/pages/updatePassword/updatePassword.vue @@ -17,6 +17,7 @@ import { mapActions, mapState } from 'pinia' import { useUserStore } from '@/stores/user' import { changePasswordRequest, getEmailCodeRequest, updatePasswordRequest } from '@/api/user' import { test } from 'uview-plus' +import { useBasicStore } from '@/stores/basic' export default { data () { @@ -32,6 +33,7 @@ export default { }, methods: { ...mapActions(useUserStore, ['updateUserInfo']), + ...mapActions(useBasicStore, ['backAndToast']), updateNewPassword (data) { this.password = data.detail.value }, @@ -100,18 +102,7 @@ export default { channel: '1' }) if (code === 0) { - this.updateUserInfo({ - ...this.userInfo, - nickname: this.nickname - }) - uni.navigateBack({ - complete () { - uni.showToast({ - title: '密码重置成功', - icon: 'none' - }) - } - }) + this.backAndToast('密码重置成功') } else { uni.showToast({ title: message, diff --git a/pages/updateSafeQuestion/updateSafeQuestion.vue b/pages/updateSafeQuestion/updateSafeQuestion.vue index 53d323f..40bbf71 100644 --- a/pages/updateSafeQuestion/updateSafeQuestion.vue +++ b/pages/updateSafeQuestion/updateSafeQuestion.vue @@ -46,6 +46,7 @@ import { getQuestionAnswerRequest, getQuestionListRequest, updateQuestionAnswerRequest } from '@/api/safeAnswer' import { mapActions, mapState } from 'pinia' import { useUserStore } from '@/stores/user' +import { useBasicStore } from '@/stores/basic' export default { data() { @@ -75,6 +76,7 @@ export default { }, methods: { ...mapActions(useUserStore, ['updateUserInfo']), + ...mapActions(useBasicStore, ['backAndToast']), async updateAnswer() { console.log('答案', this.answer) for(let i = 0; i < this.answer.length; i++) { @@ -107,14 +109,7 @@ export default { ...this.userInfo, haveSafeAnswer: 1 }) - uni.navigateBack({ - complete() { - uni.showToast({ - title: '安全问题设置成功', - icon: 'none' - }) - } - }) + this.backAndToast('设置成功') } else { uni.showToast({ title: message, diff --git a/pages/userInfo/userInfo.vue b/pages/userInfo/userInfo.vue index dcda414..2d9e32b 100644 --- a/pages/userInfo/userInfo.vue +++ b/pages/userInfo/userInfo.vue @@ -82,9 +82,9 @@ export default { }, methods: { ...mapActions(useBasicStore, ['routeJump']), - ...mapActions(useUserStore, ['updateUserInfo', 'checkSession']), + ...mapActions(useUserStore, ['updateUserInfo', 'checkSession', 'getUserInfo']), async rebindPhone(detail) { - if(data.detail.errMsg === 'getPhoneNumber:fail user deny') { + if(detail.detail.errMsg === 'getPhoneNumber:fail user deny') { return } if(this.pending) { @@ -98,12 +98,13 @@ export default { iv: detail.detail.iv }) if(code === 0) { - this.updateUserInfo({ - ...this.userInfo, - mobile: data.mobile - }) + this.getUserInfo() + // this.updateUserInfo({ + // ...this.userInfo, + // mobile: data.mobile + // }) uni.showToast({ - title: '手机号换绑成功', + title: '更换成功', icon: 'none' }) } else { @@ -113,10 +114,7 @@ export default { }) } } else { - uni.showToast({ - title: '手机号换绑失败,请重试', - icon: 'none' - }) + this.rebindPhone() } this.pending = false }, diff --git a/pages/verifyEmail/verifyEmail.vue b/pages/verifyEmail/verifyEmail.vue index d041c40..4a86fb4 100644 --- a/pages/verifyEmail/verifyEmail.vue +++ b/pages/verifyEmail/verifyEmail.vue @@ -87,37 +87,6 @@ export default { }, updateInput(data) { this.verificationCode = data.detail.value - }, - async updateName() { - if(this.nickname === '') { - uni.showToast({ - title: '昵称不能为空', - icon: 'none' - }) - return - } - const { code } = await updateUserInfoRequest({ - nickname: this.nickname - }) - if(code === 0) { - this.updateUserInfo({ - ...this.userInfo, - nickname: this.nickname - }) - uni.navigateBack({ - complete() { - uni.showToast({ - title: '昵称更新成功', - icon: 'none' - }) - } - }) - } else { - uni.showToast({ - title: '昵称更新失败', - icon: 'none' - }) - } } } } diff --git a/stores/basic.js b/stores/basic.js index b2e34b6..628309e 100644 --- a/stores/basic.js +++ b/stores/basic.js @@ -181,6 +181,21 @@ export const useBasicStore = defineStore('basic', { } } return totalWidth + }, + // 回退页面并弹出toast提示 + backAndToast(message, delta = 1) { + const that = this + uni.navigateBack({ + delta: delta, + complete: function () { + setTimeout(() => { + uni.showToast({ + title: message, + icon: 'none' + }) + }, 200) + } + }) } } }) From 1cc09adb597b16b30eeb54c97f7bd399b0579aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Thu, 29 Aug 2024 17:58:41 +0800 Subject: [PATCH 12/27] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=89=E5=8D=93?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=9B=9E=E9=80=80toast=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 12 ++++++------ stores/bluetooth.js | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest.json b/manifest.json index 35562d9..e7753ea 100644 --- a/manifest.json +++ b/manifest.json @@ -12,15 +12,15 @@ "urlCheck" : true, "minified" : true }, - "permission": { - "scope.bluetooth": { - "desc": "蓝牙将用于控制和管理您的智能门锁" + "permission" : { + "scope.bluetooth" : { + "desc" : "蓝牙将用于控制和管理您的智能门锁" }, - "scope.userLocation": { - "desc": "获取您的位置信息将用于智能门锁的位置服务" + "scope.userLocation" : { + "desc" : "获取您的位置信息将用于智能门锁的位置服务" } }, - "requiredPrivateInfos": ["getLocation"], + "requiredPrivateInfos" : [ "getLocation" ], "usingComponents" : true, "lazyCodeLoading" : "requiredComponents" }, diff --git a/stores/bluetooth.js b/stores/bluetooth.js index 33a66f1..98c72b1 100644 --- a/stores/bluetooth.js +++ b/stores/bluetooth.js @@ -622,9 +622,9 @@ export const useBluetoothStore = defineStore('ble', { timer2 = setTimeout(() => { setTimeout(() => { uni.stopBluetoothDevicesDiscovery() - clearInterval(timer) - }, 7000) - timer = setInterval(() => { + clearInterval(timer1) + }, 10000) + timer1 = setInterval(() => { uni.getBluetoothDevices({ success(res) { const deviceList = res.devices From ed3e3115e3ae9fce00eee1806ebd8f58463ba88d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Thu, 29 Aug 2024 19:42:52 +0800 Subject: [PATCH 13/27] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=99=84=E8=BF=91?= =?UTF-8?q?=E7=9A=84=E8=AE=BE=E5=A4=87=E6=9D=83=E9=99=90=E6=9C=AA=E5=BC=80?= =?UTF-8?q?=E5=90=AF=E7=9A=84=E6=8A=A5=E9=94=99=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 2 +- stores/bluetooth.js | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/App.vue b/App.vue index 14cd9b0..6758c35 100644 --- a/App.vue +++ b/App.vue @@ -24,7 +24,7 @@ const checkResult = await this.checkSetting() console.log(checkResult) if(checkResult === true) { - this.initAndListenBluetooth() + this.initAndListenBluetooth(false) } }, onShow() { diff --git a/stores/bluetooth.js b/stores/bluetooth.js index 98c72b1..b39891b 100644 --- a/stores/bluetooth.js +++ b/stores/bluetooth.js @@ -91,9 +91,9 @@ export const useBluetoothStore = defineStore('ble', { return { code, data, message } }, // 初始化并监听 - async initAndListenBluetooth() { + async initAndListenBluetooth(tipFlag) { // 初始化蓝牙 - const initResult = await this.initBluetooth() + const initResult = await this.initBluetooth(tipFlag) if (initResult) { // 更新蓝牙初始化状态 this.updateInitBluetooth(true) @@ -114,7 +114,7 @@ export const useBluetoothStore = defineStore('ble', { this.isInitBluetooth = value }, // 初始化蓝牙模块 - initBluetooth() { + initBluetooth(tipFlag = true) { const that = this // 初始化蓝牙模块 return new Promise(resolve => { @@ -147,6 +147,14 @@ export const useBluetoothStore = defineStore('ble', { resolve(true) return } + if(err.errno === 3 && tipFlag) { + uni.showModal({ + title: '提示', + content: '蓝牙功能需要附近设备权限,请前往设置开启微信的附近设备权限后再试', + showCancel: false, + confirmText: '确定', + }) + } resolve(false) } }) From 01950eaf3325b3e791d75bd040f3740c6ac888aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Thu, 29 Aug 2024 20:08:06 +0800 Subject: [PATCH 14/27] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=95=BF=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=BA=E6=90=9C=E7=B4=A2=E5=88=B0=E9=99=84=E8=BF=91?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- stores/bluetooth.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/stores/bluetooth.js b/stores/bluetooth.js index b39891b..e257ad1 100644 --- a/stores/bluetooth.js +++ b/stores/bluetooth.js @@ -12,6 +12,10 @@ import { getUserNoListRequest, updateLockUserNoRequest } from '@/api/key' let timer // 特性值回调 let characteristicValueCallback = null +// 搜索次数 +let searchNumber = 10 +// 搜索提示标志 +let searchTipFlag = true // 命令ID const cmdIds = { @@ -413,7 +417,21 @@ export const useBluetoothStore = defineStore('ble', { timer = setInterval(() => { uni.getBluetoothDevices({ success(res) { + searchNumber-- + if(searchNumber === 0 && searchTipFlag) { + uni.showModal({ + title: '提示', + content: '长时间未搜索到任何设备,请确认微信的附近设备权限开启后再试', + showCancel: false, + success() { + uni.navigateBack() + } + }) + } const deviceList = res.devices + if(deviceList.length !== 0) { + searchTipFlag = false + } that.deviceList = [] for(let i = 0; i < deviceList.length; i++) { if(deviceList[i]?.advertisServiceUUIDs) { @@ -437,6 +455,8 @@ export const useBluetoothStore = defineStore('ble', { }, // 停止搜索蓝牙设备 stopGetBluetoothDevices() { + searchNumber = 10 + searchTipFlag = true clearInterval(timer) uni.stopBluetoothDevicesDiscovery() }, @@ -624,11 +644,20 @@ export const useBluetoothStore = defineStore('ble', { const that = this let timer1 let timer2 + const flag = true return new Promise((resolve) => { uni.startBluetoothDevicesDiscovery({ success: function (res) { timer2 = setTimeout(() => { setTimeout(() => { + if(flag) { + uni.showModal({ + title: '提示', + content: '长时间未搜索到任何设备,请确认微信的附近设备权限开启后再试', + showCancel: false, + confirmText: '确定', + }) + } uni.stopBluetoothDevicesDiscovery() clearInterval(timer1) }, 10000) @@ -636,6 +665,9 @@ export const useBluetoothStore = defineStore('ble', { uni.getBluetoothDevices({ success(res) { const deviceList = res.devices + if(deviceList.length !== 0) { + flag = false + } for(let i = 0; i < deviceList.length; i++) { if(deviceList[i]?.name === that.currentLockInfo.name) { const uuid = deviceList[i]?.advertisServiceUUIDs[0] From e97763af57ef8a943c91d23e484cb6a3b877f1e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Fri, 30 Aug 2024 10:28:06 +0800 Subject: [PATCH 15/27] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=AF=B7=E6=B1=82=E9=A1=BA=E5=BA=8F=EF=BC=8C?= =?UTF-8?q?=E5=87=8F=E7=9F=ADloading=E6=97=B6=E9=97=B4=202.=20=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=89=88=E6=9C=AC=E5=B9=B6?= =?UTF-8?q?=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.vue | 4 +++- pages/home/home.vue | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/App.vue b/App.vue index 6758c35..233307e 100644 --- a/App.vue +++ b/App.vue @@ -12,7 +12,9 @@ useUserStore().updateLoginStatus(isLogin) }, // 账号信息 - appid: '' + appid: '', + // 小程序版本 + envVersion: '' }, computed: { ...mapState(useBluetoothStore, ['bluetoothStatus']), diff --git a/pages/home/home.vue b/pages/home/home.vue index 62a817f..f086431 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -89,12 +89,13 @@ }) const accountInfo = wx.getAccountInfoSync() getApp().globalData.appid = accountInfo.miniProgram.appId + getApp().globalData.envVersion = accountInfo.miniProgram.envVersion this.deviceInfo = await this.getDeviceInfo() const token = uni.getStorageSync('token') if(token) { + this.getLockList(this.lockSearch) await this.getUserInfo() - await this.getLockList(this.lockSearch) } else { await this.homeLogin() } @@ -121,8 +122,8 @@ uni.setStorageSync('openid', data.openid) if(data.accessToken) { uni.setStorageSync('token', data.accessToken) - that.getUserInfo() that.getLockList(that.lockSearch) + await that.getUserInfo() that.updateLoginStatus(true) resolve(true) } else { From 2a55f76d6aa5951c1b4f47f3eff5294f704ad514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8C=83=E9=B9=8F?= Date: Fri, 30 Aug 2024 10:48:30 +0800 Subject: [PATCH 16/27] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=E6=80=A7=E6=96=87=E6=A1=88=202.=20=E4=BF=AE=E5=A4=8D=E5=BC=80?= =?UTF-8?q?=E5=85=B3=E9=97=A8bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/home/home.vue | 10 +++++++++- pages/mine/mine.vue | 10 +++++++++- pages/verifyEmail/verifyEmail.vue | 7 +++++++ stores/bluetooth.js | 22 ++++------------------ 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/pages/home/home.vue b/pages/home/home.vue index f086431..85217a7 100644 --- a/pages/home/home.vue +++ b/pages/home/home.vue @@ -50,6 +50,7 @@ class="button-add" @click="toSearchDevice"> + 因智能门锁与账号绑定,登录为手机号登录 @@ -263,7 +264,6 @@ page { } .button-login { - margin-top: 40vh; border-radius: 46rpx; width: 650rpx; height: 120rpx; @@ -388,4 +388,12 @@ page { margin-top: 32rpx; font-weight: bold; } + +.tips { + margin-top: 40vh; + padding: 32rpx 0; + text-align: center; + font-size: 28rpx; + color: #999999; +} diff --git a/pages/mine/mine.vue b/pages/mine/mine.vue index a1fbc73..0a09a9d 100644 --- a/pages/mine/mine.vue +++ b/pages/mine/mine.vue @@ -37,6 +37,7 @@ 退出 + 因智能门锁与账号绑定,登录为手机号登录 @@ -232,7 +233,6 @@ page { } .button-login { - margin-top: 40vh; border-radius: 46rpx; width: 650rpx; height: 120rpx; @@ -244,4 +244,12 @@ page { font-size: 48rpx; font-weight: bold; } + +.tips { + margin-top: 35vh; + padding: 32rpx 0; + text-align: center; + font-size: 28rpx; + color: #999999; +} diff --git a/pages/verifyEmail/verifyEmail.vue b/pages/verifyEmail/verifyEmail.vue index 4a86fb4..a0740ef 100644 --- a/pages/verifyEmail/verifyEmail.vue +++ b/pages/verifyEmail/verifyEmail.vue @@ -1,5 +1,6 @@