From 5b9d2c746e963bd242b7dfca956df2cc182537b3 Mon Sep 17 00:00:00 2001 From: deartibers <947466799@qq.com> Date: Fri, 22 Jul 2022 14:51:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=A1=E9=B8=BD=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../images/background/createdSuccessfully.png | Bin 0 -> 29011 bytes .../assets/images/background/icon_choose.png | Bin 0 -> 1898 bytes .../assets/images/background/icon_four.png | Bin 0 -> 1111 bytes .../images/background/icon_four_choose.png | Bin 0 -> 1260 bytes .../assets/images/background/icon_offLine.png | Bin 0 -> 3517 bytes .../assets/images/background/icon_one.png | Bin 0 -> 983 bytes .../assets/images/background/icon_online.png | Bin 0 -> 3421 bytes .../assets/images/background/icon_three.png | Bin 0 -> 1271 bytes .../images/background/icon_three_choose.png | Bin 0 -> 1485 bytes .../assets/images/background/icon_timing.png | Bin 0 -> 3623 bytes .../assets/images/background/icon_two.png | Bin 0 -> 1186 bytes .../images/background/icon_two_choose.png | Bin 0 -> 1361 bytes .../images/background/noteTopChoose.png | Bin 0 -> 3749 bytes .../assets/images/background/triangle.png | Bin 0 -> 475 bytes .../web/client/src/index.less | 10 + .../sections/offline/actions/carrierpigeon.js | 88 ++ .../src/sections/offline/actions/index.js | 5 +- .../sections/offline/actions/statuscode.js | 4 +- .../sections/offline/components/pushModal.jsx | 790 ++++++++++++------ .../offline/components/pushModal.less | 44 + .../offline/components/pushSideSheet.jsx | 77 ++ .../offline/components/pushSideSheet.less | 8 + .../offline/containers/carrierpigeon.jsx | 332 ++++---- .../web/client/src/utils/webapi.js | 7 + 24 files changed, 940 insertions(+), 425 deletions(-) create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/createdSuccessfully.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_choose.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_four.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_four_choose.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_offLine.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_one.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_online.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_three.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_three_choose.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_timing.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_two.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/icon_two_choose.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/noteTopChoose.png create mode 100644 code/VideoAccess-VCMP/web/client/assets/images/background/triangle.png create mode 100644 code/VideoAccess-VCMP/web/client/src/sections/offline/actions/carrierpigeon.js create mode 100644 code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.less create mode 100644 code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx create mode 100644 code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.less diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/createdSuccessfully.png b/code/VideoAccess-VCMP/web/client/assets/images/background/createdSuccessfully.png new file mode 100644 index 0000000000000000000000000000000000000000..3d507636bceb436e5e1ce99ecfe48af88724507a GIT binary patch literal 29011 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 literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/icon_four.png b/code/VideoAccess-VCMP/web/client/assets/images/background/icon_four.png new file mode 100644 index 0000000000000000000000000000000000000000..cd492380272276ba96bf1595c5b0f4732a8fad35 GIT binary patch literal 1111 zcmV-d1gQIoP)Px(5lKWrRA@uhT1`wVRTTbCO$)qGT1Gb(3M}|B%&^nwQWqLm^4?w(jZwG8g)2== zbmc@!p0JhNcaxOE?&{x_{dk378u%I*dJLfw; z_nv$25H!f<=H}4x@$stwUIFkNfN21u0Fo|z1;7!2Jb-@z{EG&wmb1OrQ80);~1PN`J-2*Ah8?0Gn_V*dal zk_dfi7{*tbOh$-xEnO2}=BFITc^ANE%=~QE8UnmXL`A_jP4jyqy69$TR|Imo+*q|* zeF)(BZa_7>^C*!>+?|`7+wO$bk$~ekFEaCku)Kbqff5ZOx@Vf^-|a}WCEz&Do6P(j zGY@w1L>SMB=!}ToGfng7Yl&X>K#Z@~>pz8ISWwJZEcVuQBw9wmO`AV&%k#|y-AKIL zDxIDnAO%~i)&9BZobMDBsflPsnen!iiTlKdnfNk5KF!Sd(>CIks5z(iX zWql#z6#=&~+tAh9c!muP4Pk0(O8r}{R#uY1tNBdVh6wRVTb) zJzQ8=xJR-XDVNI!J@oT!4f1<`dwUy4M?JOs?R1=^)9Gi(w(U2Vc}b^x1_lO{_lZb( ze{F3I%&b#|!XlzYA@DUbf2b2Zo6RDXN-4-fp@34Uq!Ye@MMU?7z%R`Fx-JcV@7HQI zmHT0M-;KbpLST)VFRM+1jE|2aolYyHVzG$B!$S?Its#ggF9Z&l`Dq4*rq#=;mC(`5-4cPzW=@!e(N4FjfwQwS zPx(rb$FWRA@uhT3u`uRTTct%$Af=9vZ1-X;Bht1q}(Qt%cfF6fyFEZ67eY7NZes zOboQf5HuJ`Fou9o^?`&n{77{}Fr;l_f~i61wyCx>8Xo+mh@~x?hSH{X`@b{C+`I1D z?GL-tooSu>G`n-}cg}b2x#ym9?+{FA8I{e8_1pRu*7PR;tYP9z0#d-VRKgPvGSE*< z?ErowRk@_3D&KZh<&VTGp5_X0pQ|xN0~hN+F@UF;ImrkX5e);VSAaSdRCm);*l%Qf zsIOrHE6UrF*gy0ZgZ6+qXyJGp(I9~jQSy?bx7;~`Sj;VE0^85A+Em;0Dueff*%`A0 zBOQr+1lnIvQgGs{=SYiXXiNk$UTRL)CMIeb$cY6s-aZ7hsR;=sU1##UqhUoQkg=mN zFQ9RaWmca}Ln5C;rP8kI!j`*{xGMqYi{3IYf5wc&XqK?zJrPDh^qTL>qAzCUIok`N zJnLL-gA;r9QX>r7t|J|#IRGqhueXTa%d*vE_m^J&ew$|AyhKF{MHi1CtuNX*8;9j4_r z|7x~=^-`SOyH5VP(KCXr`+l0M&XMDY1{ZkGjBhPE!p?T zKPr#^j z^V*e5aPeR^hzQ+xMzOKt3MMo*Q-s7)RJE9#FL$kM3^8$he82XNrDA zxFcL>jKPcI)Ljn$^o<9xy)aEaAMpH%V_$d4=gsR=Bq{%hhVOqJFhi8YAkesJ1XiUb zqUlI3RE5wtIDy<k$;^z)Oo_gm;lL?sQLRIBicz)AzsocSHH}FYq zXIN3o2nZK4V-c@RO+@q2TsTz1z)%1=yIQ2Xgql?ZAQ!O-Vf66M2T=B8@Tlmc^Bp*H zz9Yg-tRf)8XuKPlLcm|27a+l*NTt8K+K0b~0ucnZZAg`CL(I;lt9=+9*HP*IBkr{z zH?nwB3E?)K)rE$X85|BEYiF~eF*9|RsYJZV+(HouCv$?C73uV3i-p#}FE{+S+g|d8N!axy?V7 W7I!IjIsIt>0000#pI1OlAFzuGr5nfa)&LN*@QXXG4b}%+f6yjHTNy|Ek{Jj zIo3oWM~zU@$MUHs$6J<6vT9;x;!!+MO%*|G)-5=V97` z#kl}N?M#iBY9=K%&qH`~q@jKI?Hv!oL;G3LKaodP0%nDmWqlOb0EqHt*9$@ema=6y zKpM*3T7lgSRpsVZty}Fl)EwRPfn}$nFi|eYHl5!8As|&wP?jTr%3@zE_ix*K7BjZd ziQmLske7uz!)GOrFvVEWk~qu8oJ97lE^F?s{GtlShA!j+8W2QQ9SK0tnLHNs5Y(i_ ztdX#nY+!1T2ShzfQK2Wm(3twOO1&_kAbhTzC2^? zT?X625|`NKhb*n61DL#+rS)b(E&15aqb?lda{luqf$@Mm{%n0l^RljFM>Lpbsrrl^ zeIf3bf@9dxZO|e&&592Ls#AkC?nR413TE$m@w~X_;%MNbVB=5SzL$Xy`-%-CT?Gchp*B9jxYs350dZ$rSAC!--TzG{rRd8vv<>0%qvgO_jjy~_KK zT(;DY@<#=LlX)Zb`Zs+Q(i3-RI;xzo|Ga~OWzBn^pq2BrXIk&B=sex*&vOLK#=TB( z+d3V51dHRGK^dtN*qi<)@9Ng~ikpov+q#16`-4^_@<-$KNd%-i$aOgDi{RZ;|4(MC zbbF4R5J0F!z!N|es8=ylX4P4G5BSi-0(Uc|{!Roj#2N)*8W;2wC(9ixQ?!gt)61T5M3PNrb_>l&)KnqIh$V%zz45;Lw z(Rk)F^#qv^Y3$X;3EyEX(?H*~oW2pU6mFz88G9?#VcKZm-X6Cfg=GA@531eAnM24` zW8sUdWT`P9Tow_2EJ*+z32oPf(&M|qTP4**z{U&_@tD3|6b^1yE!1mt= z6q;iBGtcV1IZYVw&ApT+oGhRWNxNwX)nSh}=d!z%m+Y+96}f^dqcv<8JP1;Mz;lSO z>3zC*$faT_qMX()uk!VsX6SUw$jGDTSP5o{1kYC=vwu(}8*|iHC$?Jh-l7VBZfq6T zvuhpEymCo|65Ksm_3ufy>p-9)@-HKym1visg&S9{okni|!|WtdhuZz`9rODEND zxs;>4mw4KYH{V!l2S`DXyv3eBB#T&HEG4TbXMD515)J!Yx!;PvL33hqPuPGU@d-dw zYhKLgLx95r&-k7tV4ZI?;Go51F}bvN{*Rc8{n>b&5J7SQe!=j)3o%`ii)X$d(z z|ELmDi8x%P z9;B^HlJ3`UM9ls5?@7v4irzR|wv!|NReG9fj@s*T`b4sEe60vQHGNkg4B(XY3I(F@IG9rL;RH-z}&(kxr_-o?NnJCGm=M z=9mTEF@f`k#n!>Z@}^Tof0JoGnJgeNcA6a6S0PUvS?kSiX+G;X7Zd(Y0eu9!O00N! zWVYWpc=y>g6SrFY0|Tq}_0MVbTvDuP4tPP8aGzcTF!!G@Nwt|Op{(cF5-S51v$^1* zGmdU(G3rx@Lwx3i?wrdXsV9Wexl}r~Ek9>gX^cs?p5316?vegIs-TIZyuD6q;^J`V zaEyUx>^^!mY9TeM0eyfczMj3WO{Z8fhwTM)K$1P-$6uV!e0DVkCnd-GKTT23Xw-@C zsa-G0e11{?yzX3kK~dATd>m?fyk?xV&SV8q#b`a*W-Pi+qOg-B%$(`Qs-1@_dacK)f08rO)FSKNxVhC6~N}y=E@LOlB0kLn$c1nm-&VIsM$%m!4O;b`CzXYVmIxmZ(VsSpDD>z-3uKM{HA&jYnjQi9 zzJmSc2m4JA2!^L|M;TUF_VNr#oSab(VZc?pu} zm=v|(zQm`6 z4|@^1JChsXOn21fsvzV`@3@i^1M;tjONm1H_=E5BTv&Z^$&(TkBwr{y;$a8RiZP8? zLL*3ns-POn&l)#75%bmt4%uaL;c9|^d2iIFqaTy5iTLwR{ws0*|$Ir3N)1`mBSKo1prnv!uN z+Ksb3@p{dp-?SDp=M>~2WHnwz*0uH!XBF_Mcz-({_;Pym2T*C({@(knG)$J-z1Z6- z?9OQ!i1(Po$e!n0KMmRDag>UC4n`x>Y_)zhdcvAlw0=bshgxI1c339zq?8lm2|-UW zwu?_U>74r2msfmPZXTfPnn?ut?Wwd2Q8A*Xn~LqMOH<@Q)EmI+HhA!c3)>RMmv3{{ zJ|;Mwpp)zK%c$J8s#i0ujtMrdRzZsBVDo)3zA4Skzgh3d3@+Pd*zBNO&l)mF(_mUd z`!DCQ)$O~PW?RB}yM7fa?G{eYuZk?07&Jrq7Z+L*`@DaK7vogkATB9u!|0J})b3;C zK^s14FQ9T4c{#s@PnCEhQ9BdPn8J}wn;xS3dPOPG5BJ2=Gq+YaLDgbk#jq#}Z}6~N z*?9v->IOR21Hc6k%*`=trXx+3q+q?eIPGa_xNP9W2Y12hea9qYt-2=CtCHqRg7>)L zyeV#-UpyU(#PgWD6Nul<%P)ct>Yu2OXo80WQ^YMexURqoJE|sG6&C&pLpHOYKM1|`i~zu4GCzlm!TgcTG76eb z#JF$su)MYiqa)T+YiJOKQCfOUG%RcO`6T~sZd&$=d*T~Q?giiFRiTNr2;Msy~;+5d;FV%6~QcGiFjuxot_rV!})iCg}L{ee3u zVNMlm$E&t7i~Mk0N>NK8Z>Ww>eFswd8Kpf$d%5K^pvY$lGZ24Qx^d3CKL~^tD!D()_o!%hf)K;8h}Px&kx4{BRA@upnoUSlQ547j=e^PLqYufbQOO{oLRwf#B5DPdu2PADCXGU~O+-bt zDv**EEz+H(M3FX&BGg4FwkSuDGFQ0?lBm#z$`I1Dbly90XP99=)R}SKd-i(Uckj99 zcka38o_p>kXz*oR7)VgRs|Q$7_W{_(#90KSfN7OmJn$?NB05{kq7Y zD`56mIM$D7lEAkpIqCM7=3D_5@fR_`k;g3ecl1{?xDL$Lh)0N~A(4|nb%o`H_nsUj zC6cZY0c4yQNLS|OIvB`}L};vS2pE#%;>t%K7L0|H6&4_)s&BVT;db4uzL17QPK!(x zqpd}+7lT+7zLSn`4wb^w4oRJJ=_85M29 z=^Qc>z))dDalU_u4FIs(`f8cgyU_|ZvOSS>#%V8V4%vyt4y#U0kNk746S^RrQgULJ zcgOb4fYsJ}l^HjTwB}OBBEmJNeNVmU?*XI~EI-Ch2!sLt#dFKX~ zs&8mNqRDtrrbqzY0O>ZzNrm~o79$V=*Q>UmrZn9r?&q`%TWbci5bu*A6P+5f7e87Dx=$9H+N#k=43Q?jiRpY1Ku{}BXxDWE&yUY zNtVmVdd$(l;PYAlbl2zLY5zC0bbGSk;XC>Q5U5cAbTPP83jksL;g3^3Q3e2X(?(nG zdoZ%J00@?$HvkADWVQ8`vyiOs5S7@TAjPA87m`^xVh-4m5fk zDRs?8gO8LRH!|^|UI3WBtm2sk6Bo7wfayz%0>aeAU2h09b$Q(jVd@JGe+biFG5Ncb zX)pPF5N5t+^+K5XqT4?~GwoA@;8fYPk3HtAA1&u|o4?fcPAR?wVB7!z002ovPDHLk FV1i3DzlHz+ literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/icon_online.png b/code/VideoAccess-VCMP/web/client/assets/images/background/icon_online.png new file mode 100644 index 0000000000000000000000000000000000000000..4a727cf1713d47908aaf99e43dcf85e3b5101688 GIT binary patch literal 3421 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 literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/icon_three_choose.png b/code/VideoAccess-VCMP/web/client/assets/images/background/icon_three_choose.png new file mode 100644 index 0000000000000000000000000000000000000000..63208f0ecea183afefaaa017eed27ad8ff1bd2b1 GIT binary patch literal 1485 zcmV;;1v2`HP)Px)hey-YJTBpglL(Le^f$_rmIrwq|M|^ znhj%Rj$sjmP@<`a=Bc(w-21~8MELw&&_q80#03_y_rD!P*OZboGirV(!TV)n+SXAl(~Ke{BdTQ-XrBYxZPZ@r31(K;q&Plk6%N z^xLSri;&1_R4Aur@01^VBhf1X(?ZK4Fn`R9!JbBM%hO$h2%a_G z+aH1Xib)1q?2bf_Ga%ANRkdSxYUH~U6f>bHhG{*elM4Y+uy(us)PU!_r)d#2VKh$c zUf5j-$fdHtQaVtpji;DhW&$Y7%*mSEd5P^pz+^tLoLSrHEAT+t6B$-m^QY``*@?vt zt2MP${_j%9wIHm9@X%D}j@>Z>CiC%i%y?a|(KITAA)yLxG}`ro?7$(yYu5a!Z-_r6 z0U^xV!5972Hi`jQIx_(aABn@=aUlpY8c_eY4L?^kV$;EDoW0nr4;iAyU{JCUfRaFh z+479a{E0v4;UNkN*N?%-cKEAJ_O0JA+n{Sx(U~Aw!2ta-c3hZLMSwik@9pgY%2TX(lNWB?SjBz z2G8;vtrq}OR4{&ef0D>sRQ%b5nXi=V;*LPyP@MVr1u#-|L39JMIwuKvb5msN&aZ2* zVPBO#?g*7+G9SOrjA(rj|3gU}HVE^l#$oI|5tu$UN;aIk+>8ZpSD?1RHO2bkp9u9L zh1wV#+!uh}`b>Ku5}&Od-CZt2gI0R}RFajc?55BsLHxE>U{jXnV z5x4hS3K0R(5ka^=DGY1prC?m@5b1R9cUI)>zTnjedoq$KG!R8B*8h_C(h(auNbbht zSC*pgmd#Uqp4(*+55O`iBH6q&6}gYb%b-LdAN!?G7ja!k$z@cJjcitWG-8H2)`3Ho zTC~|*lU$_H3)xB1X2p)*@nvb9=MnZ`AvZETq{Q~;?!{ACanfDR#xp2Acgw}~o|i^q z#(2kSJuR;cf7JMNgV-Y#DJAp}bGg$^*t{%FIyw2Qz@?f*0 z=(7Lm}X7z_zD zN+M#}ti0NS?S+?6^n?F}D?z&-DIIB~@1b67Vnf4>xKwvrlF;*UIn)dAfWKC8%t8QP zYzYDZf3+w`1oY*uv(N(idfiDPpkHuwCK0f&m^!CZz`o?`AQ8x~S)C*T`bBqV84$3a n8g$n(0sFB>PonHjes1#*He97CQfDga00000NkvXXu0mjf=|#w^ literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/icon_timing.png b/code/VideoAccess-VCMP/web/client/assets/images/background/icon_timing.png new file mode 100644 index 0000000000000000000000000000000000000000..6c5e1db60346fcd0b4e356a32b5aa4de8d9ea0b1 GIT binary patch literal 3623 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 literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/icon_two.png b/code/VideoAccess-VCMP/web/client/assets/images/background/icon_two.png new file mode 100644 index 0000000000000000000000000000000000000000..c326f4af3bb274a92e75dccebbd087a685aa553a GIT binary patch literal 1186 zcmV;T1YP@yP)Px(TuDShRA@uhT1`wVRTTbCp#_@^g+lmEX@DjeX4q+TsSAxOd2g?Y#;9B4!j&&E z(Ul8ztHx-e`}bIBbfHU)Z^sPbr;tFA2LWqK$pc#GG3V03p|o_$%E|+_%SS-E-;6(sW1IPgA1EAH^mjL_&APZm#z^{o!;+Iq^b>!7N-BiKG z#ztSMRGMSvIRGyMh_|WhF@T?mXkOE_`E)uh0Na+f0c>w?$MgC8`v5**X4}JU8+J}0 zBH5u&lgZ>~qobn&%(b`%z|0+%WxWO9BW50PZJ~{UMD$4X>$?685uLf2>I%T}^72@@ zTz&xH88=FO81pa|i`|)?p8l(qu9g5S%X*HP?+4}eW($qPKNj|Dh?+W)EcX)oS(oAQslH&PXKkdNU9Wcc4a_-=37`>jBnw z;)Oz_X~4C8s{5qk-M zX`1ga^Ox;vz0L7N^sZqTU)eS<0Ms&U_Wwqm2J!GHnM`KvjC}#XG|dm0`C~u58Hq$t ztycY1sdN$1J;N|QQGd&?T4A=~M{N_2$1ylKi0Kz)KFEaR1#--HDm9>n}%V0rz|ZjEZhfh$BSl7 z(~wT5l?rA?u~<}|kHun0BoYuhiR|v~VsCHHiz$2VgW1{HyCls>p-|YrK|OzI5t&Rz z(WXX8h_`JKT1`$)s(&RW78e)&0PwiCw|9U{(|nbg=e=kY%FN8nDC!&^A0wNU#_O^; z0j{pDs@?G_L^LM=K4<3lyeRAF=uq4jk%cu1*5Tpdi!l-h&KQNveOR!}aN-A-*fj);B|0ISR_O?Y4;u`x9@r6_iKdWxkb>Fd1<5oHCy zJ~Q`wSJzmBoIVo3c7ShfZTXoG{uTfy%p3~}fRj202M5^P-1N;95tRc4AQ@SH?BHHo zTl2NFumJ=@AxU1TR7x#g$_ZJ#AA#%KJ|a>S@;!)!@4|cGzhq@OHV+REeWQ-8$PQv( zk5MV$ytZO;OOWG>+9=^LP3ctCHyMp`uqDaGID<7SgBN0&`Qz@P|k}vG2peF?&|7-6l-=L zAOR~yT{97CUH9B2=<{+~277I2oaM3`Px)3rR#lRA@uhT5D_+RTTct%(nDx5Q=Quv=SZ)s0eKpo3`3SMbJQNf`*l%LO|4n zP>lA6)E2=+fzbX@14bdD`vVMZl?22n^hH1_)BvWDLMpUfDTOL+m$KcNW9DwQX}jGQ zGh5vIYj@_}@0{=6bM86k-XR#!Qi_g8tJlg_{7qZ|>D-}ZG@yFV#d{+3gJ`ww+uU!w^7QsXQ=V1c z8w$mO#UzOey^$Do1vIl!6!qBMn)#6gwUv-%>8a7o$%BCAuuiA*)R^16zh%*U!eq)E z>Da>vh^?}+_QY82HvV+>SP7spyC8S|&@FZt0kfrU4YRs4Sm3ejPb9rzv*zsbh{Rfi zReS9%|2xz1bO@Ui7c~6l6_8RHP){eX_3=6;+q@h!SIosLE!|Eg-EJQLZ|>g3aeg zYVga)>6n=sD;}@haUO>nuMc*~oRNU<%N`Z~`yDE#uWEo(VO=D&dP2U>G?9{)*DqET zrCJZ#xCp|<-Pw>OLi3eAx_v9M7XY*&}{}shCp`#`Bl*@EX4UV1;)7o-Y>FWT%_RB{G4?Z%}RE&?Gkp~dqPv2)!_q5Ms|6VHEe1}z=B&#{KB zo-m;!ssO2howTh{`LrpTo~hcXV#$+uVc`8@!Ds-V=etTjn8Y!Z;y(v-J`_ zJJ@EJ-46v4+o%zN%ncf8A{;20gY@YM;?aSIPQ3kTb4ZleKt&)kB9(A!Sh02nUe28? z{x)6eLH?#D+#b-E^Y~&fQVFAyxwVUuQM!Dpkk|Q-0}I|ijla7cp__eoGN(z2e@V^9#*C^t53G zjoy-S%n6JvDP3k{d{M7whJB6oDC)J&VSlXRT7@t^*wP4u{n4UEBCHR0-HsF1$Lnqq zVST|dltkEGF%31Ru)X9PBoWTntZouvebGHMtcUHV1|xHmu>II$v?S|pes1$0XA*iT TD(qvX00000NkvXXu0mjfj2w`6 literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/noteTopChoose.png b/code/VideoAccess-VCMP/web/client/assets/images/background/noteTopChoose.png new file mode 100644 index 0000000000000000000000000000000000000000..88150293ca95ac348a462b876d58287ee7028a52 GIT binary patch literal 3749 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 P00000NkvXXu0mjf`yT{> literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/assets/images/background/triangle.png b/code/VideoAccess-VCMP/web/client/assets/images/background/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..e57490069e8831c0ebb43f51bebccaccfa3b9c79 GIT binary patch literal 475 zcmV<10VMv3P)71Q{00001b5ch_0Itp) z=>Px$l}SWFR7gwh(mzN7aTEve_wJ8Mn06WGB|=L}4Gm3ALD16H*l17?)DW~Z)Ko)D z&`=N*xuUx?MLc4fsP)HoHLeeNeXk9UPaGfO4Vl(;n0SNU@Io@cV19WVCst|7{fRtgn*48 zLDAy4)z~0DyG31tic*kFe;^4&BMr?FKiE<+A&NoS4eAP16bf2?^PGsrn>9tm7pBCn zh$0r8P)G2Vh?~rtM;6gcyJigH{ZokDoI^C))j5JGRo_8`MW>rr9??}y;P*QQ-&HLE zh#PLOS`E?hsNhSsI@5AOIjheTz=0>MQj7rG(hz^s^nW+|nEotH5yPAkfUiSPL(5u= z4*MT}pZ_yq=9}W0X4sJob%NEM$(p8~h(`wA>iaZ+nGA(A*1Q0qv43LKa9@2UyBvvN zzS^$_5)q%ynI{A^-5spl1pyzTVRju6_42;5WL4iIgoSQmwW$cMC4t|y_digme;H&n Rn1KKQ002ovPDHLkV1n9((kcJ| literal 0 HcmV?d00001 diff --git a/code/VideoAccess-VCMP/web/client/src/index.less b/code/VideoAccess-VCMP/web/client/src/index.less index bf199fb..0dadb89 100644 --- a/code/VideoAccess-VCMP/web/client/src/index.less +++ b/code/VideoAccess-VCMP/web/client/src/index.less @@ -19,6 +19,16 @@ body { #App{ height: 100%; } + .semi-timepicker-panel{//时间选择器不显示滚动栏 + ::-webkit-scrollbar { + display: none; /* Chrome Safari */ + + } + scrollbar-width: none; /* firefox */ + -ms-overflow-style: none; /* IE 10+ */ + overflow-x: hidden; + overflow-y: auto; + } a:link { text-decoration: none; color: unset diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/carrierpigeon.js b/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/carrierpigeon.js new file mode 100644 index 0000000..1d3147b --- /dev/null +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/carrierpigeon.js @@ -0,0 +1,88 @@ +"use strict"; + +import { basicAction } from "@peace/utils"; +import { ApiTable } from "$utils"; + +export function getCameraListAll() {//获取摄像头能力列表 + return (dispatch) => + basicAction({ + type: "get", + dispatch: dispatch, + actionType: "GET_CAMERA_LIST_ALL", + url: `${ApiTable.getCameraListAll}`, + msg: { option: "" }, + reducer: { name: "" }, + }); +} +export function getStatusPush(query) {//获取推送配置 + return (dispatch) => + basicAction({ + type: "get", + dispatch: dispatch, + actionType: "GET_STATUS_PUSH", + query: query, + url: `${ApiTable.getStatusPush}`, + msg: { option: "获取推送配置" }, + reducer: { name: "StatusPushList" }, + }); +} +export function putSasdtatusPush(data) { //编辑推送配置 + return (dispatch) => + basicAction({ + type: "put", + dispatch: dispatch, + actionType: "PUT_SASDTATUS_PUSH", + data, + url: `${ApiTable.putSasdtatusPush}`, + msg: { option: '编辑推送配置' }, + reducer: {}, + }); +} +export function delPush(orgId) {//删除推送配置 + return (dispatch) => + basicAction({ + type: "del", + dispatch: dispatch, + actionType: "DEL_PUSH", + url: `${ApiTable.delPush.replace("{configId}", orgId)}`, + msg: { + option: + "删除推送配置", + }, + reducer: { name: "" }, + }); +} +export function putPushBanned(data, forbidden) {//禁用推送配置 + return (dispatch) => + basicAction({ + type: "put", + dispatch: dispatch, + actionType: "PUT_PUSH_BANNED", + data, + url: `${ApiTable.putPushBanned}`, + msg: { option: forbidden ? "启用" : "禁用" }, + reducer: {}, + }); +} +export function getPushCopy(orgId) {//复制推送配置 + return (dispatch) => + basicAction({ + type: "get", + dispatch: dispatch, + actionType: "GET_PUSH_COPY", + url: `${ApiTable.getPushCopy.replace("{configId}", orgId)}`, + msg: { option: "复制推送配置" }, + reducer: { name: "" }, + }); +} +export function getPushLog(orgId) {//获取推送记录 + return (dispatch) => + basicAction({ + type: "get", + dispatch: dispatch, + actionType: "GET_PUSH_LOG", + url: `${ApiTable.getPushLog.replace("{configId}", orgId)}`, + msg: { option: "获取推送记录" }, + reducer: { name: "" }, + }); +} \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/index.js b/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/index.js index 73e9f6c..7a6f5a2 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/index.js +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/index.js @@ -1,9 +1,8 @@ 'use strict'; import * as statuscode from './statuscode' -// import * as camera from './camera' +import * as carrierpigeon from './carrierpigeon' export default { - // ...statuscode,...camera - ...statuscode + ...statuscode,...carrierpigeon } \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/statuscode.js b/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/statuscode.js index b615334..8539f07 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/statuscode.js +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/actions/statuscode.js @@ -36,7 +36,7 @@ export function postStatusResolve(data) { data, actionType: "POST_STATUS_RESOLVE", url: `${ApiTable.postStatusResolve}`, - msg: { option: "" }, //编辑解决方案 + msg: { option: "编辑解决方案" }, //编辑解决方案 reducer: { name: "" }, }); } @@ -48,7 +48,7 @@ export function postStatusCustom(data) { data, actionType: "POST_STATUS_CUSTOM", url: `${ApiTable.postStatusCustom}`, - msg: { option: "" }, //自定义状态码释义 + msg: { option: "自定义状态码释义" }, //自定义状态码释义 reducer: { name: "" }, }); } diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.jsx index 1c722db..4ecd79e 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.jsx @@ -1,299 +1,583 @@ -import React, { useState, useRef, useEffect, useImperativeHandle } from "react"; +import React, { useState, useRef, useEffect } from "react"; import { connect } from "react-redux"; -import { Modal, Form, Row, Col, Spin } from "@douyinfe/semi-ui"; -import { IconTickCircle } from "@douyinfe/semi-icons"; - -import moment from "moment"; - +import { Modal, Form, Button,TimePicker,Transfer, Checkbox, Avatar } from "@douyinfe/semi-ui"; +import { IconClose } from '@douyinfe/semi-icons'; +import './pushModal.less' function pushModal (props) { - const { modalName, pushRef } = props; - const { dispatch, actions, vender, close } = props; - const pushData = props.pushData || {}; //修改时传来的值 - const form = useRef(); - const [visible, setVisible] = useState(false); //是否显示弹框 - const [isloading, setloading] = useState(false); //是否显示loading - const [loadingTip, setloadingTip] = useState("获取中...请稍后..."); //loading tip的值 - const [step, setstep] = useState("none"); //第几步 - const [okText, setokText] = useState("测试校验"); //ok弹框text 右边 - const [cancelText, setcancelText] = useState("取消"); //取消弹框text 左边 - const [formObj, setformObj] = useState(); //接口入参 + const { + close, + rowId, + dispatch, + actions, + title,//是编辑还是修改 + pushData,//数据值 + cameraList, + } = props; + const { offline } = actions;//接口 + const form = useRef();//第一步表单 + const [stepNum, setStepNum] = useState(0);//第几步 + const [okText, setOkText] = useState('下一步');//右边的按钮显示名称 + const [cancelText, setCancelText] = useState('取消');//左边的按钮显示名称 + const [finishSrc, setFinishSrc] = useState('/assets/images/background/icon_choose.png');//步骤完成图片 + const [stepList, setStepList] = useState([ + { + chooseSrc: '/assets/images/background/icon_one.png', + unCheckedSrc: '/assets/images/background/icon_one.png', + title: '推送策略', + text: '基本信息配置' + }, { + chooseSrc: '/assets/images/background/icon_two_choose.png', + unCheckedSrc: '/assets/images/background/icon_two.png', + title: '通知策略', + text: '选择推送方式及周期' + }, { + chooseSrc: '/assets/images/background/icon_three_choose.png', + unCheckedSrc: '/assets/images/background/icon_three.png', + title: '监听范围', + text: '选择跟踪状态的设备' + }, { + chooseSrc: '/assets/images/background/icon_four_choose.png', + unCheckedSrc: '/assets/images/background/icon_four.png', + title: '创建完成', + text: '完成' + }, + ]);//阶段信息 + // const [pushWay, setPushWay] = useState('email');//策略类型 - function showDialog () { - //打开弹框 - setVisible(true); - } - function positionForm (val) { - let zz = /^(-?\d+)(\.\d+)?$/; - if (!val) { - return "请输入或拾取高德经纬度坐标"; - } else if (val.split(",").length != 2) { - return "请输入格式为116.354169,39.835452的经纬度坐标"; - } else if (!zz.test(val.split(",")[0])) { - return "只能填写数字"; - } else if (!zz.test(val.split(",")[1])) { - return "只能填写数字"; - } else { - return ""; + const pushWay = useRef('email');//策略类型 + const emailList = useRef([]);//邮箱列表 + const phoneList = useRef([]);//电话列表 + + const strategyList = [ + //循环摄像头列表 + { + id: 1, + img: "/assets/images/background/icon_offLine.png", + title: "离线即时通知", + value: "offline", + }, + { + id: 2, + img: "/assets/images/background/icon_online.png", + title: "上线即时通知", + value: "online", + }, + { + id: 3, + img: "/assets/images/background/icon_timing.png", + title: "定时统计", + value: "timing", + }, + ]; + const [showList, setShowList] = useState([false, false, false]);//选中通知策略 + const showstrategyListList = useRef(strategyList);//通知策略列表 + const [timevalue, setTimevalue] = useState('18:00');//选中通知策略时间 + const [noticeNum, setNoticeNum] = useState(0);//最新点击的通知策略 + const [policyList, setPolicyList] = useState([//通知策略备注 + { + strategy: '系统监听到设备离线时,进行一次邮件推送,并将当前所 有离线的设备一同推送至信息邮箱,每次起始推送间隔不少于15分钟。', + example: '【superadmin】账号下的设备:【智慧小蓝排涝-乡山站排口】于【2022年22时00分】掉线,【智慧小蓝排涝-乡山站排口】于【2022年22时00分】掉线,【智慧小蓝排涝-乡山站排口】于【2022年22时00分】掉线,请及时处理!', + }, + { + strategy: '系统监听到设备上线时,推送至信息邮箱,每次推送间隔 不少于15分钟。', + example: '【superadmin】账号下的设备:【智慧小蓝排涝-乡山站排口】于【2022年22时00分】掉线,【2022年22时00分】已恢复!', + }, + { + strategy: '系统在设定时间前统计所有离线的设备信息,并推送至信 息邮箱。', + example: '【superadmin】账号下的设备,截止【2022年22时00分】,有15个设备掉线:【智慧小蓝排涝-乡山站排口】于【2022年22时00分】掉线,【智慧小蓝排涝-乡山站排口】于【2022年22时00分】掉线,【智慧小蓝排涝-乡山站排口】于【2022年22时00分】掉线,请及时处理!', + }, + ]);//阶段信息 + const [chooseCameraList, setChooseCameraList] = useState([]);//第三阶段选中监听范围摄像头列表 + const [mypushData, setMypushData] = useState({});//修改过格式的props的值 + //初始化 + useEffect(() => { + let pushDataObj= JSON.parse(JSON.stringify(pushData)) + let cameraIdList=[] + let receiverList=[] + if(pushDataObj.cameraStatusPushMonitors){//摄像头默认选择 + for (let index = 0; index < pushDataObj.cameraStatusPushMonitors.length; index++) { + cameraIdList.push(String(pushDataObj.cameraStatusPushMonitors[index].cameraId)) + } } - } + if(pushDataObj.cameraStatusPushReceivers){//邮箱或者手机号默认 + for (let index = 0; index < pushDataObj.cameraStatusPushReceivers.length; index++) { + receiverList.push(pushDataObj.cameraStatusPushReceivers[index].receiver) + } + } + if(pushDataObj.pushWay){ + pushWay.current=pushDataObj.pushWay + if(pushDataObj.pushWay=='email'){ + emailList.current=receiverList + } + else{ + phoneList.current=receiverList + } + } + if(pushDataObj.timing){//定时推送时间 + setTimevalue(pushDataObj.timing) + } + setChooseCameraList(cameraIdList) + setMypushData({ + ...pushDataObj, + receiverList:receiverList, + }) + if(pushDataObj.noticeWay){//通知策略 + let arr = ['offline','online','timing'] + let arr2 = [false,false,false] + for (let i = 0; i < arr.length; i++) { + for (let j = 0; j < pushDataObj.noticeWay.length; j++) { + if(arr[i]==pushDataObj.noticeWay[j]){ + arr2[i]=true + } + } + } + setShowList(arr2) + } + }, []); + function handleOk () { - //点击弹框确定 右边按钮 - if (step == "none") { + let num = stepNum + if (num == 0) { form.current .validate() .then((values) => { - //表单校验 - console.log(values) - let valuesObj = JSON.parse(JSON.stringify(values)); - valuesObj.longitude = values.position.split(",")[0]; - valuesObj.latitude = values.position.split(",")[1]; - delete valuesObj.position; - if (pushData.id) { - valuesObj.id = pushData.id; + setStepNum(num + 1) + setOkText('下一步') + setCancelText('上一步') + if(showList.indexOf(true)>-1){ + setRightDisabled(false) + } + else{ + setRightDisabled(true) } - var front = new moment(); //验证前时间 - setloading(true); - dispatch( - actions.equipmentWarehouse.getCheck({ - serialNo: valuesObj.serialNo, - }) - ).then((res) => { - var after = new moment(); //验证后时间 - var duration = moment.duration(after.diff(front))._data.milliseconds; - if (res.success) { - setTimeout( - () => { - setloadingTip("已完成"); - setTimeout(() => { - setstep("block"); - setloading(false); - setokText("确认"); - setcancelText("上一步"); - setloadingTip("获取中...请稍后..."); - }, 1000); - }, - duration > 2000 ? 0 : 2000 - duration - ); - } else { - setTimeout( - () => { - setloadingTip("校验失败"); - setTimeout(() => { - setstep("none"); - setloading(false); - setokText("测试校验"); - setcancelText("取消"); - setloadingTip("获取中...请稍后..."); - }, 1000); - }, - duration > 2000 ? 0 : 2000 - duration - ); - } - }); - setformObj(valuesObj); }) - .catch((errors) => { - //表单校验失败 - console.log("errors", errors); - }); - } else { - dispatch(actions.equipmentWarehouse.addchangepush(formObj)).then((res) => { - setVisible(false); + } + else if (num == 1) { + setStepNum(num + 1) + setOkText('下一步') + setCancelText('上一步') + if(chooseCameraList.length>0){ + setRightDisabled(false) + } + else{ + setRightDisabled(true) + } + } + else if (num == 2) { + setStepNum(num + 1) + setOkText('确认并启用') + setCancelText('上一步') + } + else if (num == 3) { + //点击弹框确定 右边按钮 + let arr = ['offline','online','timing'] + let noticeWay =[] + for (let index = 0; index < showList.length; index++) { + if(showList[index]){ + noticeWay.push(arr[index]) + } + } + let pushobj={} + if(showList[2]){ + pushobj={ + ...form.current.getValues(), + noticeWay:noticeWay, + timing:timevalue, + cameraId:chooseCameraList, + } + } + else{ + pushobj={ + ...form.current.getValues(), + noticeWay:noticeWay, + cameraId:chooseCameraList, + } + } + if(rowId){ + pushobj.configId=rowId + } + dispatch( + offline.putSasdtatusPush(pushobj) + ).then((res) => { close(); - }); + }) } } - function handleAfterClose () { - //在关闭之后 - setstep("none"); - setokText("测试校验"); - setcancelText("取消"); - } function handleCancel () { //点击弹框取消 左边按钮 - if (step == "none") { - setVisible(false); - } else { - setstep("none"); - setokText("测试校验"); - setcancelText("取消"); + let num = stepNum + if (num == 0) { + close(); + } + else if (num == 1) { + setStepNum(num - 1) + setOkText('下一步') + setCancelText('取消') + setRightDisabled(false) + } + else if (num == 2) { + setStepNum(num - 1) + setOkText('下一步') + setCancelText('上一步') + setRightDisabled(false) + } + else if (num == 3) { + setStepNum(num - 1) + setOkText('下一步') + setCancelText('上一步') + setRightDisabled(false) + } + } + function handleClose () { + close(); + } + function formChange (value, field) {//第一步表单变化 + if (Object.keys(field)[0] == 'receiver') { + form.current.validate(['receiver']) + } + if (value.pushWay !== pushWay.current) { + if (value.pushWay == 'phone') { + pushWay.current = value.pushWay + emailList.current = value.receiver + form.current.setValue('receiver', phoneList.current) + } + else { + pushWay.current = value.pushWay + phoneList.current = value.receiver + form.current.setValue('receiver', emailList.current) + } + } + } + const [rightDisabled, setRightDisabled] = useState(false);//选中通知策略时间 + function twohandleChoose (value,index) {//第二步选中通知策略 + let chooselist = JSON.parse(JSON.stringify(showList)) + chooselist[value - 1] = !chooselist[value - 1] + setShowList(chooselist) + let arrtrue =chooselist.indexOf(true) + if(arrtrue>-1){ + setRightDisabled(false) + }else{ + setRightDisabled(true) + } + } + function twohandleMouseOver (value,index){//第二步鼠标移入通知策略 + setNoticeNum(index) + } + function positionForm (val) {//第一步邮箱或者电话校验 + let myform = form.current.getValue() + if (!val||val.length<1) { + return "请输入接收信息"; + } + else { + if (myform.pushWay == 'email') { + let zz = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/; + for (let index = 0; index < val.length; index++) { + if (!zz.test(val[index])) { + return "请输入正确的邮箱"; + } + } + } + else { + let zz = /^[1][3,4,5,7,8][0-9]{9}$/; + for (let index = 0; index < val.length; index++) { + if (!zz.test(val[index])) { + return "请输入正确的手机号码"; + } + } + } } } - function handleLocation () { - //高德经纬度 - window.open("https://lbs.amap.com/tools/picker", "_blank"); + function toTimePicker(e){//阻止定时事件冒泡 + e.stopPropagation() + } + function timeChange(value){//定时统计时间 + let time = String(value).split(' ') + let timearr=time[4].split(':') + setTimevalue(timearr[0]+':'+timearr[1]) + } + function renderSourceItem(item,index){//自定义左侧单个候选项的渲染 + return ( +
+ { + item.onChange(); + }} + key={item.key} + checked={item.checked} + style={{ height: 52 }} + > + + {item.abbr} + +
+
{item.label}
+
{item.value}
+
+
+
+ ); + } + function renderSelectedItem(item,index){//自定义右侧已选面板的渲染 + return ( +
+ + {item.abbr} + +
+
{item.label}
+
{item.value}
+
+ +
+ ); + } + function customFilter(sugInput, item){//自定义筛选逻辑, 当为 false 时,不展示搜索框 + return item.value.includes(sugInput) || item.label.includes(sugInput); + } + function CameraChooseList(id, items){ + if(id.length>0){ + setRightDisabled(false) + } + else{ + setRightDisabled(true) + } + setChooseCameraList(id) } - useImperativeHandle(pushRef, () => ({ - //传给父组件方法 - //aa即为子组件暴露给父组件的方法 - pushNumber: () => formObj.serialNo - })); return ( <> -
{modalName == "add" ? "创建推送" : "修改"}
+ + + + } > - +
+ {stepList.map((item, index) => { + return ( +
+
+ 设置 +
+
+ {item.title} +
+
+ {item.text} +
+
+
+
+
+ ) + })} +
+ {/* 第一步 */} +
+
formChange(values, field)} + getFormApi={(formApi) => (form.current = formApi)} + > +
+
+ +
+
+ + + 邮件推送 + + + 短信推送 + + +
+
+
+ +
+
+
+ 敲击回车键后,输入内容将成为标签 +
+
+
+ {/* 第二步 */} +
-
console.log(values)} - getFormApi={(formApi) => (form.current = formApi)} - > - - - - - - `${value}`.replace(/\D/g, "")} - hideButtons={true} - maxLength="15" - field="regionCode" - label="行政区区码:" - initValue={pushData.regionCode || ""} - placeholder="请输入行政区区码" - style={{ width: 149 }} - /> - - - - - - - {vender.map((item, index) => ( - - {item.name} - - ))} - - - - + {showstrategyListList.current.map((item, index) => ( +
twohandleChoose(item.id,index)} + onMouseOver={() => twohandleMouseOver(item.id,index)} + > + 设置 + { + item.id==3?( +
+
+ {item.title} +
+
toTimePicker(e)}> + +
+
+ ):( +
+ {item.title} +
+ ) + } + {showList[index] ? (
1
- - - + ) : ( + "" + )} +
+ ))}
- -
-
- -
-
- 是否确认创建推送? +
+ {showstrategyListList.current.map((item, index) => ( +
+ { + noticeNum==index?( + 1 + ):'' + } +
+ ))} +
+
+
+
+ 策略: + {policyList[noticeNum].strategy} +
+
+ 实例: + {policyList[noticeNum].example} +
- +
+
+ {/* 第三步 */} +
+ CameraChooseList(id, items)} + /> +
+
+ {/* 第四步 */} +
+ 设置 +
创建完成
+
+
); } - function mapStateToProps (state) { - const { auth, global, members, vender } = state; + const { auth, global, members, CameraKind, CameraAbility } = state; return { loading: members.isRequesting, user: auth.user, actions: global.actions, - members: members.data, - vender: vender.data || [], //设备厂家 + CameraKind: CameraKind.data || [], + CameraAbility: CameraAbility.data || [], }; } -export default connect(mapStateToProps)(pushModal); +export default connect(mapStateToProps)(pushModal); \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.less b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.less new file mode 100644 index 0000000..b1f80b2 --- /dev/null +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushModal.less @@ -0,0 +1,44 @@ +.myChoose{ + background: #F9FBFF; + .myChooseButton{ + height: 4px; + background: #0058C8; + } +} +.components-transfer-demo-selected-item { + .semi-icon-close { + visibility: hidden; + color: var(--semi-color-tertiary); + } + &:hover { + .semi-icon-close { + visibility: visible; + } + } +} + +.components-transfer-demo-selected-item, +.components-transfer-demo-source-item { + height: 52px; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 12px; + &:hover { + background-color: var(--semi-color-fill-0); + } + .info { + margin-left: 8px; + flex-grow: 1; + } + .name { + font-size: 14px; + line-height: 20px; + } + .email { + font-size: 12px; + line-height: 16px; + color: var(--semi-color-text-2); + } +} \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx new file mode 100644 index 0000000..033ef44 --- /dev/null +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx @@ -0,0 +1,77 @@ +import React, { useState, useRef, useEffect } from "react"; +import { connect } from "react-redux"; +import { Modal, Spin,Input,Collapse ,SideSheet,Tabs, TabPane} from "@douyinfe/semi-ui"; +import moment from "moment"; +import './pushSideSheet.less' +function pushSideSheet (props) { + const { + close, + actions, + pushData,//表格信息 + journal//日志信息 + } = props; + const { offline } = actions; + const [notesValue, setNotesValue] = useState('');//释义 + + //初始化 + useEffect(() => { + let timeList = [] + for (let index = 0; index < journal.length; index++) { + timeList.push( + { + title:getTimeTitle(journal[index].time), + time:getTimeData(journal[index].time) + } + ) + } + console.log('timeList',timeList); + }, []); + function getTimeTitle(date){ + let year = moment(date).year()+'年' + let month = (moment(date).month()+1)>10?(moment(date).month()+1)+'月':'0'+(moment(date).month()+1)+'月' + return year+month + } + function getTimeData(date){ + let day=moment(date).date()>10?moment(date).date()+'日':'0'+moment(date).date()+'日'; + let hour=moment(date).hour()>10?moment(date).hour():'0'+moment(date).hour(); + let minute=moment(date).minute()>10?moment(date).minute():'0'+moment(date).minute(); + let second=moment(date).second()>10?moment(date).second():'0'+moment(date).second(); + return day+' '+hour+':'+minute+':'+second + } + function sideSheetChange(){ + close() + } + return ( + <> + + + + + 11111111
} itemKey="1"> +

Hi, bytedance dance dance. This is the docsite of Semi UI.

+ + + + + 22 + + + 33 + + + + + ); +} +function mapStateToProps (state) { + const { auth, global, members, CameraKind, CameraAbility } = state; + return { + loading: members.isRequesting, + user: auth.user, + actions: global.actions, + CameraKind: CameraKind.data || [], + CameraAbility: CameraAbility.data || [], + }; +} + +export default connect(mapStateToProps)(pushSideSheet); \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.less b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.less new file mode 100644 index 0000000..a831f80 --- /dev/null +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.less @@ -0,0 +1,8 @@ +.sideSheet{ + .semi-tabs-tab{ + font-size: 16px; + } + .semi-tabs-tab-active{ + color: #1859C1; + } +} \ No newline at end of file diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx index aec40a3..f42b9c0 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx @@ -1,14 +1,13 @@ import React, { useState, useEffect, useRef } from "react"; import { connect } from "react-redux"; import moment from "moment"; -import { Button, Form, Table, Pagination, Skeleton, Popconfirm, Popover, Tag, } from "@douyinfe/semi-ui"; +import { Button, Form, Table, Pagination, Skeleton, Popconfirm, SideSheet, Tag, } from "@douyinfe/semi-ui"; import "../style.less"; import { ApiTable } from "$utils"; import { Setup } from "$components"; import PushModal from "../components/pushModal"; +import PushSideSheet from "../components/pushSideSheet"; // import SideSheets from "../components/sideSheet"; -// import { skeletonScreen } from "../components/skeletonScreen"; -// import { ReminderBox } from "../../../components/index"; export const accessType = [ { name: "萤石云", key: "yingshi" }, @@ -18,82 +17,86 @@ export const accessType = [ ]; const Carrierpigeon = (props) => { - const { history, dispatch, actions, user, loading, equipmentWarehouseNvr } = props; - const { equipmentWarehouse } = actions; + const { history, dispatch, actions, user, loading, StatusPushList } = props; + const { offline } = actions; const [setup, setSetup] = useState(false); - const [sideSheet, setSideSheet] = useState(false); const [setupp, setSetupp] = useState([]); - const [venderList, setvenderList] = useState([]); //厂商信息 const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息 const [search, setearch] = useState({}); //搜索条件 const [rowId, setRowId] = useState(); //表格数据id - const [reminder, setReminder] = useState(false); //提醒弹框 + const [pigeonPush, setPigeonPush] = useState(false); //推送弹框 + const [pushTitle, setPushTitle] = useState(''); //提醒弹框 const api = useRef(); const searchData = useRef(search) const limits = useRef(); //每页实际条数 const page = useRef(query.page); const PIGEON = "pigeon"; - const USER = "user" + props.user.id - const nvrRef = useRef(); //获取子组件的设备编号 + const cameraList = useRef([]);//第三阶段监听范围摄像头列表 + const [sideSheetVisible, setSideSheetVisible] = useState(false); + const [pushData, setPushData] = useState({}); + const [journal, setJournal] = useState([]); const tableList = [//表格属性 { title: '推送信息', list: [ - { name: "策略类型", value: "PolicyType" }, - { name: "推送机制", value: "PushMechanism" }, - { name: "监听设备数量", value: "DevicesNumber" }, - { name: "累计推送次数", value: "PushNumber" }, + { name: "策略类型", value: "pushWay" }, + { name: "推送机制", value: "noticeWay" }, + { name: "监听设备数量", value: "logCount" }, + { name: "累计推送次数", value: "monitorCount" }, ] }, ]; + const noticeWayObj = { + 'offline':'离线及时通知', + 'online':'上线及时通知', + 'timing':'定时统计', + } useEffect(() => { - dispatch(actions.equipmentWarehouse.getVender()).then((res) => { - setvenderList(res.payload.data); - attribute(res.payload.data); + attribute(); + dispatch(offline.getCameraListAll()).then((res) => {//第三步 + let mycameraList = res.payload.data + for (let index = 0; index < mycameraList.length; index++) { + mycameraList[index].label=mycameraList[index].name + mycameraList[index].key=index+1 + mycameraList[index].value=String(mycameraList[index].id) + if(mycameraList[index].type=='cascade'){ + mycameraList[index].color='#808FD3' + mycameraList[index].abbr='级联' + } + else if(mycameraList[index].type=='nvr'){ + mycameraList[index].color='#F6D86F' + mycameraList[index].abbr='NVR' + } + else if(mycameraList[index].type=='ipc'){ + mycameraList[index].color='#1859C1' + mycameraList[index].abbr='IPC' + } + else{ + mycameraList[index].color='#57CBD3' + mycameraList[index].abbr='莹石' + } + } + cameraList.current=mycameraList }); //初始化表格显示设置 localStorage.getItem(PIGEON) == null ? localStorage.setItem( PIGEON, - JSON.stringify(["PolicyType", "PushMechanism", "DevicesNumber", "PushNumber"]) + JSON.stringify(['pushWay','noticeWay','logCount','monitorCount']) ) : ""; }, []); useEffect(() => { - equipmentGetNvr(); + equipmentGetStatusPush(); }, [query, search]); - const equipmentGetNvr = () => { + const equipmentGetStatusPush = () => { searchData.current = { ...query, ...search } - dispatch(equipmentWarehouse.getNvr(searchData.current)).then((res) => { - limits.current = res.payload.data.data.length + dispatch(offline.getStatusPush(searchData.current)).then((res) => { + limits.current = res.payload.data.length }); } - - function equipmentStatus (data) { - switch (data) { - case "email": - return "邮件通知" - case "note": - return "短信通知" - default: - return "未知" - } - } - - function colorStatus (data) { - switch (data) { - case "ON": - return "#04B234" - case "ONLINE": - return "#04B234" - case "OFF": - return "rgba(0, 0, 0, 0.45)" - default: - return "#1859C1" - } - } const columns = [ { title: "序号", @@ -105,7 +108,6 @@ const Carrierpigeon = (props) => { title: "策略名称", dataIndex: "name", render: (_, r, index) => { - console.log("r:" + r.name); return r.name }, }, @@ -116,27 +118,67 @@ const Carrierpigeon = (props) => { render: (_, row) => { return (
- + {row.forbidden ? ( + + ) : ( + { + dispatch( + offline.putPushBanned( + { + configId: row.id, + forbidden: !row.forbidden, + }, + row.forbidden + ) + ).then(() => { + equipmentGetStatusPush(); + }); + }} + > + + + )} { - dispatch(equipmentWarehouse.delNvr(row.id)).then(() => { + dispatch(offline.delPush(row.id)).then(() => { if (page.current > 0 && limits.current < 2) { setQuery({ limit: 10, page: page.current - 1 }) } else { @@ -147,10 +189,21 @@ const Carrierpigeon = (props) => { > - -
@@ -160,7 +213,7 @@ const Carrierpigeon = (props) => { ]; //获取表格属性设置 - function attribute (data) { + function attribute () { const arr = localStorage.getItem(PIGEON) ? JSON.parse(localStorage.getItem(PIGEON)) : []; @@ -168,51 +221,41 @@ const Carrierpigeon = (props) => { const column = [ { title: "推送机制", - dataIndex: "venderId", - key: "PushMechanism", + dataIndex: "noticeWay", + key: "noticeWay", render: (_, r, index) => { - let manufactorName = data.find((item) => item.id == r.venderId); - return manufactorName ? manufactorName.name : ""; + let noticeWayValue=[] + for (let index = 0; index < r.noticeWay.length; index++) { + let val = r.noticeWay[index] + noticeWayValue.push(noticeWayObj[val]) + } + let noticeWayString=noticeWayValue.join(';') + return noticeWayString; }, }, { title: "监听设备数量", - dataIndex: "DevicesNum", - key: "DevicesNumber", + dataIndex: "logCount", + key: "logCount", render: (_, r, index) => { - return r.name + return r.logCount }, }, { title: "累计推送次数", - dataIndex: "PushNum", - key: "PushNumber", + dataIndex: "monitorCount", + key: "monitorCount", render: (_, r, index) => { - return (r.name + '次') + return (r.monitorCount + '次') }, }, { title: "策略类型", - dataIndex: "size", - key: "PolicyType", + dataIndex: "pushWay", + key: "pushWay", render: (_, r, index) => { - let status = r.gbNvr; - return ( -
- - {status ? "邮件通知" : equipmentStatus(status.email)} -
- ); + return r.pushWay=='email' ? '邮件通知' : '短信通知'; }, }, ]; @@ -224,32 +267,6 @@ const Carrierpigeon = (props) => { } setSetupp(columns); } - - //表格请求数据中station属性数据的展示 - // function station (r, name, projects) { - // let data = [] - // if (projects == "projects") { - // r.station.map((v) => { - // if (v.structure.projects.length > 0) { - // v.structure.projects.map((item) => data.push(item[name])) - // } - // }) - // } else { - // r.station.map((v, index) => data.push(v.structure[name])) - // } - // let dataSet = [...(new Set(data))] - // return dataSet.length > 0 ? 1 ?
{dataSet.map((v, index) =>
{v}
)}
: "" - // } - // > - // {dataSet.length > 1 ? `${dataSet[0]}...` : dataSet.length > 0 ? dataSet[0] : ""} - //
: "" - - // } - //条件赛选样式 const screen = { width: 193, @@ -302,23 +319,12 @@ const Carrierpigeon = (props) => { color: "#1859C1", cursor: "pointer", }} + onClick={() => { + setPigeonPush(true); + setPushTitle('创建推送') + }} > - - {/* { - const remind = localStorage.getItem(USER); - console.log(remind) - if (!remind) { - setReminder(true) - } - equipmentGetNvr(); - }} - /> */} + 创建推送
@@ -354,7 +360,7 @@ const Carrierpigeon = (props) => { > { - 全部 - 短信通知 - 邮件通知 + 全部 + 短信通知 + 邮件通知
{
s)} - dataSource={equipmentWarehouseNvr.data} + // dataSource={StatusPushList.data} + dataSource={StatusPushList} bordered={false} empty="暂无数据" style={{ @@ -492,10 +498,10 @@ const Carrierpigeon = (props) => { }} > - 共{equipmentWarehouseNvr.total}条策略 + 共{StatusPushList.total}条策略 { tableList={tableList} close={() => { setSetup(false); - attribute(venderList); + attribute(); }} /> ) : ( "" )} - - {/* {sideSheet ? ( - { - setSideSheet(false); - }} - /> - ) : ( - [] - )} */} - {/* { - history.push({ pathname: '/equipmentWarehouse/camera', query: { addNvr: true, serialNo: nvrRef.current.nvrNumber() } }); - localStorage.setItem('vcmp_selected_sider', JSON.stringify("camera")) - setReminder(false) + {pigeonPush&& { + setPigeonPush(false); + setRowId(); + setPushData({}) + equipmentGetStatusPush(); }} + />} + {sideSheetVisible&& { - setReminder(false) + setSideSheetVisible(false); + setPushData({}) }} - /> */} + />} ); }; function mapStateToProps (state) { - const { auth, global, members, equipmentWarehouseNvr } = state; + const { auth, global, members, StatusPushList } = state; return { - loading: equipmentWarehouseNvr.isRequesting && !equipmentWarehouseNvr.data, + loading: StatusPushList.isRequesting && !StatusPushList.data, user: auth.user, actions: global.actions, members: members.data, - equipmentWarehouseNvr: equipmentWarehouseNvr.data || {}, + StatusPushList: StatusPushList.data || [], + // StatusPushList: StatusPushList.data || {}, }; } diff --git a/code/VideoAccess-VCMP/web/client/src/utils/webapi.js b/code/VideoAccess-VCMP/web/client/src/utils/webapi.js index 50cbea2..4f376c7 100644 --- a/code/VideoAccess-VCMP/web/client/src/utils/webapi.js +++ b/code/VideoAccess-VCMP/web/client/src/utils/webapi.js @@ -45,6 +45,13 @@ export const ApiTable = { postStatusResolve:'status/resolve',//编辑解决方案 postStatusCustom:'status/custom',//自定义状态码释义 getStatusSimpleAll:'status/simple_all',//获取全部状态码简略信息 + getCameraListAll:'camera/listAll',//获取所有摄像头信息 + getStatusPush:'status/push',//获取推送配置 + putSasdtatusPush:'sasdtatus/push',//编辑推送配置 + delPush:'status/push/{configId}',//删除推送配置 + putPushBanned:'status/push/banned',//禁用推送配置 + getPushCopy:'status/push/{configId}/copy',//复制推送配置 + getPushLog:'/status/push/{configId}/log',//获取推送记录 }; export const VideoServeApi = {