From ac1e7405318aef9098b9450f78ff09c6e99b1d97 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:48:45 +0800 Subject: [PATCH 01/23] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E7=99=BB=E5=BD=95=E7=94=A8=E6=88=B7=E5=90=8E=E5=90=84?= =?UTF-8?q?=E9=A1=B9=E8=AE=BE=E7=BD=AE=E7=9A=84=E6=93=8D=E4=BD=9C=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/base/user/UserController.java | 2 + .../renderer/src/assets/constants/system.ts | 3 +- .../src/assets/styles/bl-dialog-info.scss | 1 + .../renderer/src/assets/styles/bl-dialog.scss | 24 +- .../src/assets/styles/bl-tooltip.scss | 4 - .../src/renderer/src/stores/user.ts | 3 +- .../renderer/src/views/index/SettingAbout.vue | 240 +++++++++--------- .../src/views/index/SettingConfig.vue | 38 ++- .../src/views/index/SettingConfigBlog.vue | 18 +- .../src/views/index/SettingConfigClient.vue | 30 +-- .../src/views/index/SettingConfigServer.vue | 68 ++--- .../src/views/index/SettingConfigUserinfo.vue | 41 ++- .../renderer/src/views/index/SettingIndex.vue | 14 +- .../src/views/index/setting/QuickSetting.vue | 2 +- .../src/views/index/setting/ThemeSetting.vue | 2 +- .../src/views/index/styles/config-root.scss | 2 +- 16 files changed, 272 insertions(+), 220 deletions(-) diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/user/UserController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/user/UserController.java index 363e9a9..fe69bd4 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/user/UserController.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/user/UserController.java @@ -15,6 +15,7 @@ import com.blossom.backend.server.article.stat.ArticleStatService; import com.blossom.common.base.exception.XzException400; import com.blossom.common.base.exception.XzException404; import com.blossom.common.base.pojo.R; +import com.blossom.common.base.util.spring.SpringUtil; import lombok.AllArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -45,6 +46,7 @@ public class UserController { user.setOsRes(sysService.getOsConfig()); Map paramMap = paramService.selectMap(true, ParamEnum.values()); user.setParams(paramMap); + paramMap.put("SERVER_VERSION", SpringUtil.get("project.base.version")); Map userParamMap = userParamService.selectMap(AuthContext.getUserId(), true, UserParamEnum.values()); user.setUserParams(userParamMap); return R.ok(user); diff --git a/blossom-editor/src/renderer/src/assets/constants/system.ts b/blossom-editor/src/renderer/src/assets/constants/system.ts index d557881..1475c10 100644 --- a/blossom-editor/src/renderer/src/assets/constants/system.ts +++ b/blossom-editor/src/renderer/src/assets/constants/system.ts @@ -9,7 +9,8 @@ const blossom = { // DOC: 'https://www.wangyunf.com/blossom-doc/index', - CONTACT: 'https://www.wangyunf.com/blossom-doc/guide/about/all.html', + CONTACT: 'https://www.wangyunf.com/blossom-doc/guide/about/contact.html', + SPONSOR: 'https://www.wangyunf.com/blossom-doc/guide/about/sponsor.html', GITHUB_REPO: 'https://github.com/blossom-editor/blossom', GITHUB_RELEASE: 'https://github.com/blossom-editor/blossom/releases', GITEE_REPO: 'https://gitee.com/blossom-editor/blossom' diff --git a/blossom-editor/src/renderer/src/assets/styles/bl-dialog-info.scss b/blossom-editor/src/renderer/src/assets/styles/bl-dialog-info.scss index 757aabc..99cfb27 100644 --- a/blossom-editor/src/renderer/src/assets/styles/bl-dialog-info.scss +++ b/blossom-editor/src/renderer/src/assets/styles/bl-dialog-info.scss @@ -10,6 +10,7 @@ $height-form: calc(100% - #{$height-title} - #{$height-footer}); padding-left: 10px; color: var(--bl-text-title-color); text-shadow: var(--bl-text-shadow); + padding-bottom: 8px; .iconbl { font-size: 25px; diff --git a/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss b/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss index 9833977..7fb0b41 100644 --- a/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss +++ b/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss @@ -3,5 +3,27 @@ --el-dialog-padding-primary: 0 !important; --el-dialog-bg-color: var(--bl-dialog-bg-color) !important; --el-dialog-box-shadow: var(--bl-dialog-box-shadow) !important; - +} + +.bl-dialog-hidden-header { + .el-dialog__header { + display: none !important; + } + .el-dialog__headerbtn { + display: none; + } +} + +.bl-dialog-bigger-headerbtn { + .el-dialog__headerbtn { + height: 30px; + width: 30px; + font-size: 20px; + } +} + +.bl-dialog-fixed-body { + .el-dialog__body { + height: calc(100% - 10px); + } } 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 96c2363..f3a53a2 100644 --- a/blossom-editor/src/renderer/src/assets/styles/bl-tooltip.scss +++ b/blossom-editor/src/renderer/src/assets/styles/bl-tooltip.scss @@ -37,10 +37,6 @@ .el-popper.is-light { @include themeShadow(1px 3px 10px #dedede, 1px 3px 10px #000000); color: var(--bl-text-doctree-color); - - .keyboard { - margin-top: 5px; - } } .el-popper.el-picker__popper { diff --git a/blossom-editor/src/renderer/src/stores/user.ts b/blossom-editor/src/renderer/src/stores/user.ts index 5c5a362..d9273a3 100644 --- a/blossom-editor/src/renderer/src/stores/user.ts +++ b/blossom-editor/src/renderer/src/stores/user.ts @@ -81,7 +81,8 @@ const DEFAULT_USER_INFO = { SERVER_MACHINE_EXPIRE: '', SERVER_DATABASE_EXPIRE: '', SERVER_HTTPS_EXPIRE: '', - SERVER_DOMAIN_EXPIRE: '' + SERVER_DOMAIN_EXPIRE: '', + SERVER_VERSION: '' }, /** * 用户参数配置 diff --git a/blossom-editor/src/renderer/src/views/index/SettingAbout.vue b/blossom-editor/src/renderer/src/views/index/SettingAbout.vue index b639016..46d363d 100644 --- a/blossom-editor/src/renderer/src/views/index/SettingAbout.vue +++ b/blossom-editor/src/renderer/src/views/index/SettingAbout.vue @@ -1,104 +1,109 @@ ")}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 68bfb54..d933c56 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": "12687054", + "name": "回车", + "font_class": "enter", + "unicode": "e65a", + "unicode_decimal": 58970 + }, { "icon_id": "12579639", "name": "blog", 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 935abe06615f7d2c41210c96065c0f610cd69155..2fc712db6f9039c7741a0c8d3e8246105dc76b5f 100644 GIT binary patch delta 3360 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 Fq5vSVw-f*X 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 ec77cefac9cf469e35329fae22846013f6019d11..ff5a877a1be9fd3182b323c752fe4c631e761f76 100644 GIT binary patch literal 18412 zcmV(@K-Rx^Pew8T0RR9107vWq3jhEB0H?SB07shu0RR9100000000000000000000 z0000SR0d!Gmud=vj&y3PY0KB8wHMs4iF5^1AwHy`{kl2 zjk7i?f{g=&xuXDQ|+p_+lLCPm9IWZTsSO2>6;{VZu?>v)jNd;amKflz!9|a z>T>hf&A)uKu*_=rkfdmu@KpP;x4ZWb^+r-}_;eE8EHd2^$tC02JS37>VkqH;=iT;y z?r>}_IC8SwsDP+|lck{OW|*RqBB%}Bpwb^?UJC4LaM zjgM{(N0ZS|4uV)r637;P47ysOky4Un9yY0OvID!e6nP@5q;-K>#W-ofHwEpIfwtfDbY?=_u zy`sDJnle_`^yLwz7k|(f+ksG1kbw`-rfq~8uM9RAx`7)@+Eb?bj5^!UvI% z(EMj=_HEreKc;VwtUqmgmo?mp7)3=8l&g8=bVi3fL#xo{k-|L}lf&KKB>ma%&Z z>xC1?I8KPQdER?;$lM0dnI;Ca_){ z%5vti4R%DA)_YtTCh@d)tkNL>O-N9rtp5G#2?CEE93&tUc_@Mwvr&&FSj5hg*H0mG z)RG4UQy3kkzn?8woPADSrLVd-!v93gfMQb_R3TMyLBmSik6xZ%U#5T77R$Vg+C%N5 z4p4_Kcx@#&4xQEhzl6un74uh{SFXh3N6R-kY*wXZRVq|_`1r}wXU|`}eD(Ux+js9j ztn~3yjgvmtI;ByaQnSk(vBtflZZ_MX$-;GheBEhkdgjZ6-EN)JV$hIbBSwuGciyiH zCQSC|)u-QpZk@WcYSXU64VPSGbNuG*!pYqH&v#SPBco$OeZ9tebZXV6U85$=`fL1J z{P?L`i%L~$m8!E>W@))xg%Sk{?Qfl)ZLh5U{_}Tc_Sxs>FD52;2kKRO?1tMlUzc@H z+kexAt6=19!S!cw>Ye%5**FwI0kA?qm@i7syFWkW-kHZ_z`(LofLredGu9lOHia{vX}sCv=kkp^N;CR`Ltl$ggN8 zzoCQtjvM3;Tq37&5i`=mvGnmq26!t&EXW8aGRB-tFfUX5lo{U198^b!E$0-}dN=p-;&34%6)qMcx9BsiJ~fo4LYUntZN8oz|WqOkZV96kw; zZX%$Ch^QnIs)&qQqM($hs3RKoL=Rj8U`b3YixsTeAV3`ua_a&V5D$gK$G!yEk`Sj7 z;Y?y|OM(?iu__sUOO8KM;IEXJkqWa?yy`~YgRH9iVe{-JO*rDZ8yNgUZwnjCSF~veENyS1rLq4L_i6ssypacoh@ANqtO{Fby z`Ic1xu~3M_kX)1(1ntN#T>*6m9WwWUG1zO0rY*a*9~$lMAnD@U}p+q7SS@#M{{ zpiv8lrG%i>+E&`X4wg|YQ$c0sN zzN>qz9F&{cSA1+6Rr)Px+p!00|6B8T0KqxtMsruSN0Cy4GA#hQne+w+S;=nXw z?TWo0BfHXLdrj_9-O`5<(x70ead=R7$w>7v!)CptKI%hM1EnEJOPu&E0=KLpl3Po? zKJzBRk;@AGaioQlB_A#cSsveAh)|~_CR@YCz5xwJ`IH>zt^kQgd#TZBxrDll~%bAe}2bq3cuS)yi~qohI#HXXApoh1cP5Xn4X|iY)6>8 zE4qM?B}0ywQmO_2j54KYG-p9x!Dkfg6c*wg@Jy|m>uH}QVrw#GhLsi&u3DxN$+pIL zT|!a7v=SW2`@sXQ_>6&>Nf1bbd{AFnD~dMI?8wSoWoUG^7Bwie;|9zeiKoI+NU<*Da zNe){=ImasSMP@lE7;9$Oc!7LIjPO$_wTq1Gjfk`&S=|dV{LthiB5Wh5%?(|y_GY&g zLS1uvJuOfWCPTuE1m71k-*-jqS#^N*KW|7ha7liHniU@wiC6r$3wn< z9*R&dK_(OxTTM zh<@t=Zgl=ky?B6>+)~F=(&aARKsZ2k=-;U>0Y|S#o2ab*XMhqPJMeVxk#_ovMi*lm zoEDd}U)4L2bttH6a+~AZ9 z1W64Db0k7SB@r^qqK6>%eVuC1Fbso-TdW#WM10!Jh{uRt@&wCDXD{7Ho=yTr6^BEg z^j6s_B;iWEv^@Dt^a=DjRbsD{kz!77!Z$qv{zl|2#`7PL^O0q$x% zWg8e%nLKXlWr08-Ng&!H;YIez1s*7>+BP`icKbTD4IPJ33ga;PZ>vg$1Jt8j!<2N# z*RDb<38y$x(u$Q-B`7Cp8xTm4Kr0Lc-q{Hq=}JXG5OMQPv?qZ}HdRr}g;CD9zCwx7 z_qQAQVX$zCR*MyC?oi&qKA2E4BM+`LZcYdk4S5G#WZcWp!l_+pUVnZt)n)4f&r2X0 za*RdSpBq0MNW(-+=e0-{qNXMKW^2wi)WKNQ{k3kjQyb!MujoR(DdHCc{6)PH^UV|s zOT}6!EMp#oC8yTb>81`bDch(mLk~W{z?X+5Ro{VVJ7U#>%s}|n{JhM>LQUb!J^zD8r%ECiJDAzK1-?G{{vxvW z4RC7`t-6j)AI0ENuenfveXc-BfIvOXaCO#pBmw2i;^$V(BJt8CU8gz`Ifbu8a$?@- z2l#WV-2^>O^CRF?&?Y9vSHF40xe`+~uEs!=e})VNBO^X~)OB~}55aK?hcI=y;#LER zaiBk0tJ%dKuRdL`-OU%5bQdXmsTzrJbxVOSb$FEE{!>gTCAps)=~B41BIC1AarPvc zc;$XLD^}pLpZ3f=^m$tb^#ygG%DSVuMuj_7b&gC#gZzt-4;?Kooy%#d4rhLvy5rxw z{AIe9E{GPX1jRQ5hYY+qbesqtjEyIh@&x zoM2xv{uN7f$~Tiwm(E@)Rvn;2zLb?44e!kLIg-EoN|#f{79sMTWUz(Ui#;wmcT6vY z<2~sgy6t%E$-5lPab=B0wQN*D@NBO+ zFw8~4hFXx*imoi#5cO-n80U+XGlf^*@oVN9D!$Wuai<5_*ypQW-ZYTTna=K!;nuAumOz5jWjxGIj`g5a0!*@vxcf={qmWM>^N=eZ}ekBJY zumE)qg-dkrw$-diJl%$$gt6r$Z!)Gl2#X)blzNaNf6?zFY3oAV6ilwA0WmRLeEI@r zqhu`cR#Hiz#Iaf4Qk{;zq^H`+R8 zpl@7{45S&>-gn;26 z^5S0QFM6(D#u>P5azjpcYC-j&;qAuM9b*dvSJ{CbkofTZ?#vT-Ex z`Uk<>BznFm{ECScNlp`7Ssw5zjq_PbCnVM+2Tzx z!MBJw8RpK&Yi#*(@x|}63|Eu3S&MCfU-Av11J|3F<_KGOFTq({#XXD%H8fIr-iY|LR|5H9jZ|GY@Lg zYmw-qQ5=5Te7h19IOa;_Wo^S`4?uMR+`oO&dYo{*s#b&8HGnFYh3-NB_BC1jy?fcN zYA^hOlZi+#4gu`X)BE_c0X`eA9X9CwvzwrA)TT^6b%d4pQrUOtRm(EXWv^}LdV4RO zlsP;CIt6-4f<2@pse9%2okIi9TFAQAqyFho#m59(QlI0Zh`KePffG&gFTzXSR2Eo=7<&i!^@QK$#olhN58mC~g( zG$V1Lq1YIr&blE2v+^)(F#u#|$);4)41rXN{S6AyF5O$`k-_Cy=Z<653x9TQWy17T zVXiM9e53~W%;n3Wv|yfI^?-!e>x5>*xJYy*+%{BVn;aZ3i+QlF(rrj2-lR#Hw2WE2 zDY1WOTx=LAY$Q7`#EJWd@SQ}+-7F!8jKgSlGjdQmREr9HITzDdI!#y$x#1sjD@IMl zzrin_7`!hnUh_BI4l;Z2pU3}u6#~rz354qkba0Agtx=4YTq*0224Q7t3i%>nnT`OK zY?x1%O{*HBCCjB!T0n!GqE+OSQWKN9^u@Fz#jh==)aVp&U)qp6Si|yl`)&A^%?}Qy8Up}~T+0wwmuToaIvF5F=8{-$YyD4i*=U3(cK=;wy#+^0dnbnhc^L-EI z4{3q70~sscPYX2<`Zg2mf&2@%%{3To7j&S}_TzQY!1)*2z9L70Dgyz`)5Sc@2?paF z9}bZLtb@!`DhSq_JyQ4BzWL;cfcF0J%itYQ;K>-nB^+Qx3-QD8OAKgnZ4iuA2_-^| z@*%kWXty{{nY-FWaFDcxxS8R?=3gWrIU9{9clY!0^lwF`2QvA*_#;`RtHZyu&R*oK zsU#UPtM&x&?-pifctm#VP94d)3v=S2c9Y6LCZDVgIxD<)cU22D!NlB@Rtpok@u^V= zmdIyI0y;QIOm4UdvV@b;_E|gKiz*#?6e@P^nn3FEzT3HrjR`CR+%(+@4k7~}V^GhX zQMvv%bU9Xx?lZH_s|4#D7;W}s%rV!px-Pd^=-s{6%!G)zIYihIo!kwWW5*4A$M4%r zx;!npa$0sm_Gh+u-4PceYIDkGu2JFK`+6%|Mm`Lf{8moR?f>QMGXD59rP8Z*&7lbF zmK@7D5ZMOt+n?8A$cqAk^B3WXOvZ*KAaihRiKhuAsgw|3;eMr9S!1gBid?Z91T*ZE zQ9hxIGDQZEACF==n==jZC9LTkWW)_Eac7-_&(znidd&IbExu*en17%Y6p_GI+|^wu zwODdr!_{^M$yD%p5=PAg%z)AqbUr#6MP@=c_N#qPRu3bzN9>WEH^GHTYr8NDzZbPm z#yC?w5F2g*w9Ci}tk_n9Np6|x?vhWmlLC5pphK6IoZO&>Hzim{IS}EWQJ5OVT@M|F zlf7^UN85#MNX(>|agspb-|IIx_u)x|=&8D_UgY}9q~g|zD`Hxf(`4gJhf2ws)L;>i zDQnPy?;y}yGYKWSY5KzE6#NW*T&b&OIM`A4;0Hin3p36O=voBSls#61@B%4LFOMiH zd;G_eLEF))M^)mQFEy05(T$L+rS$+S(R(d7q+i0+sEmgO#Wf{LY~iSR;XA=@7ysVW zSHpy`L+(S2_=~7Z~;XOpckj!lpZ7BIutcjW>M4-uc%~ zb&=)9+<{Q0v#hSfKehUT)BA5gZt#I!W0RUf{*{Rnm3;%sROkk&DR$noCHN5@g$A2maPkX++nm=WZcWiTsJ&6x*rL(muBE&;>^yNke2b*@TL^>{)h^J% z3RXryW?s@2N>u*IploE=nV)U&GumqEcCNCnlBmwXF{yY|{%P&6jE)Qa)L2U&;XN*= zbX>Sx(LXuhp;h_~PU}fT0FEj6ul3Py?0AkLue+tT@SPJ}O^P>HTX&`85&qES{=iZY zcr^{%U;axSK$c$8Zw?i2IOUhS;&phzL^8JQaVue2#c3zq7=<=gud61hw!Ys=;!5am zv`ua`X2MK5y8%y_9ohWMWTo67;0X4tnKd=o$0Op|>cvNa;76a11a z9v1xiTsYG6_6geDa-pTUi$LuCZs6Lwhm^%7i;v!50DcUcEQ28MyK#z^>(2ChRY&{U zzc2;80Ol<8<75p}!VE(m3sM;PR`!&J_3UGF@FFEEJ|Bmp7?M>}VV4KQ5m1*^5j@WV zP6XSLh?4Deqjt!y;%_B=txuM>DdWPht0QV*+?bHj7NabS>M=pIol=ZrcICnT@<6P? zBp3Qzn@bZL;`vl>YahnZIGqdc`Hw#^3dOLND;2bq&5Dltic8X7SU`KFKZ;C4l+z%= zpHNy*aot1C*Z{W5d5Ivi=*X1VSy!gqaHx<%nM%P9bN7?ngf?I7aiA9(5S3FU8K@<@Ophw(S6v`hdF!k+u=7&Z0{r1xg@acu(YV-pNV8)kud;a=2*2=C_y+{2dd z!F@1G_V-L#&L`IHM5WfH9bwW_7$oRv+A;S}CSr?#W!VEMdGAPWqiH21iaYksoDcr` zfjA$sSjV(}a@ux*SeW!&sb+2~s$L>r2JG;!NIpn+DiUvUzfV%(C4$Jd(ro<^`)pzv zJ!bk_!yU;^9g!%KNYrr7n&jPE2`P+w$Teq|PM@CugZaEDy#d-Rs3yhP)%@DWCep^_tskVfHEmhr6Mn-|wU;6?4{u6)cISTr+z+ zh8^Y9^CNn7XVkG*zggEF_SR$D7FzqGh#PvM>;#=|cEb_RwlTGDp}HH7Np#^pc;W>N z=B18mXisgIVjChIS0c5ZQ?S{xuVgGUe9BrXr=zWP)%)6Bsp*Kd^|Y5P z(#2gP|!Yk@6PJ5}X96WHL+2B$$Oq5aP4aj}GO2OAp(X}`P^`Uc9l zx;8o&>EYC9f%-an%50y!-!@6a=;q}gooXbTb$^npX~A&fs)1HJn;w72VB z^q$43bJ9hpZ_w*?E^mU`$L!v?OxleFOM)cPz7uc1KkU8-6H|v%iNGBZ$cpw#mM)d- zEt1vHbitZUn>4{XT6M21t}0Ba46BNhRYc~qa&uYvkuJLpf3kb$$|olH4-lC-krC!R zF(IGZ%l@+!G+X_LqCD))e=r8~VC?Rqf<;pa+_@#%Sj_{~%=nc}BfUvRFH zdUbnAt)lG{+hpV5_+QP<|1}?t|I`-`oVUZcjr(s$JspaX3(_oC*#w7Q;?OUdI1Or^ zI5Rgx5*3+hk((8E|M#kcbrF)tcFVQP)5gMnWvr==UHWS#@isBjGv0CL#M*n{?vpcQ za$CF5QP{v0Jp&Lh%Y<(Hfoc0&i>m-rgB zBPQJ;(IGvi4})f4T5L_^-H0pQ0`$7GWB;Kj2SriQa{6W(Q3+0!%E;?ZAkoT8puGpY z@rq`1yP2%jCTibk+YD{frER*lH~O$cq^($Un;F;8rUlpF^#c^iOQq+86s|ELm8MEh zYoq^kO_ipeNC8a~56nM366#UH4yhD4QqNTa+IlJ;Fk~oBb+IbDrviH+&-Xx#B<6qw zsnjudN;pVLY7G_#1&L(>w#z&vXp;ITBtS05KlAC1^=uB+j{dSO{clgtJvX9m?1@4% ze(dqR*nkUMQ;X7gei99G1Nz zOUP-82az>JSFg4?^f^!*c#twRUha_WIXZgmHDfC58rFtgt5En`Q!TU>xChEJX;84% z-+G3%e-{Tsi25!;wf4{c4cHJ!{1+jzV43hm)98EA2N9=51BP+JJxo&w_~8o;;Vp@U|gyNeBAZFqB^!lW?DO=i=jU?2w|GBX+{ zVDQHqBR4C|M%iVvNp2Dah=O3F$qdSx`W3RiezOAfPhS#HFI|>n?Xsc5{4~{U>{s-Q zg#c!rN7u@sK`c(DFaw=TzA97JzJzH}fgNuWnd zJH3QDU0d{q0O5;n+W>(2gdZF7zCY zSfT94331CEevVv+GKo78==4qkU|e2sX{{zo9T}&JE3&SF@uTk(d56RDUDu(ZUYdt^ z429xnLj)LVErfsr1SK0kK^D-mNkD)fkzi=f2$a$iTJ)F%g2AR<7>4@%pyDDvj>D4$ zMu0^7G3vTN$=M?q_JRXYto;qt;&=%36~K1||Ch0V;wm5lAR)D7g#r2gKX>@&2Naf9 zhL+IO|68dc5!xE;K~Wj}Yo7I)4f&i$is4$2W@WK;@NM_RY;b`J(^b0!RtMV8aaEbg zH6Apts-6cCjb~i$EgnB{U9%l{(L8FBGgaJk?FR&wub1?ZL5F=q8=;i+%SxI$w4|~; zpwK`6=Z<{;!T{hpT{T=V_|u7Tm~o52W5^g5Vyf}Bdi@Tctb6LY1c*joA3w{{Y6%wF$B-&)E#Z4r?jWKS|$?cD7Y1}teheem-*O_GV?c@Y*X-aO;8c+%k>_6HV7 zAaa#SZgaymrD1bD1v8PV6fYNo_b&=%1ePgaW?O8u$Y$^}F@YlYX1sfP#dei@M3!S= za-14U;@cD*PM=fuHZM2VkB}*(XIpKCv%~pWP7w;FJt~O)>f{eT`LTeQnoN~Y{jTXs z#HXcbM+l1)yJcw%9XL$&C?kCFlbEFj3i(C=_KegR*MdOhPXA4&{1q#%yN`!NdtR{F zY7E{?`c-0?xKAo_;Nyudd^_RNA3+;BXS4V4Jgw97B6t4^|4p#}$D-7tj}C{u^c-t> z;&z;z#`{xtNPEUdtVlV)9%$XCNDv6U~w#tVc_B3!}@zIBq}9ABwq?|ya* z=y8-%g<>y>%RbB0;Yp)J=~gQp;9A0Qh6-qIbLNaldEFH6Pp>d7R%UQGo=tso8OqLh zQpc~3g3*;l5)-*ttYiR$UnJ1|@w*9{Vmrj^X8L7*I7Qx%2*7l>(g*>sS*OvT^JCKI zn4&9V#nxHz*R&XyLNMnV*|v{CnBXRf`4r`!Um{vCMl+DZ#FSoAqkx1YG#&EZTVrB0 zvAQNx?Ns6#*}i}bY<<_F3=WLQ5M|_t?@`)Df)7*={b?&9bGtdKRug0s#g8{z~`tC z6NPMM9f%CuIm_Xd4UIB#8w7ogS%~RygMkTGW??MK;Gsy2R}9|GSqHUM+CF+Dit-p} zRPn;9g~gE;j7F&=v&)1cd;|rD9m?}}$^N`bzAF2Br?k-l%)@=X zD*tP-owaROS||=mf%!}Qh`RutxHHZm(|mTGH8gxO7)mRzHksO?PukW&okfbo9UVqq zHw|#09u&>Z4dwwQz_1Y;%~G04=8BABhv!GS=XX_=tBaRS!a?_M;EfnLrEGR72;c9S ztsKB7Jq*`yg$=mSVf;XLx`QBc5g3fO4Gza}*mAQ*E=eF%jBFt;`&C&DaH@B_m|JT@ z_*p0pSs#_4_X~d}*wj8#uM7;_$O!u@Y>t-kS4}wJE*xj{C)V~c*i%$k7dPYwqhh4> z9It*lJ3yZS41q8Y2@Xth*@`M&=DtJ~TU|E8V1!rngJ2Hm^Y07Dz9)2=AEHB7T^EOU z@N5sGD3c%|Fhl+SEn=jrl)OkcrCT0x);Tj9JsYuHHw8iv-ZM;#z4AWpmG1rN+QWUL74onT2S&$Ky78;rsmN62R z*&Jyhd))7n3q+F&7lM7u?|(|tjsvy&9_C)K^@W&&BGpJ%N=w|1K+Q$U1rS=#rODM=6xOdm#kqG4j5B z0Kox&Ln4ZP#YRU*00Nw-AGHH}gjP>b6%hiLPiJM#C06*%b)Dy?NcP@8-C2HyZ(*Ty zR*g7!Qk(mz9A275dP=2{-ebvf@_ErC*zrsR;eSQ%Mr-1>R~kA;qbv+Q~R`tdKF-+q(MdVh)VK zZ8ih-cKM69E`LJWlLthU;HKQ0MJ_zPFlJiNN2ZOnhz(V`DoIt#^kDOvG8AfVSw&-1 zjIl7YA+A)QeokKEgS|)=wFxDnC^XR)NUhdp6mr zd`g_$ol3mz3pO1<-LaV!DQCv|Kkk3o_w{cx^n;8+_WI#W+p$>!xW_}$u7g7m0^I@# zu(5$q$i^B%z^xEC@m(YSAw1iMDP8{qOj>!8CG<-4+8|&_r*ovl4J0o-3Cct97POBW zy&RM(p2~mw)Fj1SPO1}$>N*5$@9^#p{I-9fA0W61fIw}nkFw!^)YiJ!(gbeL9XA0y z9rMQ|h$@3c)30=kZp&Di*siT)xvzoCF4Wcn6okw}(X|H;Qt-C`T8*sZyM?D5QrDv3 z&QAaV*G=dm=EFlE!Z88@9=C8$=ho|W0wfdvbxN4oVC*Ib%E%8%50Oe~X`!kqIn2Zz zHsDaF1QV7|NeoFzhE4$=v}6Dx!#tP_4XDyWrL+)fNIJM@v}(i%NIDGNjnC%*g3}QK zX4M!zhzrMBYwrwvAq5$3M@PNtmcV#egd!9KPmZrbqZ{4c1&Kl|?;)@r#;12t8n2Mz z+s%IW(~*K$a&13USWAJj3yCY>*dqoo9!&V@gbu=s7i&6>Lh0`x=&!9_3WXi|Rbyr^ zJbl&@17gk{>Ha4h{r}cUk588#E*D;mwiP(?8`cPH`A#~na}a|1 z1<~+0@A?sA`$7@`V-t)fo@s2l{Nv+1qswF*7l8q zZ{mGzeTO19kNok^pHTx7ix*QU7zKa!EZN;EW$oITA@W4yezLNrnBImBrt|WNevy>a z?nzx3NcG&1n;Q}~R#XJ8`@IQl!kLoiRwcAppA5SSQQSNsQ4G%8pYY<)8x%Dhm>}ZL z8KjE~%JY!xTeJLf z{0r-fqt$G-I=c8-2X?60yQ8i!z&S?W3ND!y#FFX>GS>=Y6qp>#o*{Ri-{PWh&Pg!A z4L)G#Q-vuoVN7jI=7E`|lB}htBoJAAOl-JxX_Oke=&*_KQf$}j)mzCg37Z@)at8w5 z=CKU{a}w5f`i*dpm%f;KYvryZmxm-f$r4#|>n)Y&sPTqmPHlBr!1MJFl}5Y(HP#}J zt&|TwUdMfW`}oT~5I$VcoPkWgUMqf4-t@YZ=rwQ&b>CUA{ht9$iyg6rffFcVFoOG( z>L>=MF~&#+(#8Bv)fjzT(&ZfnQj7(IhaxH-I*q%P<}(nE1*4OJauEhFhNheBkwC9j z$g3GY2^cI_f(NCZbRV&I;_Qk3gy?cfmyd)}r{1CH#sbN+m{?+8lWvPR3#mxF?s^ULDjq^72amdBpxv-!gE$=aT2 zogcw&eNm5RiFC#ob*o2`$JQhirHpxsqO3Y2<$%2iOkrA#fzx3)(Sqb)*WhFexEs*@ z47O)%Wq(t6P7VIElZT>^F0he+`%wE^8|Hu_dGd0*bXg@a`Ll1vRqVlgekcv2eIb7~kbXN9y9lj|@_YwCb;#6T*!CR7}74QlnX-s1O@ zAfG&U?rMP((9}KLo=^8=Phx~TlL<@+w7kfi@4V)zCFj29>c-AV)YLa4L!3LFdrvYh z0Ux+0cykgG<``qkb-V{uX{I)WBQ^+=>yX5E8MB4#D3vM-M7DfEkZN2x{xF6{RYshT za;hZD;H#a=aXKusl0^yObp9#$nH^Kw)9JzKF5Mf)7Ii_b4@8o`Y|XB=z*o~k$xld2 zLYR(z7g$lGEej)$!E`W7da5f%dI$YiW%c&hb$12vYWm|PUndY|OsT0H6mES1VNkS< zaR>5LHvup8i1XO`KbssYFsrvJzB#<4$QhD3pnrc(q3Fnwrrx=Tt%) zA=NqUbQn_V>$|Sei=fchQxv_q09M2A{luMI~n^l+AFD$0fXtgCFSIQ|Mufb zeZKpL&NkaSsOec@>FHrvbTz**?8`O}s>$!YaZ?c^Gc+S3G>cv+&RLc#Sm(BVjyz8_ zqmZ5%AZBsDr45tPI#iys>*iRr1&kMQw_IFvq{Xr-A-TeuCli#hsyXvKuYSt#`>15x zz9g-$1EC8>(@l2YuD^t*NgNdIU2NWqDibC{b&!Li0#X&AjjF{SM*RyWIH(2s85{<> z1j;c=Y+_=Hjq+q@0p$^50i~t4po~v;JQUUR-U=G@wU~jTUMPyRnoTi6HMkmJ)~Fhk zPbEcS>^QQ}Fh5 z7@fC;JGbF$<~8;j@9V{i*Uq)gizAi=m8w~@T@qz%qOQq{b6i=}EWXI*N0Aa<$i(yO{~U8Z z@|8zB@K-qg`{U{qeL<@pHzn!Ro~Rx$R-0ST%GM|NIZIEamcpuSva43kU38M3D*KM2 z9JD>5=`@}WG<_=uxuee)qnRI&TNab1<}>9ebHwHu%!jhyxdI2KXrXDBIqeh{3n=vc|Idt(iC4dlcfj` zSFmQD69}-tu7B=%$#trRF4}tU#uDyI$8P1qcJZcV(j1fHMsKm<@$m?&j`Ltc9*UZ+ zgjLl51rv4xV2+=XNV1vN{hQGpY)@|_B3Df=My=-~LPiafWJ%_R7h@`ac1}1aF1EBZ zCN4}yRXj3KNv`B?cvcCaz@H;yapF$BQ1r+9R)fugU7KN%{8LTLVK3q=idbSWYt+s7 zg)KLWC=?Fk@Do42w};MXu-arr(z{(~|Ni|n%s@6C>FK$xy=}g|wYozlfGr5V+t;d! zH8Zm#0(0%vAA4ak+~m`s+tvHgUi}2$x?CH@Sk#OrrV=eBqZyV0nro_0a?PFrTE|u@P0|uf~10n#Yxbmr7N;S@GnuHc0MddY@FIS`s z>IM1kJlnK1+j;B0HTutO#QoB$tjbl72Sz`3&}X^&SEqM+|5Ug%r??W|SwK{!>prN6 zZu4dT9qt!+$ zlw2EI6U#(b6*m`SL7p~yNvhBxEzvh0);_Hv&6bh`<`O~APGTdz48MTH>=`1CjF3k( znqkUtVPQX|U!x(DM~FkVYZ*+YUaw)xImeD2B;ws_s-2RsehUdpVlj**O;y*p;aAo= zyzf%2Go-b!02?8DUbS6)+oTs4dGUnaP>}2A!czmErTg}gF+D(_y?ZGXTrUn#gw~Z0 zzWTlm@G&184E{p5zIOFqeRf^FW=;R7dT`L}6Y%z{Z{>q|Cr<(=+s6Q9Io@V*?9CS2 zV#_JUP)dwzOiDV{JW2ABQ<_tENn3yMyL+NM!31|N;4U;>I%n{!nsIolYAQW~YjHk` z6EB?0OPYKBA?Gyl{};u7e2RN1x&GHbbQH}mM^S$iEoWChdVoDoVu`X3VbKNje>Wf6@B{w;rRyiy)Ya zX;7THOM##a7!Pqmgkt|WV@47V!A2%UHm#y&7-7PASkK}~eX^}wPeDAy%ZN|_amH=z zXV;g(Zr3Pq#&)WIe6tB5kKAtD5qOQ&)oF9w8TUQF{`>S*z72W#W^#W^&S*g3F*f`0 z<3`m4gkWm5rRCTtMMXJM=c=tTB3EmBFUqZNH1NIRYH(Vt(q>FaIzrMP=A8SARyvnE zwY_6>Z9@6V#eVRhtzku&oszBU@N*umXiP63eS`X;+)U^bq-tz-pjpeoppm zdL^R?QMc4HtLeFla~z<>MCsCr?0GyHyd_G=47?pq973mZw+UW%qgn_K&tDpqd@d0( zv2hg2hanj5=Fc3lVHNmCOh2V=;CuL5V$bzB&I%MVrtk%ZG5Oc#lfKG-@E= z6%yZ}p^>S#J9mzPOJ<+|a=8L1j5702FB$OW0y6Wsx7~5>xV`tdxhsN|s|=6enO&lb z;zP@ws~S&+=bED~zx1{r=N`B72F75ye8J4=g>oIH8Xv55yi zaKECT)-UhxOE9mc0oLy&zW>?9CzC`(L2ZSUlvltENx5ss$GtCkM&$+gXuC_jDL1-Y zofA;RWp&4gru=(i&NJV=^C8~=vP(2Mt;^X{6qy*67%B1yzAOmR%B)!wcihy_(8SbY>S7XtjX6yu+@aX=kE99>7U=xZ7ej%sHUB)U?zlkQl+Z5$3biwuX z1@l3t*R6|Phkb7~a5MN`kYZ_3LwPBEmYS{IUVuC}BYG|e@+{-CqstG3XXxk6FOmo4 zrv|J3r}5BbxB+dk?=#P;6;jLXh`Y7`2AKguVL%Z11qf~f17-y{+ckxM}{!x84h zs~`g5eCt`xTYKDrGnlq#<(y0GoO?n1DrKx6%p3$O*<56wyDc7p7taXEspc-MiWa`q zzUf8~yd$qX)#_H&H#$B$g@eg1bHF6;Q_Fdd7>abi?!WfW21{#NaB_06Lcr-XYb(QF zD;?*+LW!z}63n42OMf|K;pyM1CP=e?rw3&vM_qXx{yLh` zxuai$-AvQ<^=pj3TDHK^d*)@!Mu&Z#wPZX5a8?FM|(V+ zk|Wa(lZSiz)>1)%lib(aPwv;tWW$Y6jdFMhbJoW)ne&?&3|zz4lCOJvK@`4N`tK6= z`rbb`aBgv2u3o&#Wz~`uIQiGQu8oCnO^YosW^SNvjZ_pLX0$0*#mIS~InkTUz$_gIGmyMvxzQD#sMlNCl;Zd~KkHyfznobIf zvS@u-0_F~Rp>UN(h+lJdKBOw>hF7c{z8op~0MXEtw^JR%k$Ys3+=Rm1|O$rHe) zdk8QO0+-QqNBF_nXI^r=h%97i7FC0#>%yS+I51tDP366?r3#f&f78}>R2wr80&|TR z2;oB^qlwuf9d}!gu<4Q!uvyuh$s=-#0<|X`4(3$_(FlFy(f^N3_6;IBE2hr~e%rg3&v$o;*6?l6@zoat zIpVBcq4RUlob2xZ!dv+Z-6UkxoK5wa&XoxBO{lM@>gh z{4Ot1h%A&@p;vlF@Y`M>T0Y-ddWo0ZsusrsD`{VO&Be7fK$preE!Q8q`DbK1Ufw4s_9j_dhB7{y7NV0a)D&umzxsV4SJ{YxIKqSCBiuD z+aK7-*nF`jXv8D4B?g^0)a>b33dx+YD2&jP`6J8xw381Vdq1@&)D&RtKu)6FgtEyL zY9Yea17m}lL8u-ellAL9z?DAI>a5!sU8n=a$U<+bU=9JM!*PzW2su>J5=;jbgNj-q zfjgdqYmq#DPrNt`5;gm;Y!Ir1YoxOOZU2ga;fwhJH}4;1YRic%V>qTw-w39XHA~o^w4qvB*9(JeciD!g}#hjOj=fUBC#* zR%kj;2uin&^-&|_#NYt>vdh8}I8$|bk5+SrT96u5gfbjsZRxnP!lNKGuVHqSaTaA?#zG$p{?Sfm1ssnvBPk*;j}R5_M& zvHTAKvYwbe-HMaQiupS#&1-{1Bw2zUT3c}99vnl>6{q5UKz18y*1HTFlP#22tvS`< zTM=4y$mJ^2n9IIvRpJMB5)O*T-bK#c4(EvM4d-B>iXA>yp?R6qQ5)MHLMu#JEy55# z5Q=Sl;K+zdYZZlzTx~Ngvm$GQ2kJGxo?F$82Y7Efb^T7|+~pAX;PkxV8$42n28lDM zlv=Ra%n+JTnzrXtJ9S;#(;M{`ZYf~4Pdt(A)>2W0Kp3Q^*O5)^JA<(B7{MrotR#|! T!)VW4FKgmMI#b&&#!-F+rD-Uw literal 18352 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 LI>T)j! `${n > 15 ? '' : 0}${n.toString(16)}` + +/** + * 颜色对象转化为16进制颜色字符串 + * @param colorObj 颜色对象 + */ +export const toHexString = (colorObj: IColorObj) => { + const { r, g, b, a = 1 } = colorObj + return `#${toHex(r)}${toHex(g)}${toHex(b)}${a === 1 ? '' : toHex(Math.floor(a * 255))}` +} + +/** + * 颜色对象转化为rgb颜色字符串 + * @param colorObj 颜色对象 + */ +export const toRgbString = (colorObj: IColorObj) => { + const { r, g, b } = colorObj + return `rgb(${r},${g},${b})` +} + +/** + * 颜色对象转化为rgba颜色字符串 + * @param colorObj 颜色对象 + */ +export const toRgbaString = (colorObj: IColorObj, n = 10000) => { + const { r, g, b, a = 1 } = colorObj + return `rgba(${r},${g},${b},${Math.floor(a * n) / n})` +} + +/** + * 16进制颜色字符串解析为颜色对象 + * @param color 颜色字符串 + * @returns IColorObj + */ +export const parseHexColor = (color: string) => { + let hex = color.slice(1) + let a = 1 + if (hex.length === 3) { + hex = `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}` + } + if (hex.length === 8) { + a = parseInt(hex.slice(6), 16) / 255 + hex = hex.slice(0, 6) + } + const bigint = parseInt(hex, 16) + return { + r: (bigint >> 16) & 255, + g: (bigint >> 8) & 255, + b: bigint & 255, + a + } as IColorObj +} + +/** + * rgba颜色字符串解析为颜色对象 + * @param color 颜色字符串 + * @returns IColorObj + */ +export const parseRgbaColor = (color: string) => { + const arr = color.match(/(\d(\.\d+)?)+/g) || [] + const res = arr.map((s: string) => parseInt(s, 10)) + return { + r: res[0], + g: res[1], + b: res[2], + a: parseFloat(arr[3]) || 1 + } as IColorObj +} + +/** + * 颜色字符串解析为颜色对象 + * @param color 颜色字符串 + * @returns IColorObj + */ +export const parseColorString = (color: string) => { + if (color.startsWith('#')) { + return parseHexColor(color) + } else if (color.startsWith('rgb')) { + return parseRgbaColor(color) + } else if (color === 'transparent') { + return parseHexColor('#00000000') + } + throw new Error(`color string error: ${color}`) +} + +/** + * 颜色字符串解析为各种颜色表达方式 + * @param color 颜色字符串 + * @returns IColorObj + */ +export const getColorInfo = (color: string) => { + const colorObj = parseColorString(color) + const hex = toHexString(colorObj) + const rgba = toRgbaString(colorObj) + const rgb = toRgbString(colorObj) + return { + hex, + rgba, + rgb, + rgbaObj: colorObj + } +} + +/** + * 16进制颜色字符串转化为rgba颜色字符串 + * @param hex 16进制颜色字符串 + * @returns rgba颜色字符串 + */ +export const hexToRgba = (hex: string) => { + const colorObj = parseColorString(hex) + return toRgbaString(colorObj) +} + +/** + * rgba颜色字符串转化为16进制颜色字符串 + * @param rgba rgba颜色字符串 + * @returns 16进制颜色字符串 + */ +export const rgbaToHex = (rgba: string) => { + const colorObj = parseColorString(rgba) + return toHexString(colorObj) +} diff --git a/blossom-editor/src/renderer/src/assets/utils/util.ts b/blossom-editor/src/renderer/src/assets/utils/util.ts index c6b094a..86ad07c 100644 --- a/blossom-editor/src/renderer/src/assets/utils/util.ts +++ b/blossom-editor/src/renderer/src/assets/utils/util.ts @@ -152,7 +152,7 @@ export const timestampToDatetime = (timestamp: number | string | Date): string = } /** - * 两个日期相差的条数 + * 两个日期相差的天数 * * @param date1 yyyy-MM-dd * @param date2 yyyy-MM-dd diff --git a/blossom-editor/src/renderer/src/components/IconList.vue b/blossom-editor/src/renderer/src/components/IconList.vue index 0718173..32b055f 100644 --- a/blossom-editor/src/renderer/src/components/IconList.vue +++ b/blossom-editor/src/renderer/src/components/IconList.vue @@ -30,14 +30,14 @@ - + @@ -57,57 +57,57 @@ onMounted(() => { }) }) -const getImg = (img: string) => { - return new URL(`../assets/imgs/${img}`, import.meta.url).href -} +// const getImg = (img: string) => { +// return new URL(`../assets/imgs/${img}`, import.meta.url).href +// } const activeTab = ref('weblogo') const blossom = shallowRef([]) const weblogo = shallowRef([]) -const imgs = shallowRef([ - getImg('plan/base-awesome.png'), - getImg('plan/base-cool.png'), - getImg('plan/base-learning.png'), - getImg('plan/cat-kiss.png'), - getImg('plan/cat-nice.png'), - getImg('plan/cat-smile.png'), - getImg('plan/cat.png'), - getImg('plan/coffee.png'), - getImg('plan/juice.png'), - getImg('plan/beer.png'), - // note - getImg('note/cd.png'), - getImg('note/dustbin.png'), - getImg('note/note.png'), - getImg('note/pin.png'), - getImg('note/plane.png'), - // pe - getImg('pe/headset.png'), - getImg('pe/phone.png'), - getImg('pe/sound.png'), - getImg('pe/watch.png'), - // plant - getImg('plant/02.png'), - getImg('plant/08.png'), - getImg('plant/cactus.png'), - // weather - getImg('weather/feng-s.png'), - getImg('weather/feng.png'), - getImg('weather/qing-s.png'), - getImg('weather/qing.png'), - getImg('weather/qing-moon.png'), - getImg('weather/wu-s.png'), - getImg('weather/wu.png'), - getImg('weather/xue-s.png'), - getImg('weather/xue.png'), - getImg('weather/yin-s.png'), - getImg('weather/yin.png'), - getImg('weather/yu-s.png'), - getImg('weather/yu.png'), - getImg('weather/zhongyu-s.png'), - getImg('weather/zhongyu.png') -]) +// const imgs = shallowRef([ +// getImg('plan/base-awesome.png'), +// getImg('plan/base-cool.png'), +// getImg('plan/base-learning.png'), +// getImg('plan/cat-kiss.png'), +// getImg('plan/cat-nice.png'), +// getImg('plan/cat-smile.png'), +// getImg('plan/cat.png'), +// getImg('plan/coffee.png'), +// getImg('plan/juice.png'), +// getImg('plan/beer.png'), +// // note +// getImg('note/cd.png'), +// getImg('note/dustbin.png'), +// getImg('note/note.png'), +// getImg('note/pin.png'), +// getImg('note/plane.png'), +// // pe +// getImg('pe/headset.png'), +// getImg('pe/phone.png'), +// getImg('pe/sound.png'), +// getImg('pe/watch.png'), +// // plant +// getImg('plant/02.png'), +// getImg('plant/08.png'), +// getImg('plant/cactus.png'), +// // weather +// getImg('weather/feng-s.png'), +// getImg('weather/feng.png'), +// getImg('weather/qing-s.png'), +// getImg('weather/qing.png'), +// getImg('weather/qing-moon.png'), +// getImg('weather/wu-s.png'), +// getImg('weather/wu.png'), +// getImg('weather/xue-s.png'), +// getImg('weather/xue.png'), +// getImg('weather/yin-s.png'), +// getImg('weather/yin.png'), +// getImg('weather/yu-s.png'), +// getImg('weather/yu.png'), +// getImg('weather/zhongyu-s.png'), +// getImg('weather/zhongyu.png') +// ]) const iconSearch = ref('') From fde87aaf6ef539377ca8c8df0dba24d0a8307d27 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:52:36 +0800 Subject: [PATCH 03/23] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E9=94=AE=E6=9F=A5=E7=9C=8B=E5=B1=95=E7=A4=BA=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/article/EditorTools.vue | 252 ++---------------- .../src/views/article/ShortcutkeyDesc.vue | 140 ++++++++++ 2 files changed, 161 insertions(+), 231 deletions(-) create mode 100644 blossom-editor/src/renderer/src/views/article/ShortcutkeyDesc.vue diff --git a/blossom-editor/src/renderer/src/views/article/EditorTools.vue b/blossom-editor/src/renderer/src/views/article/EditorTools.vue index 744fd12..e6eccb9 100644 --- a/blossom-editor/src/renderer/src/views/article/EditorTools.vue +++ b/blossom-editor/src/renderer/src/views/article/EditorTools.vue @@ -47,235 +47,7 @@
- - -
-
+
@@ -303,13 +75,25 @@
{{ remainStr }}
+ + + + + From 56568ab87d566788263b17df4c0e1a762fa8ebab Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:54:35 +0800 Subject: [PATCH 04/23] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=BF=AB?= =?UTF-8?q?=E6=8D=B7=E8=AE=BE=E7=BD=AE=E5=BC=B9=E7=AA=97=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blossom-editor/src/renderer/src/components/AppHeader.vue | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/blossom-editor/src/renderer/src/components/AppHeader.vue b/blossom-editor/src/renderer/src/components/AppHeader.vue index ee25200..a3364aa 100644 --- a/blossom-editor/src/renderer/src/components/AppHeader.vue +++ b/blossom-editor/src/renderer/src/components/AppHeader.vue @@ -64,7 +64,7 @@ { ")}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 d933c56..4f598f6 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": "8990451", + "name": "相交", + "font_class": "and", + "unicode": "e71b", + "unicode_decimal": 59163 + }, + { + "icon_id": "17525623", + "name": "无内容", + "font_class": "wuneirong", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, { "icon_id": "12687054", "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 2fc712db6f9039c7741a0c8d3e8246105dc76b5f..83d722aa5fef15c9354796bcf065071ba932be42 100644 GIT binary patch delta 3829 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 ZV?c!tO|kQ5y#QPkt!rfDU!>q20RSq%Mi&48 delta 22178 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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 ff5a877a1be9fd3182b323c752fe4c631e761f76..6bb9e6dd942cb2c59e26ffa7a2b5f80895c55ddc 100644 GIT binary patch literal 18808 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 T!)VW4FKgmMI#b&&#!-F+rD-Uw From 4448bc0a965b3aed108f9941ff7603021b96ae70 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Jan 2024 20:49:47 +0800 Subject: [PATCH 09/23] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=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/css/main.css | 1 - .../renderer/src/assets/styles/bl-dialog.scss | 32 ++++++++++++++----- .../src/assets/styles/bl-notification.scss | 1 - 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/blossom-editor/src/renderer/src/assets/css/main.css b/blossom-editor/src/renderer/src/assets/css/main.css index 0cd5f08..4d57f8c 100644 --- a/blossom-editor/src/renderer/src/assets/css/main.css +++ b/blossom-editor/src/renderer/src/assets/css/main.css @@ -45,7 +45,6 @@ img { ::-webkit-scrollbar-thumb { border-radius: 2px; background-color: var(--bl-scrollbar-color); - transition: 0.3s; } ::-webkit-scrollbar-thumb:hover { diff --git a/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss b/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss index 7fb0b41..9e3bc56 100644 --- a/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss +++ b/blossom-editor/src/renderer/src/assets/styles/bl-dialog.scss @@ -5,6 +5,16 @@ --el-dialog-box-shadow: var(--bl-dialog-box-shadow) !important; } +// 更大的 header close 按钮 +.bl-dialog-bigger-headerbtn { + .el-dialog__headerbtn { + height: 30px; + width: 30px; + font-size: 20px; + } +} + +// 无 header .bl-dialog-hidden-header { .el-dialog__header { display: none !important; @@ -14,16 +24,22 @@ } } -.bl-dialog-bigger-headerbtn { - .el-dialog__headerbtn { - height: 30px; - width: 30px; - font-size: 20px; - } -} - +// 固定 body 长度 .bl-dialog-fixed-body { .el-dialog__body { height: calc(100% - 10px); } } + +// 无 header 且固定 body 长度 +.bl-dialog-hidden-header-fixed-body { + .el-dialog__header { + display: none !important; + } + .el-dialog__headerbtn { + display: none; + } + .el-dialog__body { + height: 100%; + } +} diff --git a/blossom-editor/src/renderer/src/assets/styles/bl-notification.scss b/blossom-editor/src/renderer/src/assets/styles/bl-notification.scss index 740d52f..dc764e1 100644 --- a/blossom-editor/src/renderer/src/assets/styles/bl-notification.scss +++ b/blossom-editor/src/renderer/src/assets/styles/bl-notification.scss @@ -1,6 +1,5 @@ .el-notification { word-wrap: break-word; word-break: break-all; - border-radius: 2px !important; border: 2px solid var(--el-color-primary-light-5) !important; } \ No newline at end of file From f7b355bb9cc1b52a9117462bb161909c0580fdd7 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Jan 2024 20:51:03 +0800 Subject: [PATCH 10/23] =?UTF-8?q?chore:=20=E5=BF=BD=E7=95=A5=20lucene=20?= =?UTF-8?q?=E7=B4=A2=E5=BC=95=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 13e4eff..1301597 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ stats.html /nbdist/ /.nb-gradle/ /build/ +/lucene/ ### VS Code ### .vscode/ From 535ba3eed64976030359c496520582591faaf1af Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:49:28 +0800 Subject: [PATCH 11/23] =?UTF-8?q?chore:=20=E5=A2=9E=E5=8A=A0=E9=A2=9C?= =?UTF-8?q?=E8=89=B2=E8=BD=AC=E6=8D=A2=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blossom-editor/src/renderer/src/assets/utils/color.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/blossom-editor/src/renderer/src/assets/utils/color.ts b/blossom-editor/src/renderer/src/assets/utils/color.ts index 370fe3f..31800e3 100644 --- a/blossom-editor/src/renderer/src/assets/utils/color.ts +++ b/blossom-editor/src/renderer/src/assets/utils/color.ts @@ -123,6 +123,16 @@ export const hexToRgba = (hex: string) => { return toRgbaString(colorObj) } +/** + * rgb颜色字符串转化为16进制颜色字符串 + * @param rgb rgb颜色字符串 + * @returns 16进制颜色字符串 + */ +export const rgbToHex = (rgb: string) => { + const colorObj = parseColorString(rgb) + return toHexString(colorObj) +} + /** * rgba颜色字符串转化为16进制颜色字符串 * @param rgba rgba颜色字符串 From 3c9f32a5eca87324868a66a72949449b31191b62 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:51:43 +0800 Subject: [PATCH 12/23] =?UTF-8?q?feat:=20=E5=85=A8=E6=96=87=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/base/search/EnableIndex.java | 4 +- .../backend/base/search/IndexAspect.java | 39 +- .../backend/base/search/IndexObserver.java | 47 +- .../backend/base/search/SearchController.java | 37 ++ .../backend/base/search/SearchProperties.java | 34 +- .../backend/base/search/SearchRes.java | 53 ++ .../backend/base/search/SearchResult.java | 27 - .../blossom/backend/base/search/Searcher.java | 158 +++--- .../base/search/message/ArticleIndexMsg.java | 65 +-- .../backend/base/search/message/IndexMsg.java | 14 +- .../base/search/message/IndexMsgTypeEnum.java | 9 +- .../consumer/BatchIndexMsgConsumer.java | 50 +- .../message/consumer/IndexMsgConsumer.java | 111 ++-- .../base/search/queue/IndexMsgQueue.java | 11 +- .../server/article/draft/ArticleMapper.java | 8 +- .../server/article/draft/ArticleService.java | 5 +- .../main/resources/mapper/ArticleMapper.xml | 2 +- .../src/renderer/src/api/blossom.ts | 7 + .../views/article/ArticleIndexPlaceholder.vue | 33 +- .../src/views/article/ArticleSearch.vue | 523 ++++++++++++++++++ .../src/views/article/ArticleTreeDocs.vue | 67 ++- .../views/article/ArticleTreeWorkbench.vue | 108 ++-- .../src/views/article/ShortcutkeyDesc.vue | 3 +- .../src/views/article/scripts/editor-tools.ts | 2 + .../src/views/doc/tree-workbench.scss | 69 +-- 25 files changed, 1111 insertions(+), 375 deletions(-) create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchController.java create mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchRes.java delete mode 100644 blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchResult.java create mode 100644 blossom-editor/src/renderer/src/views/article/ArticleSearch.vue diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/EnableIndex.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/EnableIndex.java index 4294cc4..da6e342 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/EnableIndex.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/EnableIndex.java @@ -16,13 +16,11 @@ public @interface EnableIndex { /** * 索引操作类型, 默认值为追加 - * @return */ IndexMsgTypeEnum type(); /** - * id字段表达式 - * @return + * ID 字段表达式 */ String id(); diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexAspect.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexAspect.java index dcb49e8..395b758 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexAspect.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexAspect.java @@ -33,36 +33,32 @@ public class IndexAspect { private static final LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer(); @Pointcut("@annotation(com.blossom.backend.base.search.EnableIndex)") - private void cutMethod(){ + private void cutMethod() { } /** - * 成功返回后调用该方法,维护索引。 使用after防止事务未提交导致的数据滞后 + * 成功返回后调用该方法, 维护索引. 使用after防止事务未提交导致的数据滞后 */ @AfterReturning("cutMethod()") public void afterReturning(JoinPoint joinPoint) { // 此处进行索引处理, 降低索引维护代码侵入 // 获取注解对象 EnableIndex annotation = getAnnotation(joinPoint); - if (annotation == null){ + if (annotation == null) { // 记录问题, 并结束逻辑 log.error("索引切面获取注解失败!"); return; } IndexMsgTypeEnum indexMsgTypeEnum = annotation.type(); - if (indexMsgTypeEnum == null){ - log.error("获取索引消息操作类型失败"); - return; - } String idSpEL = annotation.id(); - if (!StringUtils.hasText(idSpEL)){ + if (!StringUtils.hasText(idSpEL)) { log.error("获取id表达式失败"); return; } Long customerId = parse(idSpEL, joinPoint, Long.class); - if (customerId == null){ + if (customerId == null) { return; } ArticleIndexMsg indexMsg = new ArticleIndexMsg(indexMsgTypeEnum, customerId, AuthContext.getUserId()); @@ -76,15 +72,16 @@ public class IndexAspect { /** * 获取method + * * @return method */ private Method getTargetMethod(JoinPoint joinPoint) { Signature signature = joinPoint.getSignature(); - MethodSignature methodSignature = (MethodSignature)signature; + MethodSignature methodSignature = (MethodSignature) signature; Method agentMethod = methodSignature.getMethod(); try { - return joinPoint.getTarget().getClass().getMethod(agentMethod.getName(),agentMethod.getParameterTypes()); - }catch (Exception e){ + return joinPoint.getTarget().getClass().getMethod(agentMethod.getName(), agentMethod.getParameterTypes()); + } catch (Exception e) { // 只记录异常 log.error("获取目标方法失败"); } @@ -93,33 +90,26 @@ public class IndexAspect { /** * 获取注解声明对象 - * @param joinPoint - * @return */ - private EnableIndex getAnnotation(JoinPoint joinPoint){ + private EnableIndex getAnnotation(JoinPoint joinPoint) { // 获取方法上的注解 MethodSignature sign = (MethodSignature) joinPoint.getSignature(); Method method = sign.getMethod(); - return method.getAnnotation(EnableIndex.class); + return method.getAnnotation(EnableIndex.class); } /** * 解析SpEL表达式, 提供后续拓展的灵活性 - * @param spel - * @param joinPoint - * @param clazz - * @return - * @param */ - private T parse(String spel, JoinPoint joinPoint, Class clazz){ + private T parse(String spel, JoinPoint joinPoint, Class clazz) { ExpressionParser parser = new SpelExpressionParser(); Method method = getTargetMethod(joinPoint); - if (method == null){ + if (method == null) { return null; } String[] params = discoverer.getParameterNames(method); - if (params == null || params.length == 0){ + if (params == null || params.length == 0) { log.error("获取参数列表失败"); return null; } @@ -135,5 +125,4 @@ public class IndexAspect { } - } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexObserver.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexObserver.java index c4d1831..0bbae30 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexObserver.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/IndexObserver.java @@ -7,9 +7,10 @@ import com.blossom.backend.base.search.message.consumer.BatchIndexMsgConsumer; import com.blossom.backend.server.article.draft.ArticleService; import com.blossom.backend.server.article.draft.pojo.ArticleEntity; import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationStartedEvent; +import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import java.io.IOException; import java.util.ArrayList; @@ -18,37 +19,47 @@ import java.util.List; /** * 对既有索引进行监控与维护 */ - -@Component @Slf4j +@Component public class IndexObserver { - private SearchProperties searchProperties; - private ArticleService articleService; - private BatchIndexMsgConsumer batchIndexMsgConsumer; + private final SearchProperties searchProperties; + private final ArticleService articleService; + private final BatchIndexMsgConsumer batchIndexMsgConsumer; - - IndexObserver(SearchProperties searchProperties, ArticleService articleService, BatchIndexMsgConsumer batchIndexMsgConsumer){ + IndexObserver(SearchProperties searchProperties, ArticleService articleService, BatchIndexMsgConsumer batchIndexMsgConsumer) { this.searchProperties = searchProperties; this.articleService = articleService; this.batchIndexMsgConsumer = batchIndexMsgConsumer; } + /** + * 启动时维护索引 + */ + @EventListener(ApplicationStartedEvent.class) + public void refresh() { + try { + log.info("[ SEARCH] 重建全部用户索引开始"); + long start = System.currentTimeMillis(); + this.reloadIndex(); + log.info("[ SEARCH] 重建全部用户索引完成, 用时: {} ms", (System.currentTimeMillis() - start)); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** * 进行索引的维护 */ @Scheduled(cron = "0 0 04 * * ?") public void reloadIndex() throws IOException { - if (StringUtils.hasText(searchProperties.getPath())){ - List allArticleWithContent = articleService.listAllArticleWithContent(); - List batchReloadMsgs = new ArrayList<>(); - allArticleWithContent.forEach(article ->{ - ArticleIndexMsg articleIndexMsg = new ArticleIndexMsg(IndexMsgTypeEnum.ADD,article.getId(),article.getName(),article.getTags(),article.getMarkdown(),article.getUserId()); - batchReloadMsgs.add(articleIndexMsg); - }); - - batchIndexMsgConsumer.batchReload(batchReloadMsgs); - } + List allArticleWithContent = articleService.listAllIndexField(); + List batchReloadMsgs = new ArrayList<>(); + allArticleWithContent.forEach(article -> { + ArticleIndexMsg articleIndexMsg = new ArticleIndexMsg(IndexMsgTypeEnum.ADD, article.getId(), article.getName(), article.getTags(), article.getMarkdown(), article.getUserId()); + batchReloadMsgs.add(articleIndexMsg); + }); + batchIndexMsgConsumer.batchReload(batchReloadMsgs); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchController.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchController.java new file mode 100644 index 0000000..20a6991 --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchController.java @@ -0,0 +1,37 @@ +package com.blossom.backend.base.search; + +import com.blossom.backend.base.auth.AuthContext; +import com.blossom.common.base.pojo.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 搜索接口 + */ +@Slf4j +@RestController +public class SearchController { + + @Autowired + private Searcher searcher; + + /** + * 搜索 + * + * @param keyword 搜索关键字 + * @param hlColor 高亮颜色 + * @param operator 是否全部匹配 + * @param debug 是否DEBUG, 为 true 时高亮前后缀为【】 + * @since 1.12.0 + */ + @GetMapping("/search") + public R search(@RequestParam("keyword") String keyword, + @RequestParam("hlColor") String hlColor, + @RequestParam("operator") boolean operator, + @RequestParam("debug") boolean debug) { + return R.ok(searcher.search(keyword, AuthContext.getUserId(), hlColor, operator, debug)); + } +} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchProperties.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchProperties.java index 50d5ca4..fa31dbc 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchProperties.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchProperties.java @@ -1,26 +1,32 @@ package com.blossom.backend.base.search; -import cn.hutool.core.convert.Convert; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; +import java.io.File; import java.nio.file.Path; -import java.nio.file.Paths; -@Data -@Configuration -@ConfigurationProperties(prefix = "project.search") +/** + * 全文搜索配置项 + */ +@Component public class SearchProperties { - private String path = ""; + private static final String USER_HOME = "user.dir"; /** - * 根据用户id, 获取对应索引库path - * @param userId 用户id - * @return 索引库path + * 根据用户ID, 获取对应索引库 Path + * + * @param userId 用户ID */ - public Path getUserIndexDirectory(Long userId){ - return Paths.get(this.path, Convert.toStr(userId)); + public Path getUserIndexDirectory(Long userId) { + File file = new File(addSeparator("/lucene/" + userId)); + return file.toPath(); + } + + public static String addSeparator(String dir) { + if (!dir.endsWith(File.separator)) { + dir += File.separator; + } + return System.getProperty(USER_HOME) + dir; } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchRes.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchRes.java new file mode 100644 index 0000000..d435f04 --- /dev/null +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchRes.java @@ -0,0 +1,53 @@ +package com.blossom.backend.base.search; + +import lombok.Data; + +import java.util.List; + +/** + * 全文搜索结果 + */ +@Data +public class SearchRes { + + /** + * 命中总数 + */ + private Long totalHit; + + /** + * 命中数据 + */ + private List hits; + + /** + * 命中数据 + */ + @Data + public static class Hit { + /** + * 主键 + */ + private Long id; + /** + * 文章名称 + */ + private String name; + /** + * 源文章名称 + */ + private String originName; + /** + * 标签 + */ + private List tags; + /** + * 正文 + */ + private String markdown; + /** + * 命中分数 + */ + private Float score; + } +} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchResult.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchResult.java deleted file mode 100644 index deee830..0000000 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/SearchResult.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.blossom.backend.base.search; - -import lombok.Data; - -/** - * 全文搜索返回对象 - */ -@Data -public class SearchResult { - /** - * 主键 - */ - private Long id; - /** - * 标题 - */ - private String title; - /** - * 标签 - */ - private String tags; - /** - * 正文 - */ - private String content; - -} diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/Searcher.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/Searcher.java index d2f94ee..014e079 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/Searcher.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/Searcher.java @@ -2,12 +2,15 @@ package com.blossom.backend.base.search; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ArrayUtil; -import com.blossom.common.base.exception.XzException500; +import cn.hutool.core.util.StrUtil; +import com.blossom.backend.server.utils.DocUtil; +import lombok.extern.slf4j.Slf4j; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; +import org.apache.lucene.queryparser.classic.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; @@ -20,117 +23,148 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.HashMap; -import java.util.List; import java.util.Map; +/** + * 搜索类 + */ +@Slf4j @Component public class Searcher { - private SimpleHTMLFormatter simpleHTMLFormatter; + private final SimpleHTMLFormatter debugFmt = new SimpleHTMLFormatter("【", "】"); - private String[] queryField; + private final String[] queryField; - private Map boostsMap; + private final Map boostsMap; @Autowired private SearchProperties searchProperties; - Searcher() { - // 构造f高亮显示formatter - this.simpleHTMLFormatter = new SimpleHTMLFormatter("", ""); // 构造默认查询域 this.queryField = new String[3]; - this.queryField[0] = "content"; - this.queryField[1] = "title"; + this.queryField[0] = "markdown"; + this.queryField[1] = "name"; this.queryField[2] = "tags"; // 构造权重配置 this.boostsMap = new HashMap<>(); - boostsMap.put("title", 2F); - boostsMap.put("tags", 2F); - boostsMap.put("content", 1F); + this.boostsMap.put("name", 3F); + this.boostsMap.put("tags", 3F); + this.boostsMap.put("markdown", 1F); } /** - * 进行索引查询, 传入关键词以及用户id - * @param keyword 关键词 - * @param userId 用户id + * 搜索 + * + * @param keyword 关键词 + * @param userId 用户id + * @param hlColor 高亮颜色 + * @param operator 是否全部匹配 + * @param debug 是否DEBUG, 为 true 时高亮前后缀为【】 * @return 查询结果 */ - public List search(String keyword, Long userId) { - List result = new ArrayList<>(); - if (!StringUtils.hasText(searchProperties.getPath())) { - throw new XzException500("未配置索引库地址,无法进行全文检索"); + public SearchRes search(String keyword, Long userId, String hlColor, boolean operator, boolean debug) { + SearchRes result = new SearchRes(); + result.setHits(new ArrayList<>()); + + if (StrUtil.isBlank(keyword)) { + result.setTotalHit(0L); + return result; } - if (userId == null){ + if (userId == null) { throw new IllegalArgumentException("未获取到用户信息"); } try (Directory directory = FSDirectory.open(searchProperties.getUserIndexDirectory(userId)); - IndexReader indexReader = DirectoryReader.open(directory); - ) { + IndexReader indexReader = DirectoryReader.open(directory)) { IndexSearcher indexSearcher = new IndexSearcher(indexReader); - MultiFieldQueryParser multiFieldQueryParser = new MultiFieldQueryParser(queryField, new StandardAnalyzer(),boostsMap); + MultiFieldQueryParser multiFieldQueryParser = new MultiFieldQueryParser(queryField, new StandardAnalyzer(), boostsMap); + if (operator) { + multiFieldQueryParser.setDefaultOperator(QueryParser.Operator.AND); + } + Query query = multiFieldQueryParser.parse(keyword); - TopDocs topDocs = indexSearcher.search(query, 10); + + TopDocs topDocs = indexSearcher.search(query, 20); ScoreDoc[] scoreDocs = topDocs.scoreDocs; + result.setTotalHit(topDocs.totalHits.value); if (!ArrayUtil.isEmpty(scoreDocs)) { - Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query)); - highlighter.setTextFragmenter(new SimpleFragmenter(20)); + Highlighter highlighter; + if (debug) { + highlighter = new Highlighter(debugFmt, new QueryScorer(query)); + } else { + highlighter = new Highlighter(new SimpleHTMLFormatter("", ""), new QueryScorer(query)); + } + highlighter.setTextFragmenter(new SimpleFragmenter(100)); + for (ScoreDoc doc : scoreDocs) { Document document = indexSearcher.doc(doc.doc); String id = document.get("id"); - String title = document.get("title"); - String content = document.get("content"); + String name = document.get("name"); + String markdown = document.get("markdown"); String tags = document.get("tags"); - SearchResult searchResult = new SearchResult(); - searchResult.setId(Convert.toLong(id)); - if (StringUtils.hasText(title)){ - String matchTitle = highlighter.getBestFragment(new StandardAnalyzer(), "title", title); - if (StringUtils.hasText(matchTitle)){ - searchResult.setTitle(matchTitle); - }else { - searchResult.setTitle(title); + + SearchRes.Hit hit = new SearchRes.Hit(); + hit.setScore(doc.score); + hit.setId(Convert.toLong(id)); + if (StrUtil.isNotBlank(name)) { + hit.setOriginName(name); + String hlName = highlighter.getBestFragment(new StandardAnalyzer(), "name", name); + if (StrUtil.isNotBlank(hlName)) { + hit.setName(hlName); + } else { + hit.setName(name); } - }else { - searchResult.setContent(title); - } - if (StringUtils.hasText(content)){ - String matchContent = highlighter.getBestFragment(new StandardAnalyzer(), "content", content); - if (StringUtils.hasText(matchContent)){ - searchResult.setContent(matchContent); - }else { - searchResult.setContent(content); - } - }else { - searchResult.setContent(content); + } else { + hit.setName(""); + hit.setOriginName(""); } - if (StringUtils.hasText(tags)){ - String matchTags= highlighter.getBestFragment(new StandardAnalyzer(), "tags", tags); - if (StringUtils.hasText(matchTags)){ - searchResult.setTags(matchTags); - }else { - searchResult.setTags(tags); + // 无内容或无高亮匹配时, 返回 "" + if (StrUtil.isNotBlank(markdown)) { + String hlMarkdown = highlighter.getBestFragment(new StandardAnalyzer(), "markdown", markdown); + if (StrUtil.isNotBlank(hlMarkdown)) { + hit.setMarkdown(fmtMarkdown(hlMarkdown)); + } else { + hit.setMarkdown(""); } - }else { - searchResult.setTags(tags); + } else { + hit.setMarkdown(""); } - result.add(searchResult); + + if (StrUtil.isNotBlank(tags)) { + String hlTags = highlighter.getBestFragment(new StandardAnalyzer(), "tags", tags); + if (StrUtil.isNotBlank(hlTags)) { + hit.setTags(DocUtil.toTagList(hlTags)); + } else { + hit.setTags(DocUtil.toTagList(tags)); + } + } else { + hit.setTags(DocUtil.toTagList(tags)); + } + + result.getHits().add(hit); } } - - } catch (Exception e) { - throw new XzException500("索引查询异常"); + log.error("搜索异常: {}", e.getMessage()); + return result; } return result; + } + /** + * 将正文中的换行转换成 html 内容 + * + * @param markdown markdown 正文内容 + */ + public String fmtMarkdown(String markdown) { + return markdown.replaceAll("(\r\n|\n\r|\r|\n)", "
"); } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/ArticleIndexMsg.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/ArticleIndexMsg.java index ac69ba9..1877cf2 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/ArticleIndexMsg.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/ArticleIndexMsg.java @@ -1,70 +1,59 @@ package com.blossom.backend.base.search.message; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import lombok.Getter; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.document.StringField; import org.apache.lucene.document.TextField; -import org.springframework.util.StringUtils; /** * 文章索引消息的实现 */ - +@Getter public class ArticleIndexMsg implements IndexMsg { - private IndexMsgTypeEnum type; + private final IndexMsgTypeEnum type; - private Long data; - - private Document document; - - private Long userId; + private final Long id; + private Document doc; + private final Long userId; public ArticleIndexMsg(IndexMsgTypeEnum indexMsgType, Long id, Long userId) { this.type = indexMsgType; - this.data = id; + this.id = id; this.userId = userId; } - public ArticleIndexMsg(IndexMsgTypeEnum indexMsgType, Long id, String title, String tags, String content, Long userId){ + /** + * 创建文章索引消息 + * + * @param indexMsgType 操作类型 + * @param id 唯一ID + * @param name 标题 + * @param tags 标签 + * @param markdown 正文内容 + * @param userId 用户ID + */ + public ArticleIndexMsg(IndexMsgTypeEnum indexMsgType, Long id, String name, String tags, String markdown, Long userId) { this.type = indexMsgType; - this.data = id; + this.id = id; this.userId = userId; Document document = new Document(); - // 存储文章的id, content + // 存储文章的id, markdown document.add(new StringField("id", Convert.toStr(id), Field.Store.YES)); - if (StringUtils.hasText(title)){ - document.add(new TextField("title", title, Field.Store.YES)); + if (StrUtil.isNotBlank(name)) { + document.add(new TextField("name", name, Field.Store.YES)); } - if (StringUtils.hasText(content)){ - document.add(new TextField("content", content, Field.Store.YES)); + if (StrUtil.isNotBlank(markdown)) { + document.add(new TextField("markdown", markdown, Field.Store.YES)); } - if (StringUtils.hasText(tags)){ + if (StrUtil.isNotBlank(tags)) { document.add(new TextField("tags", tags, Field.Store.YES)); } - this.document = document; - } - - @Override - public IndexMsgTypeEnum getType() { - return this.type; - } - - @Override - public Long getId() { - return this.data; - } - - @Override - public Document getDoc() { - return this.document; - } - - @Override - public Long getCurrentUserId() { - return this.userId; + this.doc = document; } } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsg.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsg.java index 210690e..c9608b6 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsg.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsg.java @@ -8,27 +8,23 @@ import org.apache.lucene.document.Document; public interface IndexMsg { /** - * 消息类型 - * @return + * 消息操作类型 */ IndexMsgTypeEnum getType(); /** - * 主键id - * @return + * 主键 ID */ Long getId(); /** - * 为批量reload提供的提前构造数据的接口,避免多次查询数据库 - * @return + * 为批量 reload 提供的提前构造数据的接口, 避免多次查询数据库 */ Document getDoc(); /** - * 消息对应用户id - * @return + * 消息对应用户 ID */ - Long getCurrentUserId(); + Long getUserId(); } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsgTypeEnum.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsgTypeEnum.java index d5217ed..8066d09 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsgTypeEnum.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/IndexMsgTypeEnum.java @@ -5,6 +5,13 @@ package com.blossom.backend.base.search.message; */ public enum IndexMsgTypeEnum { - ADD,DELETE + /** + * 新增文档 + */ + ADD, + /** + * 删除文档 + */ + DELETE } diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/BatchIndexMsgConsumer.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/BatchIndexMsgConsumer.java index 841f175..adfb7ca 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/BatchIndexMsgConsumer.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/message/consumer/BatchIndexMsgConsumer.java @@ -13,59 +13,63 @@ import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.stream.Collectors; -@Component +/** + * 批量构建索引 + */ @Slf4j +@Component public class BatchIndexMsgConsumer { - private SearchProperties searchProperties; + private final SearchProperties searchProperties; BatchIndexMsgConsumer(SearchProperties searchProperties) { this.searchProperties = searchProperties; - if (!StringUtils.hasText(searchProperties.getPath())) { - log.info("未配置索引库地址, 关闭全文搜索功能支持"); - } } - public void batchReload(List list) throws IOException { - // 需要对所有用户的索引进行维护,减少文件打开次数, 优先进行分组 - Map> userGroupMsgMap = list.stream().collect(Collectors.groupingBy(IndexMsg::getCurrentUserId)); - // 遍历map, 逐个用户进行索引重建 - for (Map.Entry> entity : userGroupMsgMap.entrySet()){ + /** + * 批量构建所有用户的索引 + * + * @param articles 全部文章 + */ + public void batchReload(List articles) throws IOException { + // 需要对所有用户的索引进行维护, 减少文件打开次数, 优先进行分组 + Map> userGroupMsgMap = articles.stream().collect(Collectors.groupingBy(IndexMsg::getUserId)); + // 遍历 Map, 逐个用户进行索引重建 + for (Map.Entry> entity : userGroupMsgMap.entrySet()) { Long userId = entity.getKey(); List msgList = entity.getValue(); - if (userId == null){ + if (userId == null) { continue; } try (Directory directory = FSDirectory.open(searchProperties.getUserIndexDirectory(userId)); - IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new StandardAnalyzer())); - ){ - for (IndexMsg indexMsg : msgList){ - if (IndexMsgTypeEnum.ADD.equals(indexMsg.getType())) { - // 插入 or 更新索引 - // 打开索引库 --->通过getDoc方法获取索引文档 + IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new StandardAnalyzer()))) { + for (IndexMsg indexMsg : msgList) { + /* + * 插入或更新索引, 通过 getDoc 方法获取索引文档 + */ + if (IndexMsgTypeEnum.ADD == indexMsg.getType()) { Document document = indexMsg.getDoc(); String id = document.get("id"); indexWriter.updateDocument(new Term("id", id), document); - } else if (IndexMsgTypeEnum.DELETE.equals(indexMsg.getType())) { - // 删除索引 + } + /* + * 删除索引内容, 批量处理时不会进行删除, 所有的删除都由用户主动操作 + */ + else if (IndexMsgTypeEnum.DELETE == indexMsg.getType()) { Long id = indexMsg.getId(); indexWriter.deleteDocuments(new Term("id", Convert.toStr(id))); } } - // 完成 indexWriter.flush(); indexWriter.commit(); } - } - } } 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 fd13b9f..414f8aa 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 @@ -19,7 +19,6 @@ import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import java.util.concurrent.Executors; @@ -28,79 +27,61 @@ import java.util.concurrent.Executors; * * @author Andecheal */ -@Component @Slf4j +@Component public class IndexMsgConsumer { - private SearchProperties searchProperties; + private final SearchProperties searchProperties; - private ArticleService articleService; + private final ArticleService articleService; + /** + * 单线程处理索引文档消息 + * + * @param searchProperties 索引配置 + * @param articleService 文章服务 + */ IndexMsgConsumer(SearchProperties searchProperties, ArticleService articleService) { this.searchProperties = searchProperties; this.articleService = articleService; - if (!StringUtils.hasText(searchProperties.getPath())) { - log.info("未配置索引库地址, 关闭全文搜索功能支持"); - return; - } - Executors.newSingleThreadExecutor().submit(new Runnable() { - @Override - public void run() { - while (true) { - try { - IndexMsg indexMsg = IndexMsgQueue.take(); - // 首先获取消息中的userId, 根据userId 打开对应的索引库 - Long userId = indexMsg.getCurrentUserId(); - if (userId == null){ - // 记录异常并继续消费 - log.error("消费异常. 获取用户id为空"); - continue; - } - if (IndexMsgTypeEnum.ADD.equals(indexMsg.getType())) { - // 插入 or 更新索引 - // 打开索引库 - try (Directory directory = FSDirectory.open(searchProperties.getUserIndexDirectory(userId)); - IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new StandardAnalyzer())); - ) { - // 查询doc数据 ---> 避免service部分功能未查询全部字段数据导致的索引field丢失 - Long id = indexMsg.getId(); - ArticleEntity article = articleService.getById(id); - Document document = new Document(); - String title = article.getName(); - String markdownContent = article.getMarkdown(); - String tags = article.getTags(); - // 存储文章的id, content - document.add(new StringField("id", Convert.toStr(id), Field.Store.YES)); - if (StringUtils.hasText(title)){ - document.add(new TextField("title", article.getName(), Field.Store.YES)); - } - if (StringUtils.hasText(markdownContent)){ - document.add(new TextField("content", markdownContent, Field.Store.YES)); - } - if (StringUtils.hasText(tags)){ - document.add(new TextField("tags", tags, Field.Store.YES)); - } - - indexWriter.updateDocument(new Term("id", Convert.toStr(id)), document); - indexWriter.flush(); - indexWriter.commit(); - } - } else if (IndexMsgTypeEnum.DELETE.equals(indexMsg.getType())) { - // 删除索引 - try (Directory directory = FSDirectory.open(searchProperties.getUserIndexDirectory(userId)); - IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new StandardAnalyzer())); - - ) { - Long id = indexMsg.getId(); - indexWriter.deleteDocuments(new Term("id", Convert.toStr(id))); - indexWriter.flush(); - indexWriter.commit(); - } - } - - } catch (Exception e) { - log.error("消费失败" + e.getMessage()); + Executors.newSingleThreadExecutor().submit(() -> { + while (true) { + try { + IndexMsg indexMsg = IndexMsgQueue.take(); + final Long userId = indexMsg.getUserId(); + final Long id = indexMsg.getId(); + if (userId == null || id == null) { + log.error("消费异常. 获取用户id为空"); + continue; } + if (IndexMsgTypeEnum.ADD == indexMsg.getType()) { + // 插入 or 更新索引 + // 打开索引库 + try (Directory directory = FSDirectory.open(this.searchProperties.getUserIndexDirectory(userId)); + IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig(new StandardAnalyzer()))) { + // 查询最新的消息 + ArticleEntity article = this.articleService.selectById(id, false, true, false); + Document document = new Document(); + document.add(new StringField("id", Convert.toStr(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.flush(); + indexWriter.commit(); + } + } else if (IndexMsgTypeEnum.DELETE == indexMsg.getType()) { + // 删除索引 + 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.flush(); + indexWriter.commit(); + } + } + + } catch (Exception e) { + log.error("消费失败" + e.getMessage()); } } }); diff --git a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/queue/IndexMsgQueue.java b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/queue/IndexMsgQueue.java index e7119df..44b0b52 100644 --- a/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/queue/IndexMsgQueue.java +++ b/blossom-backend/backend/src/main/java/com/blossom/backend/base/search/queue/IndexMsgQueue.java @@ -7,19 +7,18 @@ import java.util.concurrent.BlockingQueue; /** * 消息处理使用的阻塞队列 + * * @author Andecheal */ public class IndexMsgQueue { /** - * 阻塞队列 , 存放消息 + * 阻塞队列, 存放消息 */ private static final BlockingQueue indexMsgQueue = new ArrayBlockingQueue<>(2048); /** - * 应用提交消息 - * @param msg - * @throws InterruptedException + * 提交消息 */ public static void add(IndexMsg msg) throws InterruptedException { indexMsgQueue.add(msg); @@ -27,8 +26,6 @@ public class IndexMsgQueue { /** * 提供一个阻塞式消息入口 - * @param msg - * @throws InterruptedException */ public static void put(IndexMsg msg) throws InterruptedException { indexMsgQueue.put(msg); @@ -36,8 +33,6 @@ public class IndexMsgQueue { /** * 获取消息 - * @return - * @throws InterruptedException */ public static IndexMsg take() throws InterruptedException { return indexMsgQueue.take(); 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 a07856d..10890ee 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 @@ -18,7 +18,8 @@ public interface ArticleMapper extends BaseMapper { /** * 批量查询文章正文 - * @param ids 文章ID + * + * @param ids 文章ID * @param contentType 正文类型 MARKDOWN/HTML */ List listAllContent(@Param("ids") List ids, @Param("contentType") String contentType); @@ -28,7 +29,10 @@ public interface ArticleMapper extends BaseMapper { */ List listAll(ArticleEntity entity); - List listAllArticleWithContent(); + /** + * 查询全部需要索引的字段 + */ + List listAllIndexField(); /** * 根据ID修改 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 b98f965..f29450e 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 @@ -83,10 +83,11 @@ public class ArticleService extends ServiceImpl { /** * 获取所有文章,包含markdown字段,用于索引的批量维护 + * * @return */ - public List listAllArticleWithContent() { - List articles = baseMapper.listAllArticleWithContent(); + public List listAllIndexField() { + List articles = baseMapper.listAllIndexField(); if (CollUtil.isEmpty(articles)) { return new ArrayList<>(); } diff --git a/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml b/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml index 23d5aaa..04253cf 100644 --- a/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml +++ b/blossom-backend/backend/src/main/resources/mapper/ArticleMapper.xml @@ -49,7 +49,7 @@ - select id, `name`, diff --git a/blossom-editor/src/renderer/src/api/blossom.ts b/blossom-editor/src/renderer/src/api/blossom.ts index 6c7af4c..0fede7b 100644 --- a/blossom-editor/src/renderer/src/api/blossom.ts +++ b/blossom-editor/src/renderer/src/api/blossom.ts @@ -472,6 +472,13 @@ export const articleRecycleListApi = (): Promise => { export const articleRecycleRestoreApi = (data?: object): Promise => { return rq.post('/article/recycle/restore', data) } + +/** + * 文章全文搜索 + */ +export const articleSearchApi = (params?: object): Promise => { + return rq.get('/search', { params }) +} //#endregion //#region ====================================================< picture >=================================================== diff --git a/blossom-editor/src/renderer/src/views/article/ArticleIndexPlaceholder.vue b/blossom-editor/src/renderer/src/views/article/ArticleIndexPlaceholder.vue index 4b943d2..e24bafa 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleIndexPlaceholder.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleIndexPlaceholder.vue @@ -6,9 +6,11 @@
显示排序
-
-
-
+
+
+
全文搜索
+
+
@@ -35,6 +37,10 @@
格式化
{{ keymaps.formatAll }}
+ +
全文搜索
+
{{ keymaps.fullSearch }}
+
@@ -70,7 +76,10 @@ import { keymaps } from './scripts/editor-tools' } } + // 排序 .bl-a-leftdirection-line { + padding-bottom: 5px; + padding-right: 0px; .desc-line { border-top: none; border-left: none; @@ -86,6 +95,24 @@ import { keymaps } from './scripts/editor-tools' } } + .bl-search-line { + font-size: 22px; + padding-bottom: 5px; + .desc-line { + border-left: none; + border-bottom: none; + height: 20px; + width: 30px; + left: -20px; + top: -20px; + + .desc-text { + left: -55px; + top: -10px; + } + } + } + .bl-a-fileadd-line { .desc-line { border-top: none; diff --git a/blossom-editor/src/renderer/src/views/article/ArticleSearch.vue b/blossom-editor/src/renderer/src/views/article/ArticleSearch.vue new file mode 100644 index 0000000..648813e --- /dev/null +++ b/blossom-editor/src/renderer/src/views/article/ArticleSearch.vue @@ -0,0 +1,523 @@ + + + + + diff --git a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue index c1002e5..ba9e6e4 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleTreeDocs.vue @@ -1,7 +1,12 @@ @@ -270,11 +314,3 @@ defineExpose({ handleShowBackupDialog }) transition: all 0.2s ease; } - - diff --git a/blossom-editor/src/renderer/src/views/article/ShortcutkeyDesc.vue b/blossom-editor/src/renderer/src/views/article/ShortcutkeyDesc.vue index 8d01fe8..60f81ec 100644 --- a/blossom-editor/src/renderer/src/views/article/ShortcutkeyDesc.vue +++ b/blossom-editor/src/renderer/src/views/article/ShortcutkeyDesc.vue @@ -43,8 +43,9 @@ const keymapsView = [ { icon: 'bl-a-eyeclose-line', name: '隐藏左侧菜单', key: keymaps.hideDocs }, { icon: 'bl-a-filetext-line', name: '折叠浮动目录', key: keymaps.hideToc }, { icon: 'bl-search-line', name: '全文搜索', key: keymaps.fullSearch }, + { icon: 'bl-and', name: '全文搜索时匹配所有关键字', key: keymaps.fullSearchOperatorAnd }, { icon: 'bl-transcript-line', name: '格式化 Markdown 文章', key: keymaps.formatAll }, - { icon: 'bl-a-fileadd-line', name: '新增文件夹或文章', key: 'Ctrl + N' } + { icon: 'bl-a-fileadd-line', name: '打开新增文件夹或文章窗口', key: 'Ctrl + N' } ] const keymapsTool = [ diff --git a/blossom-editor/src/renderer/src/views/article/scripts/editor-tools.ts b/blossom-editor/src/renderer/src/views/article/scripts/editor-tools.ts index 377ec8c..0d0551b 100644 --- a/blossom-editor/src/renderer/src/views/article/scripts/editor-tools.ts +++ b/blossom-editor/src/renderer/src/views/article/scripts/editor-tools.ts @@ -9,6 +9,8 @@ export const keymaps = { fullViewer: isMac ? 'Cmd + 3' : 'Alt + 3', fullEditor: isMac ? 'Cmd + 4' : 'Alt + 4', formatAll: isMac ? 'Slift + Cmd + F' : 'Slift + Alt + F', + fullSearch: isMac ? 'Ctrl + Shift + F' : 'Ctrl + Shift + F', + fullSearchOperatorAnd: isMac ? 'Cmd + G' : 'Alt + G', blod: isMac ? 'Cmd + B' : 'Alt + B', italic: isMac ? 'Cmd + I' : 'Alt + I', diff --git a/blossom-editor/src/renderer/src/views/doc/tree-workbench.scss b/blossom-editor/src/renderer/src/views/doc/tree-workbench.scss index 2218834..55f1f1c 100644 --- a/blossom-editor/src/renderer/src/views/doc/tree-workbench.scss +++ b/blossom-editor/src/renderer/src/views/doc/tree-workbench.scss @@ -45,7 +45,9 @@ text-shadow: var(--bl-text-shadow); font-size: 25px; padding: 3px 2px; - transition: 0.3s; + transition: + color 0.3s, + text-shadow 0.3s; cursor: pointer; &:hover { @@ -58,50 +60,55 @@ padding-right: 0px; } + .bl-search-line { + font-size: 22px; + padding-bottom: 5px; + } + // 公开图标 - .bl-cloud-fill { - color: #7ac20c; - @include themeText(0px 5px 5px #79c20ca4, 2px 3px 5px rgba(183, 183, 183, 0.8)); - } + // .bl-cloud-fill { + // color: #7ac20c; + // @include themeText(0px 5px 5px #79c20ca4, 2px 3px 5px rgba(183, 183, 183, 0.8)); + // } - .bl-cloud-fill, - .bl-cloud-line { - &:hover { - color: #7ac20c; - @include themeText(5px 5px 5px #79c20ca4, 2px 3px 5px rgba(183, 183, 183, 0.8)); - } - } + // .bl-cloud-fill, + // .bl-cloud-line { + // &:hover { + // color: #7ac20c; + // @include themeText(5px 5px 5px #79c20ca4, 2px 3px 5px rgba(183, 183, 183, 0.8)); + // } + // } // 专题图标 - .bl-a-lowerrightpage-fill { - color: salmon; - @include themeText(0px 5px 5px rgba(250, 128, 114, 0.546), 2px 3px 5px rgba(183, 183, 183, 0.8)); - } + // .bl-a-lowerrightpage-fill { + // color: salmon; + // @include themeText(0px 5px 5px rgba(250, 128, 114, 0.546), 2px 3px 5px rgba(183, 183, 183, 0.8)); + // } // 专题图标 - .bl-a-lowerrightpage-fill, - .bl-a-lowerrightpage-line { - &:hover { - color: salmon; - @include themeText(5px 5px 5px rgba(250, 128, 114, 0.546), 2px 3px 5px rgba(183, 183, 183, 0.8)); - } - } + // .bl-a-lowerrightpage-fill, + // .bl-a-lowerrightpage-line { + // &:hover { + // color: salmon; + // @include themeText(5px 5px 5px rgba(250, 128, 114, 0.546), 2px 3px 5px rgba(183, 183, 183, 0.8)); + // } + // } // star 图标 - .bl-star-fill { - color: rgb(237, 204, 11); - @include themeText(0px 5px 5px rgba(237, 204, 11, 0.546), 2px 3px 5px rgba(183, 183, 183, 0.8)); - } + // .bl-star-fill { + // color: rgb(237, 204, 11); + // @include themeText(0px 5px 5px rgba(237, 204, 11, 0.546), 2px 3px 5px rgba(183, 183, 183, 0.8)); + // } .bl-star-line, .bl-star-fill { font-size: 23px; padding-bottom: 5px; - &:hover { - color: rgb(237, 204, 11); - @include themeText(5px 5px 5px rgba(237, 203, 11, 0.756), 2px 3px 5px rgba(183, 183, 183, 0.8)); - } + // &:hover { + // color: rgb(237, 204, 11); + // @include themeText(5px 5px 5px rgba(237, 203, 11, 0.756), 2px 3px 5px rgba(183, 183, 183, 0.8)); + // } } // 刷新图标 From 5796c053361e6f98b620deefaa001ec76a779e4c Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:52:37 +0800 Subject: [PATCH 13/23] =?UTF-8?q?style:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blossom-editor/src/renderer/src/views/article/ArticleBackup.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/blossom-editor/src/renderer/src/views/article/ArticleBackup.vue b/blossom-editor/src/renderer/src/views/article/ArticleBackup.vue index 4882233..e950984 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleBackup.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleBackup.vue @@ -32,7 +32,6 @@
服务器将于每日早上 7 点备份 Markdown 数据。
-
From f677b4f830f1cb031b16167e281285644bd4fb56 Mon Sep 17 00:00:00 2001 From: xiaozzzi <42293085+xiaozzzi@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:53:27 +0800 Subject: [PATCH 14/23] =?UTF-8?q?fix:=20=E6=96=87=E7=AB=A0=E5=9C=A8?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E5=A4=B1=E8=B4=A5=E5=90=8E=E5=86=8D=E6=AC=A1?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E4=BC=9A=E8=87=AA=E5=8A=A8=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/article/ArticleIndex.vue | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/blossom-editor/src/renderer/src/views/article/ArticleIndex.vue b/blossom-editor/src/renderer/src/views/article/ArticleIndex.vue index 94461f2..c6d75a2 100644 --- a/blossom-editor/src/renderer/src/views/article/ArticleIndex.vue +++ b/blossom-editor/src/renderer/src/views/article/ArticleIndex.vue @@ -102,8 +102,6 @@