From 121fc5ea19760119ba607704dc73081e553c4ec2 Mon Sep 17 00:00:00 2001 From: leilei Date: Wed, 24 Sep 2025 17:51:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E8=B7=9F=E6=96=B0=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E6=9E=B6=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 9 + package.json | 1 + src/api/coordinate.js | 19 + src/api/login.js | 2 +- src/assets/images/cooponents-tab1.png | Bin 0 -> 2495 bytes src/assets/images/cooponents-tab2.png | Bin 0 -> 2555 bytes src/assets/images/cooponents-tab3.png | Bin 0 -> 1612 bytes src/assets/images/cooponents-tab4.png | Bin 0 -> 1630 bytes src/assets/images/profile.jpg | Bin 0 -> 14964 bytes src/assets/images/user-information1.png | Bin 0 -> 1940 bytes src/assets/images/user-information2.png | Bin 0 -> 535 bytes src/assets/images/user-information3.png | Bin 0 -> 939 bytes src/assets/images/user-information4.png | Bin 0 -> 1044 bytes src/assets/images/userlist-icon1.png | Bin 0 -> 676 bytes src/assets/images/userlist-icon2.png | Bin 0 -> 777 bytes src/router/index.js | 10 + src/utils/mqtt.js | 7 +- src/utils/request.js | 10 + src/utils/whiteboardSync.js | 19 +- .../components/leftTab/index.vue | 596 ++++++++++++++ src/views/coordinate/personnelList/index.vue | 755 ++++++++++++++++++ src/views/login.vue | 3 +- 22 files changed, 1418 insertions(+), 13 deletions(-) create mode 100644 src/api/coordinate.js create mode 100644 src/assets/images/cooponents-tab1.png create mode 100644 src/assets/images/cooponents-tab2.png create mode 100644 src/assets/images/cooponents-tab3.png create mode 100644 src/assets/images/cooponents-tab4.png create mode 100644 src/assets/images/profile.jpg create mode 100644 src/assets/images/user-information1.png create mode 100644 src/assets/images/user-information2.png create mode 100644 src/assets/images/user-information3.png create mode 100644 src/assets/images/user-information4.png create mode 100644 src/assets/images/userlist-icon1.png create mode 100644 src/assets/images/userlist-icon2.png create mode 100644 src/views/coordinate/personnelList/components/leftTab/index.vue create mode 100644 src/views/coordinate/personnelList/index.vue diff --git a/package-lock.json b/package-lock.json index 5075944..42fb52f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "@element-plus/icons-vue": "^2.0.10", + "@msgpack/msgpack": "^3.1.2", "autoprefixer": "^10.4.21", "axios": "^0.27.2", "code-inspector-plugin": "^0.20.12", @@ -602,6 +603,14 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@msgpack/msgpack": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@msgpack/msgpack/-/msgpack-3.1.2.tgz", + "integrity": "sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==", + "engines": { + "node": ">= 18" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", diff --git a/package.json b/package.json index 4d3ec57..54fbabe 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@element-plus/icons-vue": "^2.0.10", + "@msgpack/msgpack": "^3.1.2", "autoprefixer": "^10.4.21", "axios": "^0.27.2", "code-inspector-plugin": "^0.20.12", diff --git a/src/api/coordinate.js b/src/api/coordinate.js new file mode 100644 index 0000000..d5cb84f --- /dev/null +++ b/src/api/coordinate.js @@ -0,0 +1,19 @@ +import request from '@/utils/request' + +// 获取组织列表 +export function getDirectories(data) { + return request({ + url: `/api/v1/auth/directories`, + method: 'get', + params:data + }) +} + +// 获取指定目录下的用户列表 +export function getDirectoriesUsers(directory_uuid,data) { + return request({ + url: `/api/v1/auth/directories/${directory_uuid}/users`, + method: 'get', + params:data + }) +} \ No newline at end of file diff --git a/src/api/login.js b/src/api/login.js index adc2381..f4ba5c9 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -22,7 +22,7 @@ export function login(username, password) { // 获取用户详细信息 export function getInfo(userUid) { return request({ - url: `/api/v1/auth/user/${userUid}`, + url: `/api/v1/auth/users/${userUid}`, method: 'get' }) } diff --git a/src/assets/images/cooponents-tab1.png b/src/assets/images/cooponents-tab1.png new file mode 100644 index 0000000000000000000000000000000000000000..4a07fa49448c7160f428e51425c18d5d9de93c57 GIT binary patch literal 2495 zcmds3{W}wS8~<*zjT!1eVmUMk^U_**Jv%jWI8!uCQ)79VtQSsXIkMW0q7vzeHMldF#s`QJhnq0Co0!>yG7IpyQ-0xCK-jRT+-M|O3l{=%5bJL;=LUYC>}T9bs) zan*6Y=8L4DPrugS*55IxE1W3jVQ+4NVWTzCEoh8m65-E}zr{O+0Tn;CnB;-vkmM#V9~3o^5di zDlj)?ncL{aQ$Q7wf&(D6O=}FSLvQp0z~F{a2gG=HT>+Kti6XWMe5iRC=hOxvVQT~AlnJEZiY0p=L?h8q(M$o6-qhfn{x zQP%6Ijc+tfOVjX)ii%sIjERY@f8~e3qQ)}`H*x|BVScOsc=^fwCw_%N65=4 z2mE~mVBSscLxHv}uz#HT;)Bd+|L8g=m5Lqf+3Fy9-OJSG%Q+Yr zi$e8VyHt1&4fD0&z0ya*+g6#KYsP1@WUlqA?DVTws|#5PmO$Kzqoop5C}@ zoBKQ08=;*d@Ep!>JT1TRUENS%2*oq}$d?NvXR-qt4I1Ot$P>NmfD<(6pp{!_@d}l( zx^mjmkWR0cFDsA{G#6lAe!;CCAKCN(Q7^0&cF;CBb=t#7hfQbl>iwE zu_IdIy$d!h^P|EAont480zNx%A1@3UPsOL+-3pZ?>|H$ToI7|y9w2t1*&Ie^j8873 zUUcX+wyFX&HS?}nzsk_Nei+rT5}jdT?|{mi%5}N z9>KRgsT4RbYoMBPMzJ)rgw$t76Tey#){>3`NkY4x2B@{P5JS`mjE20DN(|jO(}8Uh z+4OBb9q%3!Uz7If*hpjbySIbIT!z1~8J)C;7Ap^7Q>&c^1aSqu|oQv#(Q+QZnh&T8%C%uPLt12^Wb_e$zq0{w?_g^Cc9Ug=}*XY~&a z-2VRfjDUXr=!ZIyA>J$$!ZT>PZewW2GaDI3yx%Qi-RjnF8)YJeg4(z~2x(iQ%X~c< z?D=UrKo4}qz%QwSVaj!Hbc;&WLn}8nyZ2H5+=3#&>cHZhaNaz(`1$+wGceV)$?Dqs zd$Ua%3O2OpcA1}%noks#=i%J%p?(*zy?US$M3-(R7Zfv{vm!rktxb;B{@Sx5HhgRDnx#(+Y4AFx?RrDa&cg!TW z;A1B1=)x5(zjJv|ppG4>ypnZBySZ{;KH_3qxin2>0z==q-BE8|ga#|6+pKrANZ+iy6qFy=nUfBI~e)fg?TdkA+YGBb%7Rq=7X5$BQVXuWX^YTb!&MSdDI4NJ8 zgH3wb33%tI+RxRrB{`oQQnyB4ve#E_rV)bYf2q%uZ~XME6~e#X6FpJ|tgNjI>x*H- zr!lkW9;@0^BzH5F4M={i7rq2T9J*d-%cwyuf6b*bm3JdL82BHic@|%0c`e^uh9nk)`$xJ;Kd z%&5$0SEZg`LvrL_G2Sdd*^3xUSP}uH_o=6(xLn~|=U_ioi(F>`=@$w8K76NVT z(#Eq}IcY~LA)rAA^?tex%v#zHhJ?-e2QIlyZw)8zQQ_tPYuug!uUfaV8WY}%Ik;dq zX$$x_T{bTV>Pq6prk8d<2%2*s5{oYGf4HOuC8?K{qJ~!DO&;ZXMSRy6pxjRRXERk` zU0Q_W4ZJf(o&ULo0aI>}PP5Dpg5E6X3IHTepS@gU_lI4Cb|}g77L-Q_hVb{9g;@gg zbTnv-@ewJhXUc2*4^xr8O;b302W{wBygEDfzPnpV(L4D}lunVNy9A4h({*zD9QL&Q zd@%tFGmcFew$tTMFe5Q=Tw6PfbK=@O-PBwE-;itYQQu&W6MBROuL)=W_h*^z7XW71 z0&ns8K(xSBYG`F-HdMh76-<8bdGRUaDfz_TpE8?k{){O<7rV!v=qw$h+r&ms)x0|P zu%J*z#H#US%{`Wu;$|7)p;3xOJqK7X^= RLQy(0K>pFowZbJR;Xi$fMNR+! literal 0 HcmV?d00001 diff --git a/src/assets/images/cooponents-tab2.png b/src/assets/images/cooponents-tab2.png new file mode 100644 index 0000000000000000000000000000000000000000..d577d75bdb03dc07769b105648984ebacbbf98a8 GIT binary patch literal 2555 zcmds3`8(7L7oV9XjFDk9*^}%`5*cI3NCqPb*~)%HB1@rkZC|?92U-~$fGP&WzJfro8oc2}>k#L)+{kh}5Akl7EQ#n-MTzN; z3jwVfv;4S@yEs*u)osqprUH@WziGhK+~&`xkH25c>H8G4&zo!Cj~%jdY|s(AiAoGS z)mMTcJhkRhGCAG65kS39Rf)h3{>oX>U3$;n4aG8-x*1LPTjK)4vvq_gyD8+hq4E36xjhJMbR9h* zW~jhHU3kP!>}Mi9rA&xsjD&^%{l<^Z;o%xa6wy{5s`&vOB|cKe@qF1?fPThN_~+FDV908d!aA1NvkRo z=-09ifNsc1!Qr4!g#&Z$k3GBBznI2}Lb9^FIV!asR z5f3dWPw#BxH?{I9?x}$1BHBWK82ostxzg0s3qaX?8f6 zWogH}CZq<6z#Lu7gYU63(f!V%sle@DFK$$tQnC(s1hKA>vJXb&Lw<4#Y4@B@GQc6p ze6{y3*>DNzc}``uZ|~Vrvge)<M*~3Z-P7H zDfCW%u?4RC)@*iL?ehDySq+<(p$53|=BJ#uFJ zt9eg5DuC)uHx$f6P+gXNUe{Gam5I04pt@`{t@^X(aFr3|+qW=Z6Uyc<@#;=(C-BwX zb4>?P{+q^#XiY)(WD2nG%_kPOKARb&L;P1+SI+N( z9)2}$K?faGCb~#f0QBp;t&Yr>yVUNs=B%Ip>7k_A*2fv1b}(k6x)$UjiX?|cB=M2U z;6>9D&8+;MjW`19Q_gt@I77#kp#EFWzrNZ92>I0`!uE6dYP*xPI3zd*2cp!IpWr8a zWb$)utUW$Md14|x)gAX$cLRyOiU~gwJgR2eNAG;cl}fwvd&isQ`gML6Ti>ahad_6w zV21BX8zExYXXEb5iO4eK2>@@12d>Qi=}=&~TMWx(_Z2&9LxLWApaSRdf5uhj(tdVY zNw&}hF4QFr?tRxYY(56r7F)^Nt2E72ajK7dR4`q{_$cx897S57AI9F-M4ruUMHl6=Sql*lB(H^sREnq;N{i3U& zV+2K({}UNlQVBRr$8=TniGx_S zxbEAHnX8oRB-FlK$k;?c|3lUX$#H9jHjMVd^3~%Uhrre8142WH%%?__at1`?^o|0!S6Ao4{Q^st!2icq--$>3)aEfDthqsgQ9Rl9j57B{9k&?~0zX z9VhlVFBVf7EPy0yyq-tBg~U7fxh1f*CDaFE6Fh59zB-h){6kzhAmA6%Kd`rNb#QZPhg-oU#ZeY@~BFyWO?B9cs&Oi1XT7CC%MJj-H|3{>DG%D@tqh#@WQGefxMYG0p zp@xDJMFm=K=GIwQ|3q|_u2~xMk!fzhxy`@1s zGsvWMnk%+WqrVOnh(eh%a1qe#t3R@VTzsv}Kw?p|=QUk(7C zqzSmLyL(BD?ww4oMWTOHbbLq@zC=^L(1g6R;91`+P`maRPbJk7Amf}wqc1Y2z|GK% z2mC33N*H%2%tZg}#RVs*bUvKe?hHW=UAA~A2!<`UlgL>BbPH)cjnjuTuoPDRU&^8m ZKz{^}s+?|x&mDeqAUw|8u)@GK`rpU&tlj_s literal 0 HcmV?d00001 diff --git a/src/assets/images/cooponents-tab3.png b/src/assets/images/cooponents-tab3.png new file mode 100644 index 0000000000000000000000000000000000000000..2559afc32fcddae3ad22f9ce4fad4a488177e2a1 GIT binary patch literal 1612 zcmc(gdrZ>@5XbM=A1@IKiz35Vi*uP~s1R{kZM7|;)Fw&+DRc!&4GNAePGMkqv{a`u z)D)*qbPC1Cc+(bZ6P~q-Z&>RKDu{|aWVAd)p!C-ky6(>v%MGVPLK02deL=8$LsZ}j3aNiuuk z;c=38sCU1@{~M>RP66i>P7Al5VxA&wGCie5Yrj!&O1Pi)RsnQtPeQ5HNJ*pOsTceJ}{0N{?Mkl>cM1A*(^x_xjMsYYRs zO8N%e&=^;EluBzwyj^PWP}(6niu!wS2tco%^>C$ssvv_n#_ER`2k|oiYE8jQV5jE) zF33R5b4nF2_gW`|STj9UYxgqB^E$J!Hg2FO-l%__axmPYB@fP??aNO;&Vj&_wkeD| zuHL8|D!ie$m|rBh=}g7jb=KNS;@-hJ5ZSx9QjtJgLKN|g*nt`SN};auJ~moF+^edC zIn(q7`-u9%^){(=M&0;2>UTNi^NhLMUaA>cBM0oZu(*lhz;XEwYig>E%@Ec5;7Tb6 z19YzR$NcH5=tod~aE#0HYjw1NUOg?%=5dnL%=>EJv!+Rf2 zA`$C24QtNFQ&tM^_>AmcKa+nA)V>jCB#0u-&HxT^zv&R1D`vHjp{9_O69VnpavlLX85djp zA$e$r91q6jTAnv3Co5xpJ$nc4L=HN)Ghg5Pt=S>Co&!2HnI?3e{XQ{;zC1a#}2|gib zeM`?WQysZs#d7l{ZFi(^4sMJiS&HF-FAD2$M-=2&wm}G@T}eFx9KsKCX>d*&soDfJ zlCSgDL%Xhmy9{FPUAVCX-ljy?dP8;pABlLF46cfC6L(C!4RjS_e(V4zjX^M3glcRj zs(ivwQr7FPk-CGnx7PT$2mLot@05rsXRk2S=zkUu$IocS+K`X6n~zZ5=G$xP VCEA&~GmiHF%q`)YWt;ei{sN1M`^^9V literal 0 HcmV?d00001 diff --git a/src/assets/images/cooponents-tab4.png b/src/assets/images/cooponents-tab4.png new file mode 100644 index 0000000000000000000000000000000000000000..9244574a19ad3c85f9bbff8b255701f729ba2018 GIT binary patch literal 1630 zcmd5-c}&xH6#xEO$|X{q5egHlpwWnc0S_+Ap@O)KOVV<+l!2{MHXN*S6tE(bX*oQ? z;YI;%P_)p3P=-uuv4RY+IA;Z`A_cKfD6AZ%m$>?eOP1|lv;FbjCwa-|y-z;xCGT8V zNYH9?J97ZQ>fl2MA`DpjAxw=8nK4LqHUN|!5flJ8qV-b%7^8v@_(x_E6jfae8=O@^ z&`G3&k@cAyRrwWk(}25X<}1?EMrlW^0tAfA`OOy*2OZi`d7i&s(`Cz-Nw?ZGs=Kf7 z_$8(F$iPf7vWA}%t?q&@!}o&6Z+sHpXBcL6$pMH_kUhYCx)=hjlED+80AjR}pXh<9bv3Sh9eJ5{-F`*yleIW{IJAsEd*P{Oo$u3;7Wr3@UQsH0 zQWA=OpM8`m!F{$iY}dTdc@21Fmg0j32hWHvCnvQ_aB)Jy9z*@Y+Q&>m&jJ*-D{9}( zz_aY!?%gv-9erQIJfV+-vgu2GyfaU5aa{zgQt0faGKzF5axN}o#bh1#%Tg1jrY!@RT=iAakKs0}M~e_s7Zm`I zWWN*aL0hQ@%^wViZghHq6!f>Md{D^@rBT5!W^4ul?ewlu$w5=@gXgPY#FH3>7$WL^ zXt6O8%;ZSeaDi$K+0~T(T+@m(p(`9k1S`<8aGdL6C+K6a`c_qz@rQP2bt7e*4+5!t zt+`gh7o8}%f?pc1v~^ETgd#B;ZsioP7MTgHte|dWA%{!ufz{_=qBR!b2F=0Dc;$Y@ zKDLXs-;yt?2=f4|6S?KgVH|x`&(gCtfR44pnHX^1n7vipdxFPpKiiq|rZ9Hn)>`k= z#WHy9v8L>ZVhfz^JY~2)Fs~hv2Kz{G8ro7uF{$IW=XW-Y6~-pbnAOLja4v+uuQE>8 z+n}91{`KqVz`0j9KZ>^m3+~B{Rv`A_Pxsb?x8$cWn?PI1-cz1nV6dJS08;EzSJFUbO*rLyFzhv= zp8z|3SHKSaz6Y+MH;PG>Guzy!tH43wp=nwF&VBDUY(x4(hRoOgkmxKBefm-BV;&z z7;W$t0}=KPY0N@4i}@`UuYVcrE$v*2t2Uv}8tth@(yw*NgLk{dDV#V7uAgh9*1cwv zA;fVF*k;#I9qA|(^T+H|w=bfoYVzsK d{$C7`o^q(9bbhDJzHfLKAoyU&0Zsrh|4$nx{qFz( literal 0 HcmV?d00001 diff --git a/src/assets/images/profile.jpg b/src/assets/images/profile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..996f6400e0f21763ff31f085fdcbbddde1923a69 GIT binary patch literal 14964 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 ZuWuwSxj=#g^o;-j002ovPDHLkV1khn+ynps literal 0 HcmV?d00001 diff --git a/src/assets/images/user-information3.png b/src/assets/images/user-information3.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac457345caf8f5452f4c9e0a09218437f880562 GIT binary patch literal 939 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 KMNUMnLSTYv^)h+@ literal 0 HcmV?d00001 diff --git a/src/assets/images/userlist-icon2.png b/src/assets/images/userlist-icon2.png new file mode 100644 index 0000000000000000000000000000000000000000..66b08e047ca50c4daf75b9f7bc9e5547b780cd19 GIT binary patch literal 777 zcmV+k1NQuhP)Px%!%0LzR9Hvtm(A-gcVu)6-y}+ zB@0ScY_KD2tO$vSEWDhrW@?N%_ntZPOx;_iPUoJPxpO}Ao$s0FnF+?MOpF;X|AC_w zn+B`|-UDxdcfik*RjsM;bl@tmIRN|tymj!JKzzM+b-I5^O{^Ah3N}aBU%(|`Z~Uhk zz=FL7Y|0@_^cD0h;B(k!4V+T;F|Y%e2`q5eLSR0iyRXw-fMHn*Jg)`Z2D=XU&{6F< zQQuX-{Tjd)u%7EI0K!Q#P0ZoCJ0`1s?)Ofd`RY z?g6rb%4y)36>yHSQgLpY>eX`p3+Wxz}K^>1^bSd;K&kBf48R_G4fva+>4%6f=JjW3@9QyugtV4iD~1r7wj z8=MtXrQAdB)%{QD>fyf1hN~&%E;wjkFaIhz`Wkdx?yTUeq_C9k3~T`#D!o0})@~-! z&BefrU;^^6yxa-6#0H_dU4PF7?nEEjdRI3Tcobl70b8B#2Lg{IY}-dSval&&oxzlR zhsT<>+@Py32lY#N_8%LB1H{{!vZO~*LRvPTtIOW+V% zC*i-2HMu?=)W6ij@z_g%SK%4V64qK_YqsQg)(TgL9y{RQ7J}g|sj54100000NkvXX Hu0mjfgN9;z literal 0 HcmV?d00001 diff --git a/src/router/index.js b/src/router/index.js index d28b7d2..ae93e0d 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -20,6 +20,16 @@ const router = createRouter({ path: "/login", component: () => import("@/views/login.vue"), }, + { + path: "/coordinate", + children: [ + { + path: '', + name: "Coordinate", + component: () => import("@/views/coordinate/personnelList/index.vue") + } + ] + }, // 错误页面路由 { path: "/:pathMatch(.*)*", diff --git a/src/utils/mqtt.js b/src/utils/mqtt.js index 0bb9795..29d9a48 100644 --- a/src/utils/mqtt.js +++ b/src/utils/mqtt.js @@ -33,13 +33,14 @@ class MQTTClient { this.client.on("error", (error) => reject(error)) // 消息分发 - this.client.on("message", (topic, payload) => { + this.client.on("message", (topic, payload) => { try { - const message = JSON.parse(payload.toString()) + // const message = JSON.parse(payload.toString()) // 遍历所有订阅主题,执行通配符匹配 this.messageHandlers.forEach((handlers, subTopic) => { if (this.topicMatch(subTopic, topic)) { - handlers.forEach((handler) => handler(message, topic)) + // handlers.forEach((handler) => handler(message, topic)) + handlers.forEach((handler) => handler(payload, topic)) } }) } catch (err) { diff --git a/src/utils/request.js b/src/utils/request.js index a71a0be..7eab37d 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -99,11 +99,13 @@ service.interceptors.request.use( service.interceptors.response.use( (response) => { + console.log(response,'response') // 1. 检查响应是否存在 if (!response) { ElMessage.error('无响应数据'); return Promise.reject(new Error('无响应数据')); } + console.log(response.data,'response.data') // 2. 安全获取响应数据和状态码 const responseData = response.data || {}; const statusCode = response.status; @@ -124,6 +126,7 @@ service.interceptors.response.use( return Promise.resolve(responseData); case 401: + console.log('未授权', responseData) return handleUnauthorized().then(() => { return Promise.reject({ code: 401, message: '未授权' }); }); @@ -143,6 +146,13 @@ service.interceptors.response.use( console.error('请求错误:', error); let { message } = error; let code = error?.response?.status || -1; + console.log(code,'code') + + if(code == 401) { + return handleUnauthorized().then(() => { + return Promise.reject({ code: 401, message: '未授权' }); + }); + } if (message == 'Network Error') { message = '后端接口连接异常'; diff --git a/src/utils/whiteboardSync.js b/src/utils/whiteboardSync.js index 590df84..e0fdabc 100644 --- a/src/utils/whiteboardSync.js +++ b/src/utils/whiteboardSync.js @@ -1,6 +1,7 @@ import { mqttClient } from "./mqtt"; import { getWhiteboardShapes, getWhiteboardHistory } from "@/views/custom/api"; import { useMeterStore } from '@/stores/modules/meter'; +import { encode, decode } from '@msgpack/msgpack' const meterStore = useMeterStore(); meterStore.initUdid(); @@ -42,12 +43,15 @@ export const WhiteboardSync = { // 订阅当前房间 const topic = `xSynergy/ROOM/${roomUid}/whiteboard/#`; - mqttClient.subscribe(topic, async (shapeData) => { + mqttClient.subscribe(topic, async (shapeData) => { + // console.log(shapeData, 'shapeData++格式装换') + const shapeDataNew = decode(shapeData); + // console.log(shapeDataNew, '格式解码') try { isRemote = true; // 如果 shape 来自本地用户,则跳过 - if (shapeData.user_uid === localUid) return; - const res = await getWhiteboardHistory({ after_timestamp: shapeData.created_at }, roomUid); + if (shapeDataNew.user_uid === localUid) return; + const res = await getWhiteboardHistory({ after_timestamp: shapeDataNew.created_at }, roomUid); if (res.meta.code === 200) { canvasInstance.addShape(res.data.shapes); } else { @@ -62,7 +66,7 @@ export const WhiteboardSync = { console.log("✅ 已订阅:", topic); } catch (err) { - console.log("初始化多人同步失败:",err) + console.log("初始化多人同步失败:", err) // console.error("❌ 连接或订阅失败:", err); } @@ -72,10 +76,9 @@ export const WhiteboardSync = { if (isRemote || !['pencil', 'line', 'rectangle', 'circle', 'eraser'].includes(shape.type)) return; // 如果是本地用户自己的 shape,则不调用接口 - if (shape.user_uid && shape.user_uid === localUid) return; - - shape.room_uid = roomUid; + if (shape.user_uid && shape.user_uid === localUid) return; + shape.room_uid = roomUid; try { await getWhiteboardShapes(shape, roomUid); } catch (err) { @@ -85,7 +88,7 @@ export const WhiteboardSync = { // 监听画布事件:清空 canvas.on('clear', async () => { - if (!isRemote) { + if (!isRemote) { try { // TODO: 调用接口,后端再发 MQTT // await clearWhiteboard(roomUid); diff --git a/src/views/coordinate/personnelList/components/leftTab/index.vue b/src/views/coordinate/personnelList/components/leftTab/index.vue new file mode 100644 index 0000000..b223d74 --- /dev/null +++ b/src/views/coordinate/personnelList/components/leftTab/index.vue @@ -0,0 +1,596 @@ + + + + + + \ No newline at end of file diff --git a/src/views/coordinate/personnelList/index.vue b/src/views/coordinate/personnelList/index.vue new file mode 100644 index 0000000..bdba8b0 --- /dev/null +++ b/src/views/coordinate/personnelList/index.vue @@ -0,0 +1,755 @@ + + + + + + \ No newline at end of file diff --git a/src/views/login.vue b/src/views/login.vue index 3200bf7..680c391 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -112,7 +112,8 @@ function requestNotificationPermission() { onMounted(async () => { try { loginView.value = true - await getInfo("self"); + const arr = await getInfo("self"); + console.log(arr,'身份信息') showLogin.value = false; router.push({ path: '/whiteboard',