From 5296055032f43f34897023a396a316081ef24a39 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Tue, 19 Mar 2024 16:17:13 +0800 Subject: [PATCH 01/73] =?UTF-8?q?style:=20=E6=9B=B4=E6=96=B0=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/iconfont/blossom/iconfont.css | 10 +++++++--- .../src/assets/iconfont/blossom/iconfont.js | 2 +- .../src/assets/iconfont/blossom/iconfont.json | 7 +++++++ .../src/assets/iconfont/blossom/iconfont.ttf | Bin 44072 -> 44216 bytes .../src/assets/iconfont/blossom/iconfont.woff | Bin 23564 -> 23648 bytes .../assets/iconfont/blossom/iconfont.woff2 | Bin 18952 -> 19024 bytes 6 files changed, 15 insertions(+), 4 deletions(-) diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.css b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.css index 405d326..93c3168 100644 --- a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.css +++ b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconbl"; /* Project id 4118609 */ - src: url('iconfont.woff2?t=1706597865404') format('woff2'), - url('iconfont.woff?t=1706597865404') format('woff'), - url('iconfont.ttf?t=1706597865404') format('truetype'); + src: url('iconfont.woff2?t=1710173492180') format('woff2'), + url('iconfont.woff?t=1710173492180') format('woff'), + url('iconfont.ttf?t=1710173492180') format('truetype'); } .iconbl { @@ -13,6 +13,10 @@ -moz-osx-font-smoothing: grayscale; } +.bl-collapse:before { + content: "\e60e"; +} + .bl-brush-line:before { content: "\ea4f"; } diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.js b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.js index 3092cc1..de114c5 100644 --- a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.js +++ b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.js @@ -1 +1 @@ -window._iconfont_svg_string_4118609='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var v,m,z,i,o,t=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}v=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4118609,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?t(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(m=function(){document.removeEventListener("DOMContentLoaded",m,!1),v()},document.addEventListener("DOMContentLoaded",m,!1)):document.attachEvent&&(z=v,i=h.document,o=!1,b(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}function e(){o||(o=!0,z())}function b(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(b,50)}e()}}(window); \ No newline at end of file +window._iconfont_svg_string_4118609='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var v,m,z,i,o,t=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}v=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4118609,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?t(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(m=function(){document.removeEventListener("DOMContentLoaded",m,!1),v()},document.addEventListener("DOMContentLoaded",m,!1)):document.attachEvent&&(z=v,i=h.document,o=!1,b(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}function e(){o||(o=!0,z())}function b(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(b,50)}e()}}(window); \ No newline at end of file diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json index d6a1315..d94eb59 100644 --- a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json +++ b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json @@ -5,6 +5,13 @@ "css_prefix_text": "bl-", "description": "", "glyphs": [ + { + "icon_id": "11855598", + "name": "收起", + "font_class": "collapse", + "unicode": "e60e", + "unicode_decimal": 58894 + }, { "icon_id": "24341231", "name": "brush-line", diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf index bf6c942266861e6a85c0ac66c207c15ba4756f92..c1eb90550424240fd276275f78c38530950f4f28 100644 GIT binary patch delta 3416 zcmZ9O3vd=^6^5VxPY8khxe!7U5^^OF2;mMPToWK5P;NzRu_83w8fmyw3zYIhOKqjJ z0#OTE5h%rolvb#K3{yK!hjARIqo_bFP^fjoeytRdA|itC#~F1rn`h6rJG=kxe&?L` z{hH54kG&V&(kK2wLI2-F;x8aJ_L0Wb3(jwD^K-~t56>THm|s7yeB9l6z(rBjpcAbx zBo5a2geYrRv~tzCs76FSf#|u$C3EXfp8j|$w9C-BrHkrUEsb1>dLL3o=k;ZYxM#{x1Q)+bCihxLD+EVXRppqANCn3iT)9Mn05Z} zf8*Wti6m^$aWePbKqG(O(Wb)4`%UAcGY(IRZi*HhymyjlGYR)bm5Oa4;UJ08wN2L( z?~kN4jcv7I?gS<p9-<>ne2EvSrj{P0kbGk!x=#hgBik5KF0tS@*MTdVKl?& zOFstElPV6u#M;0%%hsbMNH=lJiuIfKFAEs?)`j|aSWnA zd8Cs=DxH*-HnbyC$xPq{wkVrPuPkdFiED~ug5>RfufHRz1XY_ylTV=FQ5pzT0Um!x zpsMgFH3SKUl0=YZ_;Lu+4JD3173)z73H&|2Vhc3I!5|$7<&~h?P=*O=4CR_&ilM9% zOf{5$f`<%M0>LapH9;`jP<0S2FjOZ53k_8a!J{7k{bd?FX0StXmBDuvR~x*nxW?dn zicc8qR8(tu_`c$k2D=p38SGZnb3E)(TyOA-Kes_U!Cu9u3|>`y+F+mJMuQ(HK4Z|V z=#PbJp5U0F>L>WEp*|q^v!RZlC1R*IXi=IxakU98nkJ7LhL(Y-Ngw4shBJY%T03C|kpa>Dlv^*iAo3|>=C!uJh{0O2`9azJ?AkT4Kl zFeDL#9~cq~!i$DvgYc3e0U`X*kdzSq(U7PReq=~q2>&GF+DT~$149!+*kZ6=@vcM}$t1jW4}I=34gO(BM+t8mQdGi! z8q!w6I|dDkcMZucnuvQycyX$5k0cluH6+Hk1VgfnOEe_VxK?_;Yo!|=S4=Xb+PKz+ z^c$xN_DIQbZ47BTuB{<;$E6t3d0fnp;^R^cX+JK_kPG0_4dP=p$S`CLxORq20+(sX zE^zG)83!)QkcHqn7%~%Fwjo==%7&1s)4?|Xot2AVqIRCps_KEZN3mGZSU)Njtm#57&p+6ALIOs3pq1xkRgx8RU2|^oKK06Z{y-VCqfpE^EnYRbDW<( zAzR1!JPR2-&gWV1prX&SkmuuS4Y@zg*ND(M05{6eiU8-+BeXWa`I-`OEfa9Q@Prl& zIA4%LO9z~<3!y~>&fg@ooWPAYw6MVWY8F~z;O;a063|UFwCuo5GPD4}O*XU?!A#B>YCJZY0-FE zL;8etmoY2jP`d%`&SuWZyw-kl`~6vES?4-bbl8*KDSK@8bJ=g_WaQN49LmkeeV}7< z$LSq!=S|MLm|vNHtW$NTl?7P^vkHzCTrQkkc%aY~c;9f2lpEM^5A!dR1P^kZk&yE;3V%3PfBQA`%QIl3vRkOL~ z-P*j`QMEH`ch(-Sy%8T-It1EVTNEgsc8ddBEIqmPfiP?uXbukQGmv@r|Doc5`? zdp)5;LQD%Z^>#^l>!i}I18O2w{fZ*lSxKb{Rjjb5gFP z6pQSVn|_z_pL1uOE P(iQU$Kf8N(+X(*xPFGX4 delta 3258 zcmZA3eQ;D)8OQPOZk9ko-UuOqyaOSGBuxW_B!rLz5-L&(6tP9r0_CMh14NoC(3TC9 zQfjF!1^cF@v{FPxT8U+lVVF*b;Sa}gd_kHP#1!!^_eiTEt*DgxJ3P)fnmeC8cQ>2O z-TR#Ld(M$}qx*ZKPuIpPs){E=>;$AW+}p8!`C}>RJ0QCQo@iRJZ1K|aGkw1R`lN1! zUg&==)}ZraQnq4M*Sg-Q&WK!sXm7`wC5zwbI&>bguIaVas}`^8jC>Hu)A>-nsdV+? zRm;{E-18i~v|sO^-MQxe^sb4?#~b10tGa;N9mhtt946vFQ2(y^wcLf7O&>8Z=Klrn zpPRMfzvHLfF_Jdv`2cQQfzJHj9o|_SIn(n=OD(?jz~OS+&MgNIF0)x?$(l z*d39~oiqAvS~8vK%+N7Y$1ELlbgcZpV>SPCL^>k6LA*f@1Ig2;mgut!$>aqFGllsi zGn{NjP|8T2=f#~h$p!I#3}HXtr;NM#0i#$*j4_l`M1P9;0z-L*1w2VTEmV?DKCg2? z*S3pq@hm^&IbGv7S)wa>n2p5gW)quvgr)qLWo+S5*0G)qJjg>l!2NWwhEBf9T2^r{ z%i|p4i+qW#^zb#l&I-QF9n9r6eeK)%EYoP$mv5t$CMMHN0~2ZFR&L=dJjNmxGnGly zGM4dFGl3s*6We&48g8bF(Nu7dr}+tQvV(8%gl^z{bnrRm@p-h}g-Tb^z=fd)@EoQSAv9 z8qETNZK8W4GZ|jhhVL)wtQP*T4A@!)qG181`v=)bKrx|3N>UA2FKc1ivww?*tzh z&3qCOqcuPx!)P^-&>i-)E=UZMxE{1bNaPzW77_(U%Z5ay(E=h-W3-e={M2YskvM6z zytt^l;%T9AQF-QR$q^1WT6~1RGFpbj!(Z!(Xhjn0+jv@=gr|&FDdBI8)+^y@qm@he zj?o$>>@`}=gzp-yYr^-8Ryg4qqqRM559ReMhfMfjmnRuTT$D76UxVw7Kme>KE4`@_pdp+@*Oqj)2{Via_Q9~ng+;m1bd zNBDQ67$m%E6o`cXFp5UPe;S1(;lGUHlJJ_ZzaEsFgr68?DB*RZG$s7hupD$FZcxDD zG{ZebEiP&ly0|2x_{GJHf*9A&D3Wo>M&TUCY1VqmY1{y##KxrD8+F~K~H&( zOEXG#oF<{CjK^gdr9CdwDEDznMo%38H^@`n)eLaiMr{E%*wCsm$Ea1{h8Q&sT&_|3 zz~vb=65LRumVz5*)Ld}+Mr{UHVAODM@j^X_dJnG1s0-nW4U06E7h-AMJ*lIVz^6V zt5KK7O)={CIA0P`=g0YZB-#Vu{A3gD25^27iuMIKKNsS9&=vvb-zeHF;HDdG8*qLG zi#8Cr8Ae+P+-*ji3fxSi?FH_3qm2e`meH02=Py?L2GRM86~CX1yBG9Cv?JkCj^Qai zN8f29??q}OL9{H|8GSoxLDGp>ZESw*dcTdyB+pNNtAA_&19lBKn$noED5WU18?-08GW+P@+`(%HU&@K^ z&AB{e<&X=x8M$+Ex8?TcrR8nN>m6D=^q0d5hn>jJ&EKDYrJ%cz!luHrMdd}^MQ;@6 z7IzgNDn4J5RWiS1Pf1_t%+e#JSBEzaKR6<1#Qu>BMxH8LS9WX^qZXCtm#-~9J-T%C z_KIl5ofRj?6pq0xuxD?QvVIF7A)5Q diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff index 8eb852fcd5a4d191c179a7c6b36dcbe6a2926282..afec489d57ea9d65ffea9ea7b0832fadf3a42657 100644 GIT binary patch delta 22776 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 Pi=uT64gCumDKS|9U`~4* delta 22711 zcmV)5K*_)0xB-l~0Tg#nMn(Vu00000TnqpU00000tSFHbOMfH)01P-ND;_;(Yl=00C|Q00C~-bh6@YVR&!=093pH z0018V001BX?J5BmZeeX@0030n0003;0006{avNfoaBp*T0034b000H&000ayIR?Hu zlL!HWf7aKN6;%|);oqGhNmgG!GKw-@E_oj zD#V;cJw0a&=A3Xf3m@RsH>c~PW-icmr|;QoZJ<6-E&EG7eY=i|zN2c5UajnSy_&{5 zUawcRNIxH_OaEuf)>NHZruJ!6s!6qJMw*pof2X-=ep;Eb>kcz@hdH{#g5B=WVb?q4P5<8EKYdkp z{3Zu;sIDoxrs_IESFNr&yItq+dR69C=IIVE(wZi;)6?myXVjS%tfmzcIDrOqV=ub1 ze-Ha|FZXdj5AYxl@i33@D39?tPw*sbSgR-5hNpO%9?aw!dNNC&L0@{&g@)|SiL~c- zW^fZDsi7au=*SDK(>uPCySSTYxkvB(X3o&NTFMnH<4UgLYL;^*FL4$tSjhqwvWUej zVLq2|DHm`d7jZG?aW=DgnUgq~Yj}mrf4H1;IE5oQio^9Rrg0dPnWQH&QO{`{<2is) zjAo3U*-*~qT2AFO4q_~W7|bx8li@r^f3D+t1~8EQ=uID<=T=_jHE!buZq$>U%RG+e z7>?z1j^lWy>uKM?A&g)M9cWHln$n3qXhci))Mr%1DsIt-)!;vV+W&{IrsW@ve^%}M z>9ul#Oec|q=}eL;rqfBPGM!UWwUzUnTA0o*sil=UklLHhGijtz{@YQeGft{8op#c6 z)43{C=sDL~QOlm`^8Ovyme!ITjc9ZhLL(aFl}F8Y}ggkpdxODJA9 zr3%FcQ@&8Q)RZ*TZ8T*Lxtl3{$eT<#M1I4RNaW3?Y$CsDN-6SNro1A*e{D)G@;jys zBfo1(GxB?;TqD14N;vWdrmQ1>Xi7cuN2dHEe{4!Z@+YQDB!6m3NAhQ;oFs2CB_{cE zQ+ATSFr_H@OH-bblPOurg(+jnb*8i>XH)Ky!<4|}uS{7?-fBu^@-|aGlfO14HTfG; zW|O})r8oIIQ;w6rHzhjxe+N^xlYca&JozV6-jjbeB|rHWQwNZLHMIfxH&ZW=e>XJ* z`43Z9kpDEb2Kg^je~|w+H3@mUsZ%H)K}qdGR7^cXRGAuws5W&EQP0#uM14~q5e-bu zL^L#Y6w%1kR>U5r-Xa>C8jNUS>N29Ksnv*PrhX%uo0^VjVd^}hf2FDYh&@d`NbF^5 zM52|c8;RDYmL%Gk`jTjCYEGh^sY8kOrZy!yn0l4yXlhuZlc{To&ZgESx|sTx*xS^^ zL|0QM6Z@FjndoNfX`;KSv59?6-A(i`wK&n!%6%|;nVOyGZR&WUkE!j6zNX$M`k6KW zVn5R^Krfq~6ZQ4tSF{TZL7;D;9h;gQ^g&1$zUx))tn+#E7+G&UbP1_AI!L;WP z2bne=VxnpHAto8+`<-l*zw5z9c}5N~$}@YYQJ$~EtlSP_e~M9_ox_cCKBgMw+)Ojd zGk%0op7H5c?)*_}l=HgUw1=^^wQl47DsVti z_y1W@YuUvC7S#Tkg-@z&3m0lfU?Ck)l_M-C{b^M>f2u0lNq(DKQSVokHxxCksPDae z9FFV|1Zt|)Od_Ys zETEXie`F#hCvqgxx4Exx({-Es`Zujf&KaGPs0I3iJ@7h9Xs z=OxPLF4Z3J%h5=@w=ivNDl;^b&SD~f8Kxxoe|;vb9LJloDRS>?E}!424ZD1g)wZYb zk6**nF5h3;YvJkI_V(J>+H198mVjzj;`IBSukqZ+*p2Lxkk?o_tHl%SJ{)5!wsnHO zMfVC0p`k)tb zeE`3sHZ!p}MW@H{Ig{5Z56fPMtlcpzJG_{7df~U)i?c=+mF3?=(IU;#4oNU) zSo<2>k2QZuwm7vDaKEg5OIifeZ@83-f7-p&B5L=W#7n6pUu=a9l2wFtU^1;R5%OPG zne7hC6&45B%_gvW
    &N4)4F(c>^JkUe(Dud?0*b9bA`6<>0S&tFC4-P%`4#PYej z9|OC1>TXfGFR$gDpCxxcdiPgAq_+}st0;X{c8ZNZvrG3AazC+3f7c>9*fL>je}zsb z4~0aY8~?e`Eas2UdOQ);YtC$xpA_xU={2v6kU%dg<~&$M>EJ zydt^6@k+@T^}G^*Z5^F-aCpwGUs|E^@UiAmtzKaI_C!I@~_fEDngg{HB{u z_HP@qU}dap8QRu=@+L=>*IQM-zzcHwa6A6AzpN1inK$$pIffW1EF^@CaDgx)tSZ5E zQXHodXR{wNEet^yR&^qle?i2f(l~;9CMBD2xwrtrMuM#YOz`E8*nx%-SLJFTgHs|W z@L6Hw7afd9-6n!USnVJ+eRRp2&p6%?e1wn z_7UPsrriK5fWmydq3yKLv9_{&XUiU2we>cDatOk2*|Y1aeniL(f0W)p$la7cnLB@6 zQAINN(C&*OkHRV&*jD^;6(yHbS_S=gP`Hy)e@ll#$d8DskXA*_zr1UUs;;kJb(sY$ zcN3Ch<8}I{bS-T~h&LgIaU$OC6lUVwCj5!0H`RuJiEu9EO=tVr{)A{yj`lIUh&x#( zieP7ICb^7k^5ZB5fBHyHV%I5CkmQK4{zs`Fx3~W&mC_z=*E(koUe(qVPs>fF3%dsA zG>V?-3AMS_m*2j!Egq;3dqGJlS zrgdxmkvO5wnq+sA#WWC#6IZa#?}3W;>9rLtF%NJUIQ{BcwJ3;RgEp`chv~_FlSJ^E7v>UVF&R;Qa=0vu=J}0-!BmJ{3Y!Q7!^%dA1 zaPLaBr|Zj_WByEHcCLzK!Iwx?{o~eOJx-S7pW2^;iFCKg9B*t61zWpj4QMB)*VY4d zMVhCzAiAE>e?VNJM(s(c$_~XV({Ud#u*Tr@+vF`;CU_XOkIP{4sSrSLPA4oFkT;ts z)vl2wxQ)^#0PSJ81jz523DK?=ouY2|({uupF2RetUqZ+U-NHQK zLR>Fvg)4+>&ZJ<{aT&>z*g5i~|KWP@jK;|vu(S2>f0LiUcc)%!d;Yd^DyYf?%fMj& zz)*gKk#?wy+;r%d@T2#F_yE1#T@rU^&S>5CF`O3A@gu_Fbl^9 zGw6BJP*-S*+BPr{I`0L!QVWS9yeW!j#8Zc3$_Py9v?%f)lpArG9wRK_-{~LGf1+JT z|5YO$f3=ul+&+?SCJ`s`1&J3izfShyE&yyFi^xvGwufx4k6@vS8$~-(6^Xc)VPM3o zPN+e|$HoF7JPuz-t(uca%vrTzC5u+3+ZMOAEndq4xFxo!f7%^`{hQ{xMR!f5=v{I1 zJvXoPP`^WxTyClybOue+rkjG*cGCvYhiK9#f37n*5P7qw%}pfcuH1mnhNH&wFv#DY zTdd;0#XF|CE6r~A(B=L8mk&AIAXd7k!96C2^RdTVc6-oy%I0v`PPwWDV+>ByM=0RV z6BF7PH5m&lVSiylu}_SubU{>^gmwt4VJPgQY%V90QPQp5Np?_zC@3fT9r484_ftD zZ||GM_D;i{@blTNaR8twM$4Nm>{+P@qdvs@JQ=)?4*SeZwY{jutkfNM~~_2@v# z&5v|)HSb+L_RSwwQi>NDj2L4w@J}-0f0&Uj4+g1zFjOV5tebRyFs`NX?ccwuN7_(ZWL}6J|=uZ_>^#;@R0CXf8jCV zbHWqCQ^H|E@EUC`{gXc6`v3Pj(J=o%Fn|6J`R|o^^L{dae!jbSJ>}wmweZ&Y;OD>c z`SjxXg@5Wi{a@vW$cfG?{8NpR%3{u126}7{I7YvR^syZwFM>0jMjS8;XLmKu7jnTm z4~#^z%y>&;LpX>2sdQ??uJf*T(TQr&0=@_KZA0#hvIwl&C5$Q9Q0cn}`e;lHEdSI5z zs$Keht811dQt()6tnfA!$uWEWFMqKkfB1ymPBw@Z_860~?*gu}N?ctjTvaPL9%C2^ zX?uN#jB(t=ah5Mvf}zxsbdFWWG}8A`38^YIkmW%pmyWymZiJLR;{#N>CqJLC27e~9g4agY>|e2M^RxQ1mQqd7#L5yiZjRU8s`i1<4xzAfT! zp?JTDzk{OoGH%QrVw%!V?Y4pA!D=AnGlW7XND#VdmksQXQ)=*J$LKLSz$sl1|nNWZ%lFIdiLQe`?U?%lcMyhP{I}OTY@UC=-8$$5YXgtL+w7h} zg7=7c6W${lYwk^4b76$HfKVaSA-_0;qjzQ(GD?gQ3)oHXltGNCdfO3h5H<`_BEjLr z#}*l#O%-eYe@j+{c4AM+5gg2`bXwuE`~k8flwZh3{9RGiwz78Z1E@o`rUTpCfpHzc zEdbPNwcD+Sv^q}pzdk;$4Z#l0U6_v_CJ5Q5SMK<#D1Nm=e?|jDwbK`U zswJ_~;&F&#d%Gw)JeC!8Qp+bUntpAIJ~qebYQ#5+;6vJK2IoYhQx^{ME#3lfOB}Tq zB;LI^0vPv$zf=N_Gf$ViZgFT!9A2-3OgOxAf1iIbe;k_2mDjad9cE=Ohy2K-@+{o#pZxrYj#@?^P^A6ClA;rt;onx7ztv?K_p1vmj% zSnfG3XrnBKL)ruxMRb2+M9}3RCvcr6e>r|Dp@gM^xZ03mCzP-Peq=T?O3I&PiVCFZ zc}z$0{K4c9hCTU1FmY(48Yu#Pkg*Ig!ew za@av78e{KQ3!Ns(iNl8{Mn|*}GJ04O@QuO=z0ZIJhw;gn;VFMDe^{v~_Xs7=f0nRs z?AhmdDC<)+r;>?tJoWG>K9`)B`dt35!$NUyU~{G5Tm{+l^|307`oj{wFr4t}eIg#% zRu~9;PLK9SoTCRuKFNDU4r9UL!Z?oL915e_p+kob7v#)`DZ{EhHbNFiDJfu_O5t58 zl00!5C;P-GPVS*mW3U19K!9X^E(DSqe>RNhG97%LE{7=PewuL4$q1dCC(YnY`*CvF zf1GoP1u2fE{Rs3%T)1YF+7~nmSdModHX`kiaXFJ17%G2+G`UMC6B>m9K9h*DnfN@x z5tBE-ak(0m!b(I&obAI4MD1DppO&2@(oE6}&F2^~X_Cnd7$*eMsgbb_gbaj&olD9b z@?UYvXYAUzzPqold;P{gZCuyg2kWah-gf_O8@szV&WOfEcvg19F+w(sjik~@&1w5Z z=#m{}OFDmpp$Ryq--h@1c3--2T)b-ryN}&o?J{fg#CWZ)|6%*mG{KG7qY1f-8OU3# z6?O`Hg#*|x8ZR`z2HJDpEajbK-SFaym#Hbh)IEB?;g8Dds0x&m(H1EeSqb5XP zE6ih;F9JYCCDu6vYo}pIsJ{&N?-vQZ7caLE;_`t=ZU=hr00lRgoOn+k5Tq5h66jmC z_N{-ltJvi>qMeGh)HTkyqpvxxoeB}{llYWmF1up&<%IruT8j$OI^rc{3lYsO2of^U zLC8rECGtGkhe?=&G`ZbEv|o|c1mcu<-9WUj5fRHtWjT;PVzLTIT^%8p5mA@n-YyFC zN?|k8jN&XX(K!b|BqS0h4wgteu&6E0C~1G3G_@_jigUaylV&jvG=ow#+pgk#Vg;Oe zB+uFW%ZyN$5ejtTMAsS-VdJXhA5YXZH-2`V$6|&=xGJDHtR~SFu$%n=HhZYTAqP|8 zsHt*#V`s27VJoP@U$trbrE3m^MT=}-ZK1?waa!z_n2Myl*@WCrg~Of_sk=!v`zqSHmM`q`RyH;v zr6yUO0Y#~|N@7!ErMGM0@~*ZDpX>}&gzvP=7BPHa&86Enty+F(qE0BtS#P8kL#m?7 zQ>GyWI!BkYmg?3iVl9U3V&};RibH?HSUc6r1dUAkNON8}kyAnC+IJSTwc&$)$@vr3jdn&y@}AIytT35+k+zo4lZJoy5Z#o8 zZF~0E!ev9_<0s*}+DYUI+{ma-jj15!YZcYLXOA75`-Yg`Ha~H>Egnxny&b91bJ&ls;%CCOKTx5&8mNlOgp$ZZ+fO;t$M_GGSa2 z3YUk6agvl&dzP6AJeh7xTc&?4pYH&vVD?~SXs7gyyOic|xH(LO9d13P9R=SlF9bj7@lCM_~+p zNjK1l(2a0-p)e*~B3!21Jp>W!#1lD&c2yHz5T-87vK$-8trw{E$wYbJ6HZc{ z>S_-{Wmz)X6O$`5GY8uP_WDpmg^FcCR#sJ>An}2Ce1JHs>gqb`>SnnEflwfzy`#sA z^xU46V}VbD{Sy^kZPitHpZhZq>6|st==8P@&d9kQ;6?3KP?hdXxjr2qm_HCFe@EGk z9d+7r_MA`vYV}yVU(Ywj4WOu7XOnp_NkIDjFF&oS)@mjp6pW&*bj zR)A{_Yq7B+-lD`2JL|+-vxx1yg#nR@Bjaw4y=aDqsum2E1!pd3C;PoCJKGkwwk~d~ zpIh-|7k%43va-`MYt20Q9Y=P?f6R2brLJ#K9|!n&qT5wFG$$!nx$5SqY?8xTLKgYc@OBy7-dCt+kOSsvsv<}YhL;x`c zrL1lKjOxI^1(j|$jOoBLpvx@{Ui~EUa*QHk^z9&{p-c4dD%=D8n=iY;ucZVBNEhniaO3k3GXQ?1Lc>r8Swl8#OvC3;b|xb2#VM0-d3c8~2(Tiv=*9o+8>>i7om>h%!dIMES=a}_?wGuI*>P=vx z1u~Nf+N2%#RIc?@V#|Ckf5<56T7K!%o<4cv>%vk_8nf|hwNwX?ucrf9?!Aa!N# zb(rDd0i1RP@=yaW)M($az(rWB%q>kaJ1?Zo*OcfvQyearoI`qsJFNE{d8PYR;zOj* z)CGsmQ0=~~{RDTeH11&Mj@gDhd5iYWPqfF+$aq-a&yMQRJ5#O#Z-VADC8AR~77v?^v-clkM$UxAD{QwH@Vw+PZi;II}O}K?d`7af=4RqtmQ53Rg%ZwWRxhCvQiWFQoED(v#0K!-e0ZQ z%nrNR?hlM!VC(N)bLmdriv09sm%SyN30Ao+4!dkN$*pbkZrjuaxlQ};o;3icbi0*# zdi1OweJ0%A>~%GyJ^s(=86$y6&|$5L+MNdPjRCVuU>dU=f3tszP6Z>jsAaaG!#t+Q ziBq=d1I)@YjNGj+m%=nO>?;smsn?NWxn(8U;Z}P@ zpxxafTgfQTw6GAV9W|2x*&E|{CzE3{uN%%G zXi&C{3!G9We;b!$UMbfEk}SQC67`L*eGPW^0o2fG6d44YcGwwqYKLu-8Qe}7wb;y7 z>jDBG-KxC_5URy61T{Z{YsRrh(E7xLC?0iK?eh1`<{y~sR)=<% zyUP51Nooc%my-As(E9nlC!YBHu6K(!^GKH={ok`}e?-o++G8IU1H7O9_ya6I&RG50 z!8@>>cZi}Mowe47K4|R^74PLy!Olk4DOKV{I$F>r892#M5{26{bVAggWMK6qBAPK~ z5HTjgK^9KQ7j%0`k_Q8Q6EywiA-3P!{nQaeUZ(!$gX@1 zpL;iJfB)U%Ttg&|KM(8DY3(7HaE#ePwlT*ZQQV^wu*VEDje&`djt;$FtPQ|qfL!PH z0q;)nR?_5Rn}@&FT~_8UzV>S#+hQB3Jm>pZOZZwT%A&lumXmxfpF_tYm1yTw{_-dv zYpKL8f{x`EviI}F+{W|(`JcS2D>m>?GmG#Zf4@AF{USS_*IRW^kH#i>7d9uqrw3_( zOGgC@FiSAit1{6B66_2E11{AB&|C9`H({jFQSuf4+f1H&en1t;Gk9L`hmo_d%cf74t^X_tAwclUuD<>yG&^!4n@f)lk-w+8h9HjK3lU^i54*JBvz;9du zzYE^UpL|)9up}b^QO<`AKn=ySuC3d@MaQ(=ji zSI@m*>57F5np;|$7c5*c^ZGV_ONGbMdC#J4tCnXwIFmQhdl~LEs(!>QcA!iaXxu8?$wzPD$Y|5Lg4$&n4u*_|@jjxrx zUY7^~S>06s`Aye+gWU2qrC$O-tatO`fa)ZSNkPga*3;|pwvgY09Trn))@yj$1Z|geZ<5J zBAIx;1+x7j&NmBEjPnQ*CzE9|LlqMjCL8dOC5f4${RMn!8^9MNSOLMNMcXdhwtY#Y zDr8k1gOZ7?AXd7EiqZl}lFeS5;!`}X%9yQxrl+c{B{2807XOleTOR$)b+sZQIf#$X zyI}DyuHFE$OFX4Go<|_ZzI{=Y|3wS|WE&TSYSgm1!Dy?}&}=eG&r2X45-nhI+1&0B zGN^8sP4P48Al%XU9mDm0VHUzofh8&Bwx8fHllWCk;Y+n?7ECY(usGBeq1kwK(m-JrU)05+xD zZmsW&!og@?y*2+`IMPy4t*x%EfM05>gAENqIEbP4t!Ki`5Gtp=$#BjdOP41_vpwmQ z0uH4dNYZ2ii|HAQOBSKe;q_K{y-$z}Tz*=(;EreXap;mQVc zLwBNvWaH(3$%>s8fO@-IRhk^cYByWm9_^;kBAi*{?RVsSJO|^wCT<82#^I(h<^PJ)u}9e|i;XVr{2H?8SJ8(O4^M}lTaoh6GlOvzHnUMXg_LSg`;*|lf zx-5$6UE>Ao`45yf(OK^=UZU>z7bjVY{4(>rW1bERh2_FV;YwkGt(hsT@|5QAMZ=ns zndF(n1wI!^)?=~*sa4$&djLVVj8)S46*#G=9UbH2ni-C8IRjfuVZ&;eN!f5N zC(XokOjvA6O1E-U^_HB6nxo4fvJ=&%{m!L-630WL*rUI+N7P#1GXFa))E2@K?PcD$ zJ9HBK;0l+|=Uj;sl;_h%7GkoaBfp=tY8!Q;TmMb+%}#7H^37pJT^fd735ZAJqS2b- zgEt4n=WtJI2GIT!L>2(^OnFWucRx!=6LV6r5~BSV?ki1%Je%JlPSWd4m+#~Hu)%_V z{B2TUuM6FDyDMM>6H|e<^BvJAn_?vtuR7`J$^}_W%=PC&;y`-Ftovup*jSDKHclqB zM>+3Ut4qn~z?6GI}!h(1o zUyXQ{OA&4&?^rGJLD`@Gu1Ma?`}7OaBND-5K4vl7*o#gJUb&Di*d{X=F6Z=rhF{U` zEe+dbMw+<*yAnbOrUU^PtgMAr1Ykm+qhT?B*>lYKN(X9Q*hJ}boU6$3Z>PD_XpF_ALjrpYov znA)BOY>%N>E?u#zlqg-g#nNzp$tyLDIhSephJiXGHKj#+C*KMnN!n>lT%0fxrA=b^ zL!*1iUwCWy0^ms3pw0R2$-Rh5XalxX=tNV~`~}NTisUH4pLlX;*X-H5hMopW;pycI z<~KFLh089S-`G5Y8~rYP(=H%nWcIEDyJmCW(&onb7Zzyp)3_!9aqet?CJ$nEF%j7Y zx^=omH*v{Ta`rHbpv^=UOwP~wFy5RDBjZ$NhQY-%I9lmAyai@L=mG+7z6oRj#YUL5 zccdS-G74?KtudmjB2caLiU%B)3%l|*qugHh%*6t7Jm2d{UaK%{( zM_fWAa;GyUW;Xb{8@`S}!U2N=jt(d~&>#?f9iiiT4k8RNo@0Q+!Gr@$0feUNDLg`i z(|ePK&4!(}dQPFuD+$RV{Q?+fc=`*7MJOd51(~J0tgMw&3Gq6AQTzo%f>`NkL@C(D z<}*c`1v|*Ur_D$q^s(7(BAmCE5`FkwCk+j3k0bfg9uuieYYVL#+ z?ug6&-Z6Wk$sbgI;xl@bFPeL2#5_GSYmdJCvK$H7%)g!C>o%U!H8?%%vB;}dIR=v9 z!R~sqRIX&F5BB6sbx^fF68T|V}bVfS;kUE{R# zNK~1f4^p?$4C6Wy+{<$E4@yryL!lXt82S^Z>BUtNxqFm^xlg{ zj2hZrh?f7U2XF4`pIu%V?TlKNdcF8OB1F3)Dt{5EAtt(!%-XjJMPiBAoh<_ct1E&P zfUgswp||;hmKMn>#p1nt@xhG@}&+}D+fl2 z%UJf4oG=Q1n2D%>V#m9na1x5Ks?wP_O=FCkFXm?anKWWqyg(c)l~Satj~$DGx$N8& zM8e%*)Wl5$e$`U1%)NYHZ#0PAQ*^!pHx<{{L>NaJdA}&$&3>?>cSBFlhTSZfF0K|^ znPZh6#api3yKTTy;VJ|8G`pP%qXBH>k6hY&obxV!t;W3=ygPX-{tQ|B`}@8B4IbNP z`OG8UQ9ooJj2$to&(yXZJ3{BZAR+C3K5k4{(5Af(bswDZK2F|KF39+YtH{~KCykuWRxyRFgbJ4}cwp^^^^_S`8v>Wky1@6Z^+@?pC zxK_cS@cFhR#gv$XtG%WgD(NO3MV%fU)s8xy+EKgH1w*zf8w|OeUE1qxE}>4_*jQ^g zLDx6AXN`94(796b!Y)bLCHWlMI=c^VRc*+AxWn~YyoZg(+pIf7R5X65RZ`6T+nimEd~IrXCTz% zko*+^=gX>cR8hIP1k?TVD;^vhUv4vt|;mbx{;Ewgfcvvz%a z*Q~zWtS!NsZzpDrjSNOijdPa_*Hl(Fi(*Cp&e68E(VhJjm|ie6>$2+FD+g!qnl)?J z?7=HzRhP{gT0r`m7GynTor}kR=C|9bLKU+NTh|huewb5V)6ZoMqA<&k67+Vi8o8;y zm19#)J7#E4i-ws-`W!YOA`G9~=aTvNF+V?2cV^k^MR!a?7dW{Gq|U2fEwv%^6>STP z!p%v7+^|Y`U5?Pt;MNThof3!?h5Z*Y4{%LUE71zMx@;z}ecf)%Sd zO~T`2#;q6>PKRT7@g0871oNa~(&>`1#&)v1ad#2=n4S1!Q>;ydA_x`!JSNmsjMC-r>s@9dc>+BXf4Twps zcbLoo(eUa)GESM-5DWNJ9e0;qZ?)O1*O$3l)< zdc3J%byutS3p!oDNXTizW%J@eI?pMiWeg%l#sMC8o4(54gA~ zZ#N*!rP{M{N{L>D;IhIQpqs=p?=NAAVo8Rkd84+^z&|0WGwU;i4oVUowG(gD_oZdp z^qL+H*El47;Hv%~>tx*vnb1!f7;rFtKFroQB56hBGwaaGtJcJIgk}tB`Y9rby+=-YtLriYS z@<(Y~6XAeTTV6ds+k`hHVl$hPD-HjFlXM%`8!UIv4I`R1NOouVeG^ zPpcF4V-^0)!?O|bexwebHg@XQ^>|#5P8vOtO8OBMTKJiNPG|K(DzZUErYGaoQ>?_F zW84y^vA#c3l0T&f`6pPj^$r-PL7e10U_CiU`#;6n_XQDu+A7ZW43vZ=XB!wkzmsj& zk0CAWy12I)y^xh~IbQe+XB@!l+}(jk3+9nzkJF)cJSRFI*+ zM1FvLyATV1>*BXuA4%y8%kOgn`47a%TL*eK_Iu}V=$O50t~jtTx1wuc>kXTy(ey=4 zGp?HD-7-D5A~$KbvzO#?ZL|m-oUV>UWiAF=!2c@bI8^99rS8$|g@4;X#IJ&+am= zsC$#U4APhd+uddJFn+-SEy)EB7E{`1lNcF$0&Bk;d%#+6w7AerIWeUhY&NpFSoYkx zbdla_*4&a#f`<`Z)We#G!ZUS&tTHR`DbmjjM?LvVC&4wK({19otq((luM zZ_qBmDbxyG+y-y8uua%4+`_eVvf&8Lbq9z^nhDaO2~043nCqH4hfoj!l{ z6{)Kms;e8Mh8^1*t{y49NENEo;ynp}LWU`=BjnO6MWi&vD=AVt`CovT6`_WQo3U0M zzzDD9=T&g9MXY|Lq!tN+(GFd;sr}Ox)qY>+1q-TJL$>e0cVh#t{$}Y#s!&DyEjwgI zgb_mODE(PY$#ZYfTZJK^uMv_c*7`%SN)2ca6>7Qo@s-Bj{4#k9p(leFX)exx8?!Z% z`H7yUfND7AFp7@{*?59edopfBrh;Eif@!-X<|dy~F%wM9B*CS=ImUElbKK)5x4Ee) z);ZtpZSIEFmJ1iHp0>NSvVv!HwKXqXv}*CkrkCa7@fE8s8mbLR_VAtBZ_Tn&o^Zr{ z74VCmeV5O*jBMJu-T5wc2Wo?VPQTeq-i(CgnqXo}x5Ke|(SF}wmABTVE2@K)3s!9LJ4_a6?FwmI%H@H}rcFCQ-ae zd_}qmafNuZ2+dokNC!lj7PKP?V1>nmoQRfwT>^6JwftERniW}P9C zw@m-lO^NiMp!*HIL2t)B$SZ`5^LH0AujrV5hE=5W5UWI~*rKR^iS+wSG-K>o2$IsI zYYLO7Ck-uk9 zCk@~rVIN2SrcwGLz;=W)S)2y!VPN_n7^4DBGY$EfK`xnQT2qrTEJ3#OI*p^z__=+C z^D~FDNStS=hKi6K;m6M6V*LNvMyM$@T0FZ7G)f~tNuP{=BW>DjQe;XHlGK5~W|zZO z(@^hPagNe{b+aFu2GoAsBxl`k_i01A<(#4(hvh5w=T8E%Ob1~*dp7jT;PA?uO&}41 zzzTj)H#-{|YOHqmpIE8WD{o?jyd8cL*sKmTGopYJ`1$wTI%$Ou-|W19JiniuJiug| zCaw?pB&Yv>RNNc;gbRe_Oh0oT2$>>?KQDyjil$b)zEm`|;<%I?I}a0~oIKm~XO}ZNpeTFqvfgpM}H7KHhJ3Hd(VF zNf{L`7le8!@h&dzcm-99w`f>tG7f{!rPNZA* z)7~9ppAQ&w29R-$$4Rwb=_X$JruP|4zOIhpnDud3X+*w=`LmW#s4;c&LO!RJ0wajI zzJeKlCKzl*i8DjuAQ4}qq=tonfk;9?F{~kbH(tCXl}@LYTztHcxT@ox`*(M_#%_P; zW5cds*}sSs21My{-B66|qht@E9Xy<_r>+AG`=>mEC-RTw8iSV}c<{!d`FkH4>io7O z-$96YNEUZa+P_WW-O3`ZG{$TUV(;Uh`oFe+S5*xm0v-}YJ=*v;Vc;JXpTnc){&oax z;%nA2IPIY9eam;I6EM02wF(GQ7#wxMQ*&7oPH*O={4My;AXs=a6H)Sm%6KP>Ln z&r*1i`&^oF1PT(>#mH?7MTZx*#F%b8kjkk{P{GvV-h`ado#BcL?!%yGm@*bgC>bVl z&{I)STT$U@TU_r5QF86I2tAJa#p=*dWPU`hS~y*;nY|#TXfw}=mtmlYkd3i_0+Btg zwqj3a>6-YHgw)g!@??C?(u{VC$J6C@ IhFPIy5_tgdJ;g{#Y&~UIgP?KY4z|AZ4 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

    ?lrt;5OM-oNlt|eCjTp~ zQs|1I$k2t%L9^uA~l}lIQmy8j%+b3X52+-Ir`XOYV4I2Q$B?`sbG}s=%#0>Z*>z_g8 z?@N*A%Wvcj)?+5bz~Dfs(n`L3RM7v^bMXl>nO{@t=U&OEfPSu;sG^XSr_ zr?t*++O%%u;m!!#2?3D@0?g1mncGkLpNHdemBtCm#K^&`q}3i`4~~pdMvY441WHj) z9mm{^@hnzXCzFY9`2wG zD6BTbunBiiepU27Lpey7s_*{Tm0m4t&ydX4=xYb|j@w9yIWzz#wDsYxsPwHWEJ73l5-aH@)sy3P!dKX=LJ7%f61iZSg6qV)E;mrf zWH;g*o~;$e3`+tqQX9hLAd3sDtQsXMbdg~qgR}X-K3r?~SjqHydJ2_AISntXXl^%! z!WUySmIMGuXCx5F38890h2_V`s)>)-;oeh(#y~iNtJ(SYX;b3M9LifO!x+oIY){ zKiK=lOTsR)h@qKu^*Zh=hO}WYTRo-BUi%nyHPJzr4ZOpoKT(}Lw zjDjHZRdWoFSjrWcT(#ZRg@TDmtU|bkruGky!K+{zt5W{R6<61>PAN0)=I;0W!6thV(YN&`RZ;NYXtYBz}Y?oh29gbzLz+#qb z86mj5KGVFmpx#CY^xm>@&@b0p&_>TqGBGg{ufwNv_gp6}^s03b&O}g)4n$ z29w4|N#VmL)hBv4? z5@t&1068#4*32B+%NfWKC+%{=K~rbmabhcfp|3)AM<3_<4^~*y z-!!F_H3Cl>tEcvNoP7vzEg2%5Yb6C{es{RgM0q;$k5ZOeh50Qd^V6HPTJ-1 z{2VlORwuvkR{la?g^ZeV8~q=waAEh8=Z7aI^*u=(V``2sv;M_1PdC|zOvj7(ohc!R zY?Mi+7yE+X4}(A`e|pUHI$rXiTO3DR(!J8A3lq+ORGMy>*55e#XJk9B=K~-FBPfOw zBt=LcaFCux=!WmPxrc88!CPLLGMupBRllB}qj{qc};kyeO->X}f+Hr+Hbo{W!1tdA&d1-yeiv1jXSAL=u@orO_Eo7MsK6@dZMW zSR$3l6-t#_qt)pRMw8iMwb>m`m)qm@Vg4|kyg@}M7wolG%g_iXoKrKZVFq&!B*mB0 zRtcse>y+Z|ye6<|>Nk-bw$Y0A2Z5?{!xb05q$YFlY6wPQiujRld%>g&#%83Wx-01X zBWjP#Xn8dpsLnwEWjAMB*w3hGbx~^Ta_Gu*zKddHZTWTvkT)ac?H|r)xn{6!1{4j` zqvGUToC8|!?wnI&DDd@+bQpBZ)nRmUvfX7Elmpi1i#kuD6wB{-l-?L$2TlE9#{#Xg zP0K?YKm7CSFAkg;2AaoDr##$VtAb=JlRjbSe?XVLkf9tAv9$Yl23snI|!{ zex%0IuN0CQW1bmdAoCZN@pYc9o_(n8H8l=w8puhsukcNxPzw<*o*N$23_{HSnJlUM zj2`Fd5O@XK}9W-z#R+UZlnu;DxMvt3N>fn z**w$&QXV=J6`Sm@Bu8OqROC)b&AX+^N5F#VGG&bGvwVI>&ntlTXFt*K28YQD+PXP5*ykf=qe}yfIEz4VhB2m~X+UKcqNn;*k_exIUH$ z;t!=`>3$G%QWg*{J_IrB<5aZg)C9IMkUJ~P(&{T{$({Kdp&I)#!$vNJHI)X4DzF(W z0x(FswSX_Z`{+81pu>-_$dtA+I0;Xdle)Txa_bK_e@@$VaUg{Qc<4AY=oFiNEH za8IVe13Pa%hPEOJK87|ix1Vej=3!*HpJ&S4$Nl4Cjz1@Y}>Z`266GED#r z$)>O!oN-+~rS*(y$yN=?LJ8hrv{E6@WoW2p@(WIHh;le@q3`IYS~ zc*ByzfxFW%eeEXfknCeYSatzM@Cu0RrM?kS7E|9d$)*Fh>`$0REEcZFsg_dF$Ab2q zjPzorX-Mr@WEUk}7&WwQE!uU!J_>U|Rd(xNz!o@NPL3H*lXv>e1BV49dA=9CR}bO~_r_vD4Om zZo3AXyqSjx%(9~r$w@0^6cF} literal 18952 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 n4>g01 Date: Tue, 19 Mar 2024 16:18:08 +0800 Subject: [PATCH 02/73] =?UTF-8?q?fix:=20=E4=B8=8B=E8=BD=BD=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E6=96=87=E4=BB=B6=E6=97=B6=E5=8F=AF=E4=BB=A5=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=E4=BB=BB=E6=84=8F=E6=96=87=E4=BB=B6=E5=90=8D=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backup/ArticleBackupController.java | 66 ++++++-- .../article/backup/ArticleBackupService.java | 112 +------------- .../article/backup/pojo/BackupFile.java | 145 ++++++++++++++++++ 3 files changed, 195 insertions(+), 128 deletions(-) create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/pojo/BackupFile.java diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupController.java index d65f09e..5ab8cb2 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupController.java @@ -1,21 +1,19 @@ package com.blossom.backend.server.article.backup; -import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.blossom.backend.base.auth.AuthContext; -import com.blossom.backend.base.auth.annotation.AuthIgnore; import com.blossom.backend.base.param.ParamEnum; import com.blossom.backend.base.param.ParamService; import com.blossom.backend.base.param.pojo.ParamEntity; +import com.blossom.backend.server.article.backup.pojo.BackupFile; import com.blossom.backend.server.article.backup.pojo.DownloadReq; -import com.blossom.backend.server.utils.DownloadUtil; import com.blossom.common.base.enums.YesNo; -import com.blossom.common.base.exception.XzException404; import com.blossom.common.base.exception.XzException500; import com.blossom.common.base.pojo.R; import com.blossom.common.base.util.SortUtil; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.PathResource; import org.springframework.core.io.support.ResourceRegion; import org.springframework.http.*; @@ -23,10 +21,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.BufferedInputStream; import java.io.File; -import java.io.IOException; -import java.io.InputStream; import java.util.List; import java.util.stream.Collectors; @@ -36,6 +31,7 @@ import java.util.stream.Collectors; * @author xzzz * @order 8 */ +@Slf4j @RestController @AllArgsConstructor @RequestMapping("/article/backup") @@ -52,7 +48,7 @@ public class ArticleBackupController { * @param articleId 备份指定的文章 */ @GetMapping - public R backup( + public R backup( @RequestParam("type") String type, @RequestParam("toLocal") String toLocal, @RequestParam(value = "articleId", required = false) Long articleId) { @@ -77,7 +73,7 @@ public class ArticleBackupController { * 备份记录 */ @GetMapping("/list") - public R> list() { + public R> list() { return R.ok(backupService.listAll(AuthContext.getUserId()) .stream() .sorted((b1, b2) -> SortUtil.dateSort.compare(b1.getDatetime(), b2.getDatetime())) @@ -89,9 +85,12 @@ public class ArticleBackupController { * 下载压缩包 * * @param filename 文件名称 + * @deprecated 1.14.0 */ @GetMapping("/download") + @Deprecated public void download(@RequestParam("filename") String filename, HttpServletResponse response) { + /* final ParamEntity param = paramService.getValue(ParamEnum.BACKUP_PATH); XzException500.throwBy(ObjUtil.isNull(param), ArticleBackupService.ERROR_MSG); final String rootPath = param.getParamValue(); @@ -103,6 +102,7 @@ public class ArticleBackupController { } catch (IOException e) { e.printStackTrace(); } + */ } /** @@ -112,7 +112,6 @@ public class ArticleBackupController { * @param request request * @apiNote 返回类 ResponseEntity */ - @AuthIgnore @GetMapping("/download/fragment") public ResponseEntity downloadFragment(@RequestParam("filename") String filename, HttpServletRequest request) { @@ -129,15 +128,17 @@ public class ArticleBackupController { * @apiNote 返回类 ResponseEntity * @apiNote 通过 Range 请求头获取分片请求, 返回头中会比说明本次分片大小 Content-Range */ - @AuthIgnore @PostMapping("/download/fragment") public ResponseEntity downloadFragment(@RequestBody DownloadReq req, HttpServletRequest request) { - final ParamEntity param = paramService.getValue(ParamEnum.BACKUP_PATH); - XzException500.throwBy(ObjUtil.isNull(param), ArticleBackupService.ERROR_MSG); - final String rootPath = param.getParamValue(); - XzException500.throwBy(StrUtil.isBlank(rootPath), ArticleBackupService.ERROR_MSG); - String filename = rootPath + "/" + req.getFilename(); + // 检查文件名 + if (!checkFilename(req.getFilename())) { + return ResponseEntity + .status(HttpStatus.NOT_FOUND) + .body(new ResourceRegion(new PathResource(""), 0, 0)); + } + // 拼接文件名 + String filename = getRootPath() + "/" + req.getFilename(); File file = new File(filename); long contentLength = file.length(); @@ -167,12 +168,43 @@ public class ArticleBackupController { return ResponseEntity .status(HttpStatus.OK) .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE) - .header(HttpHeaders.CONTENT_LENGTH, String.valueOf(resourceRegion.getCount())) .header(HttpHeaders.ACCEPT_RANGES, "bytes") .header(HttpHeaders.CONTENT_RANGE, contentRange) .body(resourceRegion); } + /** + * 获取备份根目录 + */ + private String getRootPath() { + final ParamEntity param = paramService.getValue(ParamEnum.BACKUP_PATH); + XzException500.throwBy(ObjUtil.isNull(param), ArticleBackupService.ERROR_MSG); + final String rootPath = param.getParamValue(); + XzException500.throwBy(StrUtil.isBlank(rootPath), ArticleBackupService.ERROR_MSG); + return rootPath; + } + + /** + * 标准化文件名, 不能包含 / 进行隐性的路径切换 + */ + private boolean checkFilename(String filename) { + // 不能包含 / + if (filename.contains("/")) { + return false; + } + if (filename.contains("%2f")) { + return false; + } + if (filename.contains("%2F")) { + return false; + } + BackupFile backupFile = new BackupFile(); + backupFile.build(filename); + if (!backupFile.checkPrefix()) { + return false; + } + return true; + } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupService.java index e0e0271..381211f 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/ArticleBackupService.java @@ -2,7 +2,6 @@ package com.blossom.backend.server.article.backup; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; @@ -12,6 +11,7 @@ import com.blossom.backend.base.param.ParamService; import com.blossom.backend.base.param.pojo.ParamEntity; import com.blossom.backend.base.user.UserService; import com.blossom.backend.base.user.pojo.UserEntity; +import com.blossom.backend.server.article.backup.pojo.BackupFile; import com.blossom.backend.server.article.draft.ArticleService; import com.blossom.backend.server.article.draft.pojo.ArticleEntity; import com.blossom.backend.server.article.reference.ArticleReferenceService; @@ -29,8 +29,6 @@ import com.blossom.common.base.util.DateUtils; import com.blossom.common.base.util.PrimaryKeyUtil; import com.blossom.common.base.util.SortUtil; import com.blossom.common.iaas.IaasProperties; -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -72,7 +70,6 @@ public class ArticleBackupService { private Executor executor; public static final String ERROR_MSG = String.format("[文章备份] 备份失败, 未配置备份路径 [%s]", ParamEnum.BACKUP_PATH.name()); - private static final String SEPARATOR = "_"; /** * 查看记录 @@ -443,111 +440,4 @@ public class ArticleBackupService { .replaceAll("\\|", "") ; } - - /** - * 备份文件 - */ - @Data - public static class BackupFile { - /** - * 用户ID - */ - private String userId; - /** - * 备份日期 YYYYMMDD - * - * @mock 20230101 - */ - private String date; - /** - * 备份时间 HHMMSS - * - * @mock 123001 - */ - private String time; - /** - * 备份的日期和时间, yyyy-MM-dd HH:mm:ss - */ - private Date datetime; - /** - * 备份包的名称 - */ - private String filename; - /** - * 备份包路径 - */ - private String path; - /** - * 本地文件 - */ - @JsonIgnore - private File file; - /** - * 文件大小 - */ - private Long fileLength; - - /** - * 通过本地备份文件初始化 - * - * @param file 本地备份文件 - */ - public BackupFile(File file) { - build(FileUtil.getPrefix(file.getName())); - this.file = file; - this.fileLength = file.length(); - } - - /** - * 指定用户的开始备份 - * - * @param userId 用户ID - */ - public BackupFile(Long userId, BackupTypeEnum type, YesNo toLocal) { - String filename = String.format("%s_%s_%s", buildFilePrefix(type, toLocal), userId, DateUtils.toYMDHMS_SSS(System.currentTimeMillis())); - filename = filename.replaceAll(" ", SEPARATOR) - .replaceAll("-", "") - .replaceAll(":", "") - .replaceAll("\\.", SEPARATOR); - build(filename); - } - - private static String buildFilePrefix(BackupTypeEnum type, YesNo toLocal) { - String prefix = "B"; - if (type == BackupTypeEnum.MARKDOWN) { - prefix += "M"; - } else if (type == BackupTypeEnum.HTML) { - prefix += "H"; - } - - if (toLocal == YesNo.YES) { - prefix += "L"; - } else if (toLocal == YesNo.NO) { - prefix += "N"; - } - - return prefix; - } - - private void build(String filename) { - this.filename = filename; - String[] tags = filename.split(SEPARATOR); - if (tags.length < 5) { - return; - } - this.userId = tags[1]; - this.date = tags[2]; - this.time = tags[3]; - this.datetime = DateUtil.parse(this.date + this.time); - } - - /** - * 获取备份文件的路径, 由备份路径 + 本次备份名称构成 - */ - public String getRootPath() { - return this.path + "/" + this.filename; - } - - } - } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/pojo/BackupFile.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/pojo/BackupFile.java new file mode 100644 index 0000000..7902eb8 --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/backup/pojo/BackupFile.java @@ -0,0 +1,145 @@ +package com.blossom.backend.server.article.backup.pojo; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import com.blossom.backend.server.article.backup.BackupTypeEnum; +import com.blossom.common.base.enums.YesNo; +import com.blossom.common.base.util.DateUtils; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +import java.io.File; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +@Data +public class BackupFile { + + private static final String SEPARATOR = "_"; + private static Set prefixs = new HashSet() {{ + this.add("BML"); + this.add("BMN"); + this.add("BHL"); + this.add("BHN"); + }}; + + /** + * 用户ID + */ + private String userId; + /** + * 备份日期 YYYYMMDD + * + * @mock 20230101 + */ + private String date; + /** + * 备份时间 HHMMSS + * + * @mock 123001 + */ + private String time; + /** + * 备份的日期和时间, yyyy-MM-dd HH:mm:ss + */ + private Date datetime; + /** + * 备份包的名称 + */ + private String filename; + /** + * 备份包路径 + */ + private String path; + /** + * 本地文件 + */ + @JsonIgnore + private File file; + /** + * 文件大小 + */ + private Long fileLength; + + /** + * 通过本地备份文件初始化 + * + * @param file 本地备份文件 + */ + public BackupFile(File file) { + build(FileUtil.getPrefix(file.getName())); + this.file = file; + this.fileLength = file.length(); + } + + public BackupFile() { + } + + /** + * 指定用户的开始备份 + * + * @param userId 用户ID + */ + public BackupFile(Long userId, BackupTypeEnum type, YesNo toLocal) { + String filename = String.format("%s_%s_%s", buildFilePrefix(type, toLocal), userId, DateUtils.toYMDHMS_SSS(System.currentTimeMillis())); + filename = filename.replaceAll(" ", SEPARATOR) + .replaceAll("-", "") + .replaceAll(":", "") + .replaceAll("\\.", SEPARATOR); + build(filename); + } + + private static String buildFilePrefix(BackupTypeEnum type, YesNo toLocal) { + String prefix = "B"; + if (type == BackupTypeEnum.MARKDOWN) { + prefix += "M"; + } else if (type == BackupTypeEnum.HTML) { + prefix += "H"; + } + + if (toLocal == YesNo.YES) { + prefix += "L"; + } else if (toLocal == YesNo.NO) { + prefix += "N"; + } + + return prefix; + } + + public void build(String filename) { + this.filename = filename; + String[] tags = filename.split(SEPARATOR); + if (tags.length < 5) { + return; + } + this.userId = tags[1]; + this.date = tags[2]; + this.time = tags[3]; + this.datetime = DateUtil.parse(this.date + this.time); + } + + /** + * 检查文件格式 + */ + public boolean checkPrefix() { + String[] tags = filename.split(SEPARATOR); + if (tags.length != 5) { + return false; + } + String prefix = tags[0]; + // 不是固定文件前缀则失败 + if (!prefixs.contains(prefix)) { + return false; + } + return true; + } + + /** + * 获取备份文件的路径, 由备份路径 + 本次备份名称构成 + */ + public String getRootPath() { + return this.path + "/" + this.filename; + } + +} From aa6a8d36c3cb50d944d6d9d1cafec4c3adc4bd40 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 29 Mar 2024 10:36:12 +0800 Subject: [PATCH 03/73] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BE=85?= =?UTF-8?q?=E5=8A=9E=E5=AF=BC=E5=87=BA=E6=8E=92=E5=BA=8F=E8=A7=84=E5=88=99?= =?UTF-8?q?(=E6=97=A5=E6=9C=9F=E5=A2=9E=E5=BA=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/blossom/backend/server/utils/TodoUtil.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/TodoUtil.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/TodoUtil.java index 9987650..a9acbd1 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/TodoUtil.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/TodoUtil.java @@ -58,9 +58,16 @@ public class TodoUtil { if (CollUtil.isEmpty(todos)) { return "无内容"; } - Map> maps = todos.stream().collect(Collectors.groupingBy(TodoEntity::getTodoName)); + + List>> entryList = todos.stream() + .collect(Collectors.groupingBy(TodoEntity::getTodoName)) + // 增加根据Todo name的排序 + .entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList()); + StringBuilder sb = new StringBuilder(); - maps.forEach((todoName, tasks) -> { + entryList.forEach(entry -> { + String todoName = entry.getKey(); + List tasks = entry.getValue(); sb.append(String.format("# %s \n\n", todoName)); for (TodoEntity task : tasks) { From d4a6eed6a0449eba2f5a5dcf465c88f3199cfbf5 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Tue, 2 Apr 2024 17:29:04 +0800 Subject: [PATCH 04/73] =?UTF-8?q?fix:=20=E5=9B=BA=E5=AE=9A=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=99=A8=20gutter=20=E7=9A=84=E5=AD=97=E4=BD=93?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/renderer/src/views/article/scripts/codemirror.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blossom-editor/src/renderer/src/views/article/scripts/codemirror.ts b/blossom-editor/src/renderer/src/views/article/scripts/codemirror.ts index d95f28a..953f064 100644 --- a/blossom-editor/src/renderer/src/views/article/scripts/codemirror.ts +++ b/blossom-editor/src/renderer/src/views/article/scripts/codemirror.ts @@ -63,6 +63,9 @@ export const cwTheme: any = { minWidth: '50px', maxWidth: '50px' }, + '.cm-gutterElement': { + fontSize: '13px !important' + }, '.cm-activeLineGutter': { backgroundColor: 'var(--bl-editor-gutters-bg-color)', color: 'var(--el-color-primary)' From ce77d82bf40d71147ce565fe9ad5233d64ced4e1 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Tue, 2 Apr 2024 17:30:14 +0800 Subject: [PATCH 05/73] =?UTF-8?q?pref:=20tooltip=20=E7=9A=84=E6=A0=B7?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/renderer/src/assets/styles/bl-tooltip.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/blossom-editor/src/renderer/src/assets/styles/bl-tooltip.scss b/blossom-editor/src/renderer/src/assets/styles/bl-tooltip.scss index efa39db..a28083e 100644 --- a/blossom-editor/src/renderer/src/assets/styles/bl-tooltip.scss +++ b/blossom-editor/src/renderer/src/assets/styles/bl-tooltip.scss @@ -121,4 +121,9 @@ .el-popper.is-small { padding: 0 8px; box-shadow: 1px 1px 3px #f4f4f4; + transition: none; + + .el-popper__arrow { + display: none; + } } From 5de843553686d4811f15f3b246a8dd96a29e597d Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Tue, 2 Apr 2024 17:30:41 +0800 Subject: [PATCH 06/73] =?UTF-8?q?feat:=20=E6=8B=96=E6=8B=BD=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=A2=9E=E5=8A=A0=E6=8B=96=E6=8B=BD=E9=99=90=E5=AE=9A?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/renderer/src/scripts/draggable.ts | 45 ++++++++++++------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/blossom-editor/src/renderer/src/scripts/draggable.ts b/blossom-editor/src/renderer/src/scripts/draggable.ts index 013d153..5ac6a73 100644 --- a/blossom-editor/src/renderer/src/scripts/draggable.ts +++ b/blossom-editor/src/renderer/src/scripts/draggable.ts @@ -1,14 +1,21 @@ import { onBeforeUnmount, onMounted, watchEffect } from 'vue' import type { Ref } from 'vue' +/** + * 元素拖拽 + * @param targetRef 拖拽时移动的元素 + * @param dragRef 拖拽时拖动的元素 + * @param regionRef 元素可以拖拽的范围 + */ export const useDraggable = ( targetRef: Ref, dragRef: Ref, + regionRef?: Ref // draggable: ComputedRef ) => { let transform = { offsetX: 0, - offsetY: 0, + offsetY: 0 } const onMousedown = (e: MouseEvent) => { @@ -22,27 +29,33 @@ export const useDraggable = ( const targetWidth = targetRect.width const targetHeight = targetRect.height - const clientWidth = document.documentElement.clientWidth - const clientHeight = document.documentElement.clientHeight + let clientWidth = document.documentElement.clientWidth + let clientHeight = document.documentElement.clientHeight + let minLeft = -targetLeft + offsetX + let minTop = -targetTop + offsetY + + if (regionRef) { + console.log(regionRef.value!.getBoundingClientRect()) + const rect = regionRef.value!.getBoundingClientRect() + clientWidth = rect.width + rect.x + clientHeight = rect.height + rect.y + minLeft += rect.x + minTop += rect.y + } else { + clientWidth = document.documentElement.clientWidth + clientHeight = document.documentElement.clientHeight + } - const minLeft = -targetLeft + offsetX - const minTop = -targetTop + offsetY const maxLeft = clientWidth - targetLeft - targetWidth + offsetX const maxTop = clientHeight - targetTop - targetHeight + offsetY const onMousemove = (e: MouseEvent) => { - const moveX = Math.min( - Math.max(offsetX + e.clientX - downX, minLeft), - maxLeft - ) - const moveY = Math.min( - Math.max(offsetY + e.clientY - downY, minTop), - maxTop - ) + const moveX = Math.min(Math.max(offsetX + e.clientX - downX, minLeft), maxLeft) + const moveY = Math.min(Math.max(offsetY + e.clientY - downY, minTop), maxTop) transform = { offsetX: moveX, - offsetY: moveY, + offsetY: moveY } targetRef.value!.style.transform = `translate(${moveX}px, ${moveY}px)` } @@ -71,7 +84,7 @@ export const useDraggable = ( onMounted(() => { watchEffect(() => { // if (draggable.value) { - onDraggable() + onDraggable() // } else { // offDraggable() // } @@ -81,4 +94,4 @@ export const useDraggable = ( onBeforeUnmount(() => { offDraggable() }) -} \ No newline at end of file +} From 34f2c34f682abf37ba5ed7a28d390cb9b55ccee0 Mon Sep 17 00:00:00 2001 From: li-guohao Date: Thu, 4 Apr 2024 10:51:23 +0800 Subject: [PATCH 07/73] feat: article subject list by star. --- .../server/folder/FolderController.java | 21 +++++++++-- .../backend/server/folder/FolderService.java | 14 +++++-- .../server/folder/pojo/FolderEntity.java | 4 ++ .../server/folder/pojo/FolderQueryReq.java | 4 ++ .../backend/server/folder/pojo/FolderRes.java | 4 ++ .../server/folder/pojo/FolderStarReq.java | 37 +++++++++++++++++++ .../server/folder/pojo/FolderUpdReq.java | 4 ++ .../main/resources/mapper/FolderMapper.xml | 3 ++ .../src/main/resources/schema-mysql.sql | 1 + .../src/renderer/src/api/blossom.ts | 9 +++++ .../src/views/article/ArticleInfo.vue | 9 ++++- .../src/views/home/ArticleSubjects.vue | 2 +- blossom-web/src/views/index/HomeSubject.vue | 2 +- 13 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java index f4f778e..ac7c6f0 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java @@ -5,6 +5,8 @@ import cn.hutool.core.util.ObjUtil; import com.blossom.backend.base.auth.AuthContext; import com.blossom.backend.base.auth.annotation.AuthIgnore; import com.blossom.backend.config.BlConstants; +import com.blossom.backend.server.article.draft.pojo.ArticleEntity; +import com.blossom.backend.server.article.draft.pojo.ArticleStarReq; import com.blossom.backend.server.article.draft.pojo.ArticleUpdTagReq; import com.blossom.backend.server.doc.DocService; import com.blossom.backend.server.folder.pojo.*; @@ -44,15 +46,27 @@ public class FolderController { if (userId == null) { return R.ok(new ArrayList<>()); } - return R.ok(baseService.subjects(userId)); + return R.ok(baseService.subjects(userId, null)); } /** * 查询专题列表 */ @GetMapping("/subjects") - public R> listSubject() { - return R.ok(baseService.subjects(AuthContext.getUserId())); + public R> listSubject(@RequestParam("starStatus") Integer starStatus) { + return R.ok(baseService.subjects(AuthContext.getUserId(), starStatus)); + } + + /** + * 星标目录 + * + * @param req 目录对象 + */ + @PostMapping("/star") + public R star(@Validated @RequestBody FolderStarReq req) { + FolderEntity folder = req.to(FolderEntity.class); + folder.setUserId(AuthContext.getUserId()); + return R.ok(baseService.update(folder)); } /** @@ -68,6 +82,7 @@ public class FolderController { FolderRes res = entity.to(FolderRes.class); res.setTags(DocUtil.toTagList(entity.getTags())); res.setType(entity.getType()); + res.setStarStatus(entity.getStarStatus()); return R.ok(res); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java index 3ebed3a..193063a 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java @@ -23,11 +23,13 @@ import com.blossom.common.base.util.DateUtils; import com.blossom.common.base.util.PrimaryKeyUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.lang.Nullable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -51,6 +53,8 @@ public class FolderService extends ServiceImpl { this.pictureService = pictureService; } + + /** * 专题列表 *

    1. 查询全部公开专题 @@ -60,12 +64,14 @@ public class FolderService extends ServiceImpl { *

    5. 通过文件夹ID获取到专题下的所有文章, 从而统计文章的总字数, 修改时间, 创建时间等. *

    6. 如果文章包含 TOC 标签, 则该文章为专题的目录, 专题的默认跳转会跳转至该目录 */ - public List subjects(Long userId) { - // 1. 查询所有公开的专题 + public List subjects(Long userId, @Nullable Integer starStatus) { + // 1. 查询所有专题 FolderEntity where = new FolderEntity(); where.setTags(TagEnum.subject.name()); - where.setOpenStatus(YesNo.YES.getValue()); where.setUserId(userId); + if (Objects.nonNull(starStatus) && + (starStatus.equals(1) || starStatus.equals(0))) { where.setStarStatus(starStatus); } + else {where.setStarStatus(0);} List allOpenSubject = baseMapper.listAll(where); if (CollUtil.isEmpty(allOpenSubject)) { return new ArrayList<>(); @@ -196,6 +202,7 @@ public class FolderService extends ServiceImpl { public Long update(FolderEntity folder) { XzException404.throwBy(folder.getId() == null, "ID不得为空"); XzException400.throwBy(folder.getId().equals(folder.getPid()), "上级文件夹不能是自己"); + if (Objects.isNull(folder.getStarStatus())) {folder.setStarStatus(0);} // 如果 if (StrUtil.isNotBlank(folder.getStorePath())) { final FolderEntity oldFolder = selectById(folder.getId()); @@ -214,6 +221,7 @@ public class FolderService extends ServiceImpl { } } folder.setStorePath(formatStorePath(folder.getStorePath())); + if (Objects.isNull(folder.getStarStatus())) { folder.setStarStatus(0);} baseMapper.updById(folder); return folder.getId(); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java index 479e5b6..218a8b5 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java @@ -44,6 +44,10 @@ public class FolderEntity extends AbstractPOJO implements Serializable { * 标签 */ private String tags; + /** + * star状态 + */ + private Integer starStatus; /** * 开放状态 */ diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java index 8008767..1515845 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderQueryReq.java @@ -16,6 +16,10 @@ import java.io.Serializable; public class FolderQueryReq extends PageReq implements Serializable { private static final long serialVersionUID = 1L; + /** + * star状态 + */ + private Integer starStatus; private String tags; diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java index f1b3dc7..ec9df7a 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderRes.java @@ -39,6 +39,10 @@ public class FolderRes extends AbstractPOJO implements Serializable { * 标签 */ private List tags; + /** + * star状态 + */ + private Integer starStatus; /** * 是否公开文件夹 [0:未公开,1:公开] */ diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java new file mode 100644 index 0000000..b82b4de --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderStarReq.java @@ -0,0 +1,37 @@ +package com.blossom.backend.server.folder.pojo; + + +import com.blossom.common.base.enums.YesNo; +import com.blossom.common.base.pojo.AbstractPOJO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * 文章 star + * + * @author xzzz + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class FolderStarReq extends AbstractPOJO { + + /** + * 目录ID + */ + @Min(value = 0, message = "[目录ID] 不能小于0") + @NotNull(message = "[目录ID] 为必填项") + private Long id; + + /** + * star 状态 {@link YesNo} + * @see YesNo + */ + @Min(value = 0, message = "[star 状态] 不能小于0") + @Max(value = 1, message = "[star 状态] 不能大于1") + @NotNull(message = "[star 状态] 为必填项") + private Integer starStatus; +} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java index d2efd64..0b4d41e 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderUpdReq.java @@ -33,6 +33,10 @@ public class FolderUpdReq extends AbstractPOJO implements Serializable { private String name; /** 图标 */ private String icon; + /** + * star状态 + */ + private Integer starStatus; /** 标签 */ private List tags; /** 排序 */ diff --git a/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml b/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml index a7ff377..b4be2a9 100644 --- a/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml +++ b/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml @@ -9,6 +9,7 @@ `name`, icon, tags, + star_status, open_status, sort, cover, @@ -21,6 +22,7 @@ cre_time from blossom_folder + and star_status = #{starStatus} and open_status = #{openStatus} and type = #{type} and tags like concat('%',#{tags},'%') @@ -62,6 +64,7 @@ `name` = #{name}, icon = #{icon}, tags = #{tags}, + star_status = #{starStatus}, sort = #{sort}, cover = #{cover}, color = #{color}, diff --git a/blossom-backend/backend/src/main/resources/schema-mysql.sql b/blossom-backend/backend/src/main/resources/schema-mysql.sql index 61c6f06..b291bcf 100644 --- a/blossom-backend/backend/src/main/resources/schema-mysql.sql +++ b/blossom-backend/backend/src/main/resources/schema-mysql.sql @@ -435,6 +435,7 @@ CREATE TABLE IF NOT EXISTS `blossom_folder` `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '文件夹名称', `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '图标', `tags` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '标签', + `star_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '收藏 0:否,1:是', `open_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '开放状态', `sort` int UNSIGNED NOT NULL DEFAULT 1 COMMENT '排序', `cover` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '封面图片', diff --git a/blossom-editor/src/renderer/src/api/blossom.ts b/blossom-editor/src/renderer/src/api/blossom.ts index 35166d0..2d70999 100644 --- a/blossom-editor/src/renderer/src/api/blossom.ts +++ b/blossom-editor/src/renderer/src/api/blossom.ts @@ -274,6 +274,15 @@ export const articleStarApi = (data?: object): Promise> => { return rq.post>('/article/star', data) } +/** + * star 或取消 star + * @param data + * @returns + */ +export const folderStarApi = (data?: object): Promise> => { + return rq.post>('/folder/star', data) +} + /** * 下载文章 markdown * @param params diff --git a/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue b/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue index 65088f3..b54e597 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue @@ -69,7 +69,7 @@

    -
    +
    @@ -239,6 +239,7 @@ import { import { isNotBlank, isNull } from '@renderer/assets/utils/obj' import { openExtenal, openNewIconWindow } from '@renderer/assets/utils/electron' import Notify from '@renderer/scripts/notify' +import {folderStarApi} from "../../api/blossom"; //#region --------------------------------------------------< 基本信息 >-------------------------------------------------- const userStore = useUserStore() @@ -484,6 +485,12 @@ const star = (changeStarStatus: number) => { Notify.success(docForm.value.starStatus === 0 ? '取消 Star 成功' : 'Star 成功') }) } + if (curIsFolder.value) { + docForm.value.starStatus = changeStarStatus + folderStarApi({ id: docForm.value.id, starStatus: docForm.value.starStatus }).then(() => { + Notify.success(docForm.value.starStatus === 0 ? '取消 Star 成功' : 'Star 成功') + }) + } } //#endregion diff --git a/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue b/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue index 7a3d741..5883eab 100644 --- a/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue +++ b/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue @@ -56,7 +56,7 @@ let maxWords = 0 const subjects = ref([]) const getSubjects = () => { - subjectsApi().then((resp) => { + subjectsApi({ starStatus: 1 }).then((resp) => { subjects.value = resp.data if (!isEmpty(resp.data)) { maxWords = resp.data diff --git a/blossom-web/src/views/index/HomeSubject.vue b/blossom-web/src/views/index/HomeSubject.vue index 2fc1bfd..9570817 100644 --- a/blossom-web/src/views/index/HomeSubject.vue +++ b/blossom-web/src/views/index/HomeSubject.vue @@ -26,7 +26,7 @@ import { subjectsApi } from '@/api/blossom' onMounted(() => { subjects.value = [] - subjectsApi().then((resp) => { + subjectsApi({ starStatus: 1 }).then((resp) => { subjects.value = resp.data }) }) From 0e67b31b98df324c6de9f4db19b91604f8ed38a2 Mon Sep 17 00:00:00 2001 From: li-guohao Date: Thu, 4 Apr 2024 14:18:51 +0800 Subject: [PATCH 08/73] optimize: db table column alter in schema-mysql.sql --- blossom-backend/backend/src/main/resources/application.yml | 1 + blossom-backend/backend/src/main/resources/schema-mysql.sql | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/blossom-backend/backend/src/main/resources/application.yml b/blossom-backend/backend/src/main/resources/application.yml index 9cd4bd3..2f2e6b7 100644 --- a/blossom-backend/backend/src/main/resources/application.yml +++ b/blossom-backend/backend/src/main/resources/application.yml @@ -37,6 +37,7 @@ spring: init: mode: always platform: mysql + continue-on-error: true # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ mybatis ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/blossom-backend/backend/src/main/resources/schema-mysql.sql b/blossom-backend/backend/src/main/resources/schema-mysql.sql index b291bcf..04700eb 100644 --- a/blossom-backend/backend/src/main/resources/schema-mysql.sql +++ b/blossom-backend/backend/src/main/resources/schema-mysql.sql @@ -435,7 +435,6 @@ CREATE TABLE IF NOT EXISTS `blossom_folder` `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '文件夹名称', `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '图标', `tags` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '标签', - `star_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '收藏 0:否,1:是', `open_status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '开放状态', `sort` int UNSIGNED NOT NULL DEFAULT 1 COMMENT '排序', `cover` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '封面图片', @@ -459,6 +458,7 @@ alter table blossom_folder modify icon varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL default '' comment '图标'; alter table blossom_folder modify sort int NOT NULL default 1 comment '排序'; +alter table blossom_folder add column star_status tinyint(1) NOT NULL DEFAULT 0 COMMENT '收藏 0:否,1:是'; -- ---------------------------- -- Records of blossom_folder From 9a0b4df2bf6cbd068d851a9ae2801b09166e0e98 Mon Sep 17 00:00:00 2001 From: li-guohao Date: Thu, 4 Apr 2024 15:10:08 +0800 Subject: [PATCH 09/73] optimize: move the code that might be wrong and put it last in schema-mysql.sql --- blossom-backend/backend/src/main/resources/schema-mysql.sql | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/blossom-backend/backend/src/main/resources/schema-mysql.sql b/blossom-backend/backend/src/main/resources/schema-mysql.sql index 04700eb..4166b7a 100644 --- a/blossom-backend/backend/src/main/resources/schema-mysql.sql +++ b/blossom-backend/backend/src/main/resources/schema-mysql.sql @@ -458,7 +458,6 @@ alter table blossom_folder modify icon varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL default '' comment '图标'; alter table blossom_folder modify sort int NOT NULL default 1 comment '排序'; -alter table blossom_folder add column star_status tinyint(1) NOT NULL DEFAULT 0 COMMENT '收藏 0:否,1:是'; -- ---------------------------- -- Records of blossom_folder @@ -639,4 +638,7 @@ CREATE TABLE IF NOT EXISTS `base_user_param` UNIQUE KEY `unq_bup_userid_paramname` (`user_id`, `param_name`) COMMENT '用户参数唯一' ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '用户参数' - COLLATE = utf8mb4_bin; \ No newline at end of file + COLLATE = utf8mb4_bin; + +-- Code that might be wrong goes last +alter table blossom_folder add column star_status tinyint(1) NOT NULL DEFAULT 0 COMMENT '收藏 0:否,1:是'; \ No newline at end of file From 64a8d730a64411859ee273aa2dfb986a30f2da5b Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:41:00 +0800 Subject: [PATCH 10/73] =?UTF-8?q?refactor:=20=E6=96=87=E6=A1=A3=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 无限层级菜单 2. 文档拖拽排序 --- .../message/consumer/IndexMsgConsumer.java | 8 +- .../java/com/blossom/backend/config/Test.java | 22 + .../article/draft/ArticleController.java | 28 +- .../server/article/draft/ArticleService.java | 5 +- .../server/article/draft/ImportManager.java | 64 ++ .../backend/server/doc/DocController.java | 21 +- .../blossom/backend/server/doc/DocMapper.java | 3 +- .../backend/server/doc/DocService.java | 135 ++- .../backend/server/doc/DocSortChecker.java | 116 +++ .../server/doc/pojo/DocTreeUpdSortReq.java | 69 ++ .../server/folder/FolderController.java | 17 +- .../backend/server/folder/FolderService.java | 142 ++- .../backend/server/folder/FolderTypeEnum.java | 10 + .../server/folder/pojo/FolderEntity.java | 24 +- .../blossom/backend/server/utils/DocUtil.java | 2 +- .../main/resources/config/application-dev.yml | 4 +- .../src/main/resources/mapper/DocMapper.xml | 4 +- .../main/resources/mapper/FolderMapper.xml | 4 + blossom-editor/src/renderer/src/App.vue | 2 +- .../src/renderer/src/api/blossom.ts | 19 +- .../src/renderer/src/api/request.ts | 15 +- .../src/renderer/src/assets/styles/index.scss | 2 +- .../src/renderer/src/assets/utils/test.ts | 9 + .../src/renderer/src/assets/utils/util.ts | 8 + .../src/renderer/src/stores/user.ts | 3 + .../src/views/article/ArticleImport.vue | 37 +- .../src/views/article/ArticleInfo.vue | 12 +- .../src/views/article/ArticleTreeDocs.vue | 828 ++++++++++------- .../src/views/article/ArticleTreeTitle.vue | 54 +- .../views/article/ArticleTreeWorkbench.vue | 255 +----- .../src/views/article/EditorStatus.vue | 31 +- .../src/views/article/EditorTools.vue | 3 +- .../views/article/scripts/article-import.ts | 45 +- .../src/views/article/scripts/article.ts | 25 +- .../views/article/styles/article-index.scss | 17 +- .../src/views/doc/doc-tree-detail.scss | 107 +++ .../renderer/src/views/doc/doc-tree-detail.ts | 68 ++ ...ght-menu.scss => doc-tree-right-menu.scss} | 0 .../src/renderer/src/views/doc/doc-tree.scss | 174 ++++ .../src/renderer/src/views/doc/doc-tree.ts | 241 +++++ .../src/renderer/src/views/doc/doc.ts | 11 +- .../src/renderer/src/views/doc/tree-docs.scss | 117 --- .../src/views/picture/PictureInfo.vue | 8 +- .../src/views/picture/PictureTreeDocs.vue | 687 +++++++++----- .../src/views/picture/PictureTreeTitle.vue | 149 ---- .../views/picture/PictureTreeWorkbench.vue | 69 +- .../src/views/picture/scripts/picture.ts | 2 +- .../assets/fonts/JetBrainsMono-Regular.woff2 | Bin 0 -> 92164 bytes blossom-web/src/assets/fonts/config.scss | 6 + blossom-web/src/assets/styles/config.scss | 2 + blossom-web/src/assets/styles/css/main.css | 3 +- blossom-web/src/assets/styles/css/theme.css | 17 +- blossom-web/src/components/BLTag.vue | 4 +- .../src/views/article/ArticleSetting.vue | 2 +- blossom-web/src/views/article/Articles.vue | 843 ++---------------- blossom-web/src/views/article/DocTitle.vue | 175 ---- blossom-web/src/views/article/index.d.ts | 12 +- .../article/{ => scripts}/article-setting.ts | 0 .../scripts/doc-content-event-dispatch.ts | 48 + .../src/views/article/scripts/doc-toc.ts | 57 ++ .../views/article/scripts/doc-tree-detail.ts | 40 + .../src/views/article/styles/doc-content.scss | 447 ++++++++++ .../src/views/article/styles/doc-toc.scss | 91 ++ .../views/article/styles/doc-tree-detail.scss | 87 ++ .../src/views/article/styles/doc-tree.scss | 50 ++ blossom-web/src/views/index/Home.vue | 3 - blossom-web/src/views/index/HomeSubject.vue | 4 + 67 files changed, 3232 insertions(+), 2335 deletions(-) create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ImportManager.java create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocSortChecker.java create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/pojo/DocTreeUpdSortReq.java create mode 100644 blossom-editor/src/renderer/src/assets/utils/test.ts create mode 100644 blossom-editor/src/renderer/src/views/doc/doc-tree-detail.scss create mode 100644 blossom-editor/src/renderer/src/views/doc/doc-tree-detail.ts rename blossom-editor/src/renderer/src/views/doc/{tree-docs-right-menu.scss => doc-tree-right-menu.scss} (100%) create mode 100644 blossom-editor/src/renderer/src/views/doc/doc-tree.scss create mode 100644 blossom-editor/src/renderer/src/views/doc/doc-tree.ts delete mode 100644 blossom-editor/src/renderer/src/views/doc/tree-docs.scss delete mode 100644 blossom-editor/src/renderer/src/views/picture/PictureTreeTitle.vue create mode 100644 blossom-web/src/assets/fonts/JetBrainsMono-Regular.woff2 create mode 100644 blossom-web/src/assets/fonts/config.scss delete mode 100644 blossom-web/src/views/article/DocTitle.vue rename blossom-web/src/views/article/{ => scripts}/article-setting.ts (100%) create mode 100644 blossom-web/src/views/article/scripts/doc-content-event-dispatch.ts create mode 100644 blossom-web/src/views/article/scripts/doc-toc.ts create mode 100644 blossom-web/src/views/article/scripts/doc-tree-detail.ts create mode 100644 blossom-web/src/views/article/styles/doc-content.scss create mode 100644 blossom-web/src/views/article/styles/doc-toc.scss create mode 100644 blossom-web/src/views/article/styles/doc-tree-detail.scss create mode 100644 blossom-web/src/views/article/styles/doc-tree.scss diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/IndexMsgConsumer.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/IndexMsgConsumer.java index 347294b..f6ef2a8 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/IndexMsgConsumer.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/IndexMsgConsumer.java @@ -1,6 +1,5 @@ package com.blossom.backend.base.search.message.consumer; -import cn.hutool.core.convert.Convert; import com.blossom.backend.base.search.SearchProperties; import com.blossom.backend.base.search.message.IndexMsg; import com.blossom.backend.base.search.message.IndexMsgTypeEnum; @@ -51,7 +50,6 @@ public class IndexMsgConsumer { final Long userId = indexMsg.getUserId(); final Long id = indexMsg.getId(); if (userId == null || id == null) { - log.error("消费异常. 获取用户id为空"); continue; } if (IndexMsgTypeEnum.ADD == indexMsg.getType()) { @@ -62,11 +60,11 @@ public class IndexMsgConsumer { // 查询最新的消息 ArticleEntity article = this.articleService.selectById(id, false, true, false, userId); Document document = new Document(); - document.add(new StringField("id", Convert.toStr(id), Field.Store.YES)); + document.add(new StringField("id", String.valueOf(id), Field.Store.YES)); document.add(new TextField("name", article.getName(), Field.Store.YES)); document.add(new TextField("tags", article.getTags(), Field.Store.YES)); document.add(new TextField("markdown", article.getMarkdown(), Field.Store.YES)); - indexWriter.updateDocument(new Term("id", Convert.toStr(id)), document); + indexWriter.updateDocument(new Term("id", String.valueOf(id)), document); indexWriter.flush(); indexWriter.commit(); } @@ -74,7 +72,7 @@ public class IndexMsgConsumer { // 删除索引 try (Directory directory = FSDirectory.open(this.searchProperties.getUserIndexDirectory(userId)); IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new StandardAnalyzer()))) { - indexWriter.deleteDocuments(new Term("id", Convert.toStr(id))); + indexWriter.deleteDocuments(new Term("id", String.valueOf(id))); indexWriter.flush(); indexWriter.commit(); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/config/Test.java b/blossom-backend/backend/src/main/java/com/blossom/backend/config/Test.java index c7b736f..a372730 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/config/Test.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/config/Test.java @@ -1,11 +1,33 @@ package com.blossom.backend.config; +import com.blossom.backend.server.folder.pojo.FolderEntity; import lombok.extern.slf4j.Slf4j; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + @Slf4j public class Test { public static void main(String[] args) { + Set set = new HashSet<>(); + + FolderEntity f1 = new FolderEntity(); + f1.setId(1L); + f1.setName("1"); + + + FolderEntity f2 = new FolderEntity(); + f2.setId(1L); + f2.setName("2"); + + set.add(f1); + set.add(f2); + + System.out.println(set.size()); + System.out.println(Arrays.toString(set.toArray())); + } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleController.java index 11e52df..5cd5c7b 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleController.java @@ -12,8 +12,10 @@ import com.blossom.backend.server.article.draft.pojo.*; import com.blossom.backend.server.article.open.ArticleOpenService; import com.blossom.backend.server.article.open.pojo.ArticleOpenEntity; import com.blossom.backend.server.doc.DocService; +import com.blossom.backend.server.doc.DocSortChecker; import com.blossom.backend.server.doc.DocTypeEnum; import com.blossom.backend.server.folder.FolderService; +import com.blossom.backend.server.folder.FolderTypeEnum; import com.blossom.backend.server.folder.pojo.FolderEntity; import com.blossom.backend.server.utils.ArticleUtil; import com.blossom.backend.server.utils.DocUtil; @@ -50,13 +52,14 @@ import java.util.List; @AllArgsConstructor @RequestMapping("/article") public class ArticleController { - private final ArticleService baseService; private final ArticleOpenService openService; private final FolderService folderService; private final UserService userService; private final ArticleTempVisitService tempVisitService; private final DocService docService; + private final DocSortChecker docSortChecker; + private final ImportManager importManager; /** * 查询列表 @@ -122,9 +125,9 @@ public class ArticleController { ArticleEntity article = req.to(ArticleEntity.class); article.setTags(DocUtil.toTagStr(req.getTags())); article.setUserId(AuthContext.getUserId()); - // 如果新增到顶部, 获取最小的 + // 如果新增到顶部, 获取最小的排序 if (BooleanUtil.isTrue(req.getAddToLast())) { - article.setSort(docService.selectMinSortByPid(req.getPid()) + 1); + article.setSort(docService.selectMaxSortByPid(req.getPid(), AuthContext.getUserId(), FolderTypeEnum.ARTICLE) + 1); } return R.ok(baseService.insert(article)); } @@ -136,10 +139,19 @@ public class ArticleController { * @apiNote 该接口只能修改文章的基本信息, 正文及版本修改请使用 "/upd/content" 接口,或者 {@link ArticleService#updateContentById(ArticleEntity)} */ @PostMapping("/upd") - public R insert(@Validated @RequestBody ArticleUpdReq req) { + public R update(@Validated @RequestBody ArticleUpdReq req) { ArticleEntity article = req.to(ArticleEntity.class); article.setTags(DocUtil.toTagStr(req.getTags())); article.setUserId(AuthContext.getUserId()); + // 检查排序是否重复 +// if (req.getSort() != null && req.getPid() != null) { +// final long newPid = req.getPid(); +// docSortChecker.checkUnique(CollUtil.newArrayList(newPid), +// null, +// CollUtil.newArrayList(article), +// FolderTypeEnum.ARTICLE, +// AuthContext.getUserId()); +// } return R.ok(baseService.update(article)); } @@ -263,11 +275,11 @@ public class ArticleController { * @param pid 上级菜单 */ @PostMapping("import") - public R upload(@RequestParam("file") MultipartFile file, @RequestParam(value = "pid") Long pid) { + public R upload(@RequestParam("file") MultipartFile file, @RequestParam(value = "pid") Long pid, @RequestParam(value = "batchId") String batchId) { try { String suffix = FileUtil.getSuffix(file.getOriginalFilename()); if (!"txt".equals(suffix) && !"md".equals(suffix)) { - throw new XzException404("不支持的文件类型: [" + suffix + "]"); + throw new XzException400("不支持的文件类型: [" + suffix + "]"); } FolderEntity folder = folderService.selectById(pid); XzException404.throwBy(ObjUtil.isNull(folder), "上级文件夹不存在"); @@ -278,10 +290,12 @@ public class ArticleController { article.setPid(pid); article.setUserId(AuthContext.getUserId()); article.setName(FileUtil.getPrefix(file.getOriginalFilename())); - article.setWords(ArticleUtil.statWords(content)); +// article.setWords(ArticleUtil.statWords(content)); + article.setSort(importManager.getSort(batchId, pid, AuthContext.getUserId())); baseService.insert(article); } catch (Exception e) { e.printStackTrace(); + throw new XzException400("上传失败"); } return R.ok(); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java index 696e2e9..fb1f895 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java @@ -2,6 +2,7 @@ package com.blossom.backend.server.article.draft; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.blossom.backend.base.search.EnableIndex; @@ -166,7 +167,9 @@ public class ArticleService extends ServiceImpl { public Long update(ArticleEntity req) { XzException404.throwBy(req.getId() == null, "ID不得为空"); baseMapper.updById(req); - referenceService.updateInnerName(req.getUserId(), req.getId(), req.getName()); + if(StrUtil.isNotBlank(req.getName())) { + referenceService.updateInnerName(req.getUserId(), req.getId(), req.getName()); + } return req.getId(); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ImportManager.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ImportManager.java new file mode 100644 index 0000000..ae18413 --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ImportManager.java @@ -0,0 +1,64 @@ +package com.blossom.backend.server.article.draft; + +import com.blossom.backend.server.doc.DocService; +import com.blossom.backend.server.folder.FolderTypeEnum; +import com.blossom.common.base.exception.XzException500; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.RemovalCause; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.ReentrantLock; + +@Slf4j +@Component +@AllArgsConstructor +public class ImportManager { + + private final DocService docService; + private final ReentrantLock LOCK = new ReentrantLock(); + + /** + * 批量导入时的批次缓存, 一个批次的导入只会从数据库获取一次排序, 后续排序从缓存中递增 + */ + private final Cache batchCache = Caffeine.newBuilder() + .initialCapacity(50) + .expireAfterWrite(120, TimeUnit.MINUTES) + .removalListener((String location, AtomicInteger i, RemovalCause cause) -> + log.info("batch import [" + location + "] has been deleted") + ) + .build(); + + /** + * 并发导入时的排序获取 + */ + public Integer getSort(String batchId, Long pid, Long userId) { + AtomicInteger sort = batchCache.getIfPresent(batchId); + if (null == sort) { + try { + LOCK.tryLock(1000, TimeUnit.MILLISECONDS); + sort = batchCache.getIfPresent(batchId); + if (null == sort) { + sort = initBatchCount(batchId, pid, userId); + } + } catch (InterruptedException e) { + LOCK.unlock(); + } + } + if (sort == null) { + throw new XzException500("导入失败"); + } + return sort.getAndIncrement(); + } + + private AtomicInteger initBatchCount(String batchId, Long pid, Long userId) { + System.out.println("初始化导入排序"); + AtomicInteger i = new AtomicInteger(docService.selectMaxSortByPid(pid, userId, FolderTypeEnum.ARTICLE) + 1); + batchCache.put(batchId, i); + return i; + } +} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocController.java index ec14d34..28f2565 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocController.java @@ -5,6 +5,8 @@ import com.blossom.backend.base.auth.annotation.AuthIgnore; import com.blossom.backend.config.BlConstants; import com.blossom.backend.server.doc.pojo.DocTreeReq; import com.blossom.backend.server.doc.pojo.DocTreeRes; +import com.blossom.backend.server.doc.pojo.DocTreeUpdSortReq; +import com.blossom.backend.server.folder.FolderTypeEnum; import com.blossom.common.base.pojo.R; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -29,7 +31,7 @@ public class DocController { /** * 文档列表 * - * @return 文件夹列表 + * @return 文档列表 * @apiNote 文档包含文章和文件夹, 文件夹分为图片文件夹和文章文件夹 {@link DocTypeEnum} */ @GetMapping("/trees") @@ -56,4 +58,21 @@ public class DocController { open.setUserId(userId); return R.ok(docService.listTree(open)); } + + /** + * 修改排序 + *

    todo 返回列表, 兼容列表查询条件 + * + * @param tree 需要修改排序的文档列表 + * @return 文档列表 + * @since 1.14.0 + */ + @PostMapping("/upd/sort") + public R> updSort(@RequestBody DocTreeUpdSortReq tree) { + docService.updSort(tree.getDocs(), AuthContext.getUserId(), FolderTypeEnum.getType(tree.getFolderType())); + DocTreeReq req = new DocTreeReq(); + req.setUserId(AuthContext.getUserId()); + req.setOnlyPicture(tree.getOnlyPicture()); + return R.ok(docService.listTree(req)); + } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocMapper.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocMapper.java index 02254d1..09dc43e 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocMapper.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocMapper.java @@ -8,9 +8,10 @@ public interface DocMapper { /** * 查询 PID 下的最小排序 + * * @param pid PID * @return 最小排序 */ - Integer selectMaxSortByPid(@Param("pid") Long pid); + Integer selectMaxSortByPid(@Param("pid") Long pid, @Param("userId") Long userId, @Param("type") Integer type); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocService.java index 0d290f9..4cf7f10 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocService.java @@ -1,14 +1,19 @@ package com.blossom.backend.server.doc; import cn.hutool.core.collection.CollUtil; +import com.blossom.backend.base.auth.AuthContext; import com.blossom.backend.server.article.TagEnum; +import com.blossom.backend.server.article.draft.ArticleMapper; import com.blossom.backend.server.article.draft.ArticleService; +import com.blossom.backend.server.article.draft.pojo.ArticleEntity; import com.blossom.backend.server.article.draft.pojo.ArticleQueryReq; import com.blossom.backend.server.doc.pojo.DocTreeReq; import com.blossom.backend.server.doc.pojo.DocTreeRes; +import com.blossom.backend.server.doc.pojo.DocTreeUpdSortReq; +import com.blossom.backend.server.folder.FolderMapper; import com.blossom.backend.server.folder.FolderService; import com.blossom.backend.server.folder.FolderTypeEnum; -import com.blossom.backend.server.folder.pojo.FolderQueryReq; +import com.blossom.backend.server.folder.pojo.FolderEntity; import com.blossom.backend.server.picture.PictureService; import com.blossom.backend.server.utils.DocUtil; import com.blossom.backend.server.utils.PictureUtil; @@ -16,6 +21,7 @@ import com.blossom.common.base.enums.YesNo; import com.blossom.common.base.util.SortUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -29,23 +35,28 @@ import java.util.stream.Collectors; */ @Service public class DocService { - private FolderService folderService; private ArticleService articleService; private PictureService pictureService; - + private FolderService folderService; @Autowired private DocMapper baseMapper; - @Autowired - public void setFolderService(FolderService folderService) { - this.folderService = folderService; - } + private FolderMapper folderMapper; + @Autowired + private ArticleMapper articleMapper; + @Autowired + private DocSortChecker docSortChecker; @Autowired public void setArticleService(ArticleService articleService) { this.articleService = articleService; } + @Autowired + public void setFolderService(FolderService folderService) { + this.folderService = folderService; + } + @Autowired public void setPictureService(PictureService pictureService) { this.pictureService = pictureService; @@ -64,10 +75,10 @@ public class DocService { * 只查询文件夹 * =============================================================================================== */ if (req.getOnlyFolder()) { - FolderQueryReq where = req.to(FolderQueryReq.class); - List folder = folderService.listTree(where); + FolderEntity where = req.to(FolderEntity.class); + List folder = folderMapper.listAll(where); all.addAll(CollUtil.newArrayList(PictureUtil.getDefaultFolder(req.getUserId()))); - all.addAll(folder); + all.addAll(DocUtil.toTreeRes(folder)); priorityType = true; } /* =============================================================================================== @@ -75,16 +86,16 @@ public class DocService { * =============================================================================================== */ else if (req.getOnlyPicture()) { // 1. 所有图片文件夹 - FolderQueryReq folder = req.to(FolderQueryReq.class); - folder.setType(FolderTypeEnum.PICTURE.getType()); - List picFolder = folderService.listTree(folder); - all.addAll(picFolder); + FolderEntity where = req.to(FolderEntity.class); + where.setType(FolderTypeEnum.PICTURE.getType()); + List picFolder = folderMapper.listAll(where); + all.addAll(DocUtil.toTreeRes(picFolder)); // 2. 有图片的图片或文章文件夹 List pids = pictureService.listDistinctPid(req.getUserId()); if (CollUtil.isNotEmpty(pids)) { - List articleTopFolder = folderService.recursiveToParentTree(pids); - all.addAll(articleTopFolder); + List articleTopFolder = folderMapper.recursiveToParent(pids); + all.addAll(DocUtil.toTreeRes(articleTopFolder)); } Optional min = all.stream().min((f1, f2) -> SortUtil.intSort.compare(f1.getS(), f2.getS())); @@ -105,24 +116,24 @@ public class DocService { all.addAll(articles); if (CollUtil.isNotEmpty(articles)) { List pidList = articles.stream().map(DocTreeRes::getP).collect(Collectors.toList()); - List folders = folderService.recursiveToParentTree(pidList); - all.addAll(folders); + List folders = folderMapper.recursiveToParent(pidList); + all.addAll(DocUtil.toTreeRes(folders)); } } /* =============================================================================================== * 只查询专题的文章和文件夹 * =============================================================================================== */ else if (req.getOnlySubject()) { - FolderQueryReq folderWhere = req.to(FolderQueryReq.class); + FolderEntity folderWhere = req.to(FolderEntity.class); folderWhere.setTags(TagEnum.subject.name()); folderWhere.setType(FolderTypeEnum.ARTICLE.getType()); - List subjects = folderService.listTree(folderWhere); + List subjects = folderMapper.listAll(folderWhere); if (CollUtil.isNotEmpty(subjects)) { - List subjectIds = subjects.stream().map(DocTreeRes::getI).collect(Collectors.toList()); - List foldersTop = folderService.recursiveToParentTree(subjectIds); - List foldersBottom = folderService.recursiveToChildrenTree(subjectIds); - all.addAll(foldersTop); - all.addAll(foldersBottom); + List subjectIds = subjects.stream().map(FolderEntity::getId).collect(Collectors.toList()); + List foldersTop = folderMapper.recursiveToParent(subjectIds); + List foldersBottom = folderMapper.recursiveToChildren(subjectIds); + all.addAll(DocUtil.toTreeRes(foldersTop)); + all.addAll(DocUtil.toTreeRes(foldersBottom)); } List articles = articleService.listTree(req.to(ArticleQueryReq.class)); all.addAll(articles); @@ -137,8 +148,8 @@ public class DocService { all.addAll(articles); if (CollUtil.isNotEmpty(articles)) { List pidList = articles.stream().map(DocTreeRes::getP).collect(Collectors.toList()); - List folders = folderService.recursiveToParentTree(pidList); - all.addAll(folders); + List folders = folderMapper.recursiveToParent(pidList); + all.addAll(DocUtil.toTreeRes(folders)); } } /* =============================================================================================== @@ -151,19 +162,19 @@ public class DocService { all.addAll(articles); if (CollUtil.isNotEmpty(articles)) { List pidList = articles.stream().map(DocTreeRes::getP).collect(Collectors.toList()); - List folders = folderService.recursiveToParentTree(pidList); - all.addAll(folders); + List folders = folderMapper.recursiveToParent(pidList); + all.addAll(DocUtil.toTreeRes(folders)); } } /* =============================================================================================== * 默认查询文章文件夹 * =============================================================================================== */ else { - FolderQueryReq folder = req.to(FolderQueryReq.class); + FolderEntity folder = req.to(FolderEntity.class); folder.setType(FolderTypeEnum.ARTICLE.getType()); - List folders = folderService.listTree(folder); + List folders = folderMapper.listAll(folder); List articles = articleService.listTree(req.to(ArticleQueryReq.class)); - all.addAll(folders); + all.addAll(DocUtil.toTreeRes(folders)); all.addAll(articles); } @@ -177,8 +188,64 @@ public class DocService { * @return 最大排序 * @since 1.10.0 */ - public int selectMinSortByPid(Long pid) { - return baseMapper.selectMaxSortByPid(pid); + public int selectMaxSortByPid(Long pid, Long userId, FolderTypeEnum type) { + return baseMapper.selectMaxSortByPid(pid, userId, type.getType()); + } + + /** + * 修改排序 + * + * @param docs 需要修改的文档 + * @since 1.14.0 + */ + @Transactional(rollbackFor = Exception.class) + public void updSort(List docs, Long userId, FolderTypeEnum folderType) { + // 提取所有需要修改的文档的父文档 + List pids = docs.stream().map(DocTreeUpdSortReq.Doc::getP).collect(Collectors.toList()); + + List articles = new ArrayList<>(); + List folders = new ArrayList<>(); + + // 一次拖拽所修改的文档可能包含文章和文件夹, 需要归类和转为 Entity + for (DocTreeUpdSortReq.Doc doc : docs) { + if (DocTypeEnum.A.getType().equals(doc.getTy())) { + ArticleEntity a = new ArticleEntity(); + a.setId(doc.getI()); + a.setPid(doc.getP()); + a.setName(doc.getN()); + a.setSort(doc.getS()); + articles.add(a); + } + if (DocTypeEnum.FA.getType().equals(doc.getTy())) { + FolderEntity f = new FolderEntity(); + f.setId(doc.getI()); + f.setPid(doc.getP()); + f.setName(doc.getN()); + f.setSort(doc.getS()); + folders.add(f); + } + } + + docSortChecker.checkUnique(pids, folders, articles, folderType, userId); + + for (DocTreeUpdSortReq.Doc tree : docs) { + if (DocTypeEnum.FA.getType().equals(tree.getTy()) || DocTypeEnum.FP.getType().equals(tree.getTy())) { + FolderEntity f = new FolderEntity(); + f.setId(tree.getI()); + f.setPid(tree.getP()); + f.setSort(tree.getS()); + f.setUserId(AuthContext.getUserId()); + f.setStorePath(tree.getSp()); + folderService.update(f); + } else if (DocTypeEnum.A.getType().equals(tree.getTy())) { + ArticleEntity a = new ArticleEntity(); + a.setId(tree.getI()); + a.setPid(tree.getP()); + a.setSort(tree.getS()); + a.setUserId(AuthContext.getUserId()); + articleService.update(a); + } + } } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocSortChecker.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocSortChecker.java new file mode 100644 index 0000000..83bd289 --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/DocSortChecker.java @@ -0,0 +1,116 @@ +package com.blossom.backend.server.doc; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import com.blossom.backend.server.article.draft.ArticleMapper; +import com.blossom.backend.server.article.draft.pojo.ArticleEntity; +import com.blossom.backend.server.doc.pojo.DocTreeRes; +import com.blossom.backend.server.folder.FolderMapper; +import com.blossom.backend.server.folder.FolderTypeEnum; +import com.blossom.backend.server.folder.pojo.FolderEntity; +import com.blossom.backend.server.utils.DocUtil; +import com.blossom.common.base.exception.XzException400; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Slf4j +@Component +public class DocSortChecker { + + @Autowired + private FolderMapper folderMapper; + + @Autowired + private ArticleMapper articleMapper; + + /** + * 检查 pid 下是否有重复的文档排序 + * + * @param pids pid + * @param newFs 新文件夹 + * @param newAs 新文章 + * @return + */ + public boolean checkUnique(List pids, + List newFs, + List newAs, + FolderTypeEnum folderType, + Long userId) { + + Map newFMap = CollUtil.isEmpty(newFs) ? new HashMap<>() : newFs.stream().collect(Collectors.toMap(FolderEntity::getId, doc -> doc)); + Map newAMap = CollUtil.isEmpty(newAs) ? new HashMap<>() : newAs.stream().collect(Collectors.toMap(ArticleEntity::getId, doc -> doc)); + + List allDoc = new ArrayList<>(); + + // 获取文件夹排序 + FolderEntity fByPid = new FolderEntity(); + fByPid.setPids(pids); + fByPid.setType(folderType.getType()); + fByPid.setUserId(userId); + List folders = folderMapper.listAll(fByPid); + + if (CollUtil.isNotEmpty(folders)) { + for (FolderEntity f : folders) { + FolderEntity newF = newFMap.get(f.getId()); + if (newF != null) { + f.setPid(newF.getPid()); + f.setSort(newF.getSort()); + newFMap.remove(f.getId()); + } + allDoc.add(DocUtil.toDocTree(f)); + } + } + + if (MapUtil.isNotEmpty(newFMap)) { + for (FolderEntity f : newFMap.values()) { + allDoc.add(DocUtil.toDocTree(f)); + } + } + + // 只有处理文章排序时, 才需要获取文章排序 + if(FolderTypeEnum.ARTICLE.equals(folderType)) { + ArticleEntity aByPid = new ArticleEntity(); + aByPid.setPids(pids); + aByPid.setUserId(userId); + List articles = articleMapper.listAll(aByPid); + if (CollUtil.isNotEmpty(articles)) { + for (ArticleEntity a : articles) { + ArticleEntity newA = newAMap.get(a.getId()); + if (newA != null) { + a.setPid(newA.getPid()); + a.setSort(newA.getSort()); + newAMap.remove(a.getId()); + } + allDoc.add(DocUtil.toDocTree(a)); + } + } + + if (MapUtil.isNotEmpty(newAMap)) { + for (ArticleEntity a : newAMap.values()) { + allDoc.add(DocUtil.toDocTree(a)); + } + } + } + + + // 按 pid 分组, 依次校验各组下数据 + Map> map = allDoc.stream().collect(Collectors.groupingBy(DocTreeRes::getP)); + + map.forEach((pid, list) -> { + // 获取不重复的排序 + long distinct = list.stream().map(DocTreeRes::getS).distinct().count(); + // 不重复的个数小于总数则有重复 + if (distinct != list.size()) { + throw new XzException400("排序重复"); + } + }); + return true; + } +} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/pojo/DocTreeUpdSortReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/pojo/DocTreeUpdSortReq.java new file mode 100644 index 0000000..5596f60 --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/doc/pojo/DocTreeUpdSortReq.java @@ -0,0 +1,69 @@ +package com.blossom.backend.server.doc.pojo; + +import com.blossom.backend.server.doc.DocTypeEnum; +import lombok.Data; + +import java.util.List; + +/** + * 修改文档排序 + * + * @since 1.14.0 + */ +@Data +public class DocTreeUpdSortReq { + + /** + * 需要修改排序的文档列表 + */ + private List docs; + /** + * 文档类型 1:文章文件夹; 2:图片文件夹 + * + * @see com.blossom.backend.server.folder.FolderTypeEnum + */ + private Integer folderType; + /** + * [Picture + Article] 只查询图片文件夹, 以及含有图片的文章文件夹 + */ + private Boolean onlyPicture; + + public Boolean getOnlyPicture() { + if (onlyPicture == null) { + return false; + } + return onlyPicture; + } + + @Data + public static class Doc { + /** + * id + */ + private Long i; + /** + * 父id + */ + private Long p; + /** + * 名称, 文件夹名称或文章名称 + */ + private String n; + /** + * 排序 + */ + private Integer s; + /** + * 类型 {@link DocTypeEnum} + * + * @see com.blossom.backend.server.doc.DocTypeEnum + */ + private Integer ty; + /** + * 存储路径 + */ + private String sp; + } + + +} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java index ac7c6f0..af5621d 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java @@ -5,10 +5,9 @@ import cn.hutool.core.util.ObjUtil; import com.blossom.backend.base.auth.AuthContext; import com.blossom.backend.base.auth.annotation.AuthIgnore; import com.blossom.backend.config.BlConstants; -import com.blossom.backend.server.article.draft.pojo.ArticleEntity; -import com.blossom.backend.server.article.draft.pojo.ArticleStarReq; import com.blossom.backend.server.article.draft.pojo.ArticleUpdTagReq; import com.blossom.backend.server.doc.DocService; +import com.blossom.backend.server.doc.DocSortChecker; import com.blossom.backend.server.folder.pojo.*; import com.blossom.backend.server.utils.DocUtil; import com.blossom.common.base.exception.XzException404; @@ -34,6 +33,7 @@ import java.util.List; public class FolderController { private final FolderService baseService; private final DocService docService; + private final DocSortChecker docSortChecker; /** * 查询专题列表 [OP] @@ -96,9 +96,9 @@ public class FolderController { FolderEntity folder = req.to(FolderEntity.class); folder.setTags(DocUtil.toTagStr(req.getTags())); folder.setUserId(AuthContext.getUserId()); - // 如果新增到顶部, 获取最小的 + // 如果新增到底部, 获取最大的排序 if (BooleanUtil.isTrue(req.getAddToLast())) { - folder.setSort(docService.selectMinSortByPid(req.getPid()) + 1); + folder.setSort(docService.selectMaxSortByPid(req.getPid(), AuthContext.getUserId(), FolderTypeEnum.PICTURE) + 1); } return R.ok(baseService.insert(folder)); } @@ -112,6 +112,15 @@ public class FolderController { public R update(@Validated @RequestBody FolderUpdReq req) { FolderEntity folder = req.to(FolderEntity.class); folder.setTags(DocUtil.toTagStr(req.getTags())); + // 检查排序是否重复 +// if (folder.getSort() != null && folder.getPid() != null) { +// final long newPid = folder.getPid(); +// docSortChecker.checkUnique(CollUtil.newArrayList(newPid), +// CollUtil.newArrayList(folder), +// null, +// FolderTypeEnum.ARTICLE, +// AuthContext.getUserId()); +// } return R.ok(baseService.update(folder)); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java index 193063a..f857859 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java @@ -5,17 +5,13 @@ import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.blossom.backend.server.article.TagEnum; -import com.blossom.backend.server.article.draft.ArticleService; +import com.blossom.backend.server.article.draft.ArticleMapper; import com.blossom.backend.server.article.draft.pojo.ArticleEntity; -import com.blossom.backend.server.article.draft.pojo.ArticleQueryReq; -import com.blossom.backend.server.doc.pojo.DocTreeRes; import com.blossom.backend.server.folder.pojo.FolderEntity; -import com.blossom.backend.server.folder.pojo.FolderQueryReq; import com.blossom.backend.server.folder.pojo.FolderSubjectRes; -import com.blossom.backend.server.picture.PictureService; +import com.blossom.backend.server.picture.PictureMapper; import com.blossom.backend.server.picture.pojo.PictureEntity; import com.blossom.backend.server.utils.DocUtil; -import com.blossom.common.base.enums.YesNo; import com.blossom.common.base.exception.XzException400; import com.blossom.common.base.exception.XzException404; import com.blossom.common.base.exception.XzException500; @@ -29,7 +25,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; /** @@ -40,19 +35,12 @@ import java.util.stream.Collectors; @Slf4j @Service public class FolderService extends ServiceImpl { - private ArticleService articleService; - private PictureService pictureService; @Autowired - public void setArticleService(ArticleService articleService) { - this.articleService = articleService; - } + private PictureMapper picMapper; @Autowired - public void setPictureService(PictureService pictureService) { - this.pictureService = pictureService; - } - + private ArticleMapper articleMapper; /** @@ -69,9 +57,11 @@ public class FolderService extends ServiceImpl { FolderEntity where = new FolderEntity(); where.setTags(TagEnum.subject.name()); where.setUserId(userId); - if (Objects.nonNull(starStatus) && - (starStatus.equals(1) || starStatus.equals(0))) { where.setStarStatus(starStatus); } - else {where.setStarStatus(0);} + if (null != starStatus && (starStatus.equals(1) || starStatus.equals(0))) { + where.setStarStatus(starStatus); + } else { + where.setStarStatus(0); + } List allOpenSubject = baseMapper.listAll(where); if (CollUtil.isEmpty(allOpenSubject)) { return new ArrayList<>(); @@ -85,12 +75,10 @@ public class FolderService extends ServiceImpl { allOpenSubjectIds.addAll(allOpenSubjectChildFolders.stream().map(FolderEntity::getId).collect(Collectors.toList())); // 3. 查询这些文件夹下的所有文章 - ArticleQueryReq articleWhere = new ArticleQueryReq(); + ArticleEntity articleWhere = new ArticleEntity(); articleWhere.setPids(allOpenSubjectIds); articleWhere.setUserId(userId); - // 统计专题信息时, 会包含非公开文章 - // articleWhere.setOpenStatus(YesNo.YES.getValue()); - List articles = articleService.listAll(articleWhere); + List articles = articleMapper.listAll(articleWhere); List results = new ArrayList<>(); @@ -123,34 +111,6 @@ public class FolderService extends ServiceImpl { return results; } - /** - * 查询全部文件夹, 并转换成 {@link DocTreeRes} - */ - public List listTree(FolderQueryReq req) { - List folders = baseMapper.listAll(req.to(FolderEntity.class)); - return DocUtil.toTreeRes(folders); - } - - /** - * 递归获取传入ID的所有的父文件夹, 并转换成 {@link DocTreeRes}, 结果会包含自己 - * - * @param ids ID 集合 - */ - public List recursiveToParentTree(List ids) { - List folders = baseMapper.recursiveToParent(ids); - return DocUtil.toTreeRes(folders); - } - - /** - * 递归获取传入ID的所有的子文件夹, 并转换成 {@link DocTreeRes}, 结果会包含自己 - * - * @param ids ID 集合 - */ - public List recursiveToChildrenTree(List ids) { - List folders = baseMapper.recursiveToChildren(ids); - return DocUtil.toTreeRes(folders); - } - /** * 根据ID查询 * @@ -200,9 +160,52 @@ public class FolderService extends ServiceImpl { */ @Transactional(rollbackFor = Exception.class) public Long update(FolderEntity folder) { + updateParamValid(folder); + updateStorePath(folder); + baseMapper.updById(folder); + return folder.getId(); + } + + /** + * 删除文件夹 + *

    1. 文件夹下有子文件夹时, 无法删除

    + *

    2. 文件夹下有文章时, 无法删除

    + * + * @param folderId 文件夹ID + */ + @Transactional(rollbackFor = Exception.class) + public void delete(Long folderId) { + // 文件夹下有文件夹, 无法删除 + if (baseMapper.recursiveToChildren(CollUtil.newArrayList(folderId)).stream().anyMatch(d -> !d.getId().equals(folderId))) { + throw new XzException500("文件夹下有子文件夹, 无法删除, 请先删除子文件夹"); + } + + // 文件夹下有文章, 无法删除 + ArticleEntity articleWhere = new ArticleEntity(); + articleWhere.setPids(CollUtil.newArrayList(folderId)); + if (CollUtil.isNotEmpty(articleMapper.listAll(articleWhere))) { + throw new XzException500("文件夹下有文章, 无法删除, 请先删除下属文章"); + } + + // 文件夹下有图片, 无法删除 + PictureEntity picReq = new PictureEntity(); + picReq.setPid(folderId); + if (CollUtil.isNotEmpty(picMapper.listAll(picReq))) { + throw new XzException500("文件夹下有图片, 无法删除, 请先删除下属图片"); + } + + baseMapper.deleteById(folderId); + } + + /** + * 修改文件夹的存储地址 + * + * @param folder + */ + private void updateStorePath(FolderEntity folder) { + // 处理文件夹的存储地址 XzException404.throwBy(folder.getId() == null, "ID不得为空"); XzException400.throwBy(folder.getId().equals(folder.getPid()), "上级文件夹不能是自己"); - if (Objects.isNull(folder.getStarStatus())) {folder.setStarStatus(0);} // 如果 if (StrUtil.isNotBlank(folder.getStorePath())) { final FolderEntity oldFolder = selectById(folder.getId()); @@ -221,9 +224,6 @@ public class FolderService extends ServiceImpl { } } folder.setStorePath(formatStorePath(folder.getStorePath())); - if (Objects.isNull(folder.getStarStatus())) { folder.setStarStatus(0);} - baseMapper.updById(folder); - return folder.getId(); } /** @@ -253,34 +253,12 @@ public class FolderService extends ServiceImpl { } /** - * 删除文件夹 - *

    1. 文件夹下有子文件夹时, 无法删除

    - *

    2. 文件夹下有文章时, 无法删除

    + * 检查修改是否有效 * - * @param folderId 文件夹ID + * @param folder 文件夹 */ - @Transactional(rollbackFor = Exception.class) - public void delete(Long folderId) { - // 文件夹下有文件夹, 无法删除 - if (recursiveToChildrenTree(CollUtil.newArrayList(folderId)).stream().anyMatch(d -> !d.getI().equals(folderId))) { - throw new XzException500("文件夹下有子文件夹, 无法删除, 请先删除子文件夹"); - } - - // 文件夹下有文章, 无法删除 - ArticleQueryReq articleReq = new ArticleQueryReq(); - articleReq.setPids(CollUtil.newArrayList(folderId)); - if (CollUtil.isNotEmpty(articleService.listTree(articleReq))) { - throw new XzException500("文件夹下有文章, 无法删除, 请先删除下属文章"); - } - - // 文件夹下有图片, 无法删除 - PictureEntity picReq = new PictureEntity(); - picReq.setPid(folderId); - if (CollUtil.isNotEmpty(pictureService.listAll(picReq))) { - throw new XzException500("文件夹下有图片, 无法删除, 请先删除下属图片"); - } - - baseMapper.deleteById(folderId); + private void updateParamValid(FolderEntity folder) { + XzException404.throwBy(folder.getId() == null, "ID不得为空"); + XzException400.throwBy(folder.getId().equals(folder.getPid()), "上级文件夹不能是自己"); } - } \ No newline at end of file diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderTypeEnum.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderTypeEnum.java index f3a2aa7..17a7c92 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderTypeEnum.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderTypeEnum.java @@ -28,4 +28,14 @@ public enum FolderTypeEnum { this.type = type; this.desc = desc; } + + public static FolderTypeEnum getType(Integer type) { + for (FolderTypeEnum value : FolderTypeEnum.values()) { + if (value.getType().equals(type)) { + return value; + } + } + return null; + } + } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java index 218a8b5..cc12697 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/pojo/FolderEntity.java @@ -1,13 +1,10 @@ package com.blossom.backend.server.folder.pojo; -import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.blossom.backend.server.folder.FolderTypeEnum; import com.blossom.common.base.pojo.AbstractPOJO; import lombok.Data; -import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.Date; @@ -18,7 +15,6 @@ import java.util.List; * * @author xzzz */ -@EqualsAndHashCode(callSuper = true) @Data @TableName("blossom_folder") public class FolderEntity extends AbstractPOJO implements Serializable { @@ -106,6 +102,26 @@ public class FolderEntity extends AbstractPOJO implements Serializable { @TableField(exist = false) private List ids; + /** + * 父ID集合 + */ + @TableField(exist = false) + private List pids; + //endregion + + @Override + public int hashCode() { + return Long.hashCode(this.getId()); + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof FolderEntity) { + return this.id.equals(((FolderEntity)obj).getId()); + } + return false; + } + } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/DocUtil.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/DocUtil.java index e978523..4664ade 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/DocUtil.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/utils/DocUtil.java @@ -122,7 +122,7 @@ public class DocUtil { tree.setTy(DocTypeEnum.A.getType()); // 判断文章的版本与公开版本是否有差异 - if (article.getOpenStatus().equals(YesNo.YES.getValue()) && article.getVersion() > article.getOpenVersion()) { + if (YesNo.YES.getValue().equals(article.getOpenStatus()) && article.getVersion() > article.getOpenVersion()) { tree.setVd(YesNo.YES.getValue()); } diff --git a/blossom-backend/backend/src/main/resources/config/application-dev.yml b/blossom-backend/backend/src/main/resources/config/application-dev.yml index 335bf0e..3df6c2a 100644 --- a/blossom-backend/backend/src/main/resources/config/application-dev.yml +++ b/blossom-backend/backend/src/main/resources/config/application-dev.yml @@ -1,7 +1,7 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/blossom?useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&useSSL=false&&serverTimezone=GMT%2B8 + url: jdbc:mysql://192.168.31.99:3306/blossom?useUnicode=true&characterEncoding=utf-8&allowPublicKeyRetrieval=true&allowMultiQueries=true&useSSL=false&&serverTimezone=GMT%2B8 username: root password: jasmine888 hikari: @@ -9,7 +9,7 @@ spring: logging: level: - com.blossom: debug + com.blossom: info com.blossom.expand.tracker: info com.blossom.backend.base.auth: info org.springframework.boot.web.embedded.tomcat.TomcatWebServer: warn diff --git a/blossom-backend/backend/src/main/resources/mapper/DocMapper.xml b/blossom-backend/backend/src/main/resources/mapper/DocMapper.xml index 816ba6c..82ae1a0 100644 --- a/blossom-backend/backend/src/main/resources/mapper/DocMapper.xml +++ b/blossom-backend/backend/src/main/resources/mapper/DocMapper.xml @@ -5,9 +5,9 @@ \ No newline at end of file diff --git a/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml b/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml index b4be2a9..bd01c66 100644 --- a/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml +++ b/blossom-backend/backend/src/main/resources/mapper/FolderMapper.xml @@ -26,6 +26,10 @@ and open_status = #{openStatus} and type = #{type} and tags like concat('%',#{tags},'%') + and pid = #{pid} + and pid in + #{item} + and user_id = #{userId} diff --git a/blossom-editor/src/renderer/src/App.vue b/blossom-editor/src/renderer/src/App.vue index a9c16dc..16aa4d0 100644 --- a/blossom-editor/src/renderer/src/App.vue +++ b/blossom-editor/src/renderer/src/App.vue @@ -10,7 +10,7 @@ diff --git a/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue b/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue index b54e597..ae531ea 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleInfo.vue @@ -222,7 +222,7 @@ import { ref, nextTick, inject, computed, watch, Ref } from 'vue' import { ElInput, ElMessageBox, FormInstance } from 'element-plus' import type { FormRules } from 'element-plus' import { Document } from '@element-plus/icons-vue' -import { provideKeyDocTree, getCDocsByPid, getDocById, checkLevel } from '@renderer/views/doc/doc' +import { provideKeyDocTree, getCDocsByPid, getDocById } from '@renderer/views/doc/doc' import { useUserStore } from '@renderer/stores/user' import { folderInfoApi, @@ -388,6 +388,10 @@ const formatStorePath = () => { } const showStorePathWarning = ref(false) + +/** + * 填充文件夹路径 + */ const fillStorePath = (id: string, path: string = ''): void => { let doc = getDocById(id, docTreeData!.value) if (!doc) { @@ -542,13 +546,9 @@ const saveDoc = async (formEl: FormInstance | undefined) => { await formEl.validate((valid, _fields) => { if (valid) { saveLoading.value = true - if (!checkLevel(docForm.value.pid, docTreeData!.value)) { - saveLoading.value = false - return - } const handleResp = (_: any) => { Notify.success(curDocDialogType.value === 'upd' ? `修改《${docForm.value.name}》成功` : `新增《${docForm.value.name}》成功`) - emits('saved', curDocDialogType.value) + emits('saved', curDocDialogType.value, docForm.value) } const handleFinally = () => setTimeout(() => (saveLoading.value = false), 300) // 新增文件夹 diff --git a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue index 0cb089f..7e9c841 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue @@ -1,102 +1,109 @@ - - diff --git a/blossom-editor/src/renderer/src/views/article/ArticleTreeTitle.vue b/blossom-editor/src/renderer/src/views/article/ArticleTreeTitle.vue index d308e57..a9c1eba 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleTreeTitle.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleTreeTitle.vue @@ -1,6 +1,6 @@ ")}catch(a){console&&console.log(a)}}v=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4118609,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?t(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(m=function(){document.removeEventListener("DOMContentLoaded",m,!1),v()},document.addEventListener("DOMContentLoaded",m,!1)):document.attachEvent&&(z=v,i=h.document,o=!1,b(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}function e(){o||(o=!0,z())}function b(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(b,50)}e()}}(window); \ No newline at end of file +window._iconfont_svg_string_4118609='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var v,m,z,i,o,t=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}v=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4118609,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?t(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(m=function(){document.removeEventListener("DOMContentLoaded",m,!1),v()},document.addEventListener("DOMContentLoaded",m,!1)):document.attachEvent&&(z=v,i=h.document,o=!1,b(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}function e(){o||(o=!0,z())}function b(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(b,50)}e()}}(window); \ No newline at end of file diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json index d94eb59..4f39a37 100644 --- a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json +++ b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json @@ -5,6 +5,20 @@ "css_prefix_text": "bl-", "description": "", "glyphs": [ + { + "icon_id": "7440601", + "name": "新增文件", + "font_class": "fileadd-line", + "unicode": "e659", + "unicode_decimal": 58969 + }, + { + "icon_id": "24341715", + "name": "folder add-line", + "font_class": "folderadd-line", + "unicode": "ea51", + "unicode_decimal": 59985 + }, { "icon_id": "11855598", "name": "收起", diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf index c1eb90550424240fd276275f78c38530950f4f28..1bf2c77f60fb279464be06a79817e7c5d58b0fab 100644 GIT binary patch delta 3667 zcmZA43vg7`83*wHy}L;u$tL9eB9F}z5&|(VLITMq1d4*ZN?Sn7%MbxWpfO@VWfw$5 zKnkQqp%{@?M4(DZs|iCpoeq<6I&DXhQqhQ%;tl6CZ7D^35z_z3XQ#GVe)rzJ+3fDU z-|NtI(LUH~?=JFh{(WgD;C>qjU-n?r`o^oD{_;y8`Y5pTtrg3cHstLbmd}gAk57Zz?Jge ze1Bs$}r8fTWXpnYD@CjV^AKhP9}npj%XZ2JnC^DKYuu~5r-UPAs0Ww3+TX$IE0sQ7(d2O@G_3z6&%H@IL3=g z#BrSPBM(dQQ;fnggkTItBZFVxi~Es+AL6^%jY`y^5F?O^Q+OTI@f@DVe!PYQxEFiS zi0>hQP1uYlu?0_ID;~tpu>wzH8y>^scmf;YM;q4RQC`l&XvHH~i&a>OUtkdy!~YE4 zz5EX>9XOv5)Y2U9T_HSnPpRhWoLxEtkY!gf4>224RUN>GaN7>5d+ zL=kpiC+-^O<^AIq@-3whVSiG7*42NO_+k%&SP zB9Vr0gdqm8a3hFu|33D1t_|^6{*%1-=BLZVQ7{&8c*~l#$cr2xCCRy z_zOl4PNZNQ;fxTBC>*A;!PvqXFZ>KMoC?8!!>JJrJ)BvBNdRZIU^>8AAWUL93k6dI z&LY8NfwNdJZQwKtCJ>xef~f@OA;yp!FstA^BA8!r+5|HV&U(R|gR?;}``|n#n1^s4 z7tBaFPYC8FoQ;B63db*)uW$kaFPoE_1d|xfX2EoZ^Q2&6!`UL3;&7f4Om;Ztb;PuX z(?Q%f^7xrs$heG`k0@uKIWALxOW7*4pg6D|AD$D*omN& zU{8Y5g53$~uY!FFie+rDV?i20BS_>_GdIxgky<=oGv{!JBL1zk1H0UhB*#@00{2X)8If4TZI#+P?LFWk$LFiF} z;}CkZ;9!K#7aWn$1%ks8dW_)Mgf0{upwM68D1{zp;?ED|RE0KgOq{RK<_(CG7TUZ4 zapppss~|HiwYdu79EL6voXF7T?h$7*w7EFql!i7JM4Z>q69m>U{<>0dh(nuL5yv^S zi4}3MLz`F;M?AE-t;AsuZQ@TH`_MkY1pu^(KXEAlT_>=Qdy_lF)d6%p`MKdj0oufk zxMYAf$wpi}K%0alE+e2#q7oMr&?aAqOABc8X2eAX^mM`H2J{TUg$MM#f=dwSnSzTE z`1LG4A+AfHXA7=Spyvp)M%DWTS1su09~sz7=BJJ~y2pyQ>a9c8E&GJ6UFEKA?hN;K z_pP9`ptHgC!95{qAzMR!JFI8;!r_5Xgyx2Jgq{zp3_BKH5$-<_e!&yrndy1lbHZ~u zVpzngh}{vlBHtU)Hljbu7xkOy#^~!YftcRdir7R#a4yl8 z*pYZOX@{YPQt)57wOZCHwC8 z9reBK)3sx2r`2w$Jz0CRuClJH?)K#J$xeMy{j~a~`Xlu>rc9f1aLUc84JK5BAG(&g zvblJRW7JtnR{1z9H^iG692XTEU*at;FN?}c$cphsdE?ToDl4e0B(5YbD=w=ntIV~; z3Oy4Rd8aWsCnwo&S0(4Xvt!4Ofp@KWR&@C3J7;`>fG=R*9U1y&sFj^OP?4OSoopAj z?-)2|cfS!H{et;*z-JbkgBM+|xbm1%Nv364-n`rb>+9d3G}q;gDoOALmGXS5l|`{t zRvZ;ivPz1}Ct0O)3M|)#J6i*u=nrC&l49(e+?Ef_ef3$Z?auGq)$T{#{KuVb)AO4= zNihTALoaNMNgCK=zqV`LS1;hswySw(Is?(EyR7ccjzi6s*Xp)TBfN2C6aPQhP}sDx Vd3i+Rnx=;3E&qAi={bBn^xw+$pmYEL delta 3327 zcmZA3dvH`|8OQPOZUTgmgb+gRH$or~0)+xe2$zHqFl}i-#0rQ|XrQr$a4FS5X%||0 zks@+Y3yRoMibx|?f`ANDI}XD*j??jqRKulMPdIOpBDRQ#;P1`zhojl~oU^;Lo83Ln z^FF_KcSrR2d(o{UVi)p9{T||f4oOoVUAkt;xy?O)25IZz<+kR<3!6$C?lu7zrJ`9+ z^f(_sR`*XzN%OMRtsPO_BXR|z9ZQ!#vheho4`)E1R6Vz1*}~Qpk*kqR-OtjCidq&f zTf8cF(JQd0T(6(LV)+xvtG9i0IvHMFr!O#W+sOen$B6iU2piu2=^G1rkN<>T@%|&Y zlzy)LzvsK_gusA?^_I z(RJIqP0pU-c3nxodsqMcN5ae(e* z@O=(4FvbGjWDpP2jWS9p(2p%-F4^qh^K7AtT85HBE^qMz?&BMLlUHbCClBy7npn;= z#8}S;p5-|up4uP7)^X~}MIGzed5NA|6wSn;+6ZAGJ zCxM#UQ(+1Gdwf&p>l~}pK~!ymDxQ@>yE5UlBwk6o09@7DJFu}7%y-e_&QCAaeH0p1H=Z!j@z&{rCJi&3J?kD)I(K;ab ztI>*}Gh!I1v&!VLK;NuWm&wz5p)=cP<w8#nHGg|J1e>7V7#KJ%6foKL0b{I_q!gEG*f$+T1gdn_NG%E-%8chwt z_l@QU;U%L#HA)y5wF6y{ExNc-3fx5q@Me%m}af54@%qy`b~oj3yl6b)#8F_;;hJNBFVP{3HCt zXc7|MFq(;k|1g@4gg1@mB;h}eCMMx6Lu{q){L5&J65ci%sD%GE8m)wPjD{@XU88Y} zE<_g%UR=az1mmJc!x$H5G?sDkh9f$wnPdK-QH|?vG_-L&jK()k9qeh4<9Zs6bX=m* zaL4sB8uPd$qk)f0HX8l76r&Kp^)`xw7%o*0M9F~bW0VoNG^4b@^)<>3T)I($;QAS5 z2`r=L6mm5K}NZUD>X_$++d?D#0@b@MO>LtKH`QNB_*!h zC^K>X|BBKR=ie{NQJjCB#1yGG|3Xo?;{3N2#VpQ$TT$TRMj4-w&R-=_2;=;(5XCXh ze{oST<0_3J8dqf$);M1hQEcO?ef?DzB{9k>UL_8+)Lqn!wDy2NzwyHMx9xoCTW+hw#-;YzykTb8cB zDz)O#NLr*hS`eKVJrKPWw>|E5d~^KPZWY~*cCYHbwfoH;;}fb9ewlE+=c=AN6H^nX zCbsp;>vb?GDXAf8ebPHgSCb2pXC|*r?nsHIG{<`1-`l0mPd(gcbf2?ni_)(5ZR~q6 zy(GP(Us=Ds8F?8~GhWJgCo?s(KJ#!^YSu&93E8um#Pe}4Y) z{L2N61#JbcFsHDgaBJb&qO78gMc4X|=)bCeP&}>p;(+ZXNhNQUd_1sf;Lbra2OTU; zDV<$UyNxQbG>49#jVOsmDj2&s+LwA89RLJ?y;w;%d5{+-x=35u5EnQ z_KEwK=tQwexEC)SjrlF{!v<(vnGSb!Bxe wbq6NTp1gPRiOJ{dv+A4bPfSUfvSiAc_EUZHw?vM$UwW-25}|$N>u)Ch2aPvLCIA2c diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff index afec489d57ea9d65ffea9ea7b0832fadf3a42657..9b8644904acea43f5b1a1f19d0977f516e028c40 100644 GIT binary patch delta 23212 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 fE2b<2EPO1`Efg*A zE_g4#FjO$+F?=!jGLkb8Gp001G|Dw(HS#ueHu^V;H}E(%IBYnyIW9SzIm9|FI@UV= zJ7hboJQzHrJrq5PJ=i`-K6pN)KHfg|KMp@OKa4-lKpH?oKwLncK)OKoK_WqBL99Y5 zLT*B+Ls&6GqC>hv-b5HgWJJ0}4n<}~)_9y_U}Rum*v`n!pvwRPOhC*9gbWP-!F&b) zAkP8^v-eeD0e`!DkF-tNq$}wjDMUgdB9fp1(z4UN_uhN&J<~t02ZErexZhX*U;&52 z9q#VEI}WWHvVZlV|Nc9KRalK-j9?UNFoqiH7{>$}n8XyOu@*B}hxOQijo5_EI09R+ z729wmj>2{vjbm^uj>GXd0Vm=loQzX&Do(@cXyOchx@Ji* zxg_|A&**rB)3#9OP#hWjC zaVVLMWMI6_;swDE29$$FThMzWrn*LDc;~)7yD17U5R3M@JwGTCYb@Ul7@N*TSyBqt zw`J(lYX-C?%biWsf@*rww=O1%%lT$IYnH*Xa8dAHBDfb&V(0$neBKtiBhnyiZDNzp zSsqvy%pESUJ|_t;ti!3I?%ZrcLZAiTde%&Nl+YD!{LVR)5_Y9ZSjf}VzOLr8Vzt)T z@VXVNGkqgYM1E;$R?dw9r7sA#WjHH@RIYHGHd0w5HO=GF!>%2ZMOsM&HW^q-lag8} ze_t_QNaBvv+y$ycCrDFi4e6dpy})_NVscX2+QJWEz(hrPUMO-j|infsRb=D~xV-=v!Sczrl za@C`;>VRza6$;GG7dn)}(6Nhx_PX6=MAAUCL|VO6 zHZ6Ba#F-vYNQ-tbMkCTbuIxo7f48+N=5}&rpiG)SBwn%W#~Re c`eh8L(4i@IKGutbi=uT62o3!U8YwYZ0L2TT;Q#;t diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff2 b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff2 index 3013f569a5a8836fa741dcb9eed62c6ca166bd3a..fcc182563d4a71ca4e249be2bf873b7a958e28ef 100644 GIT binary patch literal 19196 zcmV)0K+eB+Pew8T0RR91080D-3jhEB0InPW07|O>0RR9100000000000000000000 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 XeG*A>VQAofkS*~soiVn9agz4{mpAbo literal 19024 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

    ?lrt;5OM-oNlt|eCjTp~ zQs|1I$k2t%L9^uA~l}lIQmy8j%+b3X52+-Ir`XOYV4I2Q$B?`sbG}s=%#0>Z*>z_g8 z?@N*A%Wvcj)?+5bz~Dfs(n`L3RM7v^bMXl>nO{@t=U&OEfPSu;sG^XSr_ zr?t*++O%%u;m!!#2?3D@0?g1mncGkLpNHdemBtCm#K^&`q}3i`4~~pdMvY441WHj) z9mm{^@hnzXCzFY9`2wG zD6BTbunBiiepU27Lpey7s_*{Tm0m4t&ydX4=xYb|j@w9yIWzz#wDsYxsPwHWEJ73l5-aH@)sy3P!dKX=LJ7%f61iZSg6qV)E;mrf zWH;g*o~;$e3`+tqQX9hLAd3sDtQsXMbdg~qgR}X-K3r?~SjqHydJ2_AISntXXl^%! z!WUySmIMGuXCx5F38890h2_V`s)>)-;oeh(#y~iNtJ(SYX;b3M9LifO!x+oIY){ zKiK=lOTsR)h@qKu^*Zh=hO}WYTRo-BUi%nyHPJzr4ZOpoKT(}Lw zjDjHZRdWoFSjrWcT(#ZRg@TDmtU|bkruGky!K+{zt5W{R6<61>PAN0)=I;0W!6thV(YN&`RZ;NYXtYBz}Y?oh29gbzLz+#qb z86mj5KGVFmpx#CY^xm>@&@b0p&_>TqGBGg{ufwNv_gp6}^s03b&O}g)4n$ z29w4|N#VmL)hBv4? z5@t&1068#4*32B+%NfWKC+%{=K~rbmabhcfp|3)AM<3_<4^~*y z-!!F_H3Cl>tEcvNoP7vzEg2%5Yb6C{es{RgM0q;$k5ZOeh50Qd^V6HPTJ-1 z{2VlORwuvkR{la?g^ZeV8~q=waAEh8=Z7aI^*u=(V``2sv;M_1PdC|zOvj7(ohc!R zY?Mi+7yE+X4}(A`e|pUHI$rXiTO3DR(!J8A3lq+ORGMy>*55e#XJk9B=K~-FBPfOw zBt=LcaFCux=!WmPxrc88!CPLLGMupBRllB}qj{qc};kyeO->X}f+Hr+Hbo{W!1tdA&d1-yeiv1jXSAL=u@orO_Eo7MsK6@dZMW zSR$3l6-t#_qt)pRMw8iMwb>m`m)qm@Vg4|kyg@}M7wolG%g_iXoKrKZVFq&!B*mB0 zRtcse>y+Z|ye6<|>Nk-bw$Y0A2Z5?{!xb05q$YFlY6wPQiujRld%>g&#%83Wx-01X zBWjP#Xn8dpsLnwEWjAMB*w3hGbx~^Ta_Gu*zKddHZTWTvkT)ac?H|r)xn{6!1{4j` zqvGUToC8|!?wnI&DDd@+bQpBZ)nRmUvfX7Elmpi1i#kuD6wB{-l-?L$2TlE9#{#Xg zP0K?YKm7CSFAkg;2AaoDr##$VtAb=JlRjbSe?XVLkf9tAv9$Yl23snI|!{ zex%0IuN0CQW1bmdAoCZN@pYc9o_(n8H8l=w8puhsukcNxPzw<*o*N$23_{HSnJlUM zj2`Fd5O@XK}9W-z#R+UZlnu;DxMvt3N>fn z**w$&QXV=J6`Sm@Bu8OqROC)b&AX+^N5F#VGG&bGvwVI>&ntlTXFt*K28YQD+PXP5*ykf=qe}yfIEz4VhB2m~X+UKcqNn;*k_exIUH$ z;t!=`>3$G%QWg*{J_IrB<5aZg)C9IMkUJ~P(&{T{$({Kdp&I)#!$vNJHI)X4DzF(W z0x(FswSX_Z`{+81pu>-_$dtA+I0;Xdle)Txa_bK_e@@$VaUg{Qc<4AY=oFiNEH za8IVe13Pa%hPEOJK87|ix1Vej=3!*HpJ&S4$Nl4Cjz1@Y}>Z`266GED#r z$)>O!oN-+~rS*(y$yN=?LJ8hrv{E6@WoW2p@(WIHh;le@q3`IYS~ zc*ByzfxFW%eeEXfknCeYSatzM@Cu0RrM?kS7E|9d$)*Fh>`$0REEcZFsg_dF$Ab2q zjPzorX-Mr@WEUk}7&WwQE!uU!J_>U|Rd(xNz!o@NPL3H*lXv>e1BV49dA=9CR}bO~_r_vD4Om zZo3AXyqSjx%(9~r$w@0^6cF} From c54b4672011529a054bae95d15e9d40c71449eab Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Apr 2024 19:16:03 +0800 Subject: [PATCH 39/73] =?UTF-8?q?feat:=20=E6=89=B9=E9=87=8F=E5=85=AC?= =?UTF-8?q?=E5=BC=80/=E5=8F=96=E6=B6=88=E5=85=AC=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article/open/ArticleOpenController.java | 19 +++-- .../article/open/ArticleOpenService.java | 82 +++++++++++++++++-- .../open/pojo/ArticleBatchOpenReq.java | 44 ++++++++++ .../src/renderer/src/api/blossom.ts | 13 ++- .../src/views/article/ArticleTreeDocs.vue | 56 +++++++++++-- 5 files changed, 191 insertions(+), 23 deletions(-) create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/pojo/ArticleBatchOpenReq.java diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenController.java index 9d8a940..32b9e49 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenController.java @@ -13,10 +13,7 @@ import com.blossom.backend.config.BlConstants; import com.blossom.backend.server.article.draft.ArticleService; import com.blossom.backend.server.article.draft.pojo.ArticleEntity; import com.blossom.backend.server.article.draft.pojo.ArticleInfoRes; -import com.blossom.backend.server.article.open.pojo.ArticleOpenEntity; -import com.blossom.backend.server.article.open.pojo.ArticleOpenReq; -import com.blossom.backend.server.article.open.pojo.ArticleOpenRes; -import com.blossom.backend.server.article.open.pojo.ArticleOpenSyncReq; +import com.blossom.backend.server.article.open.pojo.*; import com.blossom.backend.server.doc.DocTypeEnum; import com.blossom.backend.server.utils.DocUtil; import com.blossom.common.base.exception.XzException404; @@ -90,7 +87,19 @@ public class ArticleOpenController { @PostMapping public R open(@Validated @RequestBody ArticleOpenReq req) { req.setUserId(AuthContext.getUserId()); - return R.ok(openService.open(req)); + return R.ok(openService.openSingle(req)); + } + + /** + * 批量公开文章 + * + * @param req 文章对象 + */ + @PostMapping("/batch") + public R open(@Validated @RequestBody ArticleBatchOpenReq req) { + req.setUserId(AuthContext.getUserId()); + openService.openBatch(req); + return R.ok(); } /** diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenService.java index 3526873..38a4bee 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/ArticleOpenService.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.blossom.backend.server.article.TagEnum; import com.blossom.backend.server.article.draft.ArticleService; import com.blossom.backend.server.article.draft.pojo.ArticleEntity; +import com.blossom.backend.server.article.draft.pojo.ArticleQueryReq; +import com.blossom.backend.server.article.open.pojo.ArticleBatchOpenReq; import com.blossom.backend.server.article.open.pojo.ArticleOpenEntity; import com.blossom.backend.server.article.open.pojo.ArticleOpenReq; import com.blossom.common.base.enums.YesNo; @@ -58,28 +60,92 @@ public class ArticleOpenService extends ServiceImpl articles = articleService.listAll(where); + for (ArticleEntity article : articles) { + ArticleOpenReq open = new ArticleOpenReq(); + open.setId(article.getId()); + open.setOpenStatus(req.getOpenStatus()); + open.setUserId(req.getUserId()); + open(open, article); + } + } + + /** + * 公开状态 + * + * @param req 本次公开请求 + * @param article 文章 + */ + @Transactional(rollbackFor = Exception.class) + public void open(ArticleOpenReq req, ArticleEntity article) { + ArticleEntity upd = new ArticleEntity(); + upd.setId(req.getId()); + upd.setUserId(req.getUserId()); + upd.setOpenStatus(req.getOpenStatus()); /* * 公开文章 将 article 表插入到 article_open 表 */ if (YesNo.YES.getValue().equals(req.getOpenStatus())) { - XzException400.throwBy(article.getOpenStatus().equals(YesNo.YES.getValue()), "文章已[" + req.getId() + "]已允许公开访问, 若要同步最新文章内容, 请使用同步"); - entity.setOpenVersion(article.getVersion()); + if (YesNo.YES.getValue().equals(article.getOpenStatus())) { + return; + } + // XzException400.throwBy(article.getOpenStatus().equals(YesNo.YES.getValue()), "文章已[" + req.getId() + "]已允许公开访问, 若要同步最新文章内容, 请使用同步"); + upd.setOpenVersion(article.getVersion()); baseMapper.open(req.getId()); } /* * 取消公开 删除 article_open 表数据 */ else if (YesNo.NO.getValue().equals(req.getOpenStatus())) { - entity.setOpenVersion(0); - XzException400.throwBy(article.getOpenStatus().equals(YesNo.NO.getValue()), "文章[" + req.getId() + "]未公开, 无法取消公开访问"); + if (YesNo.NO.getValue().equals(article.getOpenStatus())) { + return; + } + // XzException400.throwBy(article.getOpenStatus().equals(YesNo.NO.getValue()), "文章[" + req.getId() + "]未公开, 无法取消公开访问"); + upd.setOpenVersion(0); baseMapper.delById(req.getId()); } - articleService.update(entity); - return req.getId(); + // 修改文章的公开状态 + articleService.update(upd); } /** diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/pojo/ArticleBatchOpenReq.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/pojo/ArticleBatchOpenReq.java new file mode 100644 index 0000000..4c6e2e5 --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/open/pojo/ArticleBatchOpenReq.java @@ -0,0 +1,44 @@ +package com.blossom.backend.server.article.open.pojo; + + +import com.blossom.common.base.enums.YesNo; +import com.blossom.common.base.pojo.AbstractPOJO; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.Max; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; + +/** + * 文件夹下的文章全部公开 + * + * @author xzzz + * @since 1.14.0 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ArticleBatchOpenReq extends AbstractPOJO { + + /** + * 文章ID + */ + @Min(value = 0, message = "[文件夹ID] 不能小于0") + @NotNull(message = "[文件夹ID] 为必填项") + private Long pid; + + /** + * 公开状态 {@link YesNo} + * + * @see YesNo + */ + @Min(value = 0, message = "[open 状态] 不能小于0") + @Max(value = 1, message = "[open 状态] 不能大于1") + @NotNull(message = "[open 状态] 为必填项") + private Integer openStatus; + + /** + * 用户ID + */ + private Long userId; +} diff --git a/blossom-editor/src/renderer/src/api/blossom.ts b/blossom-editor/src/renderer/src/api/blossom.ts index 2549031..75cf857 100644 --- a/blossom-editor/src/renderer/src/api/blossom.ts +++ b/blossom-editor/src/renderer/src/api/blossom.ts @@ -96,8 +96,8 @@ export const docTreeApi = (params?: object): Promise> => { /** * 修改文档的排序 - * @param data - * @returns + * @param data + * @returns */ export const docUpdSortApi = (data: object): Promise> => { return rq.post>('/doc/upd/sort', data) @@ -382,6 +382,15 @@ export const articleOpenApi = (data?: object): Promise> => { return rq.post>('/article/open', data) } +/** + * 文章公开或取消公开 + * @param data + * @returns + */ +export const articleOpenBatchApi = (data?: object): Promise> => { + return rq.post>('/article/open/batch', data) +} + /** * 文章同步 * @param data diff --git a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue index 79522b1..ef43ae2 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue @@ -10,10 +10,10 @@

    -
    +
    -
    +
    @@ -111,8 +111,8 @@
    重命名
    编辑详情
    同步文章
    -
    新增文件夹
    -
    新增笔记
    +
    新增文件夹
    +
    新增笔记
    复制双链引用
    导入文章
    @@ -120,10 +120,18 @@ 更多
    -
    公开
    -
    取消公开
    -
    收藏
    -
    取消收藏
    +
    + 公开{{ curDoc.ty === 3 ? '文章' : '文件夹' }} +
    +
    + 取消{{ curDoc.ty === 3 ? '文章' : '文件夹' }}公开 +
    +
    + 收藏{{ curDoc.ty === 3 ? '文章' : '文件夹' }} +
    +
    + 取消收藏{{ curDoc.ty === 3 ? '文章' : '文件夹' }} +
    设为专题目录
    @@ -137,6 +145,9 @@
    取消专题
    + +
    所有文章公开
    +
    所有文章取消公开
    @@ -269,6 +280,7 @@ import { articleUpdTagApi, articleDownloadHtmlApi, articleOpenApi, + articleOpenBatchApi, articleStarApi, folderStarApi, folderAddApi, @@ -925,6 +937,34 @@ const open = (openStatus: 0 | 1) => { } } +/** + * 公开/取消公开 + */ +const openBactch = (openStatus: 0 | 1) => { + const callback = () => { + const parent: Node = DocTreeRef.value.getNode(curDoc.value.i) + if (parent && !isEmpty(parent.childNodes)) { + for (const doc of parent.childNodes) { + if (doc.data.ty === 3) { + doc.data.o = openStatus + } + } + } + } + + if (curDoc.value.ty === 1) { + articleOpenBatchApi({ pid: curDoc.value.i, openStatus: openStatus }).then((_) => { + callback() + Notify.success(openStatus === 0 ? '取消公开成功' : '公开成功') + }) + } else { + articleOpenBatchApi({ pid: curDoc.value.i, openStatus: openStatus }).then((_) => { + callback() + Notify.success(openStatus === 0 ? '取消公开成功' : '公开成功') + }) + } +} + /** * 收藏/取消收藏 */ From dab28de7205c33b44d7f262ae185ece45198c034 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Apr 2024 19:40:24 +0800 Subject: [PATCH 40/73] =?UTF-8?q?feat:=20=E7=BD=91=E9=A1=B5=E7=AB=AF?= =?UTF-8?q?=E8=87=AA=E9=80=82=E5=BA=94=20title?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/renderer/src/components/IconList.vue | 1 + .../src/renderer/src/router/route-init.ts | 23 +++++++++++-------- .../src/renderer/src/views/Index.vue | 1 + .../src/views/article/ArticleHistory.vue | 1 + .../article/ArticleReferenceChartGraph.vue | 1 + .../src/views/article/ArticleViewWindow.vue | 1 + .../renderer/src/views/index/IndexAside.vue | 2 +- .../renderer/src/views/index/SettingIndex.vue | 1 + 8 files changed, 21 insertions(+), 10 deletions(-) diff --git a/blossom-editor/src/renderer/src/components/IconList.vue b/blossom-editor/src/renderer/src/components/IconList.vue index d1b339f..d6d6e1d 100644 --- a/blossom-editor/src/renderer/src/components/IconList.vue +++ b/blossom-editor/src/renderer/src/components/IconList.vue @@ -48,6 +48,7 @@ import blossomIcons from '@renderer/assets/iconfont/blossom/iconfont.json' import weblogIcons from '@renderer/assets/iconfont/weblogo/iconfont.json' onMounted(() => { + document.title = 'Blossom 图标库' blossom.value = blossomIcons.glyphs weblogo.value = weblogIcons.glyphs.sort((w1, w2) => { return w1.font_class.localeCompare(w2.font_class) diff --git a/blossom-editor/src/renderer/src/router/route-init.ts b/blossom-editor/src/renderer/src/router/route-init.ts index 32cdcf4..ff47464 100644 --- a/blossom-editor/src/renderer/src/router/route-init.ts +++ b/blossom-editor/src/renderer/src/router/route-init.ts @@ -36,19 +36,19 @@ router.addRoute({ component: Index, meta: { keepAlive: true }, children: [ - { path: '/home', name: 'Home', component: Home, meta: { keepAlive: true } }, - { path: '/settingIndex', name: 'SettingIndex', component: SettingIndex, meta: { keepAlive: false } }, + { path: '/home', name: 'Home', component: Home, meta: { keepAlive: true, title: 'Blossom 首页' } }, + { path: '/settingIndex', name: 'SettingIndex', component: SettingIndex, meta: { keepAlive: false, title: 'Blossom 设置' } }, // 功能页面 - { path: '/articleIndex', name: 'ArticleIndex', component: ArticleIndex, meta: { keepAlive: true } }, - { path: '/pictureIndex', name: 'PictureIndex', component: PictureIndex, meta: { keepAlive: true } }, - { path: '/todoIndex', name: 'TodoIndex', component: TodoIndex, meta: { keepAlive: true } }, - { path: '/noteIndex', name: 'NoteIndex', component: NoteIndex, meta: { keepAlive: false } }, - { path: '/planIndex', name: 'PlanIndex', component: PlanIndex, meta: { keepAlive: false } }, + { path: '/articleIndex', name: 'ArticleIndex', component: ArticleIndex, meta: { keepAlive: true, title: 'Blossom 文章编辑' } }, + { path: '/pictureIndex', name: 'PictureIndex', component: PictureIndex, meta: { keepAlive: true, title: 'Blossom 资源库' } }, + { path: '/todoIndex', name: 'TodoIndex', component: TodoIndex, meta: { keepAlive: true, title: 'Blossom 待办事项' } }, + { path: '/noteIndex', name: 'NoteIndex', component: NoteIndex, meta: { keepAlive: false, title: 'Blossom 便签' } }, + { path: '/planIndex', name: 'PlanIndex', component: PlanIndex, meta: { keepAlive: false, title: 'Blossom 日历计划' } }, { path: '/iconListIndex', name: 'IconListIndex', component: IconListIndex, - meta: { keepAlive: false }, + meta: { keepAlive: false, title: 'Blossom 图标库' }, props: { window: false } @@ -58,5 +58,10 @@ router.addRoute({ router.addRoute({ path: '/articleViewWindow', name: 'ArticleViewWindow', component: ArticleViewWindow, meta: { keepAlive: true } }) router.addRoute({ path: '/iconListIndexWindow', name: 'IconListIndexWindow', component: IconListIndex, meta: { keepAlive: true } }) -router.addRoute({ path: '/articleReferenceWindow', name: 'ArticleReferenceWindow', component: ArticleReference, meta: { keepAlive: true } }) +router.addRoute({ + path: '/articleReferenceWindow', + name: 'ArticleReferenceWindow', + component: ArticleReference, + meta: { keepAlive: true } +}) router.addRoute({ path: '/articleHistory', name: 'ArticleHistory', component: ArticleHistory, meta: { keepAlive: true } }) diff --git a/blossom-editor/src/renderer/src/views/Index.vue b/blossom-editor/src/renderer/src/views/Index.vue index b74d6f7..e4d0d9c 100644 --- a/blossom-editor/src/renderer/src/views/Index.vue +++ b/blossom-editor/src/renderer/src/views/Index.vue @@ -38,6 +38,7 @@ const includeRouter = ref(['settingIndex']) watch( () => router.currentRoute.value, (newRoute) => { + document.title = newRoute.meta.title as string if (newRoute.meta.keepAlive && includeRouter.value.indexOf(newRoute.name) === -1) { includeRouter.value.push(newRoute.name) } diff --git a/blossom-editor/src/renderer/src/views/article/ArticleHistory.vue b/blossom-editor/src/renderer/src/views/article/ArticleHistory.vue index 393d6d7..7d82421 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleHistory.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleHistory.vue @@ -64,6 +64,7 @@ const initEditor = (_doc?: string) => { const getLogs = (articleId: string | number) => { articleInfoApi({ id: articleId, showToc: false, showMarkdown: true, showHtml: false }).then((resp) => { article.value = resp.data + document.title = `《${resp.data.name}》编辑历史` }) articleLogsApi({ articleId: articleId }).then((resp) => { historyList.value = resp.data diff --git a/blossom-editor/src/renderer/src/views/article/ArticleReferenceChartGraph.vue b/blossom-editor/src/renderer/src/views/article/ArticleReferenceChartGraph.vue index 7d6dbe2..461dbc4 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleReferenceChartGraph.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleReferenceChartGraph.vue @@ -321,6 +321,7 @@ const windowResize = () => { } onMounted(() => { + document.title = 'Blossom 双链图表' init() windowResize() articleId = route.query.articleId as string diff --git a/blossom-editor/src/renderer/src/views/article/ArticleViewWindow.vue b/blossom-editor/src/renderer/src/views/article/ArticleViewWindow.vue index 06ff76f..d9e4840 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleViewWindow.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleViewWindow.vue @@ -57,6 +57,7 @@ const toScroll = (id: string) => { const initPreview = (articleId: string) => { articleInfoApi({ id: articleId, showToc: false, showMarkdown: false, showHtml: true }).then((resp) => { article.value = resp.data + document.title = `《${resp.data.name}》` nextTick(() => initToc()) }) } diff --git a/blossom-editor/src/renderer/src/views/index/IndexAside.vue b/blossom-editor/src/renderer/src/views/index/IndexAside.vue index d748ba4..3d4662c 100644 --- a/blossom-editor/src/renderer/src/views/index/IndexAside.vue +++ b/blossom-editor/src/renderer/src/views/index/IndexAside.vue @@ -78,6 +78,7 @@ const activeMenuPath = ref('home') watch( () => router.currentRoute.value, (newRoute) => { + console.log(newRoute); activeMenuPath.value = newRoute.path }, { immediate: true } @@ -289,7 +290,6 @@ const isLogin = () => { height: 60px; margin-top: 0; } - } :deep(.el-divider) { diff --git a/blossom-editor/src/renderer/src/views/index/SettingIndex.vue b/blossom-editor/src/renderer/src/views/index/SettingIndex.vue index 7c32afd..fc273dc 100644 --- a/blossom-editor/src/renderer/src/views/index/SettingIndex.vue +++ b/blossom-editor/src/renderer/src/views/index/SettingIndex.vue @@ -35,6 +35,7 @@ const userStore = useUserStore() const route = useRoute() onMounted(() => { + document.title = 'Blossom 设置' let actTab = route.query.activeTab as string if (isNotBlank(actTab)) { activeTab.value = actTab From 511402b9ae1e628bc955c060d0b10cb8911de0a3 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sun, 7 Apr 2024 00:56:02 +0800 Subject: [PATCH 41/73] =?UTF-8?q?pref:=20=E4=BC=98=E5=8C=96=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=96=87=E7=AB=A0=E6=94=B6=E8=97=8F=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../renderer/src/views/home/ArticleStars.vue | 85 +++++++------------ .../src/renderer/src/views/home/Home.vue | 4 +- 2 files changed, 32 insertions(+), 57 deletions(-) diff --git a/blossom-editor/src/renderer/src/views/home/ArticleStars.vue b/blossom-editor/src/renderer/src/views/home/ArticleStars.vue index 9f015e7..ef371f5 100644 --- a/blossom-editor/src/renderer/src/views/home/ArticleStars.vue +++ b/blossom-editor/src/renderer/src/views/home/ArticleStars.vue @@ -12,9 +12,8 @@ v-for="article in articles" :key="article.id" :class="[configViewStyle.isHomeStarCard ? 'star-card' : 'star-list', configViewStyle.webCollectExpand ? '' : 'close']"> -
    -
    -
    +
    +
    {{ article.name }}
    @@ -60,9 +59,11 @@ const toRoute = (articleId: number) => { router.push({ path: '/articleIndex', query: { articleId: articleId } }) } -const toWebview = (article: any) => { +const toWebOrRoute = (article: any) => { if (article.openStatus === 1) { openExtenal(userStore.userinfo.userParams.WEB_ARTICLE_URL + article.id) + } else { + toRoute(article.id) } } @@ -81,6 +82,7 @@ defineExpose({ reload }) ")}catch(a){console&&console.log(a)}}v=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4118609,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?t(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(m=function(){document.removeEventListener("DOMContentLoaded",m,!1),v()},document.addEventListener("DOMContentLoaded",m,!1)):document.attachEvent&&(z=v,i=h.document,o=!1,b(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}function e(){o||(o=!0,z())}function b(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(b,50)}e()}}(window); \ No newline at end of file +window._iconfont_svg_string_4118609='',function(h){var a=(a=document.getElementsByTagName("script"))[a.length-1],l=a.getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var v,m,z,i,o,t=function(a,l){l.parentNode.insertBefore(a,l)};if(l&&!h.__iconfont__svg__cssinject__){h.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}v=function(){var a,l=document.createElement("div");l.innerHTML=h._iconfont_svg_string_4118609,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?t(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(v,0):(m=function(){document.removeEventListener("DOMContentLoaded",m,!1),v()},document.addEventListener("DOMContentLoaded",m,!1)):document.attachEvent&&(z=v,i=h.document,o=!1,b(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,e())})}function e(){o||(o=!0,z())}function b(){try{i.documentElement.doScroll("left")}catch(a){return void setTimeout(b,50)}e()}}(window); \ No newline at end of file diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json index 4f39a37..514a56c 100644 --- a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json +++ b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.json @@ -5,6 +5,20 @@ "css_prefix_text": "bl-", "description": "", "glyphs": [ + { + "icon_id": "5203274", + "name": "瞄准", + "font_class": "collimation", + "unicode": "e62c", + "unicode_decimal": 58924 + }, + { + "icon_id": "577366", + "name": "搜索类目-fill", + "font_class": "search-item", + "unicode": "e753", + "unicode_decimal": 59219 + }, { "icon_id": "7440601", "name": "新增文件", @@ -418,13 +432,6 @@ "unicode": "ea17", "unicode_decimal": 59927 }, - { - "icon_id": "24341919", - "name": "left direction-fill", - "font_class": "a-leftdirection-fill", - "unicode": "ea18", - "unicode_decimal": 59928 - }, { "icon_id": "24342162", "name": "record-line", diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.ttf index 1bf2c77f60fb279464be06a79817e7c5d58b0fab..8fd95f2c5691fbd246d4eafec30d87040cf267ef 100644 GIT binary patch delta 4224 zcmZXX33OD|8OQ(c&14d?Ot#5RLN+ql16hGg_JyDzsGyiyl1LI337b&?!2v`?3sj9& zOcg~D0k@XeRw&0~d(`9cXsU>`rBspHH+i>c(Q0cchW>9pJaTk~-@W&}y!Ynad%y4h z|9JGIdGaIkzDa)j__$?&^B54mbC3zNdRC|0 z@G!8ukk`*%x#FgX{_ro4MF3B&=L>Y+eW&k-qQnK$;O4`o{Q!IqzrSE72+(hzas$Tpc(Rcw=P4$grKE64aIIku#nP7x)5aELiTbtL6rI<1V?% zeorOIRRf!XTl@x}+lrZ(Gxog-S79!$!F+z(`R)JScMZPxHJnDj(a*Pg2}y{;ctr9Y zvpLZW&cTDnkcbvs&zXcF2MO?EB69I4cHwb6f!%m=pxG7ef0px1#&dWcdAI>DARh}c z4#gOQf6_#Kt?!kI&!0qs3Bi7fE zcn~k+5PpUo_$iiS1yN`k#l+BXZ(;eF6&BH}9`6z%%SO3)sj04gvewZxL{S{hb1yWv}lc zI_a&K1*Qe8_XQ>htWO0z&mRwP={3w61h{`1<_`j~0y7B#?!SgPg#aI>VRj*qA~4So z(0?P$I0P=j+(Y1ML5o)4kidLI;0@wuqeF0nOQd0vVq{ogy28#7n7FXt6PUuVj|xm? z*qoV$X$||Bzyyc=fxuLUeOzGD!~Ubd^oQU66AuWL0QR2+Y69#N0@VTbUj*s|?2`f& z1NL79Y6t8O1*!<_j|A!o>{9}j1@^}RH3s(SF}VH@aPT*Q!UOvgff5A!?*hdLwk1%O zU33G4}n4k`;0(IgZ(Lg-)1mS-C%zvQ0HL(Q=sC(J}XfB zV1F)91z~?7P!D1MOQ15s{!(CU!~ROZM)v;}sGG3=Bfx(v2VV;mQ`r9%D66o~2^3h^ z{}U*+u+Iw=UD)3USjB!+pbo>nAW)IPg&2d{48=g#P^F<5kbd2ulLrog(hcPlDB@5- z0_7aaB~aL*f(1%ERER*ahhipZDEm;M0u2BvOrRA&G2k^c1wRx^0S)~D$}P|-pdtl& z1{9@JL-&A+7U&~TF#;V0DpsJkKv6+8sAnH1&~KpP1v(E@f`)rU6M{+-Xh%@V0*whO zMW97NjTdNEP^kiK3o1>Zfk90WXk}380!m$^!{^c>Elp()`X4@ zrDsa$?NHSMT^`CO(C?x2wh=l%l-@SNQVU8iF<~(PRWGnCfYSR@{U>=Wl>Fo7$39AsOnF8w( zs9D6%hNTJA6#|PCsM!L`6{tA^3m2#>1(q;Sj|ePgaKnb8Jr~~{e=s3G zVNb$vVtit6;$TupQg708$qSMXq+FGlz99Pa|IXiMb^X|(FD+>;8J_H!e4x}$~f>)t_$2Zdlo{v*BRFmyJ=4GaJ`59%(Y0Ha5N1G}`<^^Vcm=E#)oCTMoBI zwRX22na;eC|B^V?o9Ah<^{nUOJg&@~8pG`fE-Q`qxC)FkM?yt;Wodk>QR}G6%FHRR ztTu}M4sU6i>2aHx#b$Y}X=ZxHdn!9-6uWxdadGY*SMiLFinwo2MS3otnm=oMkI&b; zZE#z!&)2ive5ohWb4Tscc&^nuBk$L-63qDL|BcR4{KHw} z=1?XYsN&2`hEAT~o!q%1=&E3Y+5(+rQ>$SgK03~yysWktC+$D5NG z>nRXxVUIZe^1}gyr*g$L(lB(5B@*Y?-?@y delta 3804 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

    GL9Ci8U`N$>>K5D~KL_1HaGjQ&4c2{mne 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 AJOBUy delta 23519 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 diff --git a/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff2 b/blossom-editor/src/renderer/src/assets/iconfont/blossom/iconfont.woff2 index fcc182563d4a71ca4e249be2bf873b7a958e28ef..c6d48e67a9920534b726a422d411ba40dcb50c2e 100644 GIT binary patch literal 19548 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 XeG*A>VQAofkS*~soiVn9agz4{mpAbo From 61ed63732a99dc0b433baa1932d9c54eb491bfa1 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sun, 7 Apr 2024 02:43:52 +0800 Subject: [PATCH 46/73] =?UTF-8?q?feat:=20=E6=A0=91=E7=8A=B6=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E8=81=9A=E7=84=A6=E5=BD=93=E5=89=8D=E6=89=93=E5=BC=80?= =?UTF-8?q?=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 树状菜单聚焦当前打开文章 2. 优化树状菜单样式 --- .../src/views/article/ArticleTreeDocs.vue | 70 ++++++++++++------- .../src/renderer/src/views/doc/doc-tree.scss | 30 ++++---- .../src/renderer/src/views/doc/doc-tree.ts | 6 +- .../src/views/picture/PictureTreeDocs.vue | 6 +- 4 files changed, 64 insertions(+), 48 deletions(-) diff --git a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue index 53215ba..a324583 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue @@ -6,22 +6,25 @@

    - +
    - +
    - +
    - -
    + +
    - +
    - + +
    +
    +
    -
    {{ article.name }}
    -
    +
    {{ article.name }}
    + + +
    +
    -
    《{{ article.name }}》
    +
    {{ article.name }}
    {{ article.words }} 字 | {{ article.uv }} | {{ article.likes }} diff --git a/blossom-web/src/views/article/styles/doc-content.scss b/blossom-web/src/views/article/styles/doc-content.scss index ab91735..9339c5f 100644 --- a/blossom-web/src/views/article/styles/doc-content.scss +++ b/blossom-web/src/views/article/styles/doc-content.scss @@ -17,6 +17,7 @@ border-bottom: 1px solid #e5e5e5; text-align: left; position: relative; + word-break: break-all; font-size: 2em; } diff --git a/blossom-web/src/views/article/styles/doc-toc.scss b/blossom-web/src/views/article/styles/doc-toc.scss index 1633650..3f11cc5 100644 --- a/blossom-web/src/views/article/styles/doc-toc.scss +++ b/blossom-web/src/views/article/styles/doc-toc.scss @@ -25,9 +25,9 @@ } .toc-subtitle { - width: 100%; @include flex(row, flex-start, center); @include font(12px); + width: 100%; color: #ababab; overflow: hidden; white-space: nowrap; @@ -53,6 +53,7 @@ &:hover { font-weight: bold; + color: var(--el-color-primary); } } From a71800250123bc76622a71efd49504c6de210bd1 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Wed, 10 Apr 2024 20:53:09 +0800 Subject: [PATCH 64/73] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=93?= =?UTF-8?q?=E9=A2=98=E7=9A=84=E6=9F=A5=E8=AF=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/folder/FolderController.java | 7 +++-- .../backend/server/folder/FolderService.java | 26 +++++++++++-------- .../src/views/home/ArticleSubjects.vue | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java index ffcee95..7a2233c 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderController.java @@ -9,7 +9,6 @@ import com.blossom.backend.server.article.draft.pojo.ArticleUpdTagReq; import com.blossom.backend.server.doc.DocService; import com.blossom.backend.server.folder.pojo.*; import com.blossom.backend.server.utils.DocUtil; -import com.blossom.common.base.enums.YesNo; import com.blossom.common.base.exception.XzException404; import com.blossom.common.base.pojo.DelReq; import com.blossom.common.base.pojo.R; @@ -46,7 +45,7 @@ public class FolderController { if (userId == null) { return R.ok(new ArrayList<>()); } - return R.ok(baseService.subjects(userId, YesNo.YES)); + return R.ok(baseService.subjects(userId, true, false)); } /** @@ -55,8 +54,8 @@ public class FolderController { * @param starStatus 公开状态 */ @GetMapping("/subjects") - public R> listSubject(@RequestParam("starStatus") Integer starStatus) { - return R.ok(baseService.subjects(AuthContext.getUserId(), YesNo.getValue(starStatus))); + public R> listSubject() { + return R.ok(baseService.subjects(AuthContext.getUserId(), false, true)); } /** diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java index 16119bd..b703c5f 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/folder/FolderService.java @@ -23,7 +23,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import javax.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -56,33 +55,38 @@ public class FolderService extends ServiceImpl { * @param userId 用户ID * @param starStatus 公开状态 */ - public List subjects(Long userId, @NotNull YesNo starStatus) { + public List subjects(Long userId, boolean openStatus, boolean starStatus) { // 1. 查询所有专题 FolderEntity where = new FolderEntity(); where.setTags(TagEnum.subject.name()); where.setUserId(userId); - where.setStarStatus(starStatus.getValue()); - List allOpenSubject = baseMapper.listAll(where); - if (CollUtil.isEmpty(allOpenSubject)) { + if (openStatus) { + where.setOpenStatus(YesNo.YES.getValue()); + } + if (starStatus) { + where.setStarStatus(YesNo.YES.getValue()); + } + List allSubjects = baseMapper.listAll(where); + if (CollUtil.isEmpty(allSubjects)) { return new ArrayList<>(); } // 专题的ID - List allOpenSubjectIds = allOpenSubject.stream().map(FolderEntity::getId).collect(Collectors.toList()); + List allSubjectIds = allSubjects.stream().map(FolderEntity::getId).collect(Collectors.toList()); // 2. 查询全部专题的子文件夹 - List allOpenSubjectChildFolders = baseMapper.recursiveToChildren(CollUtil.newArrayList(allOpenSubjectIds)); - allOpenSubjectIds.addAll(allOpenSubjectChildFolders.stream().map(FolderEntity::getId).collect(Collectors.toList())); + List allSubjectChildFolders = baseMapper.recursiveToChildren(CollUtil.newArrayList(allSubjectIds)); + allSubjectIds.addAll(allSubjectChildFolders.stream().map(FolderEntity::getId).collect(Collectors.toList())); // 3. 查询这些文件夹下的所有文章 ArticleEntity articleWhere = new ArticleEntity(); - articleWhere.setPids(allOpenSubjectIds); + articleWhere.setPids(allSubjectIds); articleWhere.setUserId(userId); List articles = articleMapper.listAll(articleWhere); List results = new ArrayList<>(); - for (FolderEntity subject : allOpenSubject) { + for (FolderEntity subject : allSubjects) { // 专题对象, 包含字数, 更新日期等信息 FolderSubjectRes result = subject.to(FolderSubjectRes.class); // 默认专题字数 @@ -90,7 +94,7 @@ public class FolderService extends ServiceImpl { // 默认专题修改时间 result.setSubjectUpdTime(subject.getCreTime()); // 4. 这个专题下的所有文件夹ID - List subjectAllId = DocUtil.getChildrenIds(subject.getId(), allOpenSubjectChildFolders); + List subjectAllId = DocUtil.getChildrenIds(subject.getId(), allSubjectChildFolders); // 5. 遍历文章, 将文章归属到某个专题下, 并统计相关字数, 日期等信息 for (ArticleEntity article : articles) { if (subjectAllId.contains(article.getPid())) { diff --git a/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue b/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue index 47b4466..35e82fd 100644 --- a/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue +++ b/blossom-editor/src/renderer/src/views/home/ArticleSubjects.vue @@ -56,7 +56,7 @@ let maxWords = 0 const subjects = ref([]) const getSubjects = () => { - subjectsApi({ starStatus: 1 }).then((resp) => { + subjectsApi().then((resp) => { subjects.value = resp.data if (!isEmpty(resp.data)) { maxWords = resp.data From a9b864efcb977aa82d743f53ea64a741f6679369 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Wed, 10 Apr 2024 21:02:45 +0800 Subject: [PATCH 65/73] =?UTF-8?q?pref:=20=E4=BC=98=E5=8C=96=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E4=B8=93=E9=A2=98=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blossom-web/src/views/index/HomeSubject.vue | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/blossom-web/src/views/index/HomeSubject.vue b/blossom-web/src/views/index/HomeSubject.vue index e7c5990..dde228e 100644 --- a/blossom-web/src/views/index/HomeSubject.vue +++ b/blossom-web/src/views/index/HomeSubject.vue @@ -64,7 +64,7 @@ const toToc = (articleId: number) => { border-radius: 5px; padding: 5px 10px; margin: 15px 16px; - transition: 0.3s; + transition: border 0.3s, box-shadow 0.3s; box-shadow: 0 0 12px rgba(0, 0, 0, 0.1); overflow: hidden; @@ -72,7 +72,7 @@ const toToc = (articleId: number) => { font-size: 12px; margin-right: 5px; opacity: 0; - transition: 0.3s; + transition: opacity 0.3s; } &:hover { @@ -87,7 +87,6 @@ const toToc = (articleId: number) => { text-shadow: 5px 5px 15px #000, -3px -3px 10px rgba(255, 255, 255, 0.5); } - .cover, .cover-name { opacity: 1; } @@ -107,7 +106,7 @@ const toToc = (articleId: number) => { height: 35px; font-weight: 700; color: #cdcdcd; - transition: 0.3s; + transition: text-shadow 0.3s; } .words { @@ -134,7 +133,7 @@ const toToc = (articleId: number) => { box-shadow: 0 0 10px 1px #181818; text-align: center; transform: scale(0.8) rotate(45deg); - transition: 0.3s; + transition: opacity 0.3s; } .describes { From 20361dceb6f9a144466fe84fff6497da29694b56 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Wed, 10 Apr 2024 23:19:09 +0800 Subject: [PATCH 66/73] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E5=85=83=E4=BF=A1=E6=81=AF=E4=B9=9F=E4=BC=9A=E8=AE=A1?= =?UTF-8?q?=E4=B8=BA=E6=AF=8F=E6=97=A5=E7=BC=96=E8=BE=91=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E6=95=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/article/draft/ArticleMapper.java | 10 ++++++++++ .../server/article/draft/ArticleService.java | 2 ++ .../article/draft/pojo/ArticleEntity.java | 4 ++++ .../server/article/stat/ArticleStatJob.java | 6 +++--- .../article/stat/ArticleStatService.java | 20 ++++++++++++++----- .../main/resources/mapper/ArticleMapper.xml | 14 ++++++++++++- .../src/main/resources/schema-mysql.sql | 5 ++++- 7 files changed, 51 insertions(+), 10 deletions(-) diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleMapper.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleMapper.java index 548f917..863a63b 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleMapper.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleMapper.java @@ -50,6 +50,16 @@ public interface ArticleMapper extends BaseMapper { */ void updContentById(ArticleEntity entity); + /** + * 查询某段时间内编辑过内容的文章数 + * + * @param beginUpdTime 开始修改日期 + * @param endUpdTime 结束修改日期 + */ + ArticleStatRes statUpdArticleCount(@Param("beginUpdTime") String beginUpdTime, + @Param("endUpdTime") String endUpdTime, + @Param("userId") Long userId); + /** * 修改某段日期内修改的文章数据 * diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java index fb1f895..390e5a6 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/ArticleService.java @@ -19,6 +19,7 @@ import com.blossom.backend.server.doc.pojo.DocTreeRes; import com.blossom.backend.server.utils.ArticleUtil; import com.blossom.backend.server.utils.DocUtil; import com.blossom.common.base.exception.XzException404; +import com.blossom.common.base.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; @@ -188,6 +189,7 @@ public class ArticleService extends ServiceImpl { if (req.getHtml() != null) { req.setHtml(req.getHtml().replaceAll("


    ", "")); } + req.setUpdMarkdownTime(DateUtils.date()); baseMapper.updContentById(req); referenceService.bind(req.getUserId(), req.getId(), req.getName(), req.getReferences()); logService.insert(req.getId(), 0, req.getMarkdown()); diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleEntity.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleEntity.java index dc8557a..41cd8c7 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleEntity.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/draft/pojo/ArticleEntity.java @@ -118,6 +118,10 @@ public class ArticleEntity extends AbstractPOJO implements Serializable { * 用户ID */ private Long userId; + /** + * 文章内容的修改时间 + */ + private Date updMarkdownTime; //region ============================== 非数据库字段 ============================== /** diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatJob.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatJob.java index 20a9bc7..108f7e3 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatJob.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatJob.java @@ -42,12 +42,12 @@ public class ArticleStatJob { } for (UserEntity user : users) { - ArticleStatRes statCount = statService.statCount(toDayBegin, toDayEnd, user.getId()); - statService.updByDate(1, toDay, statCount.getArticleCount(), user.getId()); + ArticleStatRes statCount = statService.statUpdArticleCount(toDayBegin, toDayEnd, user.getId()); + statService.updByDate(ArticleStatTypeEnum.ARTICLE_HEATMAP, toDay, statCount.getArticleCount(), user.getId()); String toMouth = DateUtils.format(DateUtils.beginOfMonth(DateUtils.date()), DateUtils.PATTERN_YYYYMMDD); ArticleStatRes statWord = statService.statCount(null, null, user.getId()); - statService.updByDate(2, toMouth, statWord.getArticleWords(), user.getId()); + statService.updByDate(ArticleStatTypeEnum.ARTICLE_WORDS, toMouth, statWord.getArticleWords(), user.getId()); } } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatService.java b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatService.java index ce868b7..b9fc6e8 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatService.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/server/article/stat/ArticleStatService.java @@ -140,6 +140,16 @@ public class ArticleStatService extends ServiceImpl existWhere = new LambdaQueryWrapper<>(); existWhere .eq(ArticleStatEntity::getUserId, userId) - .eq(ArticleStatEntity::getType, type) + .eq(ArticleStatEntity::getType, type.getType()) .eq(ArticleStatEntity::getStatDate, date); if (baseMapper.exists(existWhere)) { LambdaQueryWrapper updWhere = new LambdaQueryWrapper<>(); updWhere.eq(ArticleStatEntity::getUserId, userId) - .eq(ArticleStatEntity::getType, type) + .eq(ArticleStatEntity::getType, type.getType()) .eq(ArticleStatEntity::getStatDate, date); ArticleStatEntity upd = new ArticleStatEntity(); upd.setStatValue(value); baseMapper.update(upd, updWhere); } else { ArticleStatEntity ist = new ArticleStatEntity(); - ist.setType(type); + ist.setType(type.getType()); ist.setStatDate(DateUtils.parse(date, DateUtils.PATTERN_YYYYMMDD)); ist.setStatValue(value); ist.setUserId(userId); diff --git a/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml b/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml index 261edd5..372a6bc 100644 --- a/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml +++ b/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml @@ -92,12 +92,24 @@ html = #{html}, words = #{words}, toc = #{toc}, - version = version + 1 + version = version + 1, + upd_markdown_time = #{updMarkdownTime} where id = #{id} and user_id = #{userId} +