From 239be643c10a05521e9cf5881bf26d442b9d9b17 Mon Sep 17 00:00:00 2001 From: gaoxq <376340421@qq.com> Date: Tue, 2 Sep 2025 00:11:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- capi-ui/index.html | 2 +- capi-ui/package-lock.json | 102 +- capi-ui/package.json | 3 + capi-ui/public/favicon.ico | Bin 4286 -> 4286 bytes capi-ui/public/my.png | Bin 0 -> 23107 bytes capi-ui/src/components/Layout/AdminLayout.vue | 1083 +++++++++++++++++ capi-ui/src/main.js | 4 + capi-ui/src/store/index.ts | 4 + capi-ui/src/views/sys/Dashboard.vue | 373 ++++-- capi-ui/src/views/sys/main.vue | 1 - capi-ui/vite.config.js | 1 + 11 files changed, 1458 insertions(+), 115 deletions(-) create mode 100644 capi-ui/public/my.png create mode 100644 capi-ui/src/components/Layout/AdminLayout.vue create mode 100644 capi-ui/src/store/index.ts diff --git a/capi-ui/index.html b/capi-ui/index.html index 030a6ff..0a7e33a 100644 --- a/capi-ui/index.html +++ b/capi-ui/index.html @@ -4,7 +4,7 @@ -
AV>Ug3x) zqoJU2piWEmbudl7;LI^b|0I=b`K&_THltu4aRx+gVIf6*XV3^YDe7c14sYJkfysB4n_xNte zS`h*4&ed9yf%FTu4lnvIf#pJA6*CR(Jyb(RxHdrtsOOBxYbMml74ue|&6CL|ticL* z-EF*^=OIDytfYK)fH|F`ZI;`#0AmFylr@QSz3@Z~spEMd_%A86D)iFef{kc;Y&(rY zPUzgv+j#eYwF7n~B3vs1&S-u`7@j$%uXuOP#fs@Q9Z RkzbZJH{w`4( 8lDVX<#?@=DxJNkLw$R-R!Xaa%`?UuH8ygVD@5 zjx4Y^*FHKU()dhA-tiLZWWUPlvjc7Ul#F*?Tz#(txrsbFSa<<^ALCe-M*87pf5;)> zLW*-AFO{iePJ5W0Rj4LbBL`M_J=7^X)2X%6WgPrv-nB2Z#ivV@pr54PUxyXK1%>n% zL%sO~I*jK+IZ0!?{hfNwk(0U3bA6=XWfY>-0`DtbZIx$`&FqgaB@LFshSK3o8g@=t zCS(VDJpiTL1o8?-H8-S3nH *@!8>~`MwNpkCR4*vda=K6C=6(F6M8mCKq4j8IoR$Cet+mTg5YMo}VoG-$d{)Yv z8+To6T3hw$pB9Zl3bxJ51wu6C7>W7$voC=jQ2uPFJKUqjoENwWt?8?Eeho$*%={Ms z(+w&zPetYsY-o^_GXu`X@yHRPk#(D(Z S){g4o>aW)Wlj7Ggv{WD|3z8=a763AzCT+NpN zj$Ds9+s#y-v8ktCRKK|X+==8?DRGVmsM}y6l%}aI$bN6JDyVOJZ?0|e)&r0|b=F%) z8LV!iC$=$MmIbB9 n DH5Cl!Etr9v(WK(*_8 z5ymSoaMq5fPJQ&)hkLT}o0?gae{}al>sfRp%KVsyfUH6scc{gp-`em?1M+n8z{yY& zoKCS3UPKpu>Q&U((}=~NQ!7n3t8K?|*t-$;O>+HC&=I3jTH6$UiS9cLQrWbd(}&-F zq7sJ(ZS#Ciw$xZ96oNs*LSOfBIRA2orAM%EH=YaKrFi%+nngR4nUT=5s_Fe)T2{%O zXCdBzI<( PexKuk JXN^gJd*P{8cftx%fb(Q#j}EUPnwn6YSM;8W&RA}J zJ3{?HEw55tR^gZ8*R+Y?O82^Mvw%>%kNB@cK=?Fjd+}>RHeWKf)T!JqOr^`eC`^s! z+RN}Z^VZsLnhT?&ojHQEOre~F_-&;xq_1U-H6*Wu8K!JeooEvQMqshWQkM*)_$E9G zW;(cy6)-)M)(IyAI{c2AQ>tOVsx#Bt_yZ+YJN)pI`5Pkiy9~F*+p@!1RvW^_1LwM4 zeJHDN5Chl9j&K1XaK(_Rm4oalTeQhfVf-GS({_ijOb;l>{mY`R$ fLarsK%yK80V~Uuot^7pprBcrC&S0!U zXQ)+gK3srwoZ`Tyu;k^Z+!x=bgtt=r^Ag WB5w)`HAbzuWGhFB|LNAuRLZY1VEvsrACC9^Omw}=m~Ul;j~U%n60NZ zMc$KYtb6WS69cXpj^n xgZmS{FhZ *DlFT+Mo$6@`a;buPlX7MQsnz8kzS~AZ{SOy_ z${%aTqSW(&h|Ug83||-BQpiKOc&0yiE(I%9Z@r4Iw%2M6_UJ}3EtZC@A{&AAor<*D zy-sljNW1# x?WBK`9I@e!Ufk$k<7+~x$=s#)R=Zl!0RZ8Vb;NoEq3gN zQA+kau3G-wBJkkjcpS=rHzt#@V}gVw?DR>SeS_tk$~0NlH?%iw0*0^?%|H+Mp%_%! z*6Wwo%hR@-jE?Z1C%^5-U8r-GW?HIDMaW;V#{4#7DH^a$?5%eP5Pp2no4k-#S96oj zxVCAXaII0f=z49GAB;D8SuO?I%btt5N|y=lK71YoVi-`QDP@k>Q76ul&(uy~AZQnB zzODHScdrW=88#NpCa;xzCyu6$Gc=xWQI*($TYz~W$VpDsqAB)Ad%*JqG&T}9C<0zr z&zA1p*Sd~F<7CLb9%F@bO&}a9M@f{8JV-WKbVfl^qH3c{v?y=yzQbt+^33?S?YR3> z2xL1PwanrVL)qSmX_qEq1Ad{lSs~S8#`|zKS0`Fu-lqI#WA*$ZQ>RcXgJq+>J%HFD z-6OH6@ko>}^qNe}l{!Tcs?FZ}z`-@MW#$#)qy)=dofV!3cT|B_t!m%du{Vrh<36;o zuK^EY$#|dG=mHTaBV2^_7L7?s`1wf7W0%wpvy+z6J6_t#;{|s(4fseOr pm4&2V24wu~qOvh!#ZpuSl>^9W)wNT<>@LffkFwR0wAlurWbF@h+MtZD{ zOW*){5H+uuL%R6AY1Sq|=vgyCVFH^_?dG-Dr(Wz2#)WASn&C+Z|HAdF=x!?7L`~F$ zjpI&6&kebT=b?J8ZT|rRgO!1tzr_JLc!@V +Pmrzt;88u1f-?aoOLj{e7um`~G5Fpk>^w{}EWZsW0*=Z^5R2q>3PpaP+D&$GQ4d z`ec0vZ*-CjfdpC*!AGrC={p@5P_KQi73M~
J@$so!>ThU|%bp0nQOqmHN*AY> zAm$;fX|-?o+r3_3PEuJO|C)$M^7#2E-@ED_&bN5Sq%&V`s8(>r5+jBC>egjp0%;~F zY_4)XWNEWqr#9^1yBuq#*F1#;+CSWf6rcREMPJ&>a@FhqeDs&YdMQMK!)F3LpRZmQ zIr01SKs%x7_A8H@Wiaz{tNvkj{8Bm^KQeHB$ -}*(g1iPNtIB4E-%)4eHFQg8o$Ra&AY2ge9eipgO;(1h-z)q zrD{z@J<_|vM?db{gKrkZLCKhwOdt(tr5HdmyVpAWjWWRio$b^$>uQYGWCYGJ|I^-s zGH9jG%24xp%(;)qetPM7ZU3P!ne^L1-OqEPZxxYJ`#z?^o J31iH{8lP?JJ1U$~bfCa0VF$j;VufX!z3Cowj}q{&T7 zmBrqBdz1{_0)`)#qS^cJks+Ww(WehrKBu7T%ToQ84C7#fUh`VG8fyb9UUss7e+7cf zTk7y|;vSuFiED3_pc}Trqz3eeAqQ_rPn^zu+z+Y6uu6^Frj8ok9zzbVsMmr8{lyn> z(8ScwrL9=J ^pWuBsODcmLAN#1C}xC=-@TQRo*TP}w`mHc9R=ccN)K zoX7ii!!dctiQwCcFu(-ca|o;blZzVJwE%P;>{^}!jnc9ICI2zp?~5e8S2&p}UDgY` zPD2hSWLOuwhX*+Tp5RJo$4MRpP(e2Aii66Yjl%L&x0W8owcj6oDCU0q!SR$i+mt@_ z_pxZU3 ||0ls02= zqAF=7U;(B)fx&7`o5rPH5#?rb_Uc%qW1o0RS?yUV%pp{kPA)3tE?@T3xUsBKKMp +j2NNrd skDW~J5==>(BEcCo~lcrjFG5ABJ?lN5M?b<;j|Xot`(IVEVIn}n{$ z>VUiSH 4Io^TkVhE@b71vKvE`KzQ959LpezvH3b?6*Bd @Z^9un$y|)9jBb*+G$a?kNEL n?^`h 7%Rw-cmF)*+*FQEv10Ubl$ww0zpJ2P?N@I#_%y(RZ*V#kM={3ES- zcL2d|D&uU+sQ$`)`g{V{v!}hi2Oqn_XkYJfsL^nA9tuROMA?xIK$bgxP?^VEcI+T! zHP@bx=vjzR6At<_c$fq&{5YsO75P7jr_bHLFp|SQEd8Nw%IXicVY@S$|J89Qq47z6 z;LB*l@vBcmxHjWok7r!*|F#I@6)_!CZ~_TCw1e(BfC0t}8%t1Bog;fVtaPVj(Eym~ zzK$3>b&~4qbw1g)PkKT})|kr-SIQ-RD08$~Fzq)8fvMzwiBeik74F(Yt|uqj1n^;1 z4eKjO1=5GRs@z;j=6zSOvUv(7-8jW@=~I!V+ECxU)+Z%pLv_!TxsLQFH;|E9x?Ett zfWfe-nhzhj&ye(IYLd5Z-jcv!ntB!{`xbh%`ju$}`16OY=y_Eq?bFv(qhtU!m#BIs zUvJo@wHkuIP`9}0f%C&kI99hf N8vRjYMQQ;SOjbjG?Ty@g~s#TEyg+Gg*bW4G1KvWjwXhV!Q!~DQLK0clAVq% zJK}rZTAV!jM^aq3l6Ly9^AS#d5bMT~ZgAg=a1^(qSShj3()!x^Gyj_w0 ms`j6#OSfSYKWdQ9{~kY3pDM+vPj05%(0nAze@Ujy0B!mWUPf-fDD`Rh zxJa|R*I?C?gm71TvVjSI@{>{?q!jrKwhy334>qq4D2_verE3~ D}ZjF4Zu;{2}68gAwd-}4=07p4oO7Z4){`ME(a)r6@*MslqPf-kI z7d&(ThZhz|@9ec?gr~rG-XaO`;*{Lkl1^9due2%q;jvC`^w_`-Lagcg tF-DW zh?c(|QHO)3n;sDop#3ox-B1j&Z-kqze+d6my_af%(HzUQAnGObBMiS%4o4SPYjMv@ z8Z2p3rmGbbj^58wjMApBRcOzJ(Baavaa;-Di%6>U&*%$W=aX^_4=#nY`0N`=5gO(G z%3g$TmfJ)yww)`~Q)i``hua+lU!r& COb2r4SOT~7&^<|M?lTC1rjR^tyeSNK7Lfo5d(jQbUQ$A zX!nvoxiPPBtCW{TyaGVVifhPfcb@OQD~Y4p|3Qx3V}3#4T%(KKLdL6`7T-S;qalk+ zqv=g|ZbZjLo4KuH+(KdMfsaG3{4Z@@S~l1qOA#8Q6-&L}XA}T#19-Vgug}VzSV(e; zB _uCA7j zE=bv 8%r;>3}bC+l@`*gZiU-rYBq5p_C`&7nJ&UX z4wd=owv7OsbiV!6lae-WzVX+ya~7)Zkt{_}uKB}iZ)Lgz1Y~)~>Xl&AkB5^P`&c4h z_NQgoT?qJ;R4fI+OFPSYtK?J+7vz+X+=J0UE|cq47!<|dowe5*C4}iYk~c6MS9-p1 zB`(Am8X`+i^IHnYtZm?F;K8DY_M{?34QS-ycV3LlA}fd0?;;vPVQc7AuBXGjt5=0= zoZ!lpze3@&AourK;_iN;(myoZD^h3;aZ7AUX^vJqWNl$ta5aO0zgra_=uuxU&1%#B zCJv=oRYwzSpD9HwZA|F(tFtE`El*T4XZp01aqm4qnmpZbhC8wiJTNo?b~_luIqiB3 zUyw05y_RmyXlg|@c)E~Z=_?>a1kKq8f2ej%y<`H7g6*yJijgSYEhJlVyQMYRb;+KN z>IC)OXOZs-O@E6SmC|2eQ|yv5wjgNp{K5X{zDO1OQ>2CDhqICgW}sTrDT|in%7Qjt zNED+I<)7p#jDV_n5sg`$@xO_%@Hby5mCtIN)M?4O+GTr?Zv;TdpkgTZvVjlmmjywe^C({&YYoiM{^N&KWGchwX^AH#=2R)pR-w1Iho3CUn>O1 z#`NRTLr=yl92D#a3$E;{)^PD=r`q`vuJ+6_jZP_y^wExMyl;?Ob^Hp?=wNuQL0l)l zS3ly>Ty24^PlEHLW7KDvDur%@I3{(*YuMrc(oYIN`**Jw#0Gz?d~LneAFNIQr_u;{ z$Zj?V);`)#3Hy>^7CMSv4(Cp1=atj#`#_Fdh3C1_>^or|J^K!=K@FwhHUtO9m;)kn zo+a7%w;yDw0 bY?2MI8X_NOW*LuVWa-81^EFDbvc$!glB{CPXO0?eJ+2wyZ 9MlTIjEJ`8n4O@sco{7jSd6qh}U2r1b}?7By47V>Iu@FZ_3<~ z8Pe;tf0p;lGg3zpV};UMqM=5I8_-^O+1YOGxVtKX8iyHEmesSl%yknY!ZM%x(|aWl zi@#Qg?LD=h?P;L5Ofjqh?`D>_0?>J83y~pJ@J0{MRFXGxqU{!ALk*<)5C!(&HA0MM z6;Lw}Sd1apQ&_T)4C{6mMz1ZhR#>LL`#p}}73)x%eH%%tBO|@wKW(I@pa?_5=<|jL zW=MGRQ4i)G#=JBw)(~1;J$j@?@>rVQE2ub*X~;ExxYhkm-Dt1Tr%;m-Ef3CCk!9O( z%1^b*;nG4ipQoO_Hr#KM>sV2bLa&cP%!?617+Twmc65Uf{!r_iczJ~&U?*d<&&tf_ z|BAcm`SB|C)zmcp^>>j@YsmfR(cSB`7-w#|Lt!THNT`4i!u(C!Q&`oAewri3Ak}i4 z?wuI7-COA`IKszcZ>IFQ+h5wLsi;?Z9=X<`E6jM#sj*ufNP)Vk$6fInbx3RA(y;p< z0CbN8-vhQ#3@%!;s_RxT?q7-Wfj0f#L7t**vmI)!v9`P|=&rg+`z8Pai#=|yx;?uu znV2X72&6j(gV$`W;(^0>T_UK6RKrv$Oa7Crd5dUver^Vji6Qs1=TAMBJKxaid`eBf z(U~~29;__wHMIH~4&3ndT$Z}aH9Z+)Z(01xJn`2LM`dokrXK{B1_@8geQ|C7u7s<{ zA|7<_Sq0QhD;}vA5~(bolp0U3TOT9pA!I)5mr$o^)>&cXHt2-6#wiBPpUCqC?H8Kl z-kezusV$J(t%Mnt7y#|LjK|n4pNbBcHC8jSxc@^@b#Lf`pYqgcqfx30sh;{RP@VW> z$B`8k!%(cO!)>e0YOpoYAJ?@HmoHz;hNjahj#j`~L|(N0$&F3zzL#8@L@_w*6kv@h z?^GTfqqoX6tn+kDYUvbEaK$ZVTHo{=SbqC UKVOo$B4@MUDqTu(6elWi zT+CEeZpB_s=V|3Ed0zwgMr5bnWbx*5q ?qOAJ0zZ%7Bd&b=j_p zXY-nYIU>yAK>*yOfApaRv!+Bq$H_22`ib|jM!@W)Arv`u@`ho_T+JM!>KEdlaQ{m< zecCu%$sw}EAk8(f*<&9&UwQn2A%>0hV{O){0)Dpt$a82vZqV1$)*+@U$yl_Z9lCDX zv3(T*qr>M*1nG*JWvixSE4&OjwiCUY!Rr<6X2^#`0{#uujnvM0>5;wMlC;Nd9{EKB z_!^V1H$JI1-vD?k%Q3*um{u>8!0u)(A5&JWFzyZZDF1s#yb}30q_M@;Tp#vKQZZK} z2xKgET|uhT9;CU$%ms6Lz6ZIBdUW{YGv0XhYDrr+PKp=>`SG;dK;mpF_^<+J;rtkO zB-3`KUBk~9n9;Nf<~1mZw)a@O{h|^?24C)>I-+4{jwxakWyVp2njXpZL9m75V^7nm zo-un8C2H*1WK~C^2hgr%{TPXjN1C3&;>*ze->3U<(0pCM5q^r6uv`4xQA7y&5f1E^ zCG(5Pw7x#&2~MW0yYz5H+*uegs(G)DIQI?$YA`f94=7B!xOOi;5uVb=fuB*Q5+P;2 zYVNC(jURHNGu^5lQfqlg^4Z5wWveP(E|9Xud+uFtz7AI)lV(oeOGJ@X824h>Tk11a z%iUP#$$Eumt@WN7mvwFf`}4hXxs4yi&llWqyFCKdOJ7<%z)Xxmxn8pt0eaK1?`{`J zNM`W&;(_2=WvX0{)HSwbWFrKjTcF(&cTl@6WVRYw`H+b85~Et7t(VO_3hB*HtjhFQ zUPB{fr__sW;4F%qyeNAwY>@+UM%8flu<2j U5b^X9LpW71J#TRtYz{_wGUb?u zMD7LY(38@GWyJ?gq9K`Tcp&8fts8ihMB}4)<}oq7%&oqANIn!HSMvmKi%In}GECJ) z?w98Ip;9YLpTuu}VoYy_HNdHkP8O0jXA@&Uq}2Rmnx$G8A+K7qji~rDhWfgvDV8de zIf_{NIsDS`$;zZ|GH`gzM9I}96FG5+V*jFeJ6q9)9$;Zd@UcSvWiBGiv(Hz7L0|8Z zM4XuZ>EqdFf8WZp#m6
8?0B(eCY^200l_q@f;cn6EB!}L z(%ns^h!A|-r#82=<7+zZvb^SR9%fRE4J(n~ouzJW+J^H+0nl5Pt5FbEHL=krTpk?y z&lo&E?MeOHRfJ4Yh6|b-A<;1^b=m#K5y5`E@AquvxRB0$$z;NOm?CUj8_SZ_Ro!s( zFE{`dE~ HUI{ac$jb2o?!+Fb3nNG%coe@tJo?iG5{r! z58c~01oUR9PBOG){!4QocG(_-AG5&0Wj?lld{r75nsl)FT*beRre>-@z6R*WsrTNj z)w+H#8_ aJ9EQbfe#8aO&!ngad%wD2o9;`E z#~L&w(5~EGK15&eG=6}6XN!)_Pnr ;IhjIHght`Z0D>nA^Dg4bn@HYQ+ VGZo{07w&6>#6w8mXtAhQ zXMFBtgR&FxT>eBQKZt#00;RE}ALD4zCU`0~Ww!cp7Nt#pZ876_PI@>d2h&C}lo1UY z$+yU2yFw!Rqd %x}P%W@i)l+Lm5D&KqCw3vbwVFNJ|A?%K*AY-SY||9H^)Yc8k+W!p_Sk5cJ)BW%;WsZUb^kGF%RjWV1{k%cB(E4mad zr1Y$pSsz|Co7=6+J^C3nsx{3T9Z6uBT}>IgPSkB;{##Iq?nN#O_Al8QXneoqtMnUk z8*lb|Q_EoRMi}^p(BOj1gJftEaejP*Rzl^vN1Fi!wk=!^o0Vk~0*lh&H9(&qyy3OE zB$DucQx-s(t-ZWzeW@JI*rwXl%?a+$=oePdSN<%h9Vl8U$JIK}*TRO2v7s8>WpAGl zpl$3k9#oHJ*p^=`mCb}roQ1A?_pc=vl_~CU|4Tnd%(HP8-0V{6f9jmmkkw;hW;}m$ zQ~Su(-s5n1RJt=U3?cI4>FT-Q2TeGpgfLiLlGBdSz-GdkpxLY>_vjT1Jum4;IT|G0 z0hn##zFQj9KP|B+jE!a4wzC#2yFI6G%-&0=1vSq%iB$G%YAnsVi?zDPc>MHXJ$7bM zvOYVtU3Gb^lq`RxGx?o|HP3M^JU(_rX0AVyBnge3$Jnn~$l@BL)#NpZB%tiv~0H zEX`V5OLoVyo|D78=Jj6@-HCQnOP0dRoPd2nsX9F82r?v)Fko?Da{xOXY~AFUc6Zm{ z2;ll`rPmc8{oc^Gz8g{|cJ5|_9(MPpa&pMSe{yqHj8*zQqevk^HD3DOHf73rbXu0Q zX*8*=>}WWMGe%7?4M*~ToTwo4kFwAau8u^6qc9Q=0X>N00$-*6!>gh&$?$AmyW;cc z5A_SKvazt3$>qxE@v`!}Ilv2ksTX3!WCEk#SN2bYW3wtyP=tH`eis1pt&`Z((455+ zzNCnWu%71@YzjAzU`36FX+iSWx&~(GMD3hgM*yCB;jGKoj6=vp-ON-v82p?}SLl)2 zS(bBcUuM3Q4`6+i8bcRL2!MWA5(ywcYY=2#U*xFzR*3X6J%EU8T1XvW0>G laQ}#0M9+479{2##5V#vhA$1I1V}5YYrX EfK;Ff?kC!=)I%`5>6tT%NOX^l(IA z0tg%Yo=mpv*r`H_= nb0;;`!J7z{_Hm7-I)D`vKedZbFZawtUNz&<+I~?!O-9p zqn5dYw49$3-HXi8AF+7VYKPo>SV7tbq45~l-$ePS55vibwa}=Mca42f;D(`@p;s-* z(ubg!ds!)+sq-N*J <70mzO~Z@Fd=9Fl>Q+M0za-0S7Tf7O|LBCd z#~dOWAen@qRX;oJ9D=ySa% }|=ak*A;#CDku?(p(sYa7GF?K$P|;(DZ8m7PM*S^kG``R%y4 zv&9!`bKMId+6t-Dq @}4 z?!h6H!4W$Vo0@e@I0i|j%zu7O0y(Z+h{qLNzLpyvu=8Q+VZt;Nqh3h@0@rL@VRH-X zd*6@K7XA3-ex)pJG<1u}A3Z6(X&0ohut3;|W1Bvtr3I^`hSj0_0&MIy+vT)lKT5@c z;4Prl4mWpKLS%^A=NLBfGIu>?x5nlr^q!AoYTcEvawo_Y3Oh!a>y#3qseBxHirvNN zu6Jw1$loKgB-kzCz#{`?=iMIakGa-ej2maXo_ECx10k*YO(Vhv-{hR&i-cw#h$#W9 zpD^m-NF46s*a@V4!;s6|dz(Hixi~ -4qjO;aR>BKv@tr688Wp;@Ew(#x697bm z05+uhSxBR*OhN(~%MqXiW9eSnm|fGR_a?P1LRpfbL @`#59OAn1}H{ zrH* ZapEu8laK z&OQZxV4*q~&~@XBN%< I5QQF+o9}f3;8ur zhQ5edTkkXG`TrDi)qhd7O`itokdh8T;YR6N2`R}X7j!{Dl >ntmX?r^ zMx<*O1Syf)r9~RyJ-a^756@rlo?p*==9=p}ah)?W*NAY?FbCh~AT?bl&!tJ(Pf0_K zIRmwe!r_Usk0#`5^kIY(5o>!0Dw-R@v&uW;hUbKDww&f%9E6|~HZ&>Ho4OZsdSn!8 z4CU8Z<&sXG9ulm ^>h-60cu^(( zZj7(Kwo5{y;8tiejNVEAF5waRsCGd=u|m@VyUa{g_cHQTs)p^Bl-jDx2O`UycaS}s z8O6l0`}n{WMRk(X)3nD8s-HOyhkCZ1AQH)>&hkps);UjR>)>NgSs~W~Z%4sn u!;X HGrg7|U{8B$Pc8nBoxgYeTQjju%j1C1X|JK)f6MvO3kZvgn}N2Ng4k>_(GXQv ziXrociuQDdM{OYZtZ2P!{l*v(yIUOCUt@mHsCN9xf(%uhJyF4cIm?5dBz4`5lAk=N zyWjta`R0#xj6_?}eKeMHmYdTRAyVvUns2O4RO@_X(A0fAY&g3 F~&{ppIE~_-R5{)B=~D zg=!~?dXZn`NigN54q;VomW)N*yH=bIp5vJ|@K#XgcA2?^&|5<|mJ #i-wZ-@3<}`)(Uyio_Mg{B9*c<(`_Htj2mc z3Nf{#wC;ho=6?Jtwze;+&A@}JwkVAT9z~`tSR{LD!b=DE@WblSlrNv A};oARpVRV{r+%K-$hb-oq_+*JF5LC8rEe zTAeye<354R_dSK_?5c)(5n(G)_a+j<2p|&Iau!o&2!; 2OW8p=gD8&ro>XP6iQhB#N_nPD*oc!Oud-an@;0>{PdIhT z?GzP83ur);y+LAAij?uwEW*l~K7mIu=~V6(P$AoM!o)9J;hG$k*(|RpQc@BNsssF1 z-yi2EzU{MzRC1A$*mnju#|Uw9mc~boeCaNqS-wHdvfUDgZ4KjD=~UrLD&|Vgf*4Pa z7;r3`AccTWCsv}CzO=+B>BzGWE7$qfLqj=HCyLKP`vwmnOHmqAU1S^lCbyE2v4#Y? z{%3Os8#dby49Mbvc2JOI2K$0sij~Y6!jCEftkb8Wze=Hj8fNbI1T`M9E<*YqGuv}h zV;JYlQNkt)A0$Y!T4y_~;6NYJ3!C;s {Ffy lh#GTL{;krJ-SeD%}LA8a_(Xg{GC$Z2WGS8 $&<626XuH!04 U)hCeupx$Mn|YZ z_?|XBmaUYb)p|hOJt6(OeQV;3O=sPt!&x=vHPa3JFxM3oQ9JXIrxKL%g(-R0!8T?x zj>3}EgeD{LT9_hj&kZr(qs$@NeRqMt@vVZewbp?k#gqPB=sgnc@VLg=@g%$*sha%y z@qLFS7D_2r61!)iUw{Ud`H^IlJKp{XKA6suKNsxVDptix(=sR%|BD^0wsd=aK$nF| zInwE(G|QeggT %TOr~yE4uAF4Eiut`0qox1(dQD z9o2Avr=WQJ5NojZnCib(jBbNDW?M9bKN&fEq8G^LBfUsv`~xx7ArXW3^YB$f$Xdgn zkZO|lP+-pYgl}z5uAh%9y-7=TGHE^D|C9MP }*PSd5@1^Az3TfDr8=tq;^F=I51 z&VRrPkzjWNxS!tZc1g;>4Wj9`o~9hhZ*l2z4X{7x17JYP-a&w32xIyYFXUy3FXqgr zaJ)n*D`3<}E8OktyZXt2{&x3fjTy%UmOa;X^3Y%IleHLcif7doXvK)#tMrOn&o`zY zXB)!b#Z)pj`7Y%qSv*`z3#|(rVU`@^Bv>E7J6;^518ViIG#ctN=yRq>{M_(Vyb?T& zbvG%SckmM7Ry8Z HML~JY2f6Hv#xwZ zyae;o(<~}31Q599lR5k(7|un+wWCnOKCVDfTqFSuV_>nm=nf^h$RqhwZl#}@9^lXu zs$ )?T4?RCK$xj%%wPj}D_r1bCpx;AZI(wm9(6-NGuuA66 zmKc<3EQ=b &2lO>TkVVnc)wEeu`LWReHRPht_(yXd z*;JtK%YzJ(KY}9%Sr1WJ|Gtnx;`cx-3uF*ucI(g2Hz__vWsGX~sbYR>Mbom>V+X?2 zn=8q(bA=r&HA)E0L9C>OsS+6rsagzchbCuZ>Qm%vv0rsx_KzfPl%fYvP@46V*m^-R zuWyG*2__hj%i>kllt$G&oa(0&udBY@qU&>peLsS{+bV6%ikEG$N?snK!8gF5hP4Lx z$_Nt?5P*R+eMv~qXP}@F(>Hx{c2pzb^J?aYbyoRl`%U2-2YJ_irbH2Hf`!`}bwPEB z3&g8WieYu`+9J6t-`HyZ-3MeAy5xLK>_(T-GQPpJn8iKLW12or_ULQ16XLfT7(1lP z;2cZ!N8u*TIk$n-M^9!wLDb +wq62)9b!}vS=in(1U@w%fHW{#Qz6}@J|Ds!7vq 4U);dl0oZmy zKrL&;jfsu^t$hWz>TH>(=~vgsyD}Q(ALD+W?q#yZA)$8~w@0I(s&DS=qHbk7xcE;O zO`D2o8Yv^*I#~UF<@?OeNmSaVk>9Dl^Qi+0I;Cx+^^aP%P$jbdsXxh$2_)^cwR7-8 zT6-o}bzOtUej6-8u^P1z7cRvoieu?BL8A&CW6d`Nhw73kD@d8}iD;F%-SDZ4KAmvA zIM;rD*<-ic%K78Uq6U3(FvP4tbXOe@pNN2N*?{~-V()2_a`Qy6T5&>=lo)z8wlGk2 zE)YYj3{Z4qDeTkv6YH&A4=ej#`f0Vy6BbTrmB&6(C?ewy$0LX!^SDD?r)hJk^Pyw$ z@@4Yw!M^ObR1r`T<<(#T>HpGbQfvin=sP>X3;WOt+qI+fyFza%^@{c$-X;KeDc>Pr z*UooIV#m1GEA9@r`>qpO8NZfIcJ#IPSq9yWyZaCjh?dMCT=i~e(U)6gM((@fj*jP- zjZ1PO&hDI-s^^?0ynsYxQT(0xHz%d}M!nW$JonNil@ubsPim0>_j=3Ja4hry7WHp6 zvPvx6Lo6pr28=qU)?LuO>s^9;xA~>9vUENnGP*8$DL{}($HFR{n!srFzWyt41^3m! zfNj|2T#(hT&4+h!LR$kuM~Fy%kzH#T$u=2xgKv-47b`$NkCl)%-~jq@!{g4Yrm0W# zZ{u$c_NQGMOp;EL`md84Q_N*YTk0-FY6H5$i=ZWzO;MS5Qp;pQLf^!VQfp@AN;eK1 zkH9a^y9oKr^ow^Ma^M!s02X| _gR$|H$ZxW8rx0_<)1sJA@>lac01c}p zb;0Ml&dVPm%wzZTb`yUy(I6NEOYUu642A5SXFsCRro(EOfDzEJPpw!l#vF9qrIH_T zzLEUk>Jyi55`F^Q{a1kGUlnFDFB=SA#%(bHO_W#M zzBJ@GhA)`_hJl}dL~ogY546v>ex9^msOMPsyjpH DKueA2Vy)V%znyR zB7{Z=x26gp9eGF({yJhF)q-ki)SDzO` ogB 5F{yW!sF{UyExH9>@?S S-%^#r2}}vBBjzIaK7K9m@VDoo zK!>cGvtV<(fZSD6HWxn%>oflm<(lV$EhyTe=^{QScyYFDx86;$uHjtwN?j9+H1{|K zKD@&xP>gF#dD%9?tFqY~EOX`|i=Lgl(X=uyL-OwYcm7|?;RIqvfM4$SLW=0HK-*f$ zKW&9c`eez|di!A-`V=4^C#c;Oo-N5EVY%@GbTPr#4*8ul!TLY}+2EDop~cxIO8MRp+NLZ4;s z3BZJm-T|_y-2rUs$K)Y>bJ(XdJF`i5JL|>5WD_=t@fao?mqdVzdgK0luatLcE0iW1 z&Co8<>gcZ?wAIP8q=@9h!qqDXFj*S)PW)uS)oLoVlT &0n6KFSx#$3`(6AOOiL`7{_xpVAnsLXO(Ttym|#?n^2kh? zkRpxf; mVCiWvN&4w=J|~Xg z@A(C9{{83Z00Q2{*GfO7v@d=nsDa=*_>aHh0SmPeX3}rEZ?g(L_HWg)g?H(;`16)k z9sUo+EIl@iUqc^om-K~3HbVtjzpczfI^od$2B2#bMkt=qG3l@)`Y~0pK+X{cDpTB@ ziiBbb@BzpINW}#W%A{gO91;E2kBW9< cXfv a>>Q)}P)2*S-FUyg~P0W8=ne&2ZJS vN8=Aju#f?O`~uu8r6X5N47>IJm-qYnRkKQ6lW~mFc)+8j4pysDv3~h~@#vs9 literal 0 HcmV?d00001 diff --git a/capi-ui/src/components/Layout/AdminLayout.vue b/capi-ui/src/components/Layout/AdminLayout.vue new file mode 100644 index 0000000..6f7803b --- /dev/null +++ b/capi-ui/src/components/Layout/AdminLayout.vue @@ -0,0 +1,1083 @@ + + ++ + + + + \ No newline at end of file diff --git a/capi-ui/src/main.js b/capi-ui/src/main.js index 739f615..019a227 100644 --- a/capi-ui/src/main.js +++ b/capi-ui/src/main.js @@ -8,7 +8,11 @@ import 'ant-design-vue/dist/reset.css' const app = createApp(App) +const pinia = createPinia() + + app.use(createPinia()) // 注册Pinia app.use(router) // 注册路由 +app.use(pinia); app.use(Antd) // 注册Ant Design Vue app.mount('#app') \ No newline at end of file diff --git a/capi-ui/src/store/index.ts b/capi-ui/src/store/index.ts new file mode 100644 index 0000000..d6729b1 --- /dev/null +++ b/capi-ui/src/store/index.ts @@ -0,0 +1,4 @@ +import { createPinia } from 'pinia'; + +const pinia = createPinia(); +export default pinia; \ No newline at end of file diff --git a/capi-ui/src/views/sys/Dashboard.vue b/capi-ui/src/views/sys/Dashboard.vue index 4faf2e6..7783308 100644 --- a/capi-ui/src/views/sys/Dashboard.vue +++ b/capi-ui/src/views/sys/Dashboard.vue @@ -1,39 +1,77 @@+ + + + ++ + + + + + + +++ + ++ {{ systemName }} +
+ + + ++ ++ {{ menu.title }} + + ++++ + + + + ++ + + +++ ++
+ + ++ ++ {{ item.title }} + + ++++ + + + + ++ ++++
++ {{ logoutTitle }} + {{ logoutDesc }}
+ +++{{ logoutCancelText }} ++ {{ logoutConfirmText }} + +- + + -- +- Capi系统 + + cApi
- - -API管理 -数据管理 -系统管理 ++ ++ 应用中心 + + ++ 数据中心 + + ++ 集成中心 + + + 系统管理 + + ++ +- + - +++ + + + ++ + - - 管理员 - - - + +-+
+ + 个人资料 +账户设置 +@@ -43,12 +81,13 @@ 退出登录 - + - + import { ref, computed, h } from 'vue'; -import { Layout, Menu, Button, Tabs, Card, Tag, Dropdown, Modal, Row, Col } from 'ant-design-vue'; +import { Layout, Menu, Button, Tabs, Card, Tag, Dropdown, Modal, Row, Col, Tooltip } from 'ant-design-vue'; import { ApiOutlined, UserOutlined, CloseOutlined, - DownOutlined, + LinkOutlined, LogoutOutlined, ExclamationCircleOutlined, BarChartOutlined, @@ -193,13 +232,19 @@ import { SettingOutlined, FormOutlined, HistoryOutlined, - UserAddOutlined + UserAddOutlined, + HomeOutlined, + DatabaseOutlined, // 用于系统名称前的图标 + SearchOutlined, + StarOutlined, + BellOutlined, + QuestionCircleOutlined } from '@ant-design/icons-vue'; // 导入Main组件(控制台要展示的内容) -import Main from './main.vue'; // 假设main.vue与当前文件在同一目录 +import Main from './main.vue'; -// 模拟业务组件(实际项目中替换为真实组件) +// 模拟业务组件 const MockComponent = (props) => { return h('div', { style: { padding: '20px' } }, [ h('h3', `这是${props.title}页面`), @@ -209,34 +254,27 @@ const MockComponent = (props) => { // 模块与菜单映射配置 const moduleMenusConfig = { - api: { - name: 'API管理', + app: { + name: '应用中心', menus: [ { - key: 'api-list', - title: 'API列表', + key: 'app-list', + title: '应用列表', icon: ApiOutlined, - component: () => h(MockComponent, { title: 'API列表' }), + component: () => h(MockComponent, { title: '应用列表' }), closable: true }, { - key: 'api-add', - title: 'API创建', + key: 'app-create', + title: '创建应用', icon: FormOutlined, - component: () => h(MockComponent, { title: 'API创建' }), - closable: true - }, - { - key: 'api-history', - title: '调用记录', - icon: HistoryOutlined, - component: () => h(MockComponent, { title: 'API调用记录' }), + component: () => h(MockComponent, { title: '创建应用' }), closable: true } ] }, data: { - name: '数据管理', + name: '数据中心', menus: [ { key: 'data-analytics', @@ -254,6 +292,25 @@ const moduleMenusConfig = { } ] }, + integration: { + name: '集成中心', + menus: [ + { + key: 'api-list', + title: 'API列表', + icon: ApiOutlined, + component: () => h(MockComponent, { title: 'API列表' }), + closable: true + }, + { + key: 'integration-history', + title: '集成记录', + icon: HistoryOutlined, + component: () => h(MockComponent, { title: '集成记录' }), + closable: true + } + ] + }, system: { name: '系统管理', menus: [ @@ -270,31 +327,24 @@ const moduleMenusConfig = { icon: UserOutlined, component: () => h(MockComponent, { title: '用户管理' }), closable: true - }, - { - key: 'user-add', - title: '用户新增', - icon: UserAddOutlined, - component: () => h(MockComponent, { title: '用户新增' }), - closable: true } ] } }; // 状态管理 -const selectedKey = ref(['api']); +const selectedKey = ref(['console']); const moduleModalVisible = ref(false); -const currentModuleKey = ref(''); +const currentModuleKey = ref('console'); const activeTabKey = ref('console'); -// 标签页数据:初始包含控制台,控制台组件使用Main.vue +// 标签页数据 const allTabs = ref([ { key: 'console', title: '控制台', - component: Main, // 这里使用导入的Main组件 - closable: false // 控制台标签不可关闭 + component: Main, + closable: false } ]); @@ -359,16 +409,10 @@ const switchTab = (direction) => { }; const deleteTab = (key) => { - // 禁止删除控制台标签 if (key === 'console') return; - const tabIndex = allTabs.value.findIndex(tab => tab.key === key); if (tabIndex === -1) return; - - // 过滤掉要删除的标签 allTabs.value = allTabs.value.filter(tab => tab.key !== key); - - // 如果删除的是当前激活的标签,切换到前一个标签或控制台 if (key === activeTabKey.value) { const targetTab = allTabs.value[tabIndex - 1] || allTabs.value.find(tab => tab.key === 'console'); activeTabKey.value = targetTab.key; @@ -376,24 +420,26 @@ const deleteTab = (key) => { }; const closeAllTabs = () => { - // 只保留控制台标签 allTabs.value = allTabs.value.filter(tab => tab.key === 'console'); activeTabKey.value = 'console'; }; const handleTabChange = (key) => { activeTabKey.value = key; + // 根据标签页映射到对应的模块 const tabToModuleMap = { - 'api-list': 'api', - 'api-add': 'api', - 'api-history': 'api', + 'dashboard': 'console', + 'tasks': 'console', + 'app-list': 'app', + 'app-create': 'app', 'data-analytics': 'data', 'data-export': 'data', + 'api-list': 'integration', + 'integration-history': 'integration', 'system-settings': 'system', - 'user-manage': 'system', - 'user-add': 'system' + 'user-manage': 'system' }; - selectedKey.value = [tabToModuleMap[key] || 'api']; + selectedKey.value = [tabToModuleMap[key] || 'console']; }; const handleMenuClick = ({ key }) => { @@ -404,8 +450,6 @@ const handleMenuClick = ({ key }) => { const handleMenuCardClick = (menuItem) => { moduleModalVisible.value = false; - - // 检查标签是否已存在,不存在则添加 const isTabExists = allTabs.value.some(tab => tab.key === menuItem.key); if (!isTabExists) { allTabs.value.push({ @@ -415,8 +459,6 @@ const handleMenuCardClick = (menuItem) => { closable: menuItem.closable }); } - - // 切换到该标签 activeTabKey.value = menuItem.key; }; @@ -424,8 +466,15 @@ const handleDropdownVisible = (visible) => { console.log('下拉菜单状态:', visible ? '显示' : '隐藏'); }; -const logoutVisible = ref(false); +const handleUserMenuClick = ({ key }) => { + if (key === 'logout') { + handleLogout(); + } else { + console.log('用户菜单点击:', key); + } +}; +const logoutVisible = ref(false); const handleLogout = () => { logoutVisible.value = true; }; @@ -435,11 +484,13 @@ const doLogout = () => { localStorage.removeItem('userInfo'); logoutVisible.value = false; alert('退出登录成功,即将跳转到登录页'); + // 实际项目中应该使用路由跳转 + // router.push('/login'); };