From c60fde3321312f668d3488cece8f3f9a499f38cb Mon Sep 17 00:00:00 2001 From: "ethan.chen" Date: Fri, 13 Jun 2025 13:56:26 +0800 Subject: [PATCH] =?UTF-8?q?init:=20=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/extensions.json | 5 ++ .vscode/settings.json | 6 ++ README.md | 3 + db/index.ts | 21 ++++++ db/media.db | Bin 0 -> 16384 bytes deno.json | 12 ++++ deno.lock | 121 ++++++++++++++++++++++++++++++++ main.ts | 40 +++++++++++ media.db | Bin 0 -> 94208 bytes routes/media.ts | 151 ++++++++++++++++++++++++++++++++++++++++ routes/user.ts | 40 +++++++++++ 11 files changed, 399 insertions(+) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 README.md create mode 100644 db/index.ts create mode 100644 db/media.db create mode 100644 deno.json create mode 100644 deno.lock create mode 100644 main.ts create mode 100644 media.db create mode 100644 routes/media.ts create mode 100644 routes/user.ts diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..c4eb3fe --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "denoland.vscode-deno" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a2bb77c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "deno.enablePaths": [ + "./" + ], + "editor.inlayHints.enabled": "off" +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d29ae32 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +``` +deno task start +``` diff --git a/db/index.ts b/db/index.ts new file mode 100644 index 0000000..dc4314c --- /dev/null +++ b/db/index.ts @@ -0,0 +1,21 @@ +/* + * @Date: 2025-06-12 16:48:44 + * @LastEditors: 陈子健 + * @LastEditTime: 2025-06-12 17:31:37 + * @FilePath: /my-score/honoback/db/index.ts + */ +import { DatabaseSync } from "node:sqlite" +import { join, dirname } from 'node:path' +import { fileURLToPath } from 'node:url' +import { readFileSync } from 'node:fs' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +// 初始化数据库连接 +const db = new DatabaseSync(join(__dirname, 'media.db')) + +// 执行schema.sql中的SQL语句 +const schema = readFileSync(join(__dirname, 'schema.sql'), 'utf-8') +db.exec(schema) + +export { db } \ No newline at end of file diff --git a/db/media.db b/db/media.db new file mode 100644 index 0000000000000000000000000000000000000000..c83228fb4e8e29c69542cc361722ddee25d858eb GIT binary patch literal 16384 zcmeI((M#Jv90%|_Bb^r7?CqWgzekHYnnni-!ZJN2ER8i@z&?d&ZcwnTHYpp7J&eKr zGatwP8gY-iUiHDU!5)Wxf8=t#%l&%%KIA1SJw1sAm8K8l$uO_TXD=D&>@5*vtZCY^ zX%E58hsE*3wZHXE_WFCP;r?Py^9yVKbbpu*0Rad=00Izz00bZa0SG_<0?$pL=hVdd zI`3Ec`K2zeFU^x^R_g1i9$hRBm-iDHC`l@K7fD)JyEe*)dc$P4zJBH}gb@5&YQJ+@ z>Pcx&OONvH6s^_C#Gs%sR`N(D)Jwu{ko4)j>{F1c<1jW^T^XwlyKri`V*Y|d}ygy9U zO() + +const AUTH_SECRET = 'it-is-a-secret' + +// 添加请求日志中间件 +app.use('*', async (c, next) => { + console.log(`${c.req.method} ${c.req.url}`) + await next() +}) + +// 注册用户路由 +app.route('/api/user', user) + +// 注册媒体路由 +app.route('/api/media', media) + +// 需要认证的路由 +app.use('/api/test/*', jwt({ + secret: AUTH_SECRET, +})) + +// 添加404处理 +app.notFound((c) => { + console.log('404 Not Found:', c.req.method, c.req.url) + return c.json({ code: 404, message: 'Not Found' }, 404) +}) + +Deno.serve(app.fetch) diff --git a/media.db b/media.db new file mode 100644 index 0000000000000000000000000000000000000000..16a64c8a254c338cb03648b3a9411b9320af552f GIT binary patch literal 94208 zcmeFaX>gtAb>|6cA-IU59Y?J=i6c0U<9Hk)xY)tOiM2&hY)OtJCr;9Knvxh8YuiM0nqOZ&ju;T~pOl zU0vy#-~XKVUMv*YnUvFx<4eIXdGEVC&w0*so^$?Zd--?1_U7pmMSpzq)Z52T7nK!! zqF~>?g0B=66%-WwIsbc<|9yi0-534u0scSxXJ7U&_xS%mFDQOz`3M*6d-&fM@RR?O zr$C+pc?#qykf%VN0(lDLDUhc?o&tFaEo}yb>i(4 zufKWRe%<%fOV2#<$}>f;Jn`h$o++}Aihk+P!8czodhUf+o_Y3}mx^9^@s*+%zVWrM z{c_QvgQwp-{nm-1-+khxr+({+mwu_Vq~wb`zy9#ut#2!KeR=Bm={Mhbqv$uk_Tm$- z=vnWaJbmK5qF0{zrv2;Pw~n8dS)O}%jEC#8*NEq~~r^Xu?QejR=7=>J~uAb%-1@(RCx^4X*R&j0zTC;8`3JkGCAKE|(y zf0AEz-2+FD6h2t+;QgN{eCYpuaO0uQ`#*8;K0e6*$y4CRlmdw_#mf&DJn?8@^ZiFY z`@|DZ9)IWAqNl;w-u`USbEm)XUeWU(KKtTl_2>9IZ@zuvE82|w3Fg*PGowMvl~m74 zrl~D;p@F||t_=of+R~#}!umvT=SFI!Gc~Xntes8WSWh=CY%Vwc^=jMZT4UMM;cRc} z+DLd~G#qR$eL5T(57ztAGgpFhgCEt_1c30h6^i?|9Y&1kAj)DFxjO6OkU=r(&(d=(R9~ZFgVAJnUR~DOIy5^7uO^-w8TrQ_1(9IJ^{RaE7^sVXX|K2}k4tgNKCqOz>4tg`Mm;<3X8k3L#h z{|&M0Z=d|`iBoT%{N9@D!5P>wM6CQw!d6D_EP?och;N4Yz~D zym47OgK`>+7;B9XJ~cSP^-O}f+PAgv2#c1QU(sE)lYEx;MbKM$7-$1%`Lc?g9;@+@z9M%YjiM8$L$qvP z2y0hFMb;{Lje8+vFg6mjOa(0iywpip^>}Gbj!?TvSeg6ANmzZXtgJXzT~!$?Gdk`2 z8z)!(_m3R~nhwS*4i|j>k;1m;KFbyg`!1%|rZ$&agXQTr@Cao$QmW%>dZQ^lvlxtB z$kaBb*RH?y=66qsb2s`k^;Zx(n=7`}VNwJZk`DG?TjeKRn-CY997i69qeA1c}9TTRohfnK&0DlIfYN+E`s(;pCdW zb!oD;k?Oe;jv&ydQZ2LTNw(}Luh1sDetmPXmiO|CNb-(Ng)M98`B64BkJSas8dzq% zKUhZ)C-vC)1!SBLDcx}`=xS$P!9;&_{bDoMGss}FHRwE#5ai)JCm0yub8h#yyZCY9 zFn1?hC0~aZ7lV!ZXov%gVP_YDB0VDslO0eG4`P&?i$g*4c)D$pQ!CRG=Tw1SdN-u( zoAj3jO}E45Rv#-181}aLbG8nF9 zmmVtk(xZh(beg5dH&V+RB6srq=5ni_Ymvsq!#Osq9*=Fk=07d-IZ(@DHPt1R1&#N` zOAZ%&>yg6d55L5lKB`;&sQ%hV^|c?xXEs-d(o@%qK8oM^DBkx`yn~NEim!eYZ{(lb z1wwjs9Ll7wjR#8$shcZ7vJX12?;(*0-gi5w?dMbr?#y%gqDydAZ7$6{`{Wa%Ugs2_ zqy}5z!=S6pZ%GZVW+qzo?b=yxXI;dQiG}p-%RJE6#rZQB9S-Jt((CJ~)vLi=XRx^D z?9S27N$e^j90)gZqn6S(8-q-(jBIBBAGTgJ*u4EMJWY3@q_L0Z1~Zq=Ym1Lf>i1ly zWMfwcYE1f0clwT4J-sog>zmiNU!Z&M%=%zlhtQ_rbZ_VkYlol}k7Bez;?CyEbwro; z(a<=m-S*2wjoGEt^f?{*T~e&k#Mln6o_y~;zai*M23@FY&HUzT9)tqI)6uoroW3*p zy!2^^#?z#o!quz2!R#s$j&Fi7)@a73%!=?Leuq6PsowEmWSIwOI}ct#{jc3M2VzyM20JOWl9Z%3gGf|NT;ag}vD0(%6aHaPp#I5+ z4;NHCQkeMS=U~yNPk#TMqSN0wQS{RBS6_YebkT2}eCvdrDbcBxnyKXn6IfQTG`r5= zY&^9*X&PK}da@Ba8hbvNZFDK*;_-W@xHi4fh3s>L0T~87kds5GB&a;WL|r&NCLx4L zyi&Wll>FV7IO)-+5aq}k*Ao35LHDJXZn*%bC+~JP?u{tF&8BJGs`Qf zdL4l%$`WL?ys#%TG#o50ru#ZGwMe(5K#^v&u4cvT7Dnt%kGSm2lHGj*3a)i_WksW%e2d!IjX`gqaryno`o)1}D3 zQd!xhTZZ6HIayh?mmZ=5CRG?QCYMO()Bp87)uGI`*(cl7SoHU@~kU^g~Q&lw_U>I{;GHyIRz(JqAq{cZ3HH1m6P zdu)tb4p7z*C;b( zc>s(hNZy7i7>0-dw>P2-b)kFn3O@A5Vs@pja4t{#A_F3%C!1lD;OvyN^x7$Ym@j85 zgA6;`!cN&$JkZ}RQrL_1OgqqB`-;w1Q)Z;$1Ju~gf)3oyOM`@gR9Gz+x-`g{p;WWD zGMd!J`P57wSRTL;AM)_bN<*fp8#M{7CL9o25gBS@3(}pEbE)P5*q`SM$D6zK!5i;# z0qhZ6JLlM1PP_Q#t0zAwdilhuH;D&)*?2bw`)=vYyLq={k2Aiqssy2zIP&1(f@dBn zOnyPSE+`NZC3E#U3Tb$KGDtK8t0P5WeM>Ojv|Ycg493r;nhiZN4F-aWMZke(h5-|O zh1@D;{-sazMAk^pIXCE_5ACDnIEKdj^0utvLZEm(}Zsw|DNdo657BDMuBfRHW0`daFm0go*g!?w5{ za$!AK#xfewLN6sU{q0!re9oxgC7ytN%V^nj=}Xtran#afjSAKA>^MItz+rE9G@kx3 z{^9}w06U{vGG66g3Tb6!H7r^8zypT4 z)YV9$%8pv^z^n~#O>Gyf5+xX}Gi^*&D+)HU(t^3g&dFJ=zQzoZX~>4>AWI61kT_@` zWzG=VjWI0`+yg;7-Bi;ihv!n02#dDxIv3YxE_Z|%R}s5NpGZfaPk@ig76P#D5U#L$ zbCx|`QoT2PTUogU-|pJBMv408?>{VyH}Nf*ykYAsoDf`VOPzxsmfhr)yN*AsT&f=E zRNIgrFapp}?GOz3u8yF+#kF0nv03cmypeGUqxzfdBA3WU8JM^hS>sTTK0zaZ8)j|` zR^k8vsg=F4oL;{gwv4fD(xVZelG7d7axzn=+1|~YYa51fjRfO2)3tGjk93Q$cSA#L zJb*}GA`T+?FfjHYY)(e7Ju*$5sg>?<_%@FUrp35i8P;|nM8X#KNmFh$vHK)15H73p zVLt+5L{gQ5!O<|E(dsh85KKRW!L}UCG>08$_^ofW8XD>!>2yGVMR3&Rc#s?`!afbB$AgP?K!buHR$3*v8qZ|< zukP5XeYZ0gdV<9C=3>3@5Car5@pf6wwuV~@+S1LSbM8y&nK`74fYW4SG<}oZKoVM) z*&bI%d4%gsl9fg)an5RI>UxiyKpfbO=FKqe5fZuD8$oPFMmC5~NLnR_1kQ@S84wMg zLu z#Q2O#_U6^Szo~>*&Hle{Y5$P}hp!)KDf~Yktbg$5?^}|%$^Xey;2$sr8cxK2g@Y5V z_Nb)n=3+-`t&a_h!GneH>dBMe{mL)+@Y&7?e-lZ<1H+Y3$(*@Pb|jmQtu5H`{6?x9 zu(dU8ZPssecRO6%nZO1Nrq81i1YLa`G#td6D`;uUnZc&8aoq*n?&G-WB06H&Ih`52 zp|iEQ9k+2hxs>VM$enk3toblC3=l>iKTseZ*MUW@=Pq0bGIh*$4_CTVSJot>%x4>( zYeEdVT8xbH1A<3M^WkZe-NDj|wAI|CW_y?>pt`&{W7k~zZ7!bOT)d!H$XZXL*h|A7 z7#4hK&qp6f&vtXZOO?90;z|^!1TVsLap}Yb5LU0o?lMRr5_p5{7#VKnbEV#5Q3?Tg zKEjj3cdmPLr2|rP`{vR_(0MK#>e7>EuR(cqAY?UE%8cH|WRV0uD{WhW0)qoGoEkPT z7kLyid=q`wf)D&r+{G;@NRW#o(tQPcX<}6sTOeu9KU`H@QC$|RF8_AC_)x)PS(n7* z8I0=S^0ghOxSzq*ds}E#6EXpk`#m`Vni!t#m2_tYt8_CxgWGpmQotS;i)0Ce%Wxq#3I^Et`18yq1+o}=rk5BMWE8`=;+I$nXU>Uq=64BaJA<*S zW@t6R`HaWGnxJDP=n{^PJ)b&@V*{2mN65xNdSQaw(=CJH63>at?_l8|elN4Y1snk` zX7Rdh!Yx`0o0N9P@`RiH>7?N)XhDYZYvQ;f#zD6hgI-<~fBX1rFUtB?aLD5TSbN2X zZ1L7k0|Ty$eKP%Km1fA*_TGZ7@(>2NT0-Hci2CZ14o^Q z(sM}@Of8#>gQ)-kkN)3Z`)#jm{yEGr}w*7@BumK?ND zFh&b?!+5JAnG9yrE9{@>gUd;3AVD;it&uRwAZbp{^tZ_@tUcwuMW1=AQ+UP>T zadPN&a0+Qjj07G_mPxdO6R-@=JPnM;Rjj^D*=Y{uHq2v9oI_~!0%2T4T{(oqCmz+M zRjXY=-Z=y)o!sIrD$xiu|E?s~e~#iT7;1(86QZXVu0*)jbu{})$dRK0N(A$d5Gup4 zd0;q9EQXeUhjW~hh=XG9lW1#)?B2{}b>E2p7l#Wz_ef#=+d3#-!H@8JZ=QbV#Cz{; zH^q3T)B;u(EGltDdzZhAU5FgH7WF1%?!r2>lJRUnb>yk;UPL-axU8XT*ftQ^eYQ|Y z1O(3pad0?3D=I)AGPRv-)l|ny>P)?apdl~*QgK?xEJ(fobNjmxAy1PQQL?4R6-vFqm^(LEeBkRa$@#Uu}}-(Ukn2-kC6 ztN`En3h|fB<@1@^MS>o~mh+6kWf0e6Uxxh`!bM5F^f2!Aq&viO5`+P;e+cm4FPVN2 z`wrd<2F}jht$4b1mH_1MplX?gz32ZZLCezp&v?Vg*%V=;K zm5BuI^$pHm0}9HGBsCd_T*xDNLrnVilblAna6g_Q+&sZ*XV`;^vZ38`V>ESX4l&8Ym|=v`A!rE`nM4Oxpe6B{TXJRQ=Odk9MIbp0>ENya!kNy^Rh?B_y}8`%dJck}z2n;%lZfLpcLDoR ziWuIgncFaDIM?HXhPB#UNnlr@Veko0!xYdO!j@Yfb_aZ*3VtGb9$bD=k`o(3y_i=i^F}vnp|C}){Bla@pb_6 z&6PgaLmgz}7W10+u?4sQmSM+bE;R=(R^H3}kYnz&^WrT`bwvlTL zCWV9K3TKHP{r=uv=n7F7)IirB~`^`)#W8sRj_UR;ds%Zg3mu%_=aW^-bNu+NKh~y zv33+45Z;O-6mkBiF2*^*A*zI5f0A&j^y~#xFP*>rQ7o7b>RvYKU4tq;R#sJ9RaRDA zr4zC4H{-v=iI@#7-(2fOpM{fh)E3%x$h*PK~Y0 zZEF#Z(2_mjt05P6k3t&dx&R>PRQMG_9T_J>$V_^-Hi$zMBzmUJ|M^jEoMVtcUAUWF z$hOv2a1qY_xZWMi5Xq>8O05j}z!1mU86+jlF6k&+0c%jeE;r(o3)>ay$_22eLQG*; z`3zc#gvhP%J@vLN=d7=A$+3#EVwSh0-2GkgFPI%x_tj5Jqzz)ab_4^{CkX~Ql?^f8 zI+Qw^gPACH&v|om^`dNAov737xezF7WjQt7EuH_;wIFeg5AiDojRUFrNj9!eSqFIY zRf)HSR)A>H8F=3@_v{EHPRxld+AhU|_72HEi%;YLlyfy3CCu55p5}a2b1!@JZc>z0 z6jxVQ@t^qW#rV%VUm3S&1{YHutpGK_LhCpQHQm1t|>D_a9^#$6=!Y;aTprsEx}?P z*WjDYT<9cDGa3)x(YABWgw8PGx#_TH39qThyLwRz(XN0^Ty9}Yty2;<6Dykk-A2cDnaVMC$mKmS+%%~!+ z;E$HgfCa}q(0jvHA*Rxhdv%rt8`l7JL_2qdnJLTXojHf^{;a6t^7UkYpim-2uW$*G0)SILEf+?>)(C$u%V<#pN}zlIn7XA3q%boCPGi zCenRH*)4eJ7qvm1U9+KEW2^F#nV}s?o-L`EOpl$xQJPElskleLX89I+0@WE2KNZC_ zvGSTKC4aNtu*jU(zM)1Q!3CQOPW*yg}9F`0m@q~2ve5w=uMvPn`dOI!xo zhon}|5kUo6wZgqOGCeb?0dP^l<_KOXH@Mf)_DtBzyq23ov3ZAdq#Bed4Y6)1I-zh( zS{k2t&eTIEhK{P4Wr^#{S5nC-&S>r0iwm5j{5^AqXu`$RjFQeg0!UM8$IILZAV7=- z?~9Vr828vY&Cua83#{H;oC{_xE^LNqKY*lGC0nq1Eu8Y#z9evJ{G75mh+tXmMS}C4 zge+3NvmH|LRsnDZB{=}6GoG2SpttV4XZZ^?m7mv?#+A^Q>QJl!W7>f)#I{7@Ea^|UpQRwRoqoy7SDhEUtapt_fMQUaayI^vO%FwzW>gv@1Ht#^81eG6mc7W zWQ7b&qn`+HVv#Hu0!zX})WzT)G2~eq-HS|GSp{PYYRz9=YiTf@n2)84xE2kww{>EL97U`~(2#Jj02k zEtd6)YrVJ4VN1*5Xt>w|PU3WC;TUIxwy|TDXJ9zt7zz&TU{oBmtXFmg6*|a`VJo2= zhL(_63-~y5TU>dBV?Ks)Rm*q8Z*O3GNGcf?iKl?!D z{=d5KyZ5&~++J|}$lo0Pg$Ld__y>i5b>QFZ`+tlH|L(u)AC5m_>R!VMomY|m+S^U^ z%3X?rjCQ3xxUL7iAcYh?<^9SacX_b6cmq|}!(_#*o)*$SgP@lrWRc820hMIVN!iDE zUdBd|5H^nmtm&{KjErH;O?DNHGcvqZ(14|IQBnZbV!GAhYzEkQ;lMOr@t`7#+UGXR5YU|Ov8EOlBb$zk)SOrj1O<8HFSgr2U z@t?3zx4QT3&EprOq-M{?9k#j$Xl+-SnRR+*49c@8zP?&$bCk79tIrg)ogC z_Rxxe%yAWC)t zO13P4-3zeW^0FNA%JP~TGeZ9?{z=nizii~sq6`YD&qf+%by&QZX z$y~@u(As1Hm~vBxorE`%tao8^eG+R+uwmagx~m3b1rwrFjO3YcuwC!6&{1wg0B}C4 z)B`@qSwij=d$PIF7mORoN#+&Q>Qy;_CHWzjc54{6P{ z9=D%~_YpOtp`I53qoj%61+;gYFJQp!aBd(N5H#aTt_VeJzq^Ip;n&$6-fVEckwh#W zT=O81=)$b|+!a$j&@D2Un8GS>^fxU_zlI0~vAW3Dl@?LRs@WT5zBwL=lz@DNr7>_JhX|s* zpHt5~xQU_KB1)Nwq(OGYGowUOw;+!d^Ly3&r=3X68xp!s(*6}kozfc^M^_~^$y>QT zDg(;C;=Gk2i!KB+%(jOYM|02w;4o2*dmlAhF%Q|zUQ%9MQ&Cc8MlzFq;J=Fh4ASnA z!Yb+8rE)2``>?{g|TLp`tr&O6K5m^w(%b2z2v=uol@Ut^r$wpHyMIoy0APbhE3}5t38L zAO=tB(i#!e)l5paq9YJ~h%sH9oKrjnd}RlYuQiEN(sbLF@S5f@Qb8l|N!I>LU0n`t z41h9d)y$;R$SsP?b=D{W!xUw)D{myy(So<+<;LQ{cf@(fy%senE8K2ps4S=?>uN3D zUB5S2?o~tz9My!{?F$-NxH@)*WxX+GJwck|AmFwx2B$UlBTozCS3@ORYi3@7jHC@@ zqtJMTgsXXE9g%_NcyhUydImZwbs{yV7se3GVk);5=HtrXF_9MG&$cd+vlj2<%xyX>601_Z-jO0^M9rZ^eJ|u*TEypn@>Ie)81m<8KwcbmDs_-+KS_nD`nydd^~n#I6UQ|QwdWE9c^1`jBmVibB^+{ zuFj(pVOF?6=-Ngtxq-M`gP}fHM2npywMv#5e>baNkBycP>%q)Bd<^7~N#JG^;)3Sc z@M4qaA}BkT?aUHOmY?~O;~Ilq3=ZISl2+wc)k9iH{!_T1za0te$xhKUXOOp7(1tLn2=GH`wYN{{ zG@p@SiRk0@RAN%9)7pG`;||YsqYBs0o=aG^bv(JtyCb1z2cR+370cGGSl+kHAzxdCBR~}nJ-O-R z(oBQ5%u=1CJ&bobh7N7AUh+3~$-7vb`o0)#--?mZDD8E6Y6xYk)22KH%G(fzo3b$~L-vuVZT^`_|BY1H6rDp`4pY3pPGihS(f5A6KE72IG@QOG*DzLDzM}qgchA6^TpOnoKgn zvpvE#7dnLDn^1@X(@s&{$HF@uW;U8C^F&&oSF$1GJ)0&f#d`%Pf^96V5+?Bz4`CHy zqn5U=b+RHxu#NM)szTn1YYK@={5XW~!BEVO)6bLjVR8(5@d_xaMeQ@5$S-wk2CXvH zM$JkEC@H}j>w~hFR`6hRbqpa)mbxphQWpu8vh5}(PbUQ}KGAk>~)k3veD{iAbdck%z;QcMxRmT4c0R zEITja&q`lT1Y^X3$J6n)%z28;bmDW6zJSO>_gf#3a4_Y_pWx&b5io`Dx@n1J8ATg> zWhi}X7y=@2GShXLDdLx82kCkaHIK$JBZ!P0X*$U}dyLl}dlMr6<*ASy?v(MIgbT8<|T^TfYkmOFm4tN?0LS=6m_424>01 zu1Jfq!M!fVqmX+bfh=w$OSVToTOTCHqP&Xsz^IVJ>Uc0V!)4Ko5RB;X_8TtsYtZ$A ziJ4r;EH?cy=7aFt)1Y&@udHh0aujA;=dC=Y_NFT z93%(|HjSU5L40tBHszq86cUSuaQ0xPTx}XC!tpA}wJe0L>ANUbRa`DU6d|k$7wd#k z;Mo^Tc+z;X-=Lii3V5P5Nxs{@$N{cfr|WJhxFtEW7>wmKm12+7eKmdnw3SeGGc6Da z!Ez_bI79=pT}b{l@%U4I0&|eMhdQ@G<^DIXudFUpyWuZ!+*yRmpmsx4Y|Aj#nPJsQ z;iPD>L@=}VQgzp;6TvJa00Vh>&D^~_882W5rp2KK-?(_+|dYwF#5qXmW#-_Wr*+%z*&dc_MC(0_m z9WUIl${ zZgjD^ky~spzrbk)^`L~qxY3OkB$ZPVNTxx@aTtKLv(KfH=gflWE|?eP)hdQaF5bSp zlX80+GTZdy-7H#uJpO>iMOi^Xm3bhX-c+j{8_S6o+q;SbQITBZ<#}_=UQtYK-fB}a z|Kx66^6%r5x`T1bNmZfkKWApw<(UA0z6pb=JJot!0W0elePUTpj+s=P&Z*W__Dtk` zwSRihX3p@1`(+CCj;HU8@Eg&}3i%J38CF&L>=2$pkHJO(2nw~u#lHxK$aPGady98$mwF?N(Dz9WY>V7>=>5R`H zV}5lTTHvTfBKfWX52eBj$V_w%+6ozP)KHN? ztc!<+ETSdtg@|M8iPDzQxuq#^4dE?K7r6{sE4Ks>L3RN;ctH%ph^yU&u56<(k$1AXD;*ht!ZU<{XMLsEymrwIRpV6Iq+`_3hx_v=)RGM&p!C}{@~#M zcCh?`^ADW=`{3UEGxHSq|4D)R_x?)&K{7!;?=TbfdY1mXJE`keF_ zOBDP$Y;BaJr_54R8AMs`QXqQg6g;1tN89AMPPNvNCMB`umD>!w)mFSS9}MDlp$hYI z&}RNmJiv)@X^fO*8IDJwI(drMM{^I6QbHKV`Ei|Rs)bh1=Eok+)mq026Uc0#Dog<3 z;@MObzemgQ;?B}|Z%Ok<)*wSkV`g|!TwGR^NETQECdZ^uVyvfRC$p0|U=tCP2=<(arhhSzaJw+iYXSrQ)(ZD5Q(~*m+&2PbUkuj(uuT81*sxyatPc`FP zRul`Wk&nTlcpgHKGpWnSB^)mNYmvy3{Q5jJVieM@v+ zyC|A-_H|H|Edjd79CPN96ltr%!@AOQ#7R> zlM%B(dfLXF=m_QvCx)th5(f(>d^me1y>L~D(T>Pk5jYMYFZ?JImUuqQ%Gr3>KI1T* zpt%J)R}d*U&+&;3!5gJB zskWB8;fs-}BPjAZpadCO9%PBi4901v?x%bX{Nmq8_n}0;R{5 zj4wa(z$N4iACm3ub@ecp(r2g=GJ~1-`iWQH|KmRv@?fP;NQg==L{V1o!aeG(Ro%r4 z)e3#9C@C+gQ5+C|p7Q_uJO7S6iTP+~9e6- zXfI8&QPESUj=xGHn^$OR^WOWXc9fqbNQtvk!8U*+y$k69@uFAt)F+1iFf8yX^*#{a znKQ&AY$B+i>u{A>tSy)7ey=g&Jz$V#>x-}npTkyBVvSkc!jOrJ?ZBkq0Ll7=tWYWZ zp1$1zK*(>{lW!evG?hInRtN{V&4{>jzcjYa)Q0{u4gO{#Y>8(6M@TmnPimY}7It=mZ`)_ENrov_7*;QXm z26f~H3Fk}?-%JnJg{?Ou_l9A`@GiC6ec_>smcvzu&NjTnMpZWUFlmHQG5-LTpVn~9@)B4xs$2^agn`HW?V_N9QCj$lg9>)$v7io8UTp{Own_;V-dj=HTW-bb{^ZXr zO0D5@I;~T!gc7Zw%wa(I78dwS+gK1B>P?#ua)11NZEV_GoV+bLxRG?Yul+kl6iN&>W9))0I)29%|79!T}_C7>Fu3W!37 z>FWhm)WyVPa3Y&(gk^))m`+~jko6PxUcS3+&8{5GiXAH>1gSJuUR7TA?RO2xYIxAq z8M$dF;Yeh(&mbFvg{kWaABJctO3joJO^6aoK#|Qi(wDsjs5BAM-+}lTwL671aB~W) zxy0Oc6k3Llw#e{zKSx11fI&2nv*I-99h3^4R#8I72h8EF&~!jWZg&z&J((Fb!$QHj ziU+pzb`8%4Ec%%XbaP{fqWCEK>N-Wa64K|aZmEYxU>8AP>F^l2=ttJnG)rLqKkH=M zW#@hzfy;_jKc&31;m|)f0ykO(b*ZvgHw62SEjWRToB<;wI2$vX8#O?V24b+NqfRO` za85x-ntl5WiZbqLM;S>UrL7laC@qQA0Aev~!>d$>kmW;1Ciqa5z`PKS$8WT>giUp+ z3r)Hb=nI<+V`7HXYoZ)+-O0Mjj4p4kZ=fOi=X{u&zp1FWTcrP8&rlK_H2Z9O*fAOQ zYy``yB__14@fP>`HNt8XtU>|YmeiUsJ62OYItfbT?~BWFe_8D=-ogZ&9M}qAP(B9j z8!rfeLE1tCErKUa$G2prTpbnkXtdg3vWq9s@QOeYOjpOpA}|s2Xic$gTt*NfBlH+E z>rDvq*X!kiWK}3VQZ<%X1OCaz;9_S60{->{JxaH5K;La;$4bkJDRW*{E$F!6*FHR~ z+CWWT)P|Flgje5cb-^0|X9_4AifRKzC~_3E5)~cOw&#bn1$PAp!M<`6D2ki&eP-YW zx<1`)Tt^Q_FGnC>Hr9{T7Fd|wA6S+-GtVJ;&nQ&P4vUZt{U#WnNEw;KU@6wuR$bQA z76rf|sd_(xB!OlWPzP(MiJD@yu$m1XFpmezMZR~snYud@RITDi<_#f5i#HMP#b7ax(Zq-n*hy}Fa5tc=7n<)xF zrq14`B&-;gEE6I?fEYoIRNcpdn~21*3j7F+h=q+@WH2Zo&I-5ss4UnAa7nc@GnWQ| zaonI1S{XICBy}oEk2UAR-frcO;h>V5;wnm_m8r5x{hxhsxS$5F)8ocL+3He7bkC(- zh(OG>GdpAp^pSM*Bo(u(0g+VNU2#Tz2oT5;h07w>$LS1ICuk7N6(2DM|J7wx<%L9~ zIMB1l;_`y_IZE$%fdu)Zl8V_;1zc)SsSMC zhGP9VRnmjw=|P%*AbXyO?6EMY7{upGq2FM}%w zLc2r9<37EkF$OULBoaR6`f(Y8$6!wYVq4CH%MfyvtBR{@%4(`TRqm9XDRov{9H|;4 zapo;&hNJNIYnI!kf=%pUW&LFC4Hi(CVQWpTVgb;nv|Cpmsgg@to?}W{{#Cw z9zF8rL;vBSoeLV-|XWmOE!;J1j7dXyZi z^3GA~M<;n#Th_#GqjOg@M=Yiaq$M$m)mJ5+ddGscn=KHNvOr;c7CUQu-O=6cNASmC z4R{b=HY5nI#8uQ=v@K;sU^2CzNzV?uLcx&b&B9>u?5oHPC;ivGT>iN`1^%*jP)Y<1 z)G2a9p?<2juc<5&SE9bjBKBbYwTpjQJ0xwwYR|a37v-=E<3R;8kpY`~R20Ta&Hc7>YUNB|R(3kFR5qGC>0OjDucLpf zlD}R(({7Y*ZapPb)aRxv*DKgGncC*C^=deDg(iThu2olKBla=pwn`i%)fR(EF-Pbr zPGrmk5=|so2>6jGG%4dW4{%x$SZ}^R_p6E;v*ecC5UINw(G$5BA`n|91=k8(>yuen zYCN2#BUg`z2`AJm=Lw2A7i9yjXb*7@Yk4;pQ<=1~xT2=Is!Z_^ufBDt;0saF8HM%U zn!=F?I92L9ZY#Q+NZr^yLZ7x7Tdrr89E;Ty$I7Z}sw~y`z;`VU+v+F+5s6r&&CN9L zu%o~hGE1GTo5Jd_D~u_k6&RRtj^J~)E~B9m#@<@*);Bg9nzWUb6xWnhS5#;;^*{9| zCTAKxG&ys&KHXvo{C$ZX!%<3*wec1gQc{m3REj~9bwr?2Hbz5BXthOzw*g~VUqcE!>*hb=<*w^8gRSC=)^_m9bI(8V&7dP8IBKZY=gbv3Oi@kamLrlLJ|amm zY*z2YQtMY$r0WU_e2qcZV7Xkx8C>rv>jH)eBU%$Y#YS<6$%E9gg~Fq>d@+PcLj`<* zBv988+Z?oq@_z=16Fx>9R<5w3g7&enfgWjd+tn!9Iz6HEYwLRJXt9SQ@MO?L#vtKK z7g@udA`wX>8pY5ld}|EkwOQdU2P2V^LMK*93Z@Jfkvz%Ze6uS1>+gcI{B_(O4$e|N z$E#(+(+rH0$xVNrW)q+COiu?X{rTyQL4K56oM0j}qaYdsltc0?a-Xk{h24$x3E^FS z3v-DCuEC{zuF4sdkK~|I@_#=)9?bhLc-3#AIbdqMS(TFdX^hq8Aa~H1P-mzvrJ5>! zc5XeSPB7^BP&Zw`Qe$>|cH&XNbSon!41*JqHua_f_}sO20)qv~E4WVpSF^Chom7P_ zLAnsjdxleNOK)|tT(0JiC1qumRmPS_?tiS{K*8Vae|Wv%Zyxxc?tk;ZX5sMuFYmj& z^`A54Kg!?n&;7nif<3nHJuAvh5d(^;v@PKoQroPkI`?ZQ-+uS46Q@tSzCW`_^^{9d z)blDVts*WibA_)?Q#GWG@+#t}toJBa&xrGiqQ86QVr(m_=hA~^BE6_IR#jG6_u*>~ zAvqq~*YGPJBRa|?I&x!tFcS560?5Bz9OK9kM`s0qhUO(wP4yC9by3oS$P+|*dd}jA zEY4SArtt=e{&q`L-4IcajvJm)W~>LS z6fLtj8XcP6O=v)++o^HuTjXB#1Mb=)WyfOF!7m}RD|YaD!EgUySikPu|MVeZzaQII z|K8_002BbdHe(T)xy3uEW82dD-8n;&0aJAeuPAG4e#c=il`$K|@70|_deN9NqZ?@0 zBA;agBekSr3^k=kN1>OZ#Ob`2Z4zg~4X1-bJUwNJv<9@A+_E_=%=wFe)p~PSY+FCz z{Ro*{o>dJ80>Vd=2r+PM9>_-E7S@KZIelo*9*&pGn(YB>uz-F&I4 z_U8J;CYB~f{=x#?9W{?^^BU&u=(|6e76_Pytd;p|v-OLW zHK$ltK6j6=I~AcW&!jN3Jg+KW45F>bz3P(ByUy=p&@c$$!|P^U`*M;-RJT*ztwQp~ z((6m9)$@^;#-91w@l&Thyqn_H_c}lBrg$k;6)S0(SW-~;tv`CGpbE)U|F$F(MkhHe z>`}NOH7*5*ne7ly2VF+EfN(v>1=dHkEnzKT^*2ANRkJeHquwgGV{SNOd)0r>x-Px? zkFClgDuh?*K!uIeC)DVxQJFM(@r(&0(M?WqM^tjaY3g{p7Sd!>t|+LrOOcb-GZ_g0 zrUSLO#3BjYT@}4oK?8KMm(}92#QtR170FM^$leF^mip?FzeeTWD@#g98Y!rI^4k%C ztBk-TMW6*W)7|0{WcI)BAn*aVOCnC#W}`S8NRu*;4Q%7(KcI~{U&)*54k*vf@U879 zi-+K4u3}5NYEvhhZ#_h~ z{$u;%&x?u#XR1;WU9l$mcMz{I9KVq2?dRjjp=do#BTua@IitoPgF-%P7aM%&`nPXW zaht{1?pg#$^0(lIyXT=2u`#l=<(Pc%lRuclDF2i^1@aWgQ{YFP0(HOsdk;|o00qQg z_>-@{UUd5S2X871E2mZKNZedXpl1kL>!kvWMebW)J;I-KpzTyCbm&eK9^zTFim+;;I*{;)@Yal!J2Dl> zvdWtGk*-fG@p_e9*j@)rhao{($u6``RA-f)MpsQNrrSL1s+PI9(tNMd6??}9#A4L` zC;tDw|9JGs?Zcltu(AKG2cNy~KNduuiyw9F$dCVS3N(EE`G=@m_Sn9rFMk1D2)s== zUpol!a#1*h3fQn?^BhENs}j?VET=|EqG}16Nx@UAH_I72hhvG(xY{x5v(OQJ*g7G7 z+v8|G6^i~>7Vn8MOQacWj#4O`n)o6LcUom)H3+oaGri8LGh)@!?~a&9kU(wI=@owX zi>aI0B3^7GGkX9_t27#Fi%^RgZPd&9c#}g@>vbIgheH#>cc@MRaTRgWFP}o$a zsp;I9vf#Q}noi{qN)#FTgAf&U0bj-@gLdT^E6)wjK|`nIL?zw+atoQqMzi(?3N&H5 zNMUI;>vM+T0`OHH5|t?Mm^2Kun|Sr)tF5@Jd&%>6tlIDKYkS2{X34UuahuQ3S86m483oB)ERPE6AbO&#%W#CY1Ov(ND(Ml>S z>mGZ_+`;wx45HiFRAVOxWl3TP5FNIxV~GVYg6{(PP^#QljFUrD$Er#$voa7#`^K_q zwMz3utv6B1Z5M@P+11i}DT+7L`grRBi}q%fXdyyXfUsUwuN=J8#;|5vZn^r49J!Yv zwA^Mz=~dIge1LnOC);S}6v77xidkI^jH%uB{PR{b@t&gRE0M?XAF<#`T0w3iKNGF^ ziIs#f+k|L^59K{XBu-DL`Im=jBhQj^ET>XY-TUJ5#Uq1r{yG-Tt}t1MQ$BS$uDax2 z9drGRGpOn+HSHOHxcH1JAN(|<7D%#4S(?J$q$O&J8|mG6Ymwh=gJF){ob2y z&j`*E8N?0W{wf0ek;0~LeU8)Y$+wQbexm3Xi(Wo?>a`Q6K0H?R!pXOfzrMYInS@qX zduFwRA4vASQ@Ijm1S_)_DX@T`lvHA$vH3O<3Y*`$kZIGm>%G&Z6f`41Ubz<*>`i!W zYTyjHB{X{WeU)wOAs3qtC0j&X{*sn$RQl`=T5$GHhrL8yD5V|1J#1^HH5&jueI|IP zGN8$PZ5RO%V=Mw3aR_oaN}iMA8+B&O^vzI0+DWhG7LzOdNLxgx4qgrWdwGI}WN?gT zX35^pU4Z_qYnBQUmJ@MwQ+b>SEw=|VW5g#97D{Q=MR{b|(~Hp< zBf+43OdR>pR=)5)s$9+CHT=uk34T;UdmGgpo0C|FULC4$?-D52QbQdi=wxCIuur}F zMvm5zlMJi~4THE?Xx%mW{E5@Yi+;ye%6W`nfh{C+m!EiV4|0h*E+&pVcevm;@Z4Id zSNGh~k%7f1@oIlQ@I2)9=goLhi^P7co@P*%o_O6qIn?OA9;EV2&L zY~jNou@H4XytzU>XFI#1`1k1CMuD=>AVpG8_R-$uA@EzPeSNg-X;eIaIYv;hp*Cab zg=s=d{N(ct2ZF6Ao(~s#)G|Zco_fxy65N@j!%9GALA-F{Uh{sV4s^-v5uYl>ahwbV^3OmT+T zn?Y~iK@bk+nfPqF&ry1+_CN$_tQOv5)WcPamfEPQOmQ+EgirD^vHe{A<~k7ag0F>k ze#1uU+Bo7%j3|Af6@NkWLn3(x`6~Tk>j2x`8CTo4wOMC(Ba|X@20p%^#oeP|C~jNo zm~2(h+|80(IN)91z+Vkd|JLDx=Ma03NQr;qITf(EG!a~?_c)27@OC1cqycIZMO(M? zWm(C0yfn3DRj&fo{0^JW2;Rl9hwq7O4i7LQc`FO5u)ODL^PX!*gknt~wYyqN#yS_d;g=y>v*lf@a)T@C&%SrqPP*dBn# zwcK*LYb zz32-x5Ba0r&}zkYB`oM@l!-*5pyiLFssMG79I&}eeP+t~wFd2KL9A*7W)q-VzIXD} zajqlgD%V*AeE=mhY?wq@^+3o>4{`FHy5_RXFxg$!K}6XS>vF8eN_ZnCD_>@9g|@I~ zU05FJ0xK;V@I8=Zj|!qIFzZWQOh zk&l5Y@U!ftvr|tAZS3O$k@=?KXFp{fe?BU z&K;a$RmLJf71cV|KaIg#J2KCCr5iGA;VLO%y0U_}v27W{#*H(t(ggw2mddQAeAzg1 zSS;6D2HjUT4uC(ZG6a98l&71TPFsND)Q$7u?Hi0UbABat$)MxhGcDZ}Ix`YNMqJgG zzst%<0Be9|L@)*Lxb+`}_~Ips6X1uKJ}>U7CnOp`n|`Q`G+0##h`AmZyzni5sA}7e zsrCiyt;HK$7G4GfL1EJ@i$n%*^H~p6bVB6bDt@)bADOeX6}_oiYuTE>JQn`YHr%#K zpgckIRW&8i^`o#g?=@wgtvXWnbfk#ilRdTqeRi63#8TD&CY_N#r&f`Y952347lESR zd-JW=y%Bs=A%sz}DntzmX0iA=4a53IONMlHrw3Y7eO^3K&C+p}Y%Y&_!3_v4Mqf~a zCD0`nRpy0?y)`=AA5ju(ke^G5)c85fS#Am9P42AJh5-k%KCZmicAA>&=$cV$v*Iyv z*veKGmPYH}G(1lkkY+_FMEaGnRWCvQY>*Ik@6S*J7*^S=`x?6;PP*0M&n2rD=C$zKW z=TWzc?kmDdd2jL>d3$;YJuH*UMIU_df!3sx)FxWu)E1>SR&i@&sL`3M^@EOaX)_Z1 z>i$9-S9(JoGbOCeL64yi|LgY#RRYu_Dx`z)wULw!O@|QJIK^Z&S(~`e*Nb5)56Q?E zL3t+sc!V(5Z5_Ep?kpC(wLDf%)8-Dh)#At!7)+|yQg$Vx2eBu_unn6lR0kKLB;K5$ zT*DM?8JMDvK*N-X>o@~M4Wg57zmx8m$Kh8*TqHgL`iT~$E>Zepf5!%Ax8 z>~%1eA36M+1rP4uEI9Pa!TAGE?%#a4>4D?^-;cXCm!E&00(lDLDUheYk2(eF{_vk# z+l9L_Z*s8)`Meu^QGeIGo45YZn_BEnyZK6#sGCo^`9UV##EX9a5IKv5_expJQvQdO zuoyr2jl%`spjPMi6%6&;FaGw6((=cf)UmPgOs4;8QEKF-vV(5jDf;^HQ>TkdcScCj zJ!hOE0A`2~46ra6&@RD{0(X&Z#~0GKZhJPB)c#KHnv-rlHjCrRE z!60x)TFv97Th$VFTIp3E6aE#WeO|04Rz;7I`=9txmy-GM=PB?* zqd?vFUbE^5d#5;mB|^b+PW*g=^A94yIa=|3{QpDx-vg8PHUH4KAphbYUkWt*%uhaq z^X##Gdw9>b<@4nIXFq=av&TO5P{A|ej=z-yZ5y-XU1&chF0|)<;vrmUkL~+dA6kwf z9?W~u{^5Jk8ovI?e3F_cspWG;{?@r7_w;imVxM>j$LwSK_Vmo=M8v_oZ#M6n{fFS2 zZ8(1PA(ETO)%{OoH|1EjFrVL)&u=2rsfhYFC8fv8D~f?9E35X(eBzrU2PVk>?f6m@ptxEU(;5cTv#FLXGU*#L9V45jp!|FDcX0p7a*wCMIWyenpK2w& z3C{Sdk6J(4x=)E0sY#t72y%JZ*)iJ)rrwBb^_Lx?rp7D<6Pzo&+QU=7YcZo8su!Eo zqVXtZueDvh7$r=S9cCTT2zP_y2>A1rXAY|F9&dp*?)~yeHXfLZ-(!-Np1)_pS7p`K z^t0*tWik4|mQyD!@iUKDukhqIlt}%=*Is%0nQy#&tmw%TAD(>Y^`fV~bL!+fCp{W9 z3ShL7XC3K=`CulY6(F{HKEZNP!(8E^mV!sLq3So2qelQ+l%1-0St0|Ypk@ktEKg84 zBuc7gc7w}I9OAt2^`{8u&DF{9oMx|HX}fSG6`!T?&-N%|?jkbscVB`?QOyHt6YmP* zBmbKkVWk!2L^<4wk?Ptl%RcAL3(u@MH#}wV_MOzs_ zdX{n(${Qwhp7hwa-u&JPRW;(@gj8n>4@Df3pw5GOpTSG2XGGBO_!S}$S(?AB?cpc# zjG74LWjIHD+re^VGBW2^p7HG}z<}UT3zO8V=6jjDSkk(8N9nzU2lrjf^mnOhIHf{+ zRSEpAEbM#6N8clSzM$ZNb3fGcDF5<21@aWgQ(y-L;<2Aq7m0oG$E|$$*wtWYU|Zqv z1L%_JNz!qqQzNP&Qt<>b69$$P{HA(vtudg`W=J!cdPEmx#?hmt}C5hWuN(|Pa{cXmJ*{Yt)_@iwyl}( zmG8dXlb#*t{Hl5)wLIz1x@$svRzs+)jzZhFO{k>0I95p+`--|>`j1poIH|kUITi)g+*Q?8#M|X^qVw73w z2nSYEZG&X=$TnEL5OjJy{&sTAvQl{OtefhsnpS3QmC#mzT~}ICQ&tKI4}76uXEEpc z?>v6Epo*rmg&LxeiseZPrKrEk^~oU75UfT`(29Hk+!jK)N35zKq1iE%NAg-sj(@Zw;i^s8HXp6kXaUN5)&5Dz~gn$QYWr z6%G$#?|Gc2(k^eTd)sF}aiTZS0Xq>f_ZSgsp|@J1+6r%%>&lwz)UjTMX;&9SzYqKFPnI7+}}%7*M;;R#&N z^Ra5^B8#<*If~WIU8?DmoJ%#*mQ0zBZ+`zcHKX1;e){C8_xUF|Skw}VX1A@?+4hR$ z<@ZRss=2$z5ocCS8CH5l{EMGQad@OK{uwQGrgtM48w9?>q*guhuS5$>H9lcl)OPA^ z$^Bi#wNm&h)C>&k<92l8x!hb(z((pqd}sL~qZ&c9qq;j0e;h+=``DvGTH#`cMC&oed4& zwUX#gSE*$|HZ}c#@B-L@mM!T@EptOa1z8UCQ9_f0Av3xhEK`(resd8o0Hys@ zk)2b^PDP4!cHraSdaCt#?T!d#wo}AyRE`-PFf)ssfqpjfgm82m6-DPeJ>V!qhhd#9 z%BIX~st*ocRs%&lA@QDYjo)jYmzK!QL1mKOHlDVY}18 z@Kw~yidxp&s1f0?YnRl9&ssjJ&PF#t`5fu#>Dd)p0CMkkf6DfAd+T)G<=Fk0bDQ4o z^!1FDSHz$F1q^+3j6c%a$czUtA)9RqI{V3*@$NO68|qpc#XMES-d6(Bc=JhB zS{YL%NpCtO57SIUan0Onaj2N$27Vxvtv+gWghQ&#;L0*e$QCc{p2=2Ch3wf=fwokE z_qwL;4?gD_$i15kWs~{xErxdc|36MSsR9qGh*gyw+5fK!4&3*dg8Tpb1ONW$(8K@k zNbljr`#w|nx&3$c-}w;`a`_?teNv$Q^G}#bny{+oNaS!~JX|`b)IEAw^j$&7`e{<+ zqwwOKa$i$+wY^2|Ka%&Fy0I(~d$L%TC-A*V%9xi^4y_3_ox>Z)ExO)hzn3Bjx)wH< zucw-qQ_ZTH9Nd{t)h+VM$R=xBPBqnYy#%NG>apsn(P||=RO@42-dBA)tNQVhfL4ha zdF0RMz)5cmjbgwsn; zrf3(ZffZe;#y*oTcy=JwXX1UGcIKj7t`;zX1VLQ>?jp0%=o7Z5^R}vFmpvKd9Jck!4&10z2xb`6Hl+<; zZh0WI9~yijGdwEmWDUq^NJ5W>Y@17Feki;Y4+n=fS4Y$m1sYfrNM9>id)anwe5J>k zHLmp^y#lb|mt|HOQkTueZTIRZu?DETm?i|AYFQTTnuS|*|p$6}d9C zTUhuMIkQL5b`1o6D!6(fm{=j~!iSZubE^XWGOl~aLE|Z3;|^)C1Fcxx`z+J|eF zV%cg|NdMT*B-eZY2gt1`3AZv^`jpk2A2~!-AEu438~+DGOj87Sc!t?RS1qFeoGE(> z1VY_vG%3)ijbKp>d*pT2oq4T^2j^I|bkPfeXa?m!CXb@GBJO`qrap zQeQuQ`qZ1RefJCRDRuccRh+h0by5HkWvUD<6BklV+tgCuSdf7lL0UU1H=#UE%4tGr zC=!^}relSELW|tx4iptNqX9BP$$Fl`!CKszb$Sf)gk3IqF>CU+pf4&qXRnvv-*i5e zHX;@w`#H~{Suw&^cTwJtKpE45z0S73BDgq}nxuJh8}S>u?CexnYrR%cliO5%iGk^J z0;6beLYb@NTv$6q!%beQtpy;pam`COahaF>qWY7jU@|5`E9ox)G}uCrQ9HkN@5V62 z?BQf>)Y%o^4g^)f9TMr;T2*f!f9*w;T!U5aQTS-P%-pGO@=e`0s=Q-|Yn92XL4rkL z6P+Pzeus_3ZUF^_`?Xr^QYwR650tQ}&I2i6W(Ml*5Lmz54^qJU#V~Yl)Zqa@7z^p< zWgbPtl<<~1>@r)yn=QnWWcz$j6l)xDV8;pYV|_wfMg%%ke2TZj*^uA8hO`r;rkI;^99$t2r;oim;5?1?tdK8ImG=9=;W6X!ZmsuZpV(W-GeNYy_YzukeEd1_B5N zXjb`6a1F_h9I(QR?8J!9lWn)ClZ-{mN)@Y0 zZOPHc#W3Eys&{-BfvX-b*|X{$(rBmGyYv{Hiz{deTUr(Wg&HGp{F5TE4pR>0`FZNF zI)NihUSW$ki8@=^BEeZ}VB--S1i_jztTV~<9uaB$rj7vzMaa~?qQ(j(E7E}Mf2loHP z!H2)}&DGdX|w!LsARgpja6iB{-cUooLHIq##s`A-vU!df_kSMwGgs z4Upy(B6TX&qEw?B{Wn8rhC+;%f_IDDeUN=V8 zrFz0rRTfUVr1jMM=H1PZY95bm1!L?s`|t5h;>1lZ z$n=kSw*w+^n273gx5qK`1S@QG*-v+{AqX_R(WMVPt;ZDmuz8YCG+M{wd9R^9K6k^> zTf-3=cMZrwY`mp`jf{t@o$1l>)T;7ma^?o>#~>|RY?^%s+o|`%MIe6`Uac5KpDV5S zhIt5W8L<{KGp(n ztGN8eC_t_lI(}i-Lqw|aiJ-e!b0cb-*$E4JjQ&3TQF0QX=^VUQ}9jQZC z1ZH{2pn%?Z7E!}VOP<_T=;H1Tv<1H2^$o{D{qH?}xZn|>()W}__B_?hZ4+ffoWLh2 zXOB-FtJxaMhS%3+L(m-{ov#PGu496QNL}I0(8Oxq)xLv5^ z+Msqfu@lxU!%+xc3T7f9Y-TSH5!hb~T-vTS2N;CbD230F0BnSyy_fES_D=zG)P@)2 zKQ<|sk-6G~Mfn$aqa&ly8_kFAX;^-~_~$Gu%MFUm?D*E%iN|Uf+q$!2e|js|of%l3 zAGntjzG_cfns2nYFFxf>Dt<>N>C4aj?lUhGJ^kW~FTHGQ92I+2GC;PAfP8z2pX0|qwomDg$5kq!P|euZ70$1kt5!WE*?jT*whbBc;;Px70}XRk`3stN zc>$E=F;HWzu>(rm0g`0=cw@rAe?MJ}xgf;j9eQOh#mr`J5|3dOSjOLlz{S$7x@n6XvQ}=#AHVNvCo(y{{kt#(*To~ncw6i51WNtc6 zk6a!;V9_Z8iW{dOFt|{WT6Khp`JXjc?&(l;-Zz3ykX)$uq|f`g;^0Z_ z!DoG2GHdjds->7%6`(F*_sM$H->bJ7KXF*_YmNU=P<*}Z*Y13B)v-bV+ry};x=Kuo=~QDHN2Ka>y39rH*puq2_O}86MGCTZf8(2+jA(62 zRlTXdt+@Ip;miv80+^V7(|$z7C?_jo4&XK5^Agx_qehM|6(?fg$-m_~Hi{WgmO$PS z)Ch~jx1#$QgrMCf#<^Doaz$SjQ0z@0rSbq@+KT8m*ZA4rRvcIor>v|8#0)_7fyEk| zv$htGnp=yLNfZ0}aM-=#rz<{kRyCTJ#lg+#gG~kRwN|YR2|IgvfnHY(N zA5nA)Lx6n_VuJ6-5qsXd$<&{;U!+%c-#}Jm24jv3#ysZp|ob0V1K}(-t*X%&z)5 zDR*4v8%GgnPgK_)c@vjmk^S zpZwg90b$yQ5@3ngNp@Y+kgBOVgw>BdNt=-HVNh@0dTkeV5-wl6dF`{Sw{G3}PUXcb zziPgD=a;veT_&t_6hVY;)xH7C`3GxroWAYC)U=XNNmDJ@A65~03mqGV!R1Wbc(X@W zrSF;q>>`xz@NG;QFWe0SE-J|nW&TBvSl8C`gipG4o35@jeRfq3N-m&EUO`D}Q-)lD zRRL-9PeB6Jw=?kHH7za&9W|UYw36}e7>b`fr=@uJt$-N17midOijO;lZUx*dD1|mT z9d=GQMTyeT6pc>UMZYQ%2B1Tb+?Yn@tU@8Td1O;--cMB#1LE6Ti&@He8|)1S|JsI{ zx-WlH=lgV8|7pJ-U^Gv?d-C2{ZSFyCkX6BwB!88bXN8wp-T7yvQh8}A<5Yg+U91sl zvI%$l8MI=DGN#aZ(gWig)a27CR^(57XBtIh!3AR0VI}Ajp_+4oUMWi=!r4TJnFxt@ zx>v+y%%pDLAyG;&24y*=@O2$a)HHO=@r;2#U9g>)PqMEZelD|x>2PbyFI$FjMqy88 zDsua!--mqCoAHlW))<6&Nem=Ogx(*Y4ZB~Wbdf3o(jW{Ai61T!-9srAn!}siUQ&Xl zdbr*S_ts&=yy>Jz#ut`DBW7LT(M$JnNrsMem(0xZCJMaVkVl`wvPF7`rF--7`!i!< ze;051M|oOPMU8FRQD7??ewln9o+T(Ciz7lGTUzL8Iha=2tYXV+WT|3X7WS09yq_IJ z%)%||;Mp4Qgb#Y*cZo$cgUb}zZdgA2CO8@9YoxCI_poN%yr>QSUPNY&rBRig=Rz1A zEk3wQX}f4fo^naeumTzcL0C(fsBr<)a z8=J1Ya>aL{GMQ3kxYR~n^WT2(sv8>dZmw^*kRs^jh>^0UN?v_9-6L*r;5z>ys570b z|CSEi#SedY`QitafA_r)J}B3#ok9<#hLH`qzPE9Gyr9CKGa{D66&c*=(J7En!?sQB za34j>hTRDt3X9ez`B7A0%LG4Eic~{lCHWcalpiN`-bY7tD6z&Hl)@PbcRJY()NXZX z{yolH%P&5c@#rlsL}vrA!=uAZ!~N{ce)fKxam2tgecI{`immrQ;vGg<+}l0K4CsVd zj-aFR@t1<8P0#B0O+}GojEuThQ=03J9ylz14|9 zG9tR?f%6haci_p882uOkvrXkaUiO<6=c;f~CGTD6aNH=C4M0HFDLk6f-|IOS)_Igl zAzApIuq3tB{2$&2jE14Rir|17^LG@QHqM0NM&{y56BJ;^dax@hra8KIG?YWVOu{E5 z*1$-tz-O^<9=AcM+0S*@brc`<7bb?o@kg2%D96+v92XGhPu<5>{c!zC zU!^GBYyYCRqCP96leBWxH+~Jth7>`@v|)ka&O?36Kp?bY%?o{CcsZUIE^J^{kTOL{ z@lWh}&7*jIlcS6is!DmPj3HBIx!e=$@DAouM9#Dg(~cVF*GGx^FmOp!Xfl!0ZY(SS z?T$|rW?oZBRjq8O^sjxDqt!fwg?A*yd~ulteefx;8ZLWjzlhw$^UjO{4nwH9-HZuo z#ut!%B`IwgZ`t@PLW;QLBZL>RIQ9HOiFb~1m@3Ma9C`=a)m~lSSW|btE>&G$7KeKD zNkdgF9OmrT{`N%0sq3fCe&hH5{;Su|wx4M^{nw|ipS<_AAM3(@^XJV9yjg)aEAW4@ z0v$gIh$d+`SJ8V-PFLS;y7`03OSe%xzgc9ZYj1DO-D? zb%F2}niN{@b0N{EUvfMW(?=M6AVVFmq3Y6A?9@0qCDCSGSF&UPzn-a;P3#p;G;z?;%_kBoor``R#Yhi@`5uQT zSTU|KK5_Y9e{hTT{s!t~gx!OXi^;)*%!Jl`9q40NNWPVuW+-alcN6z1#y(AVz9-ze z7w+c5>_Z>2+qt|`%>$dUh4>&j2+Ke*+FT_F(_tc-;F78p3d}q@_Tq+-gu)kW0X+J{ z7XV8z%7gA=b3nzYDmd7-i{bkI`*&H>tq3uD(V7T(sA7N*YCU#U^y-V>T5{NLYJ*4fNMLh_f5Ue!t%8g#U zgPbYpW_64{vBUz}cqbk*#0wBg1b%_UVW6mX2tzqS(0$t^ky|c<4HPU1ILjI!GUdXd z6}7SKiE#)NB9=o}1Fy74OGB)Z$dKvDn?9D8qH$?_SO8rS0RcUxlBDVztJ3Gm9YyAn zqsq$Rlj_vny5O&@=v#;RtQJ=%^1)!f^?tr}A>T5SZ(Yj=Xsu83!Q*_;mv2F~4g9Q^ zVuLMjgciuomc;SZ*Mw~`spRxCcucntA5Qwwh~lQ;0sFZP>b}XA&B~%47$W1En-<3e z_b8JA<$`vT10h|Iipu6-EP^ptdyKj6h5=KZ;ZVVRp~}sw*k?-jDE?xd5HV zg+O|vXEb6?r)IQFY_rZ8z%>!h(X)x@^H=_+o?2){I5P!S?7t+ZCh%24z41rU{Xboc(X7! z7;cNN(C0@VHx~EC4mwZ}x(?cUdFtcW;$Y=8TbkI?z+8zcQpdvrE;Od8kXJ<%?;)!0 z2}Y79H5Xd11b_L?iJzXUX#275h2LB*5U3{YmQbgj*y?!jd>Bh3GjX(p@qPN~9R|nD z6Hq%&tm+lO5z}YQ{{Uu=Ycfj!>d{Fu8<`{6>2eK6k7kJzgd@rXN1sx5Ht$O>y2eT0#|BLqo zV92C}mSYYAm=u|bfEUwSldH(1*P~ZcMfpTz!U?yQN<-)UWSFsMjZ#v@2%n@c=91qrU27)V1TC0xcxV@q4 zi#c>;b$#5wM;?J_>N(Kk!6WP@F>eHiEv)4j3b1GD{W9Nc28CjjQaZfqG>MoFwI+K~ z3#+R;pQ^8~PuE`${`3rq@+!V<9^%~(!WXUle9>^xv3vW!>|^O#rAvUN);AnE1NDuy zoPnD2RSi|C`c&}U;4kn}V{N{r&k12_UlYb*r79tKS&_Ea6n@(|67Fsv@ltn-rI`EH zjJ+zukM`CYI3%vSZgkx*45_a(vg<%3(a>JBnhQrKbi>;YfANylG*+|2>2yuQv9N_| za>;SV8<-zSV)%3N_gr}U9sfJ{R`6$*moPY|9lhLim1x21N6DT0pEdX7*3PCl-QpNK zk|%YpEn?2?VXCKDF`I>Hn(u@3U9m`S-W~^VG)g_}0Cd{+ktevjYFGSK#i20I%-L=T3Hb z2EEK`biXwpEQXtM&Z_*;)#l3YU%T1#i^`9in?AdB(`3cd$vufS?A4!j0S9GJ~h{i293Kcaf_(BICA)HpwICFSrPGCUqCFMbQ#Xo zTM41NuL%03mF@}@gw;{y6~GT*u4g}sLDOLT#Z?u>-swIV-3(uh9gM6OmwOEH?vfik zQaw(ReK{AZW4l0a7v715U>N~Z>wxTlfZR!z4s+TgoiA=j<8sH9dWA7=Anr;&RcjBW zT5jWlKxqo06ugG!RhS5<`XGM=H+bTt0h&#L3dE4%ZE{6Ci%O*5 z6x74s$R%yJ7xfj_c$7wF>vjTPBZnMVWfTx|?v!UtWPT;M7e@o+d@!tHC2((783yi3 z<|L~x0$aIEhR>3~|Elv?5bNv8WzN`}sfHlaR8_h@__qLm&iBq$v@~cTF5dp6>1K0$ zU@DJRWXEC#3daUGa3bn4EuC3t%1;+XMi$AbM^;dPSqs@|+fo4t;E?T}a%)r6e?QE2 zbMUk{+grjTtd$c7o)j1)=~Jt;LUw{a5FCgP1whij71p4kPoJDA$JI`WIOpr?YOAq- z9I>tfSj122FSPw6Ag#j>&sB7p+L;e_^1*aIn9R54^1-nFZt1n(;HwZr6_w5trJ^A7 zqhXaW3uz|iaU+Jp2$?u$p}k$8AWZ?sA3QQF+FpUI2H!ZOh1n1nXyyX6p+^>VaWJxm zey)b*j>M9>ekLY@RlTpZ!?e=1q0)&J@Q(3mFaI- zt$4)xs8U7T7s0bW6Uxxw9>E}5`#BOKFSJqn(TW(P;UA!1p0XUUPq7^Go`Sd#n&65t zos`WSRtha@C-^0q5VkTz=h*59ailrNTTBI}wW$0-zAjpQz>KX$T&BX=4lIG;sDRNp z`k{9%Y+L8M7&bq<^^042K#0d+N0bwc#&E%3We|iYS~Et7~f;{x=-wPwLVQt!IPp zkrL?Lio5@0TrQX|=DNk)O4oW^gk*IxCP&LD>s-cvqmm=LuWSWW?nA>wJKwfc$mF$9 zZjK(!#<2z*+XvUcVhb-fSqz1MV8OPOuO&ZJ?FGoYr{twuof&uVCJ1PTnkQzLo;4gb zNdVBjM8tzIw*F3X2^1ba##={+Bug5aEC4~6F}9Qa2n$+ zw>>nt37XeUV@|t8RDN!!J?w^ zNeMRQqXtPu_f#{9-=OvCJmV#7h8H{hN>hN0;mCC#695nZu^J>{LTNL z&(VWZxEPC<=&~mCz;E395K>PNHZ6~~e6;z-jT`jKOOkm?GL?^2MhG+MXqv$W{4r?; j0;Yb=iHFZSQ691Xmxz*N2X*ze7s{$C9D7nD52OD9$LBjn literal 0 HcmV?d00001 diff --git a/routes/media.ts b/routes/media.ts new file mode 100644 index 0000000..d680d5b --- /dev/null +++ b/routes/media.ts @@ -0,0 +1,151 @@ +import { Hono } from 'hono' +import { db } from '../db/index.ts' +import type { JwtVariables } from 'hono/jwt' + +const media = new Hono<{ Variables: JwtVariables }>() + +// 获取所有媒体记录 +media.get('/list', async (c) => { + try { + const mediaList = await db.prepare('SELECT * FROM media').all() + return c.json({ + code: 0, + data: mediaList, + message: 'Success' + }) + } catch (error: any) { + return c.json({ code: 1, data: {}, message: error.message }, 500) + } +}) + +// 创建新的媒体记录 +media.post('/create', async (c) => { + try { + const data = await c.req.json() + const { title, type, rating, notes, platform, date } = data + + const result = await db.prepare(` + INSERT INTO media (title, type, rating, notes, platform, date, created_at, updated_at) + VALUES (?, ?, ?, ?, ?, ?, datetime('now'), datetime('now')) + `).run(title, type, rating, notes, platform, date) + + const newMedia = await db.prepare('SELECT * FROM media WHERE id = ?').get(result.lastInsertRowid) + + return c.json({ + code: 0, + data: newMedia, + message: 'Created successfully' + }, 201) + } catch (error: any) { + return c.json({ code: 2, data: {}, message: error.message }, 500) + } +}) + +// 更新媒体记录 +media.put('/updateById/:id', async (c) => { + try { + const id = c.req.param('id') + const data = await c.req.json() + const { title, type, rating, notes, platform, date } = data + + await db.prepare(` + UPDATE media + SET title = ?, type = ?, rating = ?, notes = ?, platform = ?, date = ?, updated_at = datetime('now') + WHERE id = ? + `).run(title, type, rating, notes, platform, date, id) + + const updatedMedia = await db.prepare('SELECT * FROM media WHERE id = ?').get(id) + + if (!updatedMedia) { + return c.json({ code: 1, data: {}, message: 'Media not found' }, 404) + } + + return c.json({ + code: 0, + data: updatedMedia, + message: 'Updated successfully' + }) + } catch (error: any) { + return c.json({ code: 2, data: {}, message: error.message }, 500) + } +}) + +// 删除媒体记录 +media.delete('/deleteById/:id', async (c) => { + try { + const id = c.req.param('id') + await db.prepare('DELETE FROM media WHERE id = ?').run(id) + return c.json({ code: 0, data: {}, message: 'Deleted successfully' }) + } catch (error: any) { + return c.json({ code: 2, data: {}, message: error.message }, 500) + } +}) + +// 分页查询媒体记录 +media.get('/page', async (c) => { + try { + const type = c.req.query('type') + const currentPage = parseInt(c.req.query('currentPage') || '1') + const pageSize = parseInt(c.req.query('pageSize') || '10') + const title = c.req.query('title') || '' + const startDate = c.req.query('startDate') + const endDate = c.req.query('endDate') + const sortBy = c.req.query('sortBy') || 'date' + const sortType = c.req.query('sortType') || 'desc' + + if (!type) { + return c.json({ code: 1, data: {}, message: 'Type is required' }, 400) + } + + let query = 'SELECT * FROM media WHERE type = ?' + const params = [type] + + if (title) { + query += ' AND title LIKE ?' + params.push(`%${title}%`) + } + if (startDate) { + query += ' AND date >= ?' + params.push(startDate) + } + if (endDate) { + query += ' AND date <= ?' + params.push(endDate) + } + + // 添加排序 + if (sortBy === 'date') { + query += ` ORDER BY date ${sortType.toUpperCase()}` + } else if (sortBy === 'score') { + query += ` ORDER BY rating ${sortType.toUpperCase()}` + } + + // 添加分页 + const offset = (currentPage - 1) * pageSize + query += ' LIMIT ? OFFSET ?' + params.push(pageSize.toString(), offset.toString()) + + // 获取总数 + const countQuery = query.replace('SELECT *', 'SELECT COUNT(*) as total') + const totalResult = await db.prepare(countQuery).get(...params.slice(0, -2)) + const total = totalResult?.total || 0 + + // 获取分页数据 + const mediaList = await db.prepare(query).all(...params) + + return c.json({ + code: 0, + data: { + list: mediaList, + total, + currentPage, + pageSize + }, + message: 'Success' + }) + } catch (error: any) { + return c.json({ code: 1, data: {}, message: error.message }, 500) + } +}) + +export default media diff --git a/routes/user.ts b/routes/user.ts new file mode 100644 index 0000000..0763c8f --- /dev/null +++ b/routes/user.ts @@ -0,0 +1,40 @@ +/* + * @Date: 2025-06-11 17:57:58 + * @LastEditors: 陈子健 + * @LastEditTime: 2025-06-13 13:50:14 + * @FilePath: /my-score/honoback/routes/user.ts + */ +import { Hono } from 'hono' +import { sign } from 'hono/jwt' +import type { JwtVariables } from 'hono/jwt' +import { db } from '../db/index.ts' + +const user = new Hono<{ Variables: JwtVariables }>() + +const AUTH_SECRET = 'it-is-a-secret' + +// 登录路由 +user.post('/login', async (c) => { + console.log(c.req.json(), 111) + const { username, password } = await c.req.json() + + // 从数据库验证用户 + const user = await db.prepare('SELECT * FROM users WHERE username = ? AND password = ?') + .get(username, password) + + if (user) { + const token = await sign({ username: user.username }, AUTH_SECRET) + return c.json({ + code: 200, + data: { token }, + message: '登录成功' + }) + } + + return c.json({ + code: 401, + message: '用户名或密码错误' + }, 401) +}) + +export default user