From dba4c55322a1cbacafcab92a36dcf8be8765e9d5 Mon Sep 17 00:00:00 2001 From: seaislee1209 Date: Thu, 12 Feb 2026 14:48:09 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E5=A8=A3=E8=AF=B2=E5=A7=9E=20.gitigno?= =?UTF-8?q?re=20=E5=A8=93=E5=91=AF=E6=82=8A=E7=BC=82=E6=92=B3=E7=93=A8?= =?UTF-8?q?=E9=8F=82=E5=9B=A6=E6=AC=A2=E9=8D=9C=E5=B1=BE=E6=9A=9F=E9=8E=B9?= =?UTF-8?q?=EE=86=BC=E7=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .gitignore | 20 ++++++++++++++++++ backend/__pycache__/auth.cpython-310.pyc | Bin 2811 -> 0 bytes .../__pycache__/calculations.cpython-310.pyc | Bin 6155 -> 0 bytes backend/__pycache__/config.cpython-310.pyc | Bin 419 -> 0 bytes backend/__pycache__/database.cpython-310.pyc | Bin 685 -> 0 bytes backend/__pycache__/main.cpython-310.pyc | Bin 2305 -> 0 bytes backend/__pycache__/models.cpython-310.pyc | Bin 7976 -> 0 bytes backend/__pycache__/schemas.cpython-310.pyc | Bin 8310 -> 0 bytes backend/airlabs.db | Bin 90112 -> 0 bytes backend/auth.py | 7 +++--- .../__pycache__/__init__.cpython-310.pyc | Bin 139 -> 0 bytes .../routers/__pycache__/auth.cpython-310.pyc | Bin 1602 -> 0 bytes .../routers/__pycache__/costs.cpython-310.pyc | Bin 5416 -> 0 bytes .../__pycache__/dashboard.cpython-310.pyc | Bin 4190 -> 0 bytes .../__pycache__/projects.cpython-310.pyc | Bin 4859 -> 0 bytes .../__pycache__/submissions.cpython-310.pyc | Bin 5074 -> 0 bytes .../routers/__pycache__/users.cpython-310.pyc | Bin 2889 -> 0 bytes backend/routers/auth.py | 2 +- frontend/.vscode/extensions.json | 3 --- frontend/src/api/index.js | 7 ++++-- frontend/src/router/index.js | 7 +++++- frontend/src/stores/auth.js | 8 ++++++- 22 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 .gitignore delete mode 100644 backend/__pycache__/auth.cpython-310.pyc delete mode 100644 backend/__pycache__/calculations.cpython-310.pyc delete mode 100644 backend/__pycache__/config.cpython-310.pyc delete mode 100644 backend/__pycache__/database.cpython-310.pyc delete mode 100644 backend/__pycache__/main.cpython-310.pyc delete mode 100644 backend/__pycache__/models.cpython-310.pyc delete mode 100644 backend/__pycache__/schemas.cpython-310.pyc delete mode 100644 backend/airlabs.db delete mode 100644 backend/routers/__pycache__/__init__.cpython-310.pyc delete mode 100644 backend/routers/__pycache__/auth.cpython-310.pyc delete mode 100644 backend/routers/__pycache__/costs.cpython-310.pyc delete mode 100644 backend/routers/__pycache__/dashboard.cpython-310.pyc delete mode 100644 backend/routers/__pycache__/projects.cpython-310.pyc delete mode 100644 backend/routers/__pycache__/submissions.cpython-310.pyc delete mode 100644 backend/routers/__pycache__/users.cpython-310.pyc delete mode 100644 frontend/.vscode/extensions.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f499fd1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# Python +__pycache__/ +*.pyc +*.pyo +*.db + +# Node +node_modules/ +frontend/dist/ + +# IDE +.vscode/ +.idea/ + +# OS +.DS_Store +Thumbs.db + +# Env +.env diff --git a/backend/__pycache__/auth.cpython-310.pyc b/backend/__pycache__/auth.cpython-310.pyc deleted file mode 100644 index 472fea6fb64bc96b192cb40e73a912b38f9350c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2811 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 diff --git a/backend/__pycache__/config.cpython-310.pyc b/backend/__pycache__/config.cpython-310.pyc deleted file mode 100644 index ec6d96a6c013860923ff3bea5173bff836cc3188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419 zcmYjNy-vbV6u$id3IRtJ7Y7%HLSoc`7-NMSAV49#CCUxSP3gU20b6W~3G9w+JOFOG z_y8upNLOPBui)gZ#>A7HFW+}g&aaotWdOIaw{nmGz(*|po6N-p_u!ZV1sG6)ic3)`L^D!pLdU|?fdJFYoJHjs%C1J z8iJ%}w3hkce(Hp*Tq>1{CCl-r)-Wj2VU$6zVnCBLVSo7-S7*LAW_G9s%=THRPS`@V zZ!LGkRL6~zbZ&=^=i)>i9i5yyn*;#6JRe$6q7)(2vk8erFNl&O7Bct27kSQ?IN-F_ zs&$NpS#RTgtx|yq5wp{TI)T^Sh5<>tq4!LPaQ>=eG#h%2RJA@LU1*SYM>p#)z*pj4 zF?=0X%LC2vTl|uP?(fEfp=D2)O9!^+-Z-P;Y!NAEcYNO|JLm5Q!5#-0C_+}sO0pme Giu4U?*>dUt diff --git a/backend/__pycache__/database.cpython-310.pyc b/backend/__pycache__/database.cpython-310.pyc deleted file mode 100644 index aec53ff42e49771b9b97ff6c0fefe2afd82e2005..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 685 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 diff --git a/backend/__pycache__/schemas.cpython-310.pyc b/backend/__pycache__/schemas.cpython-310.pyc deleted file mode 100644 index 1f288d7cb551e886baa82b4c9935760398fd10dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8310 zcmb_hS+E>c8J>OL?vj-NR|tWN8eGZ^BPN6bDZ?a^L~$z8_MOwYX)-f?Io$&l%d#lJ zD#1!A1u7+!$^#Vm5ao$tdGOsQt9&}XDfb3^_096Z@B6!ZdR7URx#=_K>vMWJ|MLC+ z`P-}4D=GYY#k=fUH>6U3Cm8>i12~Gqe<+2Zs6U5mw@-Ey})|~F9YvW`+@fh zUID&N9RNNccoq11bp!AXf_DMmsMdhj1n&m^n7Rr0Cc%4vZ&n9^4+`E3e2Y2+d`R#< z;9J#gz_$tBuhvhe)^8u)2^pWdr0hZ9cGq@({)e5*S9V@|dHdHtS^L`)&*T5vu~YZ2 zz5n|+ci#Bn9ox@c-hTV}o!`E@{q9eUI}dou>6!e!uG3RE zS30>BxZc3-ncNB24{#=@?7%T4wt?Gsy1aP&Ul!mf4j%@Qa#Ec%^qx7Ja8xTjTnJ#R{u#gmq0Dwfsv)Ud~X z&9WXH+P!Eb>j&C2Ez2GZyuju=`f! zrRCh>7rz&?XJ1@i8XAgUUVd{}1iV!G1@w!Zf>VS>OX!!exQeNqh3<}P2X>(;KTT>d zInicy>jF&6+SJ}~Ye>27{P<_v&%R)C+Uq$Q+>kPjzBdRi^e$Px-Lv(j_Ihct2=?*z z`*~IVe9yCkx#HN3amvc4OsL23ua<^bIJQ_U4`VbDi%NH3x=wyy$|)!sZn}eoN0_=z zcS<8nF{L|Y;EK%83$6m!1XFZrh^rWi>+BZYsIB+liFz-aWNBsBx9o1mdF?qSZj-%J3FkYC8bDd0TTFTX|nk`TmvAkUIhhJ13Wa)gv0QTUUYPDPBXZi+Onlf%GdToqc^ zJdstD?ZSe(9=L!@Z<|V23{qKkFtZ+--BBF>q%+0qp|({98p?jJ5k2$pac^+m-8|EN zJvXI?PV>C>`nY$X-Hl=3`11_W6vFF2%|}sZCD@|A1)cTk)crKI5qi1!yXcVYqD9w5 z_ITmE$LJd|a0rJ_<4){7w)<9kIU{ps7W$Tfdh+I z)M-o!*-iy>t1`C?o6mM?z#|kS8i*@qzG_Th30M$+HvA%b}W zO9EQ63;xk?ILq#H?yS=#6ugcX4OJovyPZ&U^-1=~Z~8Esc`SV^2EKs9CtZhXY9Yi> zP2zeSU#y}l7)?|}V;xb?|4vOIwFxyrO*yA7R0Vb7{*4ip(N)u(CU8r}sn&F7X@udr zz{{iStHf}m+DOe4Y zbM&X!$U_o^$&*BDqsN7+qoXd?-yIme8%N}3F=-~hpijJ+Jp%b|ubRoagK_0GHj9jrMxHiId!FAx!H5-B(z)g8x6S&oB zjmDP*FOBfB;N=ls5xg?Ot3u~d1`Rr2Re4y%9#e@NAB?WoAdWBqj#SkaU72d+`%EG9 zq;;6pz}A~ifE+4-dH4>zSNUQyI?2H)9Qm7)!~rMnOX#ZWy?iuZl6eHd#@B@Q#L zGWED0Mw2qO9Tz41m>Pou;|#O%Fi&mG#F*qvWK?Zaz2FVCZ~0p^sIo6s2U9gw<@jCg z%9hGhqw@?uv(aWs^LIgvVaO4sf0ghk8*)*|Tk~w}OBiKXpGpcs-7(@|bHh1{_4g`9 z6a9hV{~r-2OpcR?6XG!9)Dc0#h!jQ~MxYRf5hsa2WI3cH)OQqV#`GKqn=j-2^$|8- zVIy)(q<4(xM1;rDLtb&g9&9=ml1ASftS?Qwqufk#u_PIoy7!cNCLgd^QTO2SkKcksfBl-UV*N&0@^0c)j6!109OziG{Lb2p2YfH$0Z>|6PhT&dJc?ySr5KWwkk`qF% z4_TimJizq4Vn!5MoIHxd@1R+1fWp+=7SbTY?E~|g5!1(8h&W&2hFOe=EWoUxY+A?e zKjV45+uL%O7Bf;jxLsOfYCYfo!)kH zn?1JeRt4E!hxsENoAMva7cpMJ_B-6Ffl(*6-!)Z`_*qXRA3LBvf!EOwuxYbl-q4;9 zE3&MOOZpTCX^k@roAIHEhg_o%y}{cbV#BOvR&R+9i3X>XCwjXES2>M)zlvijjKwn#D5J&70}CceKAnTC94Gy(op66mb|%X*OtN@dGAmGqk4&TMBt8+Upy9#5yp;72c{bDi&6Xx^+!E@XhGszm=v1*L+pt(MTYZokF%KaCXTTJT*xU1WgJ^9 ztnXuVjECF_h&bS7bqMw%}BkQY|vZ3DJ&>Ui|)> zc)hk3S%?_K{?Fj#M=am)~VU#PHaF#2!fQGdiSVf3K}!)gU0 z0_QB&BSX|2J;sbhy)Ys~j0NUT3W3ZG$@)dJOxr&Bn4`6;oTyTCA8s7xQo`d+FB*<& zH*HghGPufO`H0<$1)t;HlIS|mmOGg8XB<(fG~Nwiug{Ui5_krqi3FHE(5iu3BMcq~UK(L$ z$TeZ|);+d=VZ*bvIz8<7QD`5sM!x-{*S6ny;=Ol%_x{VTU48L|@C#D7-)V+5Xe-(y z`DQt)oPpkxb8+#$XK#2~3b1B1K4-hw`XEfRENgbfXD1RbbHILV6JeOu+h`NT5Y7X6 zI6el2H9^$#;@$Y*qC40$E#C=(-q@S8*Qc{6Q?xAQbuCLjjD?O>SS`ZuvJoS&+1p@4 zZED4a!CXJc#$j`w%{=S)4hH^;Bl46Sc2&tAJqC8dIg9P&ZH!LZ33okGPA}j$^pbp( zH_=P*RTMhSBPnN}w!u0N`;srgX4og&t7W9ykNE=i<=+3{MOYMuUviSxvN)x zx%12`+s{5Du}MqzDzzSF0H!i#Gqnj@84F@!JNQDzVh{UCHNz~U&Kp>hMVkX81Q?AP z;sXjQyc45sDejpn#?QNf)$@GcGy})(Th96OZr61N-An7cr-@?|?>c5Z!mcjQiS=-g ztuM0S$C2dibf0j*<}e#!8IQd!Hi?1FGph@j@(&#T8k$Nf7bWJ2X@$MWz&N|Tex2rv z!egSZ!8!w|vpiQo<_o6@-$9-%`vc*@5@%6q@@Y)I|H#JzeJjtgo+)J>sTIgRRQ3Xr zuxchg63`_Y2qB8KYrfGue=(&a;YZxNXaGLTuetc^Q@)jN6>BDKRC2m_W%F@ diff --git a/backend/airlabs.db b/backend/airlabs.db deleted file mode 100644 index 91408df6080fb63ad6a36ccb15ede3e233e7d3fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90112 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≪YAtz;L!U)%r(8*Q~YEm$4d=G4Kgjx)CM;F2H z+T|lFk|V!qkgJw2s7RLoTGp#xZ?t!H5!asJ^vaj<|F%e!%IB)cR6W2|3`iB^l7%MJ zB^FDp(5x<(v|Z7BA|)BjVR0o(g#wnQy2SauRgj`Yq!P{XyC%8Oozet=VT#Ic;KOrwW_0k~Q@679rgURGS+8^p8PWon1wWu%OS%vzjHWDf00e-*2Z_MNc686$MO?A*!<6d0EWVIti@Cy@ zWOm4B9+VGY6pzE>qU{Cc`wsp4jCPlcxY{C{GV&g_A9p}9=-FPbGC&vYT;sNMav_nO zuYE(QTpSnOzLX4{a~bYtQ-XSY3RPKrM>We_#CHx9O8(#h3m!F#Z;neUDH-%uOO)?} zRx2+#tTL`d15u0P3P~F6fm6hl2Y983ZvlxHIFMdy744I&rq+&?Nn5RAPC<=ZZ-KQC zVG*S|+2vXt)f00e*l5C8%|K$!si{$H63{`)mE$ZOIF(QBg>5Wm*&gncGEXZ zKI2b~D@L>7tA?SLpR}yBwClgAKcoAV?wanX_Pg3Ju|-@a?3y?BjL=*!sUghW-A7FX zq3QH=yIUqB;nCPgG!PC|w|pV=lX{#*(?P#))F0V;?KSu97q4#IcxUta8ylZ`b?b%i z57AC~u-{4dI|unK7fm?_AEn)oI)~;StoSkCk)MN;HT|6AtvfyZme|h&jjE5Ax9&W_ zZ;AaJYgBy%T28l;pPok5N1)}TmHgb_sQL)BoGv9l-HobGg_f(|t>}kpRDCM6kRPW) zeLjAa^V6Yp{Y3FA2kzj?shq#7pBAnmki;d-W5a=jJuFf6#v5eL9BT!O~T=!J`@DX3V zKB9;(uTP!GW#5q>zS&XFBKK1#avjhUYHU*xCjRJU7Ky=tmk!u8YNkAE^83HgFZ2`+R6m9HJDpDGVFTtXC9 zj0Q{XqE_nqP(5$tX?1Txz*Gzki~D$ICPGu+*@xAAsfULpQjD=~#p+>Hj}c34e8tdc zt$xMoQB)5Ui#Fa_BPgl|i>20vQdEx^OIE&O4WXzWHc}SOS;tZHc8ZdLNF5cb2Mxwt z@q#-KnJ^??>gi8CW=xxq8{$Amr^#f}bh*3TTGUDTCxbrp)A=d%9xwhv+E{;O^Tul% zFTb+&&YO5jvi0h_{1{EKkDWH|$}TOoE3~<&Z=U_6z8os&sCX!R@p0bK(rUn|9jDdo%{wFX?wrzW%L$6nE%t>=FI<*pQgR*}rp*75pQgD#{XL!kBl~+g|3~)sbpDT&)Rg%@ z^3#<0Kl0O*`9Jd0l=(mM)0Fu?^3#<0Kl0O*`9Jd0l=(mHZRY%+_BL_;PkWm;|3?*T z-uxdqYu@}HQEb}$A62Y*^MB;5dGmkT+l=`??QP2ZpZ4y}{2$rfllecgt1|yrxnJQD z-&YV;QACsCSPP!DitmFc-Uhk#%4cq^zj^EC4>xXp5#0vyY^^`TPvsRB`)F@WzZg`kg6;XenIQTxh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o2DH#VW=zv&bhg zsaPSPC_gJTxg;hjF*!RmFD0fZzqBN^s5mA*J~J<~BtBlRpz;=nO>TZlX-=vg$edy( IAi=@_0K51erT_o{ diff --git a/backend/routers/__pycache__/auth.cpython-310.pyc b/backend/routers/__pycache__/auth.cpython-310.pyc deleted file mode 100644 index 851f5329550d7c9728552fa8a139354958903f52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1602 zcmY*Z&1)n@6z{73n(xVXB4kBGaA(zIm-QqfMibeX#!2pR87*e-P4n*>bMiK zhZvE)40;HHu!k&&=*6H2IePPtsHUcd4iH-2Nh+@@@tO&FgUHu=D6Oyw0w z=JMAcFHa9I&rUCne|rIQtKsP4!rJnBmMbo_zsP&M%cQQ}+t^rJdeq`Q6=z-TNfoJF zHi-5ga47)-)7$1MWKFP~P02;W)|LC&cHCX(yE&IiyBpa<-qk)XuI38X>w8?p?S9yc zr2H}yOpmt&j}#B1Rtv(0%4`_HxUF0W-c?}^oA-VTYBiaaAHRFRH- zV0G+=6lTsd>oGl`Vp_R?c?Y!PA5rtq?K|P-%EIQx zz18*QU};eoV+mbV@gCP>R~~o6FILw-TV7mTS`k&;N@Lb=#2AJe$GL-d(5|`bFP3;0 zuzzkXezdg^i~CVizO^Q@4sWTgX4C>=u`OXpE4PpsbG^QHP5<%YvIc6Fj*%MiKt@Q3 zhz3CW_B>=*xlXPY0sPfKy9{DDu>pp%pyvdHA|I3k+GXU3icz#WUKerK;J(3cz}&yW zeXt84MUWCm8F*2I?%ONc-HVc(H;UpNI7Hk4r5#iKau4du!)?f|ryY?cT-Va9t9Fup zD5E42eO+R}g+4F?y7V^gEDc`~3nSI22)zI6u;P96@F8fVln@`_;(Ms(P|c&djS2&a zJD?gw+(H|xKU6ot8b0=vPlGL|KvC)t{AS=AS`P7Eio3A1(s)DrVaT#p7;3*A0h4>N zz^5l{RIj;HleAwRU!!%AWMwGDqQ=8o6WGl`lU3m?N-dBQ(I8c2Mgjx|Fn=9?fBq(&?D JEUA=c$-f0ax`_Y) diff --git a/backend/routers/__pycache__/costs.cpython-310.pyc b/backend/routers/__pycache__/costs.cpython-310.pyc deleted file mode 100644 index f3ee76a0277f0ae51aab4a6ac04d36684c67b55d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5416 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 diff --git a/backend/routers/__pycache__/dashboard.cpython-310.pyc b/backend/routers/__pycache__/dashboard.cpython-310.pyc deleted file mode 100644 index d10805cf2c65e9ca8154ab40339acf52a63ec3d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4190 zcmZ`+-ESMm5x>1V-W@+hQIsf3vL%1Uv>OWr`T-P%8`l<61FkJdN(>xa5GU?QI_i$3 z_LjEg9#NxA(IS9?1Wiz*Hc+uZ0k=Ti=BX+2(wF`d`x?uRfxZU_V!JbYq(1D1#O>|Q z&d$uv%>HJtna!pY_+4vldDq7j=j+6dmFlA2#hwMYaVf%0}ZBGX?_DpcZK0*{%r74CA!2uA^8j6!aw4k z++AbPA{~`$-jHj?UR?uvPQg>@YEsw1wIw<(*Pf>3MWr&)9tRIU{`{|B_8vaHe{bf@ z%+t?*_w>>4zx?OlpML!5Gni8(~RWc~ntrGv+pUwT((L z%-v{v%&js|R53)U=J>U0E7n&HUCwlu=MrmX*mtv3!80Lb6;mDN(SyaLDgMZ@oJvisBPZSXPuVUF6@ua}DL+4PL+vCxsVEtxR@6>9N=MdB!qy^dJ0GQcgv53ZOFM__ zg(xX4837A2Q3m+TC{r)~Q0bT(7o`=W+he>`AMeFGE7i-=4t&RUO!So2FR9+i?sBK= zlYQ=2tOn~RslKlFv~67V2UwLG>{Qy*=Z8M-ZVGG~;)f`S^e8c|)DKfqQo3p<&!?lD zqz`q~NhQip0(b#^cva~XA{BhF*cst7(Fp7g`HN9;`v^@?y{C3YfqJwv7LB1D>wC1>z(nauzg%g8>ye*C!zNSHM=T%j=lP+hKlc~6peu_ z)MTM1UWvxL1ZIwXNZ1HJjlC`b`AM33ki;htY_J zqe4`UCh7QtB*0_2JqqV!=hqK+KE1mOl21PQ$CIr`&!8wN0B9O@Hdmo5e+-GD#GBml zt0BS|=Pm_=sWkyJpHZAm+;sf5D^fAaFhIzwm84KTD)fdExFR#aC62(BhtVnnWUaPb zK#vBubKGHwaDAcn@N0V5G1Qat!fNxT%P1%-yCHxusGHH1n+?kf8Wq^Zc z&-qON*6=)ZV%{ZyO>N!X6ee@QFHjgx!a@O_id}%fE`}gdoH;dKb%JIaN5WjSFF$hE|-kA)F z89G(GQUHHDU^(P62H|1g4Mt_R5 zjuUoju+H)9%%Bg6655%5dLkQ)Zo$xeY5bP(|!=uWsVuM!7oUiCHI_~DYF#EfGHQKqj zehseO?|}qaDJD!E9G)Vq1(a`f+ukMlfXC2#_(+c-oN%Z-eLoQSnG^4I=l-9b-TUK{ zPk#IKgWtrZyh2zR_$%5g_WxhA_q2ZmYh>+7nQR04S1V_PS*_A$ty&f43VcMs4W401 zU}%?gl*ok}K74$vxxwbyCJR^sW<+X_$P8qiN2-NK8^4_-z%neQlIAQsaB!12Gy({c zAI9jJ#+3-+5_=^~O7LcRqzxm#?zH(D!;cC!0*#%)Pmi|m;B_FBL6n%t;B#DIC2a8X zP7cKz{dS;&^Wzm;M z-Z}@yw|)0KUKqkF(CA80p2|G5r$}C(Avwd+3^haa7jULts%qwi)i3}L^yl$deW7ZZ O=T^qhiU(-<=l=tKN!G{! diff --git a/backend/routers/__pycache__/projects.cpython-310.pyc b/backend/routers/__pycache__/projects.cpython-310.pyc deleted file mode 100644 index 330608ef8023c57a74f2d0e9e958120e8ae5e5d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4859 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 diff --git a/backend/routers/__pycache__/submissions.cpython-310.pyc b/backend/routers/__pycache__/submissions.cpython-310.pyc deleted file mode 100644 index 530a0d07e08f998ac94b429bd3f1c7eebf9a6525..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5074 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 diff --git a/backend/routers/__pycache__/users.cpython-310.pyc b/backend/routers/__pycache__/users.cpython-310.pyc deleted file mode 100644 index 7234d282c659e6fc8bdb704131adf9126d14cca0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2889 zcmah~&u`qu73K`NB$vxwt=219mTg5zf1ry1au6gzlQ?dTSZxCsvLM+lK)4{NosmR^ zT&`z^sg#^QJ6QQX5NZgM(1TSc{^(7v(aqci8@B-XQ%RR)XnFj zxqLpFCl;ry&Vn7n8izDG%|afsChu%Jti@*TIMD(>y?2JSxz9UiEH-;cxy^$y0Xff` zdy6p6!ZH1g+Jxb^Y@C2OCAHxX|7eKI8)?b@OM}udlD(?(?Bai$RZQ zZ<9+|LFZ~J6{y@Du41+Y9-JEzjD3_FMaFfozMDw?Q&E&dm<>?>zTk<18N@e+46%p! zTB%@38(sBFA^1SWC8%{1JnY89M9NM#Nr4Mq>^5PN$~*FH+JlK1MGrcC>|=|Pfn?HJh@Vx;0743&29 zaJrQj1GSs&$1=$hv9AM`r0~@*q|)_N#z|kLA3-GhCZa4(R4)`wIDnW(aT>(}2F0YGXkN4Hht)%}U zq{dCyDP)SgX`;U}+}906u_|Jiz-`DD2ueb-06!mo?!Uw<=#^Z6q-hB*hs6NSoEMB| znzAh&9%sH!VeRCx0XQ%WNk0HEvhG`o9FhA}kv;pqb7TRo9a#qyo6H?+M6Xz5Vgi4H zZFGu`Hetvvh#heCOZR{P>rk)1p||K}b$AE`?iSLBuDoWVVq#K>mtjT+7c(e;evuC^ zVE`ri?phx&q1Gg?T)CJP{Uno@08EzlTwS|Wa0{s~4^HEMnjqc=Fe1l;2-#|XNFj_6 zOwm=4^Nce4kbX)OR)eivklq-vuS|ZAiE6-CXmm~H9J&WK_-u{rBSO&o%#mf@?MkC& zN6<%sl-gQ)7wYanK!*%{X^;|fy0=bD_>%}Fze zu{D?!uQGd@)V+@A!SSj9yW437iCWp#wo@UMz(|N05Za$OtNh@VRXM98ntB9A7}G9r zou^8B&{iOQcdG<(#06aYj4TJqdY-FBRi-8{mSMfb!aL`Ngc1j80|!d?>%jL(09d>W z3!uY&V#+FI2ip4<^>O=?rv?DO4XM8eFrp_(olttzM%rdMq3BeFxvMJ!MX;#L!3Lp#BmGrm299H~`*Fe{6KjTom0g9@ty@|-shpnxm%8+KLGNhTdW;)sramm{# zOeNREMZ_oB67QgHc`8h0H%fCe8M5AjDT(uoo&(JcsR_(`f{{2w*dLcvYBc^zh- zFSsc;_Q*cT4HTOx74aUJ^}PQR3v)cDI^Hx7|Le(oykIepu7O{P-C)thV?n3mv!Wlz+S^W`42P+}#wM_nn8@pvyp<(cf0yU`D}~4frl5A!{xBWv2p2zmxYv^{ zxX^@W=1hy1rXGdi2r1K^L?4M1c>M~zzs>cfoupK|0&fpfqoR$A-RizEOlliWp=;NE zv9`LQgUuW3s~bQ6VDs9BcCW5pzOuSe^*?6_H>If}Z4XPO?R207a%4_=jPhmF8Q%Si zu+uW*mmo7O$v`+(7ovl|uKBfS$8HBM?GooHCG_8vhEGG^wL{`OslMq`YKKq4IoAQ* VH_vqR33bA6!UflMPpoY}`45kuwBi5& diff --git a/backend/routers/auth.py b/backend/routers/auth.py index 8ee2375..887fbee 100644 --- a/backend/routers/auth.py +++ b/backend/routers/auth.py @@ -16,7 +16,7 @@ def login(req: LoginRequest, db: Session = Depends(get_db)): raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="用户名或密码错误") if not user.is_active: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="账号已停用") - token = create_access_token(data={"sub": user.id}) + token = create_access_token(data={"sub": str(user.id)}) return {"access_token": token, "token_type": "bearer"} diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json deleted file mode 100644 index a7cea0b..0000000 --- a/frontend/.vscode/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["Vue.volar"] -} diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 3ab61a7..7d7a6fd 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -22,9 +22,12 @@ api.interceptors.response.use( err => { const msg = err.response?.data?.detail || '请求失败' if (err.response?.status === 401) { + const isOnLogin = window.location.pathname === '/login' localStorage.removeItem('token') - router.push('/login') - ElMessage.error('登录已过期,请重新登录') + if (!isOnLogin) { + router.push('/login') + ElMessage.error('登录已过期,请重新登录') + } } else { ElMessage.error(msg) } diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index bdc8b60..ca6b2ae 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -27,7 +27,12 @@ const router = createRouter({ router.beforeEach(async (to, from, next) => { const token = localStorage.getItem('token') if (to.meta.public) { - next() + // 已登录时访问登录页,直接跳首页 + if (to.path === '/login' && token) { + next('/') + } else { + next() + } } else if (!token) { next('/login') } else { diff --git a/frontend/src/stores/auth.js b/frontend/src/stores/auth.js index e97d866..ad10cf6 100644 --- a/frontend/src/stores/auth.js +++ b/frontend/src/stores/auth.js @@ -10,10 +10,16 @@ export const useAuthStore = defineStore('auth', () => { const res = await authApi.login({ username, password }) token.value = res.access_token localStorage.setItem('token', res.access_token) - await fetchUser() + // 登录后立即获取用户信息,失败不影响登录流程 + try { + user.value = await authApi.me() + } catch (e) { + console.error('fetchUser after login failed:', e) + } } async function fetchUser() { + if (!token.value) return try { user.value = await authApi.me() } catch {