From 98721b7587e047fb5f000bcb6c470e719b9574ba Mon Sep 17 00:00:00 2001 From: Lan Date: Sun, 9 Feb 2025 23:33:43 +0800 Subject: [PATCH] =?UTF-8?q?feat:=202023=E4=B8=BB=E9=A2=98=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=96=B0=E7=99=BB=E5=BD=95=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/admin/dependencies.py | 27 +++++++++++------- apps/admin/services.py | 2 ++ core/settings.py | 5 ++++ .../public/assets/logo_small.png | Bin fcb-fronted/public/logo_small.png | Bin 42793 -> 0 bytes fcb-fronted/src/stores/adminData.ts | 4 ++- fcb-fronted/src/utils/request.ts | 3 +- fcb-fronted/src/views/Admin/AdminView.vue | 17 ++++++----- ...View-BKOAIqPG.js => AboutView-C7hzxtgM.js} | 2 +- themes/2023/assets/AdminView-B-o88PWR.js | 1 + themes/2023/assets/AdminView-BWfXdK1g.js | 1 - ...e_type_script_setup_true_lang-ltPxer0O.js} | 2 +- ...eView-Dux7n3Yt.js => FileView-BtjtHAxi.js} | 2 +- ...eView-BkILh4cO.js => HomeView-Bu388OX8.js} | 2 +- ...View-Jxm08CRX.js => LocalView-8QbVv3kT.js} | 2 +- ...dView-DI2GPu7d.js => SendView-DPZ0t7Gz.js} | 2 +- ...ew-DEdS8CkH.js => SettingView-CroJu_zD.js} | 2 +- ...one-DVo3TrM4.js => _baseClone-DRpC8OZL.js} | 2 +- ...{config-BSb8DhnL.js => config-BobZadUT.js} | 2 +- ...tton-CDy8odqo.js => el-button-CIFg-IwZ.js} | 2 +- ...m-j_Zdsgc5.js => el-form-item-_5R7KEC5.js} | 2 +- ...pper-CiRxPHiQ.js => el-popper-CwdMC8HJ.js} | 2 +- ...lect-FOPt9abY.js => el-select-DUuFevCN.js} | 2 +- ...{el-tag-C9LjjnJo.js => el-tag-CbTkcEh6.js} | 2 +- .../{index-BdLVKrzu.js => index-CVeK0dPI.js} | 6 ++-- .../{vnode-BBhHGWD5.js => vnode-D5ByjH_G.js} | 2 +- themes/2023/index.html | 2 +- 27 files changed, 59 insertions(+), 39 deletions(-) rename themes/2023/assets/logo_small.png.png => fcb-fronted/public/assets/logo_small.png (100%) delete mode 100644 fcb-fronted/public/logo_small.png rename themes/2023/assets/{AboutView-BKOAIqPG.js => AboutView-C7hzxtgM.js} (84%) create mode 100644 themes/2023/assets/AdminView-B-o88PWR.js delete mode 100644 themes/2023/assets/AdminView-BWfXdK1g.js rename themes/2023/assets/{CardTools.vue_vue_type_script_setup_true_lang-CrXTRNrq.js => CardTools.vue_vue_type_script_setup_true_lang-ltPxer0O.js} (99%) rename themes/2023/assets/{FileView-Dux7n3Yt.js => FileView-BtjtHAxi.js} (99%) rename themes/2023/assets/{HomeView-BkILh4cO.js => HomeView-Bu388OX8.js} (98%) rename themes/2023/assets/{LocalView-Jxm08CRX.js => LocalView-8QbVv3kT.js} (94%) rename themes/2023/assets/{SendView-DI2GPu7d.js => SendView-DPZ0t7Gz.js} (97%) rename themes/2023/assets/{SettingView-DEdS8CkH.js => SettingView-CroJu_zD.js} (96%) rename themes/2023/assets/{_baseClone-DVo3TrM4.js => _baseClone-DRpC8OZL.js} (94%) rename themes/2023/assets/{config-BSb8DhnL.js => config-BobZadUT.js} (97%) rename themes/2023/assets/{el-button-CDy8odqo.js => el-button-CIFg-IwZ.js} (99%) rename themes/2023/assets/{el-form-item-j_Zdsgc5.js => el-form-item-_5R7KEC5.js} (99%) rename themes/2023/assets/{el-popper-CiRxPHiQ.js => el-popper-CwdMC8HJ.js} (99%) rename themes/2023/assets/{el-select-FOPt9abY.js => el-select-DUuFevCN.js} (99%) rename themes/2023/assets/{el-tag-C9LjjnJo.js => el-tag-CbTkcEh6.js} (94%) rename themes/2023/assets/{index-BdLVKrzu.js => index-CVeK0dPI.js} (98%) rename themes/2023/assets/{vnode-BBhHGWD5.js => vnode-D5ByjH_G.js} (91%) diff --git a/apps/admin/dependencies.py b/apps/admin/dependencies.py index ae0b807..b935ce5 100644 --- a/apps/admin/dependencies.py +++ b/apps/admin/dependencies.py @@ -11,6 +11,7 @@ import time from core.settings import settings from apps.admin.services import FileService, ConfigService, LocalFileService + def create_token(data: dict, expires_in: int = 3600 * 24) -> str: """ 创建JWT token @@ -22,16 +23,17 @@ def create_token(data: dict, expires_in: int = 3600 * 24) -> str: **data, "exp": int(time.time()) + expires_in }).encode()).decode() - + signature = hmac.new( settings.admin_token.encode(), f"{header}.{payload}".encode(), 'sha256' ).digest() signature = base64.b64encode(signature).decode() - + return f"{header}.{payload}.{signature}" + def verify_token(token: str) -> dict: """ 验证JWT token @@ -40,7 +42,7 @@ def verify_token(token: str) -> dict: """ try: header_b64, payload_b64, signature_b64 = token.split('.') - + # 验证签名 expected_signature = hmac.new( settings.admin_token.encode(), @@ -48,21 +50,22 @@ def verify_token(token: str) -> dict: 'sha256' ).digest() expected_signature_b64 = base64.b64encode(expected_signature).decode() - + if signature_b64 != expected_signature_b64: raise ValueError("无效的签名") - + # 解码payload payload = json.loads(base64.b64decode(payload_b64)) - + # 检查是否过期 if payload.get("exp", 0) < time.time(): raise ValueError("token已过期") - + return payload except Exception as e: raise ValueError(f"token验证失败: {str(e)}") + async def admin_required(authorization: str = Header(default=None), request: Request = None): """ 验证管理员权限 @@ -71,9 +74,12 @@ async def admin_required(authorization: str = Header(default=None), request: Req if not authorization or not authorization.startswith("Bearer "): is_admin = False else: - token = authorization.split(" ")[1] - payload = verify_token(token) - is_admin = payload.get("is_admin", False) + try: + token = authorization.split(" ")[1] + payload = verify_token(token) + is_admin = payload.get("is_admin", False) + except ValueError as e: + is_admin = False if request.url.path.startswith('/share/'): if not settings.openUpload and not is_admin: @@ -85,6 +91,7 @@ async def admin_required(authorization: str = Header(default=None), request: Req except ValueError as e: raise HTTPException(status_code=401, detail=str(e)) + async def get_file_service(): return FileService() diff --git a/apps/admin/services.py b/apps/admin/services.py index 821dcb9..133c54c 100644 --- a/apps/admin/services.py +++ b/apps/admin/services.py @@ -90,6 +90,8 @@ class ConfigService: class LocalFileService: async def list_files(self): files = [] + if not os.path.exists(data_root / 'local'): + os.makedirs(data_root / 'local') for file in os.listdir(data_root / 'local'): files.append(LocalFileClass(file)) return files diff --git a/core/settings.py b/core/settings.py index a9353df..c66177d 100644 --- a/core/settings.py +++ b/core/settings.py @@ -35,6 +35,11 @@ DEFAULT_CONFIG = { 'onedrive_password': '', 'onedrive_root_path': 'filebox_storage', 'onedrive_proxy': 0, + 'webdav_hostname': '', + 'webdav_username': '', + 'webdav_password': '', + 'webdav_root_path': 'filebox_storage', + 'webdav_proxy': 0, 'admin_token': 'FileCodeBox2023', 'openUpload': 1, 'uploadSize': 1024 * 1024 * 10, diff --git a/themes/2023/assets/logo_small.png.png b/fcb-fronted/public/assets/logo_small.png similarity index 100% rename from themes/2023/assets/logo_small.png.png rename to fcb-fronted/public/assets/logo_small.png diff --git a/fcb-fronted/public/logo_small.png b/fcb-fronted/public/logo_small.png deleted file mode 100644 index b09e0f054ff634623b488a4a4f247cf59c3efde6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42793 zcmb@tbyyui(l30@!QI^<1b2dKaCdiy5Zv9}-Q9w_yAwiicXto2m+bEQ?tc5+``ir&E3#?XY`)ynoS3c%ya^+8&hI2sVUT79>6;Bw_9{f7kC2mP1LKuY`%5l2g2 zQgs=5Vj&xQ6Jj=cMtVk4K3HO6Vjg>AQ!Yhe(SN}|?s!Sf9UX1C7#Lh!TE zXyRb=-RWpyw_A^+DqE_n-Alke)n7FH(K4u5@NVq|3GVfeph{Wny|=DUr(lC6P} z3EzjMe?b0&_21I}Fr@MSHuN7^|AO)`{H^c*sQ-U9u77YpS{ENI55xbqR6f|?FWet* zvH(CrSWwv&ck0K*xBe zp8u-k<_^Owy-Py}#R8TR5XmYcRB5BR6<{2yCUM^~QpG4y0A`GvqbRT;9kz@M`+zig zZGiQ)QdS46AN_KVJfS(e(NS=gyn@%e+Bt1zEKZyGe=Hk@kaSH&K zib&V9be$uIb^h@8i<0LPpyp<%RROUYUoT4sXmflpl5&_YKbaD@+d!zx?$ebBfXUyx zYqwuaHe!fWT6fV?xz$QKG*aTIh72;TA<2-eUIxtF3SXwGVlYk2mmW$A(t+g zK1UDJB3w4U^UjhS{6TMA`!t^Nd#E3-ZjzHa-Wt_i`vgK@rY zQ1*yM3S0qf-P8=^KO35VHq>TRtrCVhWt43k3KyI}>Q8n?-f0B;{S*qip>IVv^saB^^#~m<4sgqT<(6N^ic_3>B1KoM;^7dkr?tX+7hwuj3;>)_1?0r{oY!y z^1Ava9#95;+EQ(ZL9JdiRe0dGr^G<{<7hzWoFVf$IuKi-!O%8%<;s8#bKCtm(Kd7+ ziMF~*trI2(l(2E7I34>-P|MbBxe{5U8cH7l_-DVDrmLz}P{IjPV6tiSvR^RrC)e~@ z6n2f(>{%aQI{SVG0(HUWg~EnU0i=v|aB?Hm^9s5qv!l;Ll!^;m2nZICAyk>H%iXz| zGcx%uM2}5y%+FmD0pC_4n6<8*HiMDF;nU_C_`n2_zcHDekv98hEWFVfg0*TcHWuk*equ6+JRyh zhli4k;^5WfM7X0EYQw(s8d3<=6sK^h5a;YiMe`!G{ZN^1??O!Y~lO| z8XPiQo#sYh(189S?X-~VA1cg4F3;9D)LW1{*{$cu#CJKYr)Y`1|b;>k!m;D;(onE*3B@mT_-lZ&-8P1 z%Tp<%s`eomrzT8pG3ClJe5X#wFW1a~buibj2?7u_5^UD7$Lm#mu6}kHCG@1HH8eRr zgWS}DiR~1e|Gh(g$WKXei)AoZV*L#h0v*5>p>3d>Sqo)Ye#aJ9(%qjV2>fB`V16~( z9jIY+wo<%bBA*Y#DDCS#njIR%4LcOiH%W73ukf=x&C*~z77H7os7`S?VXfVaTaAYj zR+mzzbfv>hSr6N$)QV_X$qVd+I1EEs^$B7oL*4s z3;H@rh(>rgM{XzjRP;?jw2OQOOqvLij3ts#5xLS&RaW1wB`47&N(EmvKWc>n0Q!nXkPqO2chA;`QB@t|LgA5wF(#l7GXkeEpe4H$eB<{UZX5IaZIwwhH89Y4#@kA4I81ucDMa>)+43<#ez(S zHF~-XyODB&FIJ#rLQjx>A_~x!;b$4zD#DTOsMf1&=EDuyuIUBtmAVt(tzy8#0H@%` zchNVPVfVVS%i9>V9(tK7(Wmyt;wB{~d6*~@d@pN(lB}KkC^jAP7Fy?4p&SPJ@u)=u z%2b@zpXSt$oe5#B3rdUQxzu<7IrZFEP-+Oelk)Qp zaXl0wI-!nts-C*SeU0H2s2M!jOf?+qF#KOy7N8MVBrApqRN5C(Z3|FBwwmg*B-L#W zmqiJ*Yh3RFy0vI9F(1#a4FqaW@-$n}UfW@@Lqc(zwd|W!@~yrc=2iC53h~3)PKa&R zMF*hlKM&=;!;JGL2~d);Vsrd<$enVgzTMqip1WxlY+;ApiwnSUoO)NA&D@Q|TUO0m z6Qh~t3+tOvPRjl0K+I*p_DAk89Xc-1^q(_x@56gwxhCB(&yLsZd8dWMo)k5Ht^s(6 zv>AsCdMUUKb)p7OYtVR!nJoL{rn{oZ#ioKWUGp(0zY}@BvvsPfPRbe&;dO{r|?njJWA@PJ&M7Un?^1lmKdl~a9@~NeS@4G(;e$pcPxa7;Ye@>U;MT!nqdd&x}^@Vejx~+CLXmKr~hHJd=6r~0-M1#Z6G=`?i z&)XbV-W;|iZVSMN#phEmk5ee@t9B;)LI+htC$@;W$~v8=V^h|n9vg>bi*lsyWm~z0 zt;Ph|19gvU8>e#q#eV+M?8S}^FKRpif~F3^ZVDNXnA%5_Y=cMK;XpOtPHDpG*rmbJ z{S9Lm=wb%?5!zGxjnPovY*?qL?p+(9S;BN~>tevd)9(=5wu=j%C%Lv=AvW7r#gfVDa6S|ZJD71Zaha<=X2;YJ-w|?^Ls5@ zJIQ2r^LZ-CE91!*LAc%6oyXbOv&22av?XFl=TI;|aZ^Lti_1N! zs*@H}|A0!v|8BD$^LZ5{&;}nd0pzt#0H>h!G|28XTnmI~2>os(^ChHzAyDa@XWlPf zwg?Q|IyhtKQ|Og#NAdb$j6%fB_7L_e@rwqgu*ot~-~;-C7hrN(u*eJva*qek60IbG zE1e@Yezd9x{KVPTWAhr^G1+=JU#F;km&^Da_%f{%6#cbgLxld};K)Sl(9n?3G5PmG zv+U5H*X)y0BMnU7OXn8^(8JNVX}>^d*R=yda~hfJ1Fn5LRxiV)(I|m^M{U)YrE z#=!5p5`qy}|Kp#{Hq=d9y3c^Q>V5~PTm*U;NEP1!mhhE9eRHxUiYcm&4L=WOU+z^9 zS5Fz|_AmEvuQV#R_q|P0PTJFNt1e*2K_nqPug^OJ{4QO#Iq&nmcJgLKC`s>Q+Cvl@flHHg@zSoBglxG< zjt{3*H3Bqb@7A^zaDqG0KQf0O;Mr0w8aS*1{s`RK6jB0?%TN_y9|A*8^B<8(%=}Iq zTKHEy6C!&GNW$_wMFXFC{LgNmx9W!s7Xbhw2FI7YqK?JX6=s9PN&Q&H%0YEn8?rpm zjh4bfH)rAXUS7;H#;4VSsbCmDvz>a8Ep0GiyjfyD2Iqogjp567lrPI7F->^XBvY1? z-P7l3G>E05g{}Lr7N9oaEtqdUAtVPR_Bkt-@>tLDtOE-1z*EQBrleZH&WbD$+dSVY z%e1NiUPGVN!lWB%B4i6%n}qAriVDKms#;5J>|$iChBQ{k$>ADM&yL|Mb$r+P;}4JI zT~HCY0X;FV6B}DJvN8?{uZRvf?4_d$c|7{%S!)2T8XKlNg+^tKf#7UO|AmcJLCh7w zp^WMh0rG8KjX82icpy}xFL;C=J?k_0^uCXHaFUR<ye1 z$SYTfSc|pT<1mznUV*NWqhc@y*JaMMn(nIaoMw_kDV|mssh1|JW^bDI@g-AU9F}BR ziLzQhch+TX5P1-})JTj?R8kHHQ}~geMqrFvaw8h8fvFDSc*~k0G=a=0N7c?>OYVVg zc?`21++VjRy&jtdt6>T1bU9;)MWC-q6#AZ1euSKDGr627uBx`kv7lLq~6R9mi@B-jz~I z2|ML{v&@o^`-}d`gk)`O82Rk*t6mbZeM)BA@d$8xUrsFN5`)a9K^R~1mak+PFY}_B zOsBpMg0Vh1^w-lVcRZ74aW?z$t*Ma%VqZa%#42Ug$N!uP1-?gBKUfcJ)Ay0e+ELf$ zwgc~*%@3b6lk5)@5Ov~*xxvbPP+N+B?e(Q(qGC#792jLB*sWo%wu8go-N!P&>Q}lO zz6LaC-d_ln@M@K^Ob2B>T_aa! zg%S`Wjv7%sO&%pQgGS79<#w(Xq@qoDbENmp8$DlM5d>P%&)K;H2z`@kPgGlWb`8A+ zQX)xD;eM=$NhxOJNkxOTH5#H}07Szd#$Mg%I}mx*_u09d-Wgb_&%%xw>q;LjHqq64 z5u#(N`Wp%GW&IYwg7YYKH*<1F^@(0=9 zlok-Wm20_gUeUkldY;#HPRiBS_VE?+|CxF#l=V}u=%fssPfJwuG_Z>i>ZhE+EOvH? z2LREkfzc%ubS@9MjZkKTVNJ7^+@`bdSt%_YvC`9fYsbblAHm!_A%(0jUW`yf8>ny~ zq}?1Syi_vnMCmZ`<-rT%{3s0XvKwNv-c&)B>jg>0g6d<))|BY)+1;?Js~)IBXpIV# z{svZhe)b4p!4?{5W@^3w9Xbsm@%ZgU)I&4oS)F{US_wT#iA_-zVXY%Z^-^*Y4hEg# zxfdI84Xpj_sr6uF*xcTcj0dQje2Ona;*m|o>LIB=HX;v`wMjS`!xvtDL3aQ@80jJF zLF^F1`gIW_X_`KA!)EO;%{F=458;I?<7J1iAJ zkf`8lLELIfO0P>)ixKnCqk1Vg3Fm-txIN;N;Y)jheM-Ez_kRoc=GAkm+6Afn35*i> zYL=1?(=vWy8<`KEx!t_=lt}P8)O1Gi@$Ei(klbMOAW58a`K4{Ga$75s5Rp0geQh9z zQR;HSnc875c34+JO6i^xtJG(O9Afe3(~Q3|tm}DhVGpY`Do0BHqXuqJjfH*OpHPtv z$u$z6VNUY1aF^1t7XAuKtSTW4iH}JVT^97%tHtt3Y7+ER8Iy#@Y9&YzHH6V`q4%LS zG=3BEYS~s;>_`A1pq^}$X++f;(O~e7sRgC4vJ$ynlT)N zP)#6@WQPUx6KmemjlCuV3yok!XPO5zi~6BXc=Eci+uWP%f%BWvrfjAzFBG16<)he`u^->iy>oHj_}VQZyOR6{Yh0THS0 zudR+-wDj4znXKZ(Wr0E;{%^@gU8MQr+gpDknp|U-IFI4vU-4Jyzl9n&vbJRD^4OXd zTf@?TH9qeKRWU=eG<3ls3zsqf&@zs!@c|>1X5M5gnx!_7$1kQ(>C5*G$@_aEm}4G4}#K+E`TI1Y+Q zrhhxjdWm4X8^yb4JQ^2$oI`7jX@!aME#;zf1$1*Zh(K2afI4xM6(&3xeapm6>!GDH z?=htChdCbDF`n5F&^(&0mtQHCNY9j9!GeX-yVvh>ah*y^FY4-QE{;;D|lV2D{NJ66sl8#LCNpcsUGcl z!3Hka(h>{il1Gdu(>xt#JR(4ShavmrlvmrD@#ee$yTi{;KFj5aEdCg?Wt6bmT(Gow zZrJS?dYf(ldij0_1f8L*=j$iEHqn9igpZX6Gx*!-5aOrkc*N59XEcrnv5uuo>e%D>nk|p$WJr3`UA%{P#9DIc&FIGN%5`E|1BdXHL68&W zQ;fGn(r4a+*hMwvT<6<(8dhMNv%USOhn^QdGXsE|A1(eE{Q>2@c7}+{1<{PPIkKr3 z27pbJL)OT;r7Pm66OOYw6yQs3FukL9d+o}sO*kke6GWh>N|Le(HI3ZYCa^Y>(J_Bd zMG&%BK27|0El3>q#kQ^AwZ_xak-R6y$;S_MtRm%*H>s^*Lqh*ve`WE;A; zYYu$o7upFlAeMOcIQpeejw^jR>feu5KswU^dLw2znhth_1 zCDrgNSd=)Ja;}_Spk9(WR z19KGTWl>)#OOoAwAwwa##mb3p86OSoz$XYyqpEM4pduyK2?H!G|AW|SadMeT7X1&i z$bpd0M80pk?uReA{9DRG^WJrmdVREg(jU7c#E6u+231e54DrzTw)>1y%;H%#&nj&d zT>T}0n$Lpgy}c}ZTrK=}WCAEJId`yhL^|?+m~V9zi1(>#4ACc+)QtOdt!Yba>(@4l zj-Vhf#Z>-I9V^md9D-ye{5Vr7k7Ua{WL=Sa9^pprOFmlSi-JJx@GW&8y9+lYO0xM4 z%I@_BRH>B=|!^O&Wt5)2%c2H00BNfNwOGqk4mho(eG_3@U#onX~ zsfe*kOuj(5qW)5BlIt7yB(Uxq)HK4^UHBb~>%CryHZLp)U+bu>Y#SHZ`FPoh;kb(n zoU!=uJKitK7b}Pm4ff0fESn%XuJNhM11v|1CDC@5XzL9?stO}K+SYJVbpE&});y@q zelfX;3TL26!f`Uf0Ed~5x@`4r$i~T>T_cOf!Z0K7@ zHXpXPB~_frPZzPa?|$}BRs%>@d@uE9VEU>GTz!7A^Vx)e%iBb6?`hPbp5YyuyI8vH z67WMY%z@e!sn2~6flg>oEI6fbcN}*~HA^dNRRg z1SUuv$iIh08_y#<*8skmM=#HS`ze4&hY7K)n4Pg%K|n8VK%^h$eoE-GS5kaM3YCZYi>#@hH?BPvU#P^XkWUElJ6_$Q zZExEipHys$-VdL?d_XcZ#Q^yj4*gfcFwIDY`k&M5`6i_vnMB){dV0D()DAu&9foZ1 zezEAT*{?~JySD)x*dQzH@; zK)mm06y{svQbI3rbs@tx;WTW!u2D&iN*{P1|c-9p#&}QEq`U$__3`?sn@uMMHrFVguIFg(HW+7d2mS1uWGch;T@qW&}W1u;s z0tgQ0jS55=k$VxI_)wE}PL=Y(?!Z+5o{D{$l*v$a8dU&S4* zSmq}p&})*XKK4~fuNLR4$lidqY>1wmF)SYoQ9!^Jn>~)MdLzDQDAYJJ1mwAqtt5kd zD@}@OQMQd$e#pBgrR6!_C2|q?8(8?U_c*wTY+;`NR?@cC3zCBnZ{+!Xu2sS}@X2{{ z_Qifj-FJvry4&hSUp&0TL$=nU#^;ayA2+^)hMxOPQfIL3?JpLTTkZsEOyJO=bNZ~h zh1aw97Al@l@B$X z_?@O2r)GzDBI1nU>b%Tz%E83kEQ3j*ca1!{7u&}LdP9^yg?snjtEk;Zgbm#&@9_#q zZKw#*ed$=&dayXUDFsB9fitGo^7Z5Wd7EmEPvr;O>zX`HE)3Wnrut2uPy~2qV-zG7Xt|rPk zP%l+9nVtkzqa-^a3npeFyrDbEUz#I@#da$_P@Z(i%b*o}E!jZO&0k$&?)NP^ROMR@ zdY3CDjnFBFV_=d6OA>hHOC1Xm>sUYiY#{_N66(i7rjyp1g9(h_#aQhavptDvra#g4 zka~0WQsc_doQnl>;=THyqkYePX&W_!zv;INGXwbkI?R6qb#go6O`@nKK2WKDu~TN= z{ArCBBUso;RPngC0U&B2;CuuzZdk%eNO`6u->hJW@mhA2&fJ3zb$moOxF8_-&)aKi z7f*i!db{<_-eQyCP2jSrfOqJk$@UrMgJ@`7kJ0FORz(nR^0=hfkN6zazVR zPOMiG-RD-(+kW9pufi+ase$`(f`$EtjPkt(MyOuCxu)3<8ht0$p2!60wc>o@>KP|qd_Mbx zIA~0eh&h-1Q1N$Q%}wtz#tIiW-7KhZ)jbIlaSiXpE6NIx>81}DSQN{Ra0AC**B_(a zcl?x9MA*l+RVsI3$ov-9hV&NtAl}oY{8@lx?PT}Fn7pr&A~alN_-jEA;%N_m@#(CS zRp|-SMoMI7vtj2up?h8V9#GRsEj~J6F|w}crqMNZzW5K16}O4Mt-^wT#uN!Q;VpOJ zTb9o6!V_t7WLO6x%wx|w8qCS*I9H;KqVt+TQ5ublTrDKO7Nk5uHA&12m@)3iUDq*K z+W;c{;7)O>s(Xt!f%(;jPW$_}VJe6c4~@+Hw&-tzVOy)xolR$zMD<|Ya0;SD zw&-^PpPG){RRp=FwphJL3=liHFBzCtLXug(+sCDFEjIfxJkpo7!r?Qqj;WF(8;)LQ zVz4>*`4su83(y!cY!WvC7#$`|7CKzZu)Mh7t_bR zv`aIENgq8TxDtaG4n zIHve;JDqtVbuQvP9kFQ+^+T~!U0EM%e=I$MC?-dw8C*p1GsZu*E$ z@GmH@!Elhm?`5P2grTM=$d&dX)fG>golT?=bBGMNrXej#wBAuuUlyP!4k}CRCBDBby1f zwq+r0c$3E1ht>2rs%O&C1l(Ai2s;mZ030`f3f7>-R+B~C2g8z)eb4Bu9R%8&X7i)V zfHTAV*)wC)w{F0TcT`sH9m5#L%6_-fdCj}hGt@2BXUbTG%M110ckK;+A??QA^Doss3T8~noh}V*?#-S-|R^7iZcD-p=iPxU#%)_^c+h~Abw_D_3M#<58KFn zP9$m?EX=$#XHN^l@S$hRoQvU*7WeMQl=t2|6BUyEc7V2g*DB4!*fJ!shOd zvo5SkWOspEC)g$<-saICXiot_yQzp&Kd_N2s`fgHx7Y~8+;b_Ots)}daJhGJE&hVj zMzbva6+|#)DUUz9T8hSeH@&Hu&%mD1%0KO_pkXn_oiYSWDwq-OUxv$>TiXO#E?hk9 zA(0js#VqqT)XULM?ZFFSlBxUe1?w*PmGuw55>o&g z{0=^#J*_L6ItlRr|EkBc_S+z7cY&`Yfa-*FG5w)JvVd@rmCIlL%Q6ycV(F5IT@=II zih7~%WO!{T$@{2IXI+pzE%(GSHc=QKd1Ms{s zTh6vj%r+Eq!z$v?%rRW;^J2`GB+U4m+J)an$8yB=G^>4I^+Mt4?uC}pPHjEaJDAy~ z`NE@lz^pHInRDUUe$&*VDd%%dV0my_T{zT*i=N%7$iqG%5?CMr99snWod+I%bFJz^ zDyw6YZB-BUavS|L8Z{~(#bc&0V><Nm-@Mmv9X#s+2K%qM-()~}ki?EA zy`go;t^Ds_HG&dGQbN@GlT(s`#0NhzYF+Tpj$h3j^_eE01UsCaeUYLP_~hpo09{x= zolSb&AIUVC&9O8FGxgx-H%FtU>tg!5ce0XQN)Tp=g;7(xxiVXY1x};gE$|KvR?hv4 zlR$^Ah6_g}m-;XHWfNt8da&O^XAZ=7rAlLUHd)U^TLy0n2K&8bKO%51H*sDFz!Czz zmB9?mJhQ`Y<79vfo`x<=L%EoVmw;FTelx^AK?e2pjOPxxNoci%I~a}-i?>_=#3-nvo_0Nl8_#|;4h1P z&e8?y=k5p5o4UlCbNIr^!CyWVf2mA`0a`kt+M|c&k}Iy7AZj>J0BB67z>Qt?IJT8= z)1Hhrg&-OCL_B>u5XC|TfcLbk8A3Yl{BkTv(FLufw6vCQGBbBkg%$Z5aYT8v!3XV= z8%|ImQ11C?%-k?py$1_Z1=3u+Hy+Rn%hF5t^|*^v_2VwXjY>=;mpC!augGWSoK}P( z5(OVq{Y)j|$2y)v+l_c?cwM9y3a5?4fB{Uroeq~ctFEJQks7dZ9n;UDl|4^ZvxEGi ze1S^Kdy$J@pQ=hWX)=LWX=?i7TpD3aN%^(wQIUZcu}2emXM+>dv-#y2D?O7-!;zgr zQ$0(z=1-WA4LP2%1wR}iHNayLS2bZ6pIL6jS0?qpmGvxL9a^;ABp*a;$$KAXE{R}> z_%Tw&+JPUeCKt~@P)^BVyWK4H%)@bdV44{l<3C~?kyF&PP#8^-CTn@5jQ%#GGINwj z<^7(~Oh?oL6&y7eija+Pj{UW;9qub6k${<7fo&l{h}*I-Uu{xFXEo@NaCo1YU<~U8 z+778C%*cY-FB`mAx*)QTJ&x*QKYwrxDagDxs50Hf^t=^B=K(F3h5(RG;=c+=3ouex z*scd2f-&D5P_@FqAsnEb==w_2XNwhO%Rfmiy^BUD`Gmn{Auf12dwAv~y<=mJ{X+Dk zksw6~XIq6lg|hf*8#q!*O4U<^a-K+)yPy=y5yELHD&&kmF+pY4Q&K5QE_=O2y9U?gRc6F>9x0wPDO$+7~%=IxcU^fGRLw9PiI1k8Cu5sD~>m{e& zG7&Xq(M1YsUZ@;=4QRJZ^Ah$R>#Cbju;tV6umVt73LJ#0S0%Mn(u0P+Z=viaw8U#) z!p6ckrCrZ__%X2dGS`2}gO3p<3?KYi@B=rI(IX#bf z4`COS?yn^Ptrv!fo382%`+xy+P9$yom{&{v8EI_Eo-f~Q{w^fx{~m}eRWc>IkYRx( z67jA#0d&6u`=aB=DAj1A@IqJ6{2D)L$0)V(p=GcA5(4pikNKj8g4f(ECINo<&7C=x zon@{mgd`q+%uIU9QX~D}KX!2f$mB1E3mx%K)4(=AfiqVm4jGK=;suqIQ7X|j=x^4QVkI3MScF^;MO4nng^=FS-xqwx! zptjwXGOWsW0I07WbupeIiex%BT-)DlVhvSs=h64hMG;Hkryvo>h*&R#b&pr_0IdcV z-%(XLlb&wwE@Jl&OS&pB-$nLY0JlAEd{SZsQC;TJK80}vkzm6}F8Ps9k;`xvVyWF1 z2IhEIHAwcK`LGc)cY>kQ<(9hn>ol;l1wFei9jpXbyGO#1RMM|~4z{8{=*(1(sSYApTSyZWp@y24i}(QE^ALQ> zh6Sw3j8bLoJ&hL4Tip9AeKbvWQ0l8d#Cxc~W(zp-R(_ajW+%0bB3~pkN#lKf*#m~Y zx#3ra#lUCqg+ELXj08mmOo_95cPoq|yaH9TCAK_=*=$ldO{=vk_sY2*oY)u4KR?w5 z_Z!LOr9Hl8Y*^_hou`LBCXfz(lNBqT61(|&;GULv3`Wc^b7>ne0?Su zKg>94#K9DPL#v*UWwvzbdgE??)VV%N#R_lV^izu?o2C4ao@1~(EbR%@^gd<3{iX0= zhajujXypZcdf@)hb2#nBnHtsH{+L8%I~hc}CB!IkiW*Q0VSe55C~D zlayAWz)&_#>B-)NL5Vk9`yFrUck81G4Cz&;mlpwuh@}1ZaE_ZJ#?j8NmL9s_BML2C zyfmrFTroj4_)Ss?kJt6)sGkD%69t%RB;lPt$?B&TpY`(#uATXV>7Vb3cgmiSKT{6s zgW>3EqovP49xRLa+P7ilOAg~kxy9Vw@-Du#%@SCJe?%rdPe%It^jXIk<3eU?l-EIX zI&?eh)kf5}&di}Zj3^pa?V6hb2-&n1bvz-kB0$(e2@5iNRPymY*Lj4H#la40y zcdhn99goAC@P>fH&tf50!68^`q(zBi@Jr;TAF(7YL?zT98~LCC#x-3rhl8()m3p`U z0d3bGEA)q;dy*lnB!Na!+jON?7x7nW+{dB4PJ&8o=wwW8j#NQ6O8cWB(Q|qJMitl^ zn%N2lYf`o0g)Jr6g=9%AC`3J2)xvC~O*5?=BShXH_IsuA$>zKRBZnGlt7On=v7x@h zO-?-V5MBWUSw$RjI;`w{i9c&}ckKYZ{vuFc1FXmZ@KShyB~TGlgrUhr`Rx?eK?>}4 z_T7D4;nSTky#OCUHr%gU+-o0`7*4f!!&{k*;+_hB19AUnC~BHtg9eKn6ivsTsruXW z#h)VDGvO0J?+ElL?p?E3n!HubGDz}~PUG0{NGRBbMZfR?@-DXnt-Tr~jfyiiL%~aH zC_Xsr0~D;jwY07l*nmeyB$@95ePCu0$y>I|bgVcB-hqnIS>3n?p6k%NLLLuH^9Gr3 zwOol>b6>0iK`xm0h3)sRsV|{}vymkL?-7Eq$Hj-9P<4_dfxKq&kmDsj!di+B7lo%r$%!w+X z*dYz#6!qz8r~?d_2ptIc^fW4Hm^^$|PPxS2G9@}fl*fu*GuawtJvW3jy?C|V;N zrnYX4$ZZLHX?b7*$HS)Z&)}cl@y>8cL`<>RwE_}eqGF=j0N0>_7O42d8OL0+`Ae! zf(R@Lr5frJg7Z1O@Fx#U0{AhXB~Bs+@zY89lb>eNt?ZywdpO^S8KEmbwxul>rqZ&T zA+1m&y6IbfnbV8CHTr2ZHAQn+sgf1h0e103^jQFxKMIC-vhXE`{t)0L51Q@Bqh(CI zT)OW%kROyuElWQp-~E5cHH^)A8fxD5~zo}#fv~9cK__k zKMSmeDJLP|oc$`kS|xdiKFPmMhj4>N#48$6?WjrNvzI^2kG@YyBZJmiUUosto2n8)<2 z9SZR}f^mI<*pp5Nw*zR(Csk@gqP%4Xwxm zkhxHT9=v)x9Th|~(`)z*+3tWXwn*^LDwJ$)Nn-yJ5`}L~v(S;1S%{5)?%B2((X{d& zMrR<*qp3+c^=^zY6T?W`!OszQJ|+B~4ee0o8FP(g%fzgzzJ=vMV+#WchBiJ?1j{1q zv30O?xZ|MfNXXm1+mOM^`U7jR&= z+#i$gxifJ}*Lrh6!7Dx(db?-#oeB~eJphuQWD0gE(pYXObWsKMBh<4{8}=_H+3;Vu zS>!2i26Gcpoxza41Px!6JA_6Vr$eOhgfYambef@`oweEV69`iBziDkqDR*_9n;bi2 zD(F))KS@(%%B)YDq#8IdkvvO~`^fw7-Tbz*tYt)6?;YZdkR^QOlYRU)iN`f zluAFPYLJZIfl*|cWZLeqcWv(XrCMZfhw!+9ZD@s=LB;WOLGIJN=z1We@1M9Lk{*hl zyw4PT3_#i=y4{4Ih?&O}6%qmk#roGmFk|>Y_91oIU)4P4+PQC0+_0AqrWmrMLR#Xw zSEw&s)p7mHvDtC~KYn3y8+ZqIUyww-3NdpYEr;<~swkjC$ADT3{78mSTaQL@;av-` zStN>=cX*1RCpS|K!em;A<=;qtpWrGEq!}?I7HN1chFTHxRZq934bUkwH$hp8jG#&m zpNsR8eHPy|>Ws0B@5X z5k(---5vWY9g1KhPd}yXBM9Lmn24CI(2(y~O+2zT&h(^8k*){vE+>5;a zaf#Q++7=4qm7H$|5$&+jQ!T{F*P`qRHU|9;JIxGNQIl^lq7=6}5mby%)gI;t0X_i^ ze_XPRORLZypk>7pQ7TUE1VXM1kNTITbd8D-Nsro4bU#&3DS&;xbhU}}_cm6YYWK;9=!BdY_WTjF#h`jbLvGgeM zPy=x(G$8^+g_6=rn|_@_7A{-&HECWE+S!ETscf6IpKd)<>HB>AN24AW5BI088@5x= zbG~V>At;{h8rOjYPFFrqF=0TJf+;$0s^Kv9}-un8rNd8psiCZ2<&K zIU9`^Ibz3GWmEEN3!wSIf;QV*g58u=4C6rT*(Z{nUEZl6kfe#x5B##vx1PWOWl}aJ z^@*v`JiOV5q3xcg0Jhe_XJm)oz}C3iqJ2}k!T1nt@ zR|4L}pU!jTmK5TK-@B6f7gj2UQJ{s7AIrsbKHqW%4;0>Thql+O8m;199~klG z^vDhq0(9@2f9CMuMUTk`{P;~bAKbLoK*9ZrJ+Qi}>7cqTn+yKOUdG|T^bdzXab2ZV zP&Ek@mC(U(m-qG2OZcGSat-)C@s%KsUYR7kf^SUrY5a=|cDo)a8XO{SNOsJ-KgRxU z*3~Lfu4gv&KzW1l>NUdpgsEruckJf*Xrkd6*zqeXn9#`Fn&-<>arg zmjGL<3$n=on^Ilr3dq^B7z?>~IwnElxzHzc%I+4R)*ciy8cU4YWFI#*?Q`3+-DwqP zV$!?T=pvLJjmk%?R4B;b_A+itq|DA$$gF)JH#?-?!a#^7FRabBrj^@(0QD0G)i>8Q z^-$QBz0mEq^jz)o*N)?Kv|Z-x;Oc!+>}qO!V)!8hL&ha?(HRCZ`*-wSLaAN^K8YBz zKlOjZ>|}r&Tf)+lD`mGneelFQ*1W&r81{5i0npT+5uQ z&ex&hl`jMfe~{cKfUf7=0@L3fBr_ioeG$|I?F@$@f4A~XJ(F+Np@!{PZx6H&F;RM4 zl0KC8{yzY+Kux~}*1Z`1fEYg*K!Oz+5+@8e-cNwa;|)4j{t8Xse_gOk)pv>lQKx|J z$H{M%Nmryk8-B;S_#)irh7W-A#;}~U1`7zDv?%h}I(1f%&@S39TY847BgsaP_)TeNO^i22% zBI7eoY?JBCg6IdC(|7cPeZUR=3%mewkuY@*J@`eJR%yF>X#1joesTad>haYmY+Hr^ z06+jqL_t*IFWHBXq<3>mh|n?s%rD&!XW5<78Z2EXaQ3O5q}(T3G9s;UFZ*^b8L^sN zUA{%-G>1%UJ8L!?7K^LG=Ui9eqUWf>zX1BdyU7PpSrtWrXi=d2!VSnyj^h}l$_-D! z$!{0!!j?R)WdNARtS9nsaR{7b7;p@nuHB&)LQ96E74OaNd6C{udlh0v27v8X;O=4M zV*OwP(}eYdLg0jR{VrUyfb62@$yW$aR7FuB(iA}2HdEYzRQS$hv~lvAhSXTAT9$LP zftlTm#tR)sW(tI$peh|G=nssciai6HQG>cP)+n%S$YENN`fKdA$PZ}$8EJ;jOZ}j; z%hhQuOvwy{n${UQkU2<~whUtNFX+C4%j;aIJ}L@?Pk{$MA4rLTu?WE6xrTbgNuTVs!m%%m)L z!ynK(DOppV{Ok{C?d{pvgVk?wMuDX`XJN^(7sx7|25#^-7;ofdYe+xHa{yjay5_~C zg_{j6q+LaSAm5j1an@_q+*qK1^+iwM-c532Wl7V*$!{+AN0De+WB|~A7)R5IJ&x6o zEi}m0Z)u|<(Lhy4j8S0e)d%4}_)p*lv!L>L6O*!3>IZ`*S&*9{>|}hDs?K3}CChN| z(vNA@?p`t0E7hD>rhpazmWWiz`Z*bkkP-TL$S1!w*0sn0;KrLS0Q8V4x>Een^d!Wc zPHODI>bE$jz~bSX$T;}~K=2V5LDm8YVU+_%7_9KT;N+{Ck%r7c|4jjR4o%vBKg|{@ ztS%V6)OWQhVAGwLTi=}gCIpY^tE~lyRgR|D;MA zr9k$$GFm!(37tyzQMvvT(gQ_O3TQ|_C{LS%E>L*JQ73agoiChE(~8FdJTYlhQ4|P5 zfmsFJA#HH@8%vhJ6-XRpL`3}Mr$r6`{nj3|Fy8?`?Dj&Wlgk_(q)Y0nwnl-qeNNIl zslO+ee<~C-zlS7n(h-Y;O)uyNox^Mram@o{*hsro{9BruH>9nRMfE2F6wtgQQOod3 z2?7v9LU`1S&$||k%BLkme?ozZ z83?PxxecOR0%1_MnMy;6ruTx>@Dm(oxSVDbJ`J}Sm3AvWM?X5PE-$+gQbi}Ha>)X2 zCGW1UBlWPz0but17M*b;E)O{Zxt%NubKtV_1B=vH#YsIlF>b}Eb!1+67#reuv2$~h z+{X2TtRvLj!*SIg$Z{=2{=umLa>8~PKA`5_JN4`K~Kb7s{ z$N-}5WLVclu)V6Pc%#6AkzZ5xu-_tU+H|u0FJXS1bAXV=gu10tEatTQn(JY(g-dD1 zzPU8BxL@5X)#r9V0Ye{)O|geee!ya-uy;^dzb_)$^T-0=+KDFI99Bz(CAU)dxG>>w zp$Wnj$wsTX;*bK%hVQ1+X-|>ux*tHe0`nr^xXlCsLf$;(nZ^3$;2eKNetQMoU+^88 zw69VZ6o>s+O>Q0q<^nTxoufY-?BMyJi}z_Qj^l`6i7WuhhH0Mws*gF=V77+XS5fEu zz7cG*sw!S7z>|0Bp!X2R`4AE<%z=BuXOM01e*^oY^eaVYHDfeXE6-CBMB}OZ?;t+p zU6r;?f$h8ck!fDddJ%~wj49*-wnVl>9smPKu}jHc-;5-%D znBrhdM7tb$0OZN78JlFoxv9F_4OaFxoEIGVXGN40s?AsKM$AxsM}Qj95#EfFr! z0VNG$u&@DymHHi9+(7qcD*a7_2d~Xkmows1`r^VIaDv~0lk^%$#YnK*fRrosgPdr= zH4uy9-;r%57iW{qqC0oOWkQuUL4oPt?g-SoUiL-0(^-rq5f^{C{wM*Uu>(r(gVlOK zjRup;du5v#9My^FP+&U_*;+Du1(L7&0DnI~!nfT3INte#KTn3$;V0dNH0j1GlqS1%w0N{xMC(-g6?l5{+K&|rWipB`G zwK{W$pQ7BMFA~9j(6)bzgV|4z!IDt0sfq={{)40?z~caEx3pZ^S@0VbO%msmg0Vu= zyEyJI+!tWUi4nk*$d_QVs^w2%Yo9KVD&N8kMbTXvSlH{-k(n(gZM&&q$*BF5oBDIQ z;Lf57D;uf#%cP-1h8fkNLX}vo>D>U9KZ98OpX587Sm!GBF&-$u5kMMU4;6@mO%g+J z?ofo?U#dtE9RTFoEsHt8FC7+ET7$2mgI1ra2dh^_fu<>du)22#Z6NQ7Z$l3HHv9)S z;hrYK>g1k_SmcUpnyz165pxtsDueGQT~%%U750}8&O4BB#eK;?plmw8<32G=m%v4l7JH3>e<%G(kA<7CyW4Y z43y%pGroH$S-RFmrMuAsz}I`1;Iz0cQVixzSu;F1Ea|4G^g>nIJ}8i#evEPl|34T> zrozbf9Jqwj^~7R%s5>3OZ$<5cC~d5l!bI`|Uz%2;86!V~H?JkbL1;%3Xx~l&ZuP z1txFl2wTB;IhNA>1qqgIo7EmsD-AeXMd*2n)@}-D2O#>wtj%nol}fI&>3G8_l2lO? z2%iGk8Y`ARB;U5}WOTU)XVOeS{4ge&c$d1Atc2se%*GM^1Js?DoC3++(vj>mRqFrP z>aW=cVA=mXn(c@#0ABDXP(lLEeUOT2?uQ?;eOWX+r0Q;G6mZUlSbz=oEyq9%!-*Mn51&2@w}H&5QQn3YPbu*1y-Ie$#yO=oGQ)@k5<2;2Y`0qI&6f@1)}Yk0R~d# z8^e!Bt0QfuUM+AIeZfMhg@E`7&cYT~w3&Xk*^X#eIBA?}>M?jM1xrAu+ibTZ*0E1c zAnXx|4**S!9h$2v8G6)?)rbxN%6L8-4vnZ@j(xzSGJPvKt_u+(Rhz8nWT#``6wW## zK#d-$ zJKc3tv`z_(4ghxa_JzLVo70>$@im=E+}2dz)$gFdryclw<*!NSMN^~55HI~II@M)B zjc?W4SfW7x4#-icA&#|<3YW)HU`%%mh}e0yvDEE|x8;myn_L6TKrt6+i_yfG5`_{S z05k*w(FKBg$2xzVz6|JxSTwUDUmPH06>k(%5Oke5*(mW z7zB0NKr6;52k4N-Px`VUhT3Gmp&EDaB61m^r^nu{1tE63r&G zxw_r%JTL)y(xBw16s{x}V@qU9dMfKzbH~% zhGRHoLx`?-219UT=oN%^Wu4U(+D#2#B@%Gx^=(v{%^JFo3UIF*&~PRGHcYhOzpNa% z9kk2Ezz6@G^he1q|3@4G6y1at4Ln_a4GKt?q#pkWPGxpb4G&v?b;_X?gQAwvxXq3O z$95ZpV>N&wECTa72w1m+&W>#%LLF~tb%j@b)}GCkJ-o`=`(5Ay zh5j5k2&5CMgK<(6md_E(B7$a$@}liOQz$=zrL-;wO`_1IKCr02xy}_LcNNVOoechjdwF0gybf{_4Gv#L(Fg4c893 zLL3gMCF-L36v!R&IR^hXP^2P0xXw^H3oZe_|AI=+zeK+Lh)#_9jZxoJQy^s^Q!MtZ<tL`IP6ore8)TRBRC}byigi zYWC$JRLh3`�`ELC{*SvcI%|rhIFu_A2S-db(9UX`Ke1e5NL6kS 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 diff --git a/fcb-fronted/src/stores/adminData.ts b/fcb-fronted/src/stores/adminData.ts index 059fa0c..aeb9b47 100644 --- a/fcb-fronted/src/stores/adminData.ts +++ b/fcb-fronted/src/stores/adminData.ts @@ -3,9 +3,11 @@ import {ref} from "vue"; export const useAdminData = defineStore('adminData', () => { const adminPassword = ref(localStorage.getItem('adminPassword') || ''); + const isAdmin = ref(!!localStorage.getItem('adminPassword')); function updateAdminPwd(pwd: string) { adminPassword.value = pwd; + isAdmin.value = true; localStorage.setItem('adminPassword', pwd); } - return { adminPassword,updateAdminPwd }; + return { adminPassword,updateAdminPwd,isAdmin }; }); diff --git a/fcb-fronted/src/utils/request.ts b/fcb-fronted/src/utils/request.ts index 05a1658..91d8274 100644 --- a/fcb-fronted/src/utils/request.ts +++ b/fcb-fronted/src/utils/request.ts @@ -8,7 +8,7 @@ const instance = axios.create({ instance.interceptors.request.use( (config: any) => { config.headers= { - 'Authorization': localStorage.getItem('adminPassword') || '', + 'Authorization': 'Bearer '+ localStorage.getItem('adminPassword') || '', } return config; }); @@ -24,6 +24,7 @@ instance.interceptors.response.use( return Promise.reject(response.data); } }, (error:any) => { + localStorage.clear() ElMessage.error(error.response.data.detail); return Promise.reject(error); }); diff --git a/fcb-fronted/src/views/Admin/AdminView.vue b/fcb-fronted/src/views/Admin/AdminView.vue index 4111252..35051fa 100644 --- a/fcb-fronted/src/views/Admin/AdminView.vue +++ b/fcb-fronted/src/views/Admin/AdminView.vue @@ -1,10 +1,10 @@