From f07b23b82575e377959fd04b950d772ce4a39716 Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Mon, 22 Sep 2025 19:43:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E5=8D=9A=E5=AE=A2?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 +- .idea/blog-service.iml | 3 +- .idea/misc.xml | 2 +- .idea/vcs.xml | 6 + __pycache__/main.cpython-310.pyc | Bin 0 -> 466 bytes api/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 403 bytes api/__pycache__/blog.cpython-310.pyc | Bin 0 -> 3565 bytes api/blog.py | 26 +- config/__pycache__/auth.cpython-310.pyc | Bin 0 -> 2203 bytes config/__pycache__/database.cpython-310.pyc | Bin 0 -> 753 bytes config/__pycache__/logging.cpython-310.pyc | Bin 0 -> 1063 bytes config/__pycache__/setting.cpython-310.pyc | Bin 0 -> 712 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../__pycache__/generator.cpython-310.pyc | Bin 0 -> 1218 bytes .../__pycache__/options.cpython-310.pyc | Bin 0 -> 987 bytes .../__pycache__/snowflake.cpython-310.pyc | Bin 0 -> 677 bytes .../__pycache__/snowflake_m1.cpython-310.pyc | Bin 0 -> 3571 bytes .../blog_visit_middleware.cpython-310.pyc | Bin 0 -> 1218 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1877 bytes middleware/exceptions.py | 4 +- models/__pycache__/base.cpython-310.pyc | Bin 0 -> 1968 bytes models/__pycache__/blog.cpython-310.pyc | Bin 0 -> 3062 bytes models/base.py | 2 +- models/blog.py | 4 +- requirements.txt | 10 +- schemas/__pycache__/blog.cpython-310.pyc | Bin 0 -> 3949 bytes .../paginate_query.cpython-310.pyc | Bin 0 -> 1053 bytes .../__pycache__/pagination.cpython-310.pyc | Bin 0 -> 1785 bytes schemas/blog.py | 42 +- .../__pycache__/blog_service.cpython-310.pyc | Bin 0 -> 8775 bytes service/blog_service.py | 131 ++++- sys.stdout | 509 ++++++++++++++++++ utils/__pycache__/blog_utils.cpython-310.pyc | Bin 0 -> 2318 bytes utils/__pycache__/common.cpython-310.pyc | Bin 0 -> 850 bytes utils/blog_utils.py | 50 ++ 35 files changed, 763 insertions(+), 28 deletions(-) create mode 100644 .idea/vcs.xml create mode 100644 __pycache__/main.cpython-310.pyc create mode 100644 api/__pycache__/__init__.cpython-310.pyc create mode 100644 api/__pycache__/blog.cpython-310.pyc create mode 100644 config/__pycache__/auth.cpython-310.pyc create mode 100644 config/__pycache__/database.cpython-310.pyc create mode 100644 config/__pycache__/logging.cpython-310.pyc create mode 100644 config/__pycache__/setting.cpython-310.pyc create mode 100644 id_generator/__pycache__/__init__.cpython-310.pyc create mode 100644 id_generator/__pycache__/generator.cpython-310.pyc create mode 100644 id_generator/__pycache__/options.cpython-310.pyc create mode 100644 id_generator/__pycache__/snowflake.cpython-310.pyc create mode 100644 id_generator/__pycache__/snowflake_m1.cpython-310.pyc create mode 100644 middleware/__pycache__/blog_visit_middleware.cpython-310.pyc create mode 100644 middleware/__pycache__/exceptions.cpython-310.pyc create mode 100644 models/__pycache__/base.cpython-310.pyc create mode 100644 models/__pycache__/blog.cpython-310.pyc create mode 100644 schemas/__pycache__/blog.cpython-310.pyc create mode 100644 schemas/__pycache__/paginate_query.cpython-310.pyc create mode 100644 schemas/__pycache__/pagination.cpython-310.pyc create mode 100644 service/__pycache__/blog_service.cpython-310.pyc create mode 100644 utils/__pycache__/blog_utils.cpython-310.pyc create mode 100644 utils/__pycache__/common.cpython-310.pyc diff --git a/.env b/.env index 060fafa..7fd8a41 100644 --- a/.env +++ b/.env @@ -1,7 +1,7 @@ LOG_LEVEL=DEBUG DB_USER=root -DB_PASSWORD=123456 +DB_PASSWORD=estun%40medical #DB_PASSWORD=19940822Cxx%401213 DB_HOST=localhost #DB_HOST=host.docker.internal diff --git a/.idea/blog-service.iml b/.idea/blog-service.iml index 74d515a..a1348d4 100644 --- a/.idea/blog-service.iml +++ b/.idea/blog-service.iml @@ -2,9 +2,10 @@ + - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index f62dc0d..93e34b1 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,5 +3,5 @@ - + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d49dc0091cb354ff031f9b061a315ae3cb766a69 GIT binary patch literal 466 zcmZuuJx{|h5Vhl^Nu#vtQi-vQMWR0dA;g#XSWu;IR-`D2O>5*dk?oek2s8fyM*aJ7CFo?|kp>o$a#I2@$N_?~mCNM(EQ9+lxSO3|nVl7-CqW0#l4FcBE4f zN*YY0TX@uKuq#`IPkoFyW*%$3U>fk?waxrD%>8GmT}NIM5gu62f(aV7zd#2KaqVBE z+MJB90rnK13T?PbRJj1B;jEv@a+)lK7A7eKW0K#eibG;&D$6XD318*BGNPO(vvdw= z^%$K($za0OQskED8DS)^-I+1f%`l|?EhwgyP!3E$iADDIbg=0^`d3xCme${*t;MzS zAXh`Pstz}VcckpIH|A&W{2)GCt>Q~zt`^x?m3KThI<`{#`fu8}NX2|qJ=DQrQL=^P WNAOoj_rOFbav~hz(CLycj>s>0MSyhx literal 0 HcmV?d00001 diff --git a/api/__pycache__/__init__.cpython-310.pyc b/api/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d6dcfcb32bb82a40afaccfa7bddf39fdc478d5f GIT binary patch literal 403 zcmYjMJxjzu5Z#Y_oL){O|G+YW7M3ESocPfk2X-M4a@ozfM{)_fiA1op^(XiP{5RIy zT3uyt<%~wSfq64;n0dReo=kQL#KG6c!yD93B-_D(TtJ#b06_#TNkwByiC}`4tm3f) zy(4MCge$xkCw7H@PomKV_DMvof1R23a(=g=f85h`*Gg@9)-*ZJ{sVglatdiefM>EI zEfrL-R|anoP~|g=nqH%2q56o~J+;ouPRMjn9WTmyIgp5I7i8XvMvLDkSEtFe?~@zV z-gb+*u2(W|O@aqUM(RhE%Oq=5lBQ~{+B7|Gp6tGsOJ(4@gQP)0!vI3611Ph|vwi^% n;Zox~c2H2G5xs+eTfZOJf-%hO=&Y(mSIToVZajd11T^G7kOW)r literal 0 HcmV?d00001 diff --git a/api/__pycache__/blog.cpython-310.pyc b/api/__pycache__/blog.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f466a07d22159767bb99afd27ee8279d77b7e828 GIT binary patch literal 3565 zcmbtX-ER~}5}%%#{q%TkuW@V$BnI=feAwhWA%p;iOF{^6Sh%1QRdgh)^3S3pqtg~L*4=7`GZ&%H) zs()QwT|KULc4jqv?(F&L(y5%L{fC6sCxgN{!rsRI zo`yjwR{WXQwAf0A?XrU{OxOWKZ1EIZ?1Wu1%doSFat9)ZU>HW)kmPf}?2S1ef@c`L6Vba6{p>nuTAc~c!SjsV&0JrA7jbn~ z9IYl_LhA4myv)cwjC=(S%g$9?Bh;&Kgi(7L^%@+-==c1J=)Vrf*k6JD9fuQgpUkbx zZxl{4az7%6;1v9(ZOw1UE_hQW;|RS4rx|^K{k{!n&~JB}-(U9W9XQMAgK%z4E1X}Z z^H30>dB*XBf*EFxpMUE@wH`)YMet2D94!X2TvbymfF9D01;xN$QRPW>27!LCqGQ--)$?Q}7*!Hq zhP~`BQmw}Q&hedJOtXxOY4watsz;K!8lCd$eKU`CHIkf;6-^iS;27{B;dIbtbn5-!|>0AlT zpjh_9jEW=TqrVzXThEifkFGDze7kVtUrV=dMZODqnDXnMSH$?{nl|HJ6{Ne2^J#WR zsjd_Tfv88Ee*Ap?<7srWc=H3CRxisiQFNW6ulf+bOa*Tl$TCgSjya9UY~l7NH1%J; zS^m=}1ygNBM5wz`ZNmXuhE_b&IN606>c@RF4|SL*83=1WG)`a}#r6QpsupNB#Z~>P zc2&$6W7@1ZThP@e)Q5S@7d17`;hmUb$Fqjoj<3`X>V~kJ)zn`6`QPx#!xu-dT)Fs$ z6TDfUIIpUgWhwA4lI_8GYc3XR4l9OhQ))LF^tuZ)W3Q`E0f{-{Rra)@p7WBK)Qq2 zZNcW#G?u|~BTqyF+}Dxcb95Z|LqxbGH|DSZaenUmFckwfq^u6mG_5qdSJQN0R#(FW zqJX#a8$sP5HV&kvE0RMkV)NH;=5Ku+WopdEBsPyhC0zvI1i%nIho0A^@I1aC{^}X( zNWz_L3(Ob)UO+Z{AR{Up=A_z5URvYPQRfm6@i3xLY)Iw>wBCm;N-SNG9G~8s%YXmp zDheBA(b_G+!r{t5G6i*r2vXL!q{&MtQs|=?kkrVGl;ZNaHa9-HzIf+uiAqHCp|OFD zvzW>NXR$UT+H$zJB{`b@XT`ev@(OyP-QZAUbwzR`IpS0Kt`DHlda@Sp-dLKOxqokF z;e*>75>qdu)vCQ|%~f`+4ils;I!91Pv#VFBBMEuDPj!C{kEOYL%YU1Tc~C%_4~-Mp zC_rm-q?HFdR(lB7#^W{A9VI#iwa?P<_y8YqO+z;^;7lXo-if-}^kC5L|)~OC+Szo1<&* zOa@amr&3mQuEW%15fifJC`uef7lfkpQAzCVod2F%bW4|{H#J;Uo=TC@@<~zjhp9-a zG=b?~3`M6=bx=pQi|V9~BCNWo>!z*;J3HUB$II8L6zLjM^xa^0;cYSLl!x&{rZ`c= z>yU0fI~CuH(Pf)d(Px{1-!-A(R06&d`MQZ}x>>9GL1<1?t1j2r(5Te|E^lEns!oc^ z4xe&9Vw~Th>Ef56;-sf-QxvO~-Q|6zi!Mwb!S9y3E00no@?GpKZ9uogA>G2>61uJn zQ)ET*=X@$BxGXr0dqhe9|QOkuI!9xx`kHGpP;oZ{8fh-vN;~*ILn=L3}eP F{tqU-q4)p* literal 0 HcmV?d00001 diff --git a/api/blog.py b/api/blog.py index c377216..4cd2917 100644 --- a/api/blog.py +++ b/api/blog.py @@ -4,7 +4,7 @@ from fastapi import APIRouter, Depends, Query, Request from sqlalchemy.orm import Session from schemas.blog import BlogResponse, BlogQuery, BlogCategoryResponse, BlogStatsResponse, \ - BlogLatestResponse, BlogCommentCreate, BlogCommentResponse + BlogLatestResponse, BlogCommentCreate, BlogCommentResponse, BlogVisitResponse, BlogCreate, BlogUpdate from schemas.pagination import PageResult from config.database import get_db from service import blog_service @@ -34,6 +34,21 @@ def query_blog_by_id(blog_id: int, db: Session = Depends(get_db)): return blog_service.query_blog_by_id(db, blog_id) +@router.post("", summary="新增博客内容", response_model=bool) +def add_blog(blog: BlogCreate, db: Session = Depends(get_db)): + return blog_service.add_blog(db, blog) + + +@router.put("/{blog_id}", summary="更新博客内容", response_model=bool) +def update_blog(blog_id: int, blog: BlogUpdate, db: Session = Depends(get_db)): + return blog_service.update_blog(db, blog_id, blog) + + +@router.delete("/{blog_id}", summary="删除博客内容", response_model=bool) +def delete_blog(blog_id: int, db: Session = Depends(get_db)): + return blog_service.delete_blog(db, blog_id) + + @router.get("/category", summary="查询博客分类", response_model=List[BlogCategoryResponse]) def query_blog_category(db: Session = Depends(get_db)): return blog_service.query_blog_category(db) @@ -44,6 +59,13 @@ def query_blog_stats(db: Session = Depends(get_db)): return blog_service.query_blog_stats(db) +@router.get("/visit", summary="查询博客访问信息", response_model=PageResult[BlogVisitResponse]) +def query_blog_visit(current_page: int = Query(1, ge=1, alias="currentPage", description="当前页码"), + page_size: int = Query(10, ge=1, le=100, alias="pageSize", description="每页数量"), + db: Session = Depends(get_db)): + return blog_service.query_blog_visit(db, current_page, page_size) + + @router.get("/latest", summary="查询近期博客", response_model=list[BlogLatestResponse]) def query_blog_latest(db: Session = Depends(get_db)): return blog_service.query_blog_latest(db) @@ -56,4 +78,4 @@ def add_blog_comment(blog_comment: BlogCommentCreate, request: Request, db: Sess @router.get("/comment/{blog_id}", summary="查询博客评论", response_model=list[BlogCommentResponse]) def query_blog_comment(blog_id: int, db: Session = Depends(get_db)): - return blog_service.query_blog_comment(db, blog_id) \ No newline at end of file + return blog_service.query_blog_comment(db, blog_id) diff --git a/config/__pycache__/auth.cpython-310.pyc b/config/__pycache__/auth.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..264e224075fba5c97fea2cca5be7fb982b983e66 GIT binary patch literal 2203 zcmah~-A@}w5Wn3!pU=i$7#uK=50bX2TLmRVX`?Etk`gP>G!Vt4A19>K;a%X!`Oey1 z1CET;mb~&mz+?W7{sVo!*FNQ`4}Hr^I2?3COR&^fov@@|EVx#PUR3fqJgS?QR%Ri0yIRyii_ z1Sf3#h`5uS@LJvA=UDZQ!6tZZi?T^pdttd#>>RJLDUeufn$@v@Avu=R=3j63q#=XF^eBy{~5%#gR`U$%V z(u>S)8I8s(M6W@T{8Ah#exSbhMS~^|^A%S?hbK9l84r~YO3qqW1##quKxgmsE{~W5 za&qlnPwgx|_NCm91^b5kf{Ru7qp&3UT{S!z`1&?iUR%IvLtd$WzlC6?b)af7;9+1}wDE|WatUBTPn zGE1_OO9?)LHAltIc=S|+i79)V$yhs$&_l-Q4xMd7o{T=EO&CisBqo|NPRPJGB`xD6 zSp{6iy8FxHWIW^`Rqg5 zf}w*b0FeeUAg8oth$;vgR7}9)+Iw6CTYX@sffaR}Fp6|K2UJo{RYsOBgHXFxAYuj; zY{6AeME`&hz0e*wKrjF?KoIGwC_YM)4VEJz=1Bk8uo)vKsHhpNLoZhiE zfcbY5b>?wGK$9Xr=mvsIPZ!#Iw~3)=U}!AA1!7>F7^lV|9S~7e&;eT_qy0S5_5N7 zB{q-RG2=oEO7p3f;`7cx^(WkTa7$L1kX z)_@!lSyh=M<5!|=| zR$?=bK!|I=2+S~@S^{3MGy_BhwM@xXk{|U%>5i{Ndwv+Ob!=o!A!5-m#SPq~6ZzlD zr!dTBjleRf%1M~$&lCW1s7)MNF)PF-^o_WM2kCxrY1AC|d?5v9zrOVJzHQa-2GO>_ zG)%HvzEnPBE55XDWymc^-tIxt^hFl;V$5zCds-N5E)4snK=_kdCtxh(`|w08yp1$P z;w?H2JVp1YVvK!q(Mx;%8BR(hWzX}YC{{kcNYe9kr%Zd2#e%j(a zH1M~LPE)$uId?iS>xKMldljA6uvvhiR0LA+JS+MjR;64mI|RJB+#KGQQT6=iWJ$tYvOXY%bn9ERgpkN zZ2bil5{&#CX0J?4?3sAy6v$ck-uFH~`@Z+yrM7J%SPy>xm|YNreyU(|skeKuf(?9+h#d&~jh)ly7i#IFx0aMVuJO@dF9LY0OJM zKd%2AL<}HXpO9cAA_G4yE?yj1__)%vOaH?erNC$ z$ps|I@GQVwS&#z4P0+u>j;bsy<2?HsPvY!)Z)fc~eF~fhkz^Lh>&f>kMDZIX$*3u! zKfl)P&l@S!nE#i&cKI3a@sj3M*|mhhC^Dy{(`E(c-}3AVK}Q1&rma5i>W&&dRNWB3<)~Ee-tO+`@$*$hJ_G&XY|4!ZjXhT9@ChK zmW+2cUTy3MvnmQ;q&+zpj$R)4o1^jWZwF*)b9-mwDi9WfG(Q2M2b2oi_k$$y{l66U zBZ@WV;_I?KzX%FSpQ-!MhK*@msVw+a7RZ$jhI^Kl@sbhJ5Jod~tBvd6G-3%T4IJV z8Y1Bd@&gGX@s==8dRxSZ@FNt~e#2c9V%s`TjErPaC_Oi+J3J%;#wlzw0wxi|0x|Cz zNg{oLdq~zmdLW%mcGBO;+D_Jc4oE{#07ADOtBWQ82rS)awT=Ecznny$N@Y5kRmycV znAsz6P0ym}%VgFs-Q%;X0c(yXLp~aO9*q7&3=OIfzdArHFqG{vzzCWBO=q9Edy(l| zHQ)GMsn;LJVa-y`b+VM4+ko?BCRPilw>ba4N*0xeQMk-+)k3o46q?74)J7F*Eq|iC z1zAh>_g(*ed~tst4^?rwx|!zLH<=bDzFB1Rw?^h`mC86R)5oT2fA{Xe)+6e`mO&=RGK^2IZnN^?sHDRkM+M``4B}ojsNNoWRmv)wd7sE6O5T=!68Fe^@=D AUH||9 literal 0 HcmV?d00001 diff --git a/id_generator/__pycache__/__init__.cpython-310.pyc b/id_generator/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..70aa14ff1673600833591130505acaffb9278105 GIT binary patch literal 152 zcmd1j<>g`k0>$?iGC=fW5P=LBfgA@QE@lA|DGb33nv8xc8Hzx{2;!Hui&czsMMaEz zW{F2>Qb19DR%&udaZFN9e!6aPYEfBca%xOwN_={1UTRTdNq$jGe0*kJW=VX!UP0w8 V4x8Nkl+v73JCLEpOhAH#0RYaZBtHNE literal 0 HcmV?d00001 diff --git a/id_generator/__pycache__/generator.cpython-310.pyc b/id_generator/__pycache__/generator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7dc444c1468a6d3a9249d7048c43855ff7a6fac2 GIT binary patch literal 1218 zcmZ`&F>ljA6uz^a#Boy;MX&%8X_+EHq%I7oLP!mi4g{pC3|6F*o4bHp$1Z0ZN|Xf} zp^5<*pr|m=PEdvdVqgOP0<%|W(oXD5yyrAlDCJ4_{O;ZJyYGGPoi{pa5RkE7-*07A zLVn<8Sinav!t%?YI57#QTybbqF%^oo3btyhluQ$@@l=QK)QVziJUvTFnQ$C_GWK4* z+kN!0xBa5~>3Q$j>+b5)o%Odfd|J3dT7f5xJqlqZ8fCnt!1i1p%$)CfcN>niC|Gl% z4#$5<0_q&N1u-cAQ#dtMu5h(O;CfA@7Saucr+B)fnHioDI_z|wg0dGbK z25p`Aw~q24E=u<~tz+y!&_)Vl_~T%-=>qg}k;rTS-Cdy%XrOGUZMsRJERCyBmKL6Y zz?cf8XLtK+@5{E$`y}nY>Flho|NOSuz5hN5u{R!4(#p?Uz9iVL73=ghvuFnIp5%`ODb(s}nK>o{}On@R1{^ki)*pf)(X`5wKypuz!9Ul#$YD zUTK{^gqwr^L}@94P`dwb@kvP7Cdg4Z#1VQnluc~9+Mje}24(m0=ba~O-L((Bmz}w} znM%S*wKcZn2xJ666m4Eix?8k@V#AhxP%f!)*>V&M%(!A1E0kE%f$C)*e5YU~1;a2L zKcwLO9MzJ61LRsw!B}K4*7SJjpq*pvc4#^KCmF`LS7%J(WJ?^Ds4(63l17x3x%c!NfA IdX5&yWpWnOl_dUP&PK=J41nk1E{e|xa zAwMw~HVuO7u)MPXj98>Vn8MU1Vd^8*QkZs&3lO$35O?Pt(4mx}7gJ&NH8XjNzA3NGzk6O>8 z_0Rue$JneGrb4PZx&uRBg*6S!y9~gTI-xKSK&6hpT1Q{2Yk)dKOfenMU@5>fBhXW$ z7%RZ7;SA<-x37LnNfeD!0QP>GVAl6RT%X=qaF2o}`PAE9(9DAxujX-b)>QYuH0 xh-D1H2!=QftkT1QXNazhrF(nDyejc$d%+N?r-95cbETj38cKM0J#;dj`2)>#GkpL6 literal 0 HcmV?d00001 diff --git a/id_generator/__pycache__/snowflake.cpython-310.pyc b/id_generator/__pycache__/snowflake.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e69c12202b24c6a85bd43e32bdbb84e03ad2a3d GIT binary patch literal 677 zcmY*Vzi-n(6uvtAVu5oX z)ZBtc5TC3PK?NHU!Co_;3TusccD4XX_wv)}#oKR_vk%4h_mln4#hZ8I!>`5Y%Xsg2 ze0*Mf9JwKsU6UHU17S%3kNB*@_bp*byU&Cz8bjM}h$c*G(RWWw$n%@#$&l{WZc(SeL}Pi-=C$GyTS5c5UfV&!))WRR!?P^ znqVVVn|F-VFQQNek>Hy$k-C>E9T*_dM-q$MuX2a;D2Ye~fKyVl8#_1uQ@hG`y(Vsv^tL4Dxy$*M5?PG)Ea%U&UR-5#6CtfAN%hS2 vSx8*tK#jZL{SDSS#9?i#jCJAgEzX4sIWGfKOzZC4S*j-ALl}c`o3@?56ojAv literal 0 HcmV?d00001 diff --git a/id_generator/__pycache__/snowflake_m1.cpython-310.pyc b/id_generator/__pycache__/snowflake_m1.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33c9cb118172110070f51112de44be55ea360397 GIT binary patch literal 3571 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 literal 0 HcmV?d00001 diff --git a/middleware/exceptions.py b/middleware/exceptions.py index 8013846..1fdbf50 100644 --- a/middleware/exceptions.py +++ b/middleware/exceptions.py @@ -35,13 +35,13 @@ async def global_exception_handler(request: Request, call_next): except SQLAlchemyError as e: # 记录数据库异常 - logger.critical(f"数据库异常: {str(e)}", exc_info=True) + #logger.critical(f"数据库异常: {str(e)}", exc_info=True) return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content={"message": "数据库操作失败", "details": str(e)}) except Exception as e: # 记录未知异常(带堆栈信息) - logger.critical(f"未知异常: {str(e)}", exc_info=True) + #logger.critical(f"未知异常: {str(e)}", exc_info=True) return JSONResponse(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content={"code": 500, "message": "服务器内部错误", "details": str(e)}) diff --git a/models/__pycache__/base.cpython-310.pyc b/models/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da65d15a1e7583f1f183c07565979b0a88b1be99 GIT binary patch literal 1968 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 literal 0 HcmV?d00001 diff --git a/schemas/__pycache__/paginate_query.cpython-310.pyc b/schemas/__pycache__/paginate_query.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fb7345d14040d72185d8f891eac4dd0238486df GIT binary patch literal 1053 zcmZ8gOKTKC5bno3b~l@7qG%8ijS`rHi)RTzNWh#VnA@_lOs0F2(Rn1*J(`3Gh>4Gj z2SG1h+!X{p>BXb}!E;|F(LH(Bi`A0^qdinjb$503_f=KrqoWOiNstB*M$-|Xc0 zsN>`YidsM=h@c5cX`803&8VHTgr`p1scfFOsn_<<9u=N+gfD$jL#a!zR}&2}vg@{M zqPawZu^~ny0W+SGiHx*ydPNom)c8wMsW{KjY%GQ=^0rh(qK6c{hZd+|V%apK0zhWE zyM`X7Zgp41The$SbpcuA*yx9&hJPPr4n;jeRgyl@RI@%GkR950O4@e^WIzYB?+wV> zxS-ok$pyW~;X;YlStL10N`8)H6!%2cP%fy!-L-?cUQb`>#HMWeXmv$XZ8( zq2Zz|p{Qw8D@f(eiEXM8jvzY>MiCYrkc?|q(jEGOtuwp~liCfHh$9_vYDq59k zs5+SaI19Dxt``zETWg!9F_XkfM|rw7d&*+9z^BR9)PJ5cNgjoXnr;1c4_xCP*48*x zMO~fiFfp#Ju`)i$CDGq92+s3%nQLt|SZ1=$#RPB)pQ`LMGB-^11 zY(=Z=9jFPMnz4T=+cs1-#1(#?Pw_F%7^6p@_Zu$b)~$e5r3dRA)J;RJCt+f9y?Ko4 z*x%Jw4k_4%w+yS2v<`2@XH>B&E1X&gW!fq~$AcB~K|AObb>Li)d-aYwVPi8hIYc=)yb-jA^e(%-qbv8Zi z5*SyX{CTr$5b_s(oE{c@EW?zWAQ)jZCJFUuqIp`PdpgB6EjALb{Xs} z5rs`nRo)9E|0rWTR`qtoW9DxKam0c=6CpaE9y)w1!<5%RaNMJT zdRD0$O9Q&$WtO(*0%X23s;eH@x)JYQnwoe3xE5$!=Uwfyua{G2`HOfCIZmf&!77ugT zx)EocHzgNaQOH{|yvdV5wjhm@d>6VsWsRUUE z#!}I(r>Te;a8~s=N}}AyLwpG(pN2(=gmpBB8gzU9Tt&|~tTkOxh5Z6OMGZv-gwmrl zS9RYH(lpDjLJSCz9>m=VD&}W5oQh*i8AgXYf&IG1+wqd?Uj7G zFlnHP@5``FVva~De1KM0)+d!(IPak>!Sh0-A(mr2P@i-La%P9zf*;Z)eA8J17oZh& zSU!Hdcl7v&!RPmm9v%$u-YYY10s|0_KrBtF49Vm6S?E^QZcCoO0b3*nYUtZDr(lk( zYt5N6bXT_Tvn&L1zXVR=G72nk8B5Hgb``}dDDYhIB8rm#uYv}@JCSv{$a~^-G(4*v zu7KepOo=6Ti2>~}dK%QyT&mf#RNx+HMrGx_Zj^RLq2MBkz}A2$Jr<;S6bcj9%JA4_ eBQ)sztjNk)8vQBX#qyW8I7=E@Lw9PI^?w1fa-=l? literal 0 HcmV?d00001 diff --git a/schemas/blog.py b/schemas/blog.py index 477e705..eef6bcd 100644 --- a/schemas/blog.py +++ b/schemas/blog.py @@ -1,6 +1,6 @@ from typing import Optional -from pydantic import BaseModel +from pydantic import BaseModel, Field from datetime import datetime @@ -13,14 +13,25 @@ class BlogQuery(BaseModel): year: Optional[int] = None -class BlogResponse(BaseModel): - id: Optional[int] = None - title: Optional[str] = None - topValue: Optional[int] = None - isGreat: Optional[bool] = None - category: Optional[str] = None - summary: Optional[str] = None +class BlogBase(BaseModel): + title: str + topValue: int + isGreat: bool + category: str content: Optional[str] = None + + +class BlogCreate(BlogBase): + pass + + +class BlogUpdate(BlogBase): + pass + + +class BlogResponse(BlogBase): + id: Optional[int] = None + summary: Optional[str] = None wordCount: Optional[int] = None readDuration: Optional[float] = None visitCount: Optional[int] = None @@ -49,6 +60,21 @@ class BlogStatsResponse(BaseModel): wordCount: int +class BlogVisitResponse(BaseModel): + ip: str + os: str + browser: str + uri: str + title: Optional[str] = None + visitTime: datetime + + class Config: + from_attributes = True + json_encoders = { + datetime: lambda dt: dt.strftime('%Y-%m-%d %H:%M:%S') + } + + class BlogLatestResponse(BaseModel): id: int title: str diff --git a/service/__pycache__/blog_service.cpython-310.pyc b/service/__pycache__/blog_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07388defdbc952c3f252aae652f64f087c68520c GIT binary patch literal 8775 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 literal 0 HcmV?d00001 diff --git a/service/blog_service.py b/service/blog_service.py index c974d1b..14cba26 100644 --- a/service/blog_service.py +++ b/service/blog_service.py @@ -6,10 +6,11 @@ from sqlalchemy.orm import Session from models.blog import Blog, BlogCategory, BlogVisit, BlogContent, BlogComment from schemas.blog import BlogResponse, BlogQuery, BlogCategoryResponse, BlogStatsResponse, \ - BlogLatestResponse, BlogCommentCreate, BlogCommentResponse + BlogLatestResponse, BlogCommentCreate, BlogCommentResponse, BlogVisitResponse, BlogCreate, BlogUpdate from schemas.pagination import PageResult from schemas.paginate_query import paginate_query from middleware.exceptions import AppException +from utils.blog_utils import get_blog_summary, get_word_count, get_read_duration def query_blog_by_page(db: Session, current_page: int = 1, page_size: int = 10) -> PageResult[BlogResponse]: @@ -107,6 +108,119 @@ def query_blog_by_id(db: Session, blog_id: int) -> BlogResponse: return BlogResponse.from_orm(blog) +def add_blog(db: Session, blog: BlogCreate) -> bool: + word_count = get_word_count(blog.content) + + db_blog = Blog( + title=blog.title, + top_value=blog.topValue, + is_great=blog.isGreat, + category_id=add_blog_category(db, blog.category), + content_id=add_blog_content(db, blog.content), + summary=get_blog_summary(blog.content), + word_count=word_count, + read_duration=get_read_duration(word_count) + ) + + db.add(db_blog) + db.commit() + db.refresh(db_blog) + + return True + + +def add_blog_category(db: Session, category: str) -> int: + db_blog_category = db.query(BlogCategory).filter(BlogCategory.name == category).first() + if db_blog_category is None: + db_new_blog_category = BlogCategory(name=category) + db.add(db_new_blog_category) + db.commit() + category_id = db_new_blog_category.id + else: + category_id = db_blog_category.id + + return category_id + + +def add_blog_content(db: Session, content: str) -> int: + db_blog_content = BlogContent(content=content.encode('utf-8')) + db.add(db_blog_content) + db.commit() + + return db_blog_content.id + + +def update_blog(db: Session, blog_id: int, blog: BlogUpdate) -> bool: + db_blog = db.query(Blog).filter(Blog.id == blog_id).first() + if not db_blog: + raise AppException("博客不存在") + + update_data = blog.model_dump(exclude_unset=True) + + update_blog_content(db, db_blog.content_id, blog.content) + + db_blog.title = update_data["title"] + db_blog.top_value = update_data["topValue"] + db_blog.is_great = update_data["isGreat"] + db_blog.category_id = update_blog_category(db, blog.category) + + word_count = get_word_count(blog.content) + db_blog.summary = get_blog_summary(blog.content), + db_blog.word_count = word_count + db_blog.read_duration = get_read_duration(word_count) + + db.commit() + db.refresh(db_blog) + + return True + + +def update_blog_category(db: Session, category: str) -> int: + db_blog_category = db.query(BlogCategory).filter(BlogCategory.name == category).first() + + if db_blog_category is None: + return add_blog_category(db, category) + else: + return db_blog_category.id + + +def update_blog_content(db: Session, blog_content_id: int, blog_content: str) -> bool: + db_blog_content = db.query(BlogContent).filter(BlogContent.id == blog_content_id).first() + if not db_blog_content: + raise AppException("博客内容不存在") + + db_blog_content.content = blog_content.encode('utf-8') + + db.commit() + db.refresh(db_blog_content) + + return True + + +def delete_blog(db: Session, blog_id: int) -> bool: + db_blog = db.query(Blog).filter(Blog.id == blog_id).first() + if not db_blog: + raise AppException("博客不存在") + + delete_blog_content(db, db_blog.content_id) + + db.delete(db_blog) + db.commit() + + return True + + +def delete_blog_content(db: Session, blog_content_id: int) -> bool: + db_blog_content = db.query(BlogContent).filter(BlogContent.id == blog_content_id).first() + if not db_blog_content: + raise AppException("博客内容不存在") + + db.delete(db_blog_content) + db.commit() + + return True + + def query_blog_category(db: Session) -> List[BlogCategoryResponse]: query = select( BlogCategory.name, @@ -147,6 +261,21 @@ def add_blog_visit(db: Session, blog_visit: BlogVisit): db.refresh(blog_visit) +def query_blog_visit(db: Session, current_page: int = 1, page_size: int = 10) -> PageResult[BlogVisitResponse]: + query = select( + BlogVisit.ip, + BlogVisit.os, + BlogVisit.browser, + BlogVisit.uri, + Blog.title, + BlogVisit.create_time.label("visitTime") + ).select_from(BlogVisit).outerjoin( + Blog, Blog.id == BlogVisit.blog_id + ).order_by(desc(BlogVisit.create_time)) + + return paginate_query(db, query, current_page, page_size) + + def query_blog_comment(db: Session, blog_id: int) -> List[BlogCommentResponse]: query = select( BlogComment.id, diff --git a/sys.stdout b/sys.stdout index bc5fe0b..abc25c4 100644 --- a/sys.stdout +++ b/sys.stdout @@ -201,3 +201,512 @@ 2025-09-21 10:14:26.611 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/685968269635653 2025-09-21 10:14:32.814 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 2025-09-21 10:14:32.814 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:10:32.528 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:10:32.538 | CRITICAL | middleware.exceptions:global_exception_handler:38 - 数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2025-09-22 15:11:20.975 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:11:20.979 | CRITICAL | middleware.exceptions:global_exception_handler:38 - 数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2025-09-22 15:12:52.569 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:12:52.572 | CRITICAL | middleware.exceptions:global_exception_handler:38 - 数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2025-09-22 15:14:34.715 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:14:34.715 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:14:34.722 | CRITICAL | middleware.exceptions:global_exception_handler:38 - 数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2025-09-22 15:14:36.797 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:14:36.802 | CRITICAL | middleware.exceptions:global_exception_handler:38 - 数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2025-09-22 15:14:37.098 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:14:37.098 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:14:37.103 | CRITICAL | middleware.exceptions:global_exception_handler:38 - 数据库异常: (pymysql.err.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)") +(Background on this error at: https://sqlalche.me/e/20/e3q8) +2025-09-22 15:15:18.304 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:15:18.835 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:15:18.836 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:16:30.165 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:16:30.166 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:16:30.291 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:16:30.292 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:16:45.745 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:16:45.745 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:17:55.127 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:17:55.127 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:17:59.863 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:17:59.863 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:01.178 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:18:01.178 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:09.547 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:18:09.548 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:10.775 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:18:10.775 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:11.597 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:18:13.368 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:18:13.368 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:14.576 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:18:14.606 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:18:21.277 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:18:21.286 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:18:32.435 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:18:32.477 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:18:34.315 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:18:34.315 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:35.850 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:18:35.861 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:18:36.801 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:18:36.801 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:37.910 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:18:37.922 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:18:54.032 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:18:54.032 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:18:55.791 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:18:55.823 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:19:07.698 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:19:07.711 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:19:09.027 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:19:09.027 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:19:10.200 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:19:49.933 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:19:49.933 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:19:51.055 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:19:51.055 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:29:07.461 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15 +2025-09-22 15:29:07.461 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:29:07.462 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:29:09.248 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15 +2025-09-22 15:29:09.248 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:29:09.249 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:29:11.191 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:29:11.747 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15 +2025-09-22 15:29:11.747 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:29:11.748 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:29:44.643 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:29:45.150 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15 +2025-09-22 15:29:45.150 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:29:45.151 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:30:49.103 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:30:49.752 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15 +2025-09-22 15:30:49.753 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:30:49.754 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:30:54.846 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/ +2025-09-22 15:30:54.847 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:30:54.955 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/favicon.ico +2025-09-22 15:30:54.955 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:31:28.200 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 15:31:38.462 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 15:31:50.381 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 15:32:30.627 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 15:32:58.230 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 15:33:01.985 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/.well-known/appspecific/com.chrome.devtools.json +2025-09-22 15:33:01.986 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:33:06.065 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 15:33:06.087 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/.well-known/appspecific/com.chrome.devtools.json +2025-09-22 15:33:06.088 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:33:30.973 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 15:33:31.004 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/.well-known/appspecific/com.chrome.devtools.json +2025-09-22 15:33:31.005 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:33:31.649 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json +2025-09-22 15:33:40.922 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:33:40.922 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:36:26.310 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:36:26.310 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:39:34.526 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:39:34.526 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:42:07.925 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:42:07.926 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:45:58.186 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:45:58.187 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:46:55.130 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:46:55.131 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:47:55.921 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:47:55.922 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:49:55.638 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:49:55.638 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:50:42.343 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:50:42.343 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:54:01.182 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=10 +2025-09-22 15:54:01.182 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:54:34.738 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:54:35.231 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15 +2025-09-22 15:54:35.231 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:54:35.232 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:54:45.865 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/visit?currentPage=1&pageSize=15 +2025-09-22 15:54:45.866 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:54:45.866 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 404 +2025-09-22 15:55:11.021 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 15:55:11.021 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:55:13.232 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 15:55:13.232 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:55:16.814 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=2&pageSize=15 +2025-09-22 15:55:16.814 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '15'} +2025-09-22 15:55:18.058 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=3&pageSize=15 +2025-09-22 15:55:18.058 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '3', 'pageSize': '15'} +2025-09-22 15:55:19.444 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=4&pageSize=15 +2025-09-22 15:55:19.444 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '4', 'pageSize': '15'} +2025-09-22 15:55:21.420 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 15:55:21.420 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:56:21.793 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:56:21.794 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:56:22.607 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 15:56:23.300 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 15:56:23.301 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 15:56:29.178 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:56:29.179 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:56:34.330 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 15:56:34.384 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:56:37.117 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 15:56:37.117 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 15:56:46.624 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 15:56:46.624 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 15:56:48.277 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/591259203186757 +2025-09-22 15:56:48.288 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 15:57:02.098 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 15:57:02.098 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 15:57:05.160 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/591259203186757 +2025-09-22 15:57:05.187 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:01:30.053 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 16:01:30.053 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 16:11:59.331 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/653526425653317 +2025-09-22 16:11:59.344 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:12:16.814 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/653526425653317 +2025-09-22 16:12:16.851 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:12:18.578 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 16:12:18.578 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 16:12:19.373 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 16:12:20.288 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 16:12:20.288 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 16:12:22.093 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 16:12:22.103 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:13:08.148 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 16:13:08.164 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:13:43.129 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 16:13:43.183 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:13:47.295 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:13:47.301 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:15:09.734 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:15:09.762 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:15:33.888 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:15:50.282 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:15:50.311 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:17:18.946 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:17:18.987 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:17:50.938 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:17:50.974 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:18:07.683 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:18:07.709 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:19:03.894 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:19:03.922 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:19:30.947 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:19:30.974 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:25:21.951 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:25:21.983 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:25:24.186 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 16:25:24.186 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 16:25:25.748 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 16:25:25.759 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:25:27.213 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:25:27.218 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:28:50.934 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:28:50.990 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:31:15.089 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:31:15.117 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:31:22.466 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 16:31:22.509 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:31:23.823 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:31:23.827 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:31:51.087 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:31:51.119 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:32:28.998 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:34:34.904 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:34:34.933 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: 'str' object has no attribute '_sa_instance_state' +2025-09-22 16:35:07.569 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:36:08.384 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 16:38:52.539 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 16:38:54.167 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 16:38:54.168 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 16:38:55.866 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 16:38:55.952 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 16:38:57.139 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:41:18.563 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/631305371107398 +2025-09-22 16:41:38.946 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 16:41:39.149 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json +2025-09-22 16:42:24.993 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog +2025-09-22 16:42:24.996 | CRITICAL | middleware.exceptions:global_exception_handler:38 - 数据库异常: Class 'schemas.blog.BlogCreate' is not mapped +2025-09-22 16:54:29.509 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog +2025-09-22 16:54:54.299 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog +2025-09-22 16:55:19.391 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog +2025-09-22 16:57:29.815 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog +2025-09-22 18:14:20.522 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/222 +2025-09-22 18:14:20.552 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客不存在 - 详情: None +2025-09-22 18:25:32.758 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/222 +2025-09-22 18:25:32.805 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客不存在 - 详情: None +2025-09-22 18:26:28.913 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:27:21.610 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/631305371107398 +2025-09-22 18:27:21.641 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:27:23.929 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:27:23.929 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:27:27.864 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:27:28.948 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:27:29.722 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:27:29.722 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:28:52.114 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:28:52.114 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:31:41.995 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:31:41.996 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:31:45.766 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:31:45.766 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:31:48.191 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:31:49.043 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:31:49.043 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:31:50.676 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:31:50.676 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:31:55.477 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:31:55.589 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:31:56.525 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:31:56.526 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:31:57.563 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:31:57.578 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:32:01.569 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:32:25.403 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:32:25.421 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:32:27.763 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:32:30.262 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:32:30.274 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:32:31.801 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:32:31.896 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:32:31.896 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:32:31.922 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:32:31.974 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:32:32.015 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:32:32.016 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:32:33.771 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:32:33.771 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:32:35.396 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:32:35.396 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:32:41.918 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:32:41.930 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:32:43.999 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:32:45.747 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:32:45.861 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:32:45.861 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:32:45.872 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:32:45.884 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:32:45.915 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:32:45.916 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:32:48.833 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:32:48.833 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:32:50.031 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:32:50.031 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:32:53.942 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:32:53.966 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:32:54.843 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:33:00.928 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:33:01.118 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:01.118 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:01.129 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:33:01.139 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:33:01.180 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:01.180 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:03.100 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:33:05.118 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:05.119 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:06.433 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:33:06.442 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:33:08.330 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:08.330 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:09.233 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:33:09.244 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:33:09.895 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:33:11.488 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:33:11.597 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:11.597 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:11.609 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:33:11.621 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:33:11.651 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:11.651 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:13.466 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:33:15.203 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:15.204 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:15.764 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:33:43.025 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:33:43.025 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:33:45.937 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:33:45.938 | WARNING  | middleware.exceptions:global_exception_handler:26 - 响应: 405 +2025-09-22 18:34:46.500 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:34:46.511 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:34:47.017 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:34:51.419 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:34:51.500 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:34:51.500 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:34:51.512 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:34:51.522 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:34:51.556 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:34:51.557 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:34:53.242 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:36:53.036 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:36:53.036 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:36:54.031 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 18:36:54.031 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 18:36:57.341 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:36:57.341 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:38:13.963 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:38:17.268 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:38:17.268 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:38:19.535 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:38:19.548 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:38:20.820 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:38:23.110 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:38:23.195 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:38:23.195 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:38:23.206 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:38:23.221 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:38:23.249 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:38:23.250 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:38:24.949 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:41:06.913 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:41:06.914 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:41:09.726 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:41:09.731 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: delete_blog_content() missing 1 required positional argument: 'blog_content_id' +2025-09-22 18:41:39.132 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/docs +2025-09-22 18:41:39.238 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/openapi.json +2025-09-22 18:41:54.768 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:41:54.771 | CRITICAL | middleware.exceptions:global_exception_handler:44 - 未知异常: delete_blog_content() missing 1 required positional argument: 'blog_content_id' +2025-09-22 18:42:14.812 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:42:19.880 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:42:19.885 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客内容不存在 - 详情: None +2025-09-22 18:42:50.275 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:42:50.303 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客内容不存在 - 详情: None +2025-09-22 18:43:06.008 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:43:06.051 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客内容不存在 - 详情: None +2025-09-22 18:44:09.227 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:44:09.253 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客内容不存在 - 详情: None +2025-09-22 18:45:23.874 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:45:23.925 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客内容不存在 - 详情: None +2025-09-22 18:45:57.101 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:45:57.113 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:45:58.136 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:45:58.137 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:46:03.406 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722514116330950 +2025-09-22 18:46:03.449 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:46:04.490 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:46:04.490 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:46:20.664 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:46:20.664 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:46:22.438 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:46:22.443 | ERROR  | middleware.exceptions:global_exception_handler:32 - 业务异常: 博客内容不存在 - 详情: None +2025-09-22 18:46:56.020 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:47:07.468 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:47:41.733 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:50:54.925 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722514116330950 +2025-09-22 18:50:55.028 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:50:55.028 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:50:55.067 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:50:55.083 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:51:10.453 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:51:13.077 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog +2025-09-22 18:51:13.285 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:51:13.286 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:51:13.301 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:51:13.317 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:51:13.358 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:51:13.359 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:51:15.327 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:51:15.328 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:54:54.576 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:54:54.576 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:54:56.974 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:54:56.974 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:54:59.240 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722542064379334 +2025-09-22 18:54:59.455 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:54:59.455 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:54:59.466 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:54:59.466 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:54:59.494 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:54:59.527 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:55:00.853 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:55:00.853 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:55:02.437 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:02.437 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:07.394 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:55:08.960 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: POST http://127.0.0.1:8082/blog +2025-09-22 18:55:09.151 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:09.151 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:09.164 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:55:09.176 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:55:09.215 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:09.216 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:12.434 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722543030515142 +2025-09-22 18:55:12.446 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:55:13.732 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:13.732 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:15.059 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722543030515142 +2025-09-22 18:55:15.072 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:55:15.748 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 18:55:21.292 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: PUT http://127.0.0.1:8082/blog/722543030515142 +2025-09-22 18:55:21.465 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:21.466 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:21.477 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:55:21.488 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:55:21.524 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:21.524 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:23.208 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/content/722543030515142 +2025-09-22 18:55:23.219 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/comment/0 +2025-09-22 18:55:24.389 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:24.390 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:28.920 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: DELETE http://127.0.0.1:8082/blog/722543030515142 +2025-09-22 18:55:29.157 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:29.157 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:55:29.182 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/stats +2025-09-22 18:55:29.192 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/latest +2025-09-22 18:55:30.441 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:55:30.441 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:55:31.669 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:55:31.669 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 18:56:17.221 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=2&pageSize=10 +2025-09-22 18:56:17.221 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '2', 'pageSize': '10'} +2025-09-22 18:56:19.131 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 18:56:19.131 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:04:46.072 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:04:46.073 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:05:04.232 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:05:04.232 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:06:27.903 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:06:29.614 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:06:30.762 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:06:30.763 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:06:31.344 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:06:31.873 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 19:06:31.873 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 19:06:33.165 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:06:33.165 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:07:01.746 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 19:07:01.747 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 19:07:14.066 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 19:07:14.066 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 19:07:17.578 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 19:07:17.578 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 19:07:20.284 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:07:29.679 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:07:29.679 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:07:43.055 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:07:43.055 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:07:43.499 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:07:59.605 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:07:59.605 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:08:00.326 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:08:01.072 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 19:08:01.072 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 19:08:37.540 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 19:08:37.541 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 19:08:41.634 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:08:41.634 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:08:42.352 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:08:46.044 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/visit?currentPage=1&pageSize=15 +2025-09-22 19:08:46.044 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '15'} +2025-09-22 19:08:46.882 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/category +2025-09-22 19:08:47.220 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:08:47.220 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:35:46.700 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:35:46.701 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} +2025-09-22 19:36:39.565 | INFO  | middleware.exceptions:global_exception_handler:18 - 请求: GET http://127.0.0.1:8082/blog/page?currentPage=1&pageSize=10 +2025-09-22 19:36:39.565 | INFO  | middleware.exceptions:global_exception_handler:20 - 查询参数: {'currentPage': '1', 'pageSize': '10'} diff --git a/utils/__pycache__/blog_utils.cpython-310.pyc b/utils/__pycache__/blog_utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcc0f75a10b3fac21d1c1ff35aeecfea4eef8a2d GIT binary patch literal 2318 zcmZWqU2GIp6rMXXJ2Rc`w%aWNMWc)VODMh&G>svYc7Z1SOP3-}s_U?KwmW4zv)q|! zOEXRQmj??*11LeEn21K97^7$^!6)OZuk&hm+dlbdEHUw%*_LkWZ0^}}&OP_u^PPLn zxppk3a`62Y`=jt0aDSpu`$-_|gW+5PLODu`+$hlqL7p%2qk<*?FK8kawa73>Be#hr zQOS_0Y$$n=DzxsLsMS%`P(Y)Crk+MYQ%_@|jSQLw+6bB`jnk%coED=AL(cQGnQj7Y z1AWRMbaS{`$V+q!-3r=9+LGZ?+m^s5E=2-)z&POT zWOcf#ue#EfTrtKy82Yt@1W?7&M?1O)JJZ>YL+t~Zl)x0w2a%lZS#BWa3Of6mV-28N z-qYDO)G;wJbkKAUdB^&hJ!0fsXXqG2rPVRmn3*$%Jl8B%RoRf;RXQ0o3>$8C+-5Wz zZrTWYIdLGOEb<~zc!em0KPB=Em4Uiuxh{U_E)OG&ANuHXF84GC(IMV(5No2d^vU_f z*}2NKAD6B?N|vXu%s-s|>zC{0ix-wYy16b|Ye%idtR_lrtC6eSE<6RIrVgarJF}Vo zbh~oHGnLb`>#(kz1&J_yy?pO>`NH|~ zy`R^o$hx(dD7`5@5Q>HsB=&dr9n5A1dwSXj-p+RP4fY-e*qh+!jj-bg8&e|dc%!2_ zJGm2#94z&y93>)QTYy~$7$foo@XH|h+z5AzP%?uBLRh0uZt;|#AylZs9uY=FfG&D3 zfbsm?rN!9?mG92X|8%!n8vw3y@xj73vt9k=8~4kfotkVs+Iqld<2s`TMQ)kw3`-yt z3FHFYkincl0KbEXQ!1KJzPX|a*Aj>Y8w#HfWLE6~LE}U=zq%1}8^OmAe06cwEWH8l zIhd(YNb?3ra+U-kP(3J?tUkQ);xPtK68v`%utC58>^?Wfv3e>@5$icBhEjq?K-x;B zP->wPNKI4@r6iR>QmKNH^D3?g(wD(KVvZd6&k+x%X((+FUB(?FKlDcfP26{^1~iZ*52LE1m4)>G_8@ z7QUZbn7dj2=!41+mly9`EPwh{HG?&I&^m6}6E!WM z8Pj3ywzH;{xA(y!XAcljfZiuakQQqr4h5p1URC}Es>J^RDk+bFit&Ge@(c@vJqrX* z#VRvt4wGi}!$Ol`bii;h0ju2uE`uAvGJ9>{s!arKhP zFeX9$s7;NcvkP}&=nmVAB!Q$J4Ftz!fdCm)eR?AKqOH4OZw}j36;=oa52*1F-$NF* jdF4$w#48$m@qKb||0veGAPS0*5E9J^Rf#qz+qVA)$y{w> literal 0 HcmV?d00001 diff --git a/utils/__pycache__/common.cpython-310.pyc b/utils/__pycache__/common.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..90be75269e9561ac1ba1402f74ebea6855c9b8ff GIT binary patch literal 850 zcmZXSL2DC16vt;~cat=bpjC<|NpD#sq4uVPpr)XwA_yMR4I$YX>(PBv z4+Zt=CF!l;q2NU%`2gNL&ryxEr`$dHW}`9Hfq6Uc&CGlM{k;h@nKXj2I{kA0Ge+o} zb{2;T&NY}~4GcvT`>2X2VVD{W-!rL6tzEN979t6ngor`$9b~6Y;1=3cX3%IcmEcT9 zJaD1TeCV|WvjS7(z(_Q}6jRbeL!&?QjF~qeLj*a^=ms2{9POPPjwT2#c% zp1c(`Z}V`6xl%YyKin<|#vgeub0X>a!g0e^D-4S5Co1b|adjEiV_llG&?ZZkF<*kk zDNwqa-i<+BghdYxpdCZp2Uvj2pyn>>;SKa0Vt~o|gK3e-9Md8@!1NbP%xO*yFezMD z|0^*-fY9>-m}j7+mh9sm9-tw*i!gdfsBRVBw6U_JCw*oUMT%<*cVb>MlY+ZyskF@k z)@k!{M(5MNNS>~s?&?ev(1|e>OMd7!d{HjW&qGQ}w0%!1b0_oyo5USaX&~GV0~Sc} zZ>{XrAe!(IECWV%bmBcUI CMD2|L literal 0 HcmV?d00001 diff --git a/utils/blog_utils.py b/utils/blog_utils.py index cc2aca7..4eeb515 100644 --- a/utils/blog_utils.py +++ b/utils/blog_utils.py @@ -2,6 +2,56 @@ from fastapi import Request from models.blog import BlogVisit +# 博客概要字数 +BLOG_SUMMARY_COUNT = 100 + +# 阅读速度 600 字/分钟 +READ_SPEED = 600.0 + +# 博客非统计字符 +EXCLUDE_CHARS = [' ', '\n', '\t'] + + +def get_word_count(text: str) -> int: + """ + 获取文本字数 + + :param text: 文本 + :return: 字数 + """ + count = 0 + + if not text: # 检查None或空字符串 + return count + + for char in text: + if char not in EXCLUDE_CHARS: + count += 1 + + return count + + +def get_read_duration(word_count: int) -> float: + """ + 获取阅读时长 单位:分钟 + + :param word_count: 文本字数 + :return: 阅读时长 + """ + return word_count / READ_SPEED + + +def get_blog_summary(content: str) -> str: + """ + 获取简要信息 + + :param content: 博客内容 + :return: 简要信息 + """ + if len(content) > BLOG_SUMMARY_COUNT: + return content[:BLOG_SUMMARY_COUNT] + return content + def get_client_ip(request): """从请求中获取客户端IP地址"""