From 43b8536c7f86c403ea0b800f258a0531c6812cf5 Mon Sep 17 00:00:00 2001 From: wikiboss Date: Mon, 21 Sep 2026 16:17:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(mpuniapp):=20=E5=BD=A2=E8=B1=A1=E5=8C=96?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=BA=95=E9=83=A8=E5=AF=BC=E8=88=AA=E6=A0=8F?= =?UTF-8?q?TabBar=E5=85=A8=E9=83=A85=E5=A4=A7=E4=B8=9A=E5=8A=A1=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 替换名片图标为圆角矩形商务数字名片,彻底消除代码标签 - 替换雷达图标为中心基站与同心圆扫描波束,彻底消除API文本 - 替换潜客图标为双人商务人脉剪影,彻底消除4个方块 - 替换我的图标为典雅端正的商务西服肖像剪影,彻底消除大括号{} - 优化工作台图标为现代微圆角商务控制台 - 严格遵循81x81像素Retina 3x高清透明PNG规范与色彩Token(常规灰#667085 / 选中蓝#0B5CFF) - 全量11个测试套件64项测试100%通过 --- mpuniapp/static/tab-card-active.png | Bin 1142 -> 934 bytes mpuniapp/static/tab-card.png | Bin 1146 -> 931 bytes mpuniapp/static/tab-leads-active.png | Bin 459 -> 1252 bytes mpuniapp/static/tab-leads.png | Bin 461 -> 1314 bytes mpuniapp/static/tab-profile-active.png | Bin 544 -> 1009 bytes mpuniapp/static/tab-profile.png | Bin 550 -> 1098 bytes mpuniapp/static/tab-radar-active.png | Bin 923 -> 1781 bytes mpuniapp/static/tab-radar.png | Bin 928 -> 1779 bytes mpuniapp/static/tab-workplace-active.png | Bin 987 -> 1136 bytes mpuniapp/static/tab-workplace.png | Bin 1031 -> 1126 bytes mpuniapp/tests/tabbar-icons.test.ts | 63 +++++++++++++++++++++++ 11 files changed, 63 insertions(+) create mode 100644 mpuniapp/tests/tabbar-icons.test.ts diff --git a/mpuniapp/static/tab-card-active.png b/mpuniapp/static/tab-card-active.png index 31f83a029feca7066cbf6139a9524fcbf508582c..0ef3f6696645fd543282f203c6be514c13e1556b 100644 GIT binary patch literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzk?##^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!X^24-td7srr_xVN*{mJ2(I9DTiD_Z()SPM2@~ z4oVYMjcpy3CZ5>km6Dp8stObh3v*L?e6Qf%v&R#xjdy2$N}GIg=lG8eO`)91R zx%^?%*P_c-GaoNlb#>~Uz4O}4CALbeo!p)wpsx6Hu{p;x)8$`_Bxlc`^n}g$_9FXa z_02ab6z9f^*?+DuvR5npykPQvi+`nko;wb_NSovTL|dwCnO@EDTT&5gF0HJL&D(g5 zXKu~KfbjG+t2?iqG(U6YZ12*HJvNIT?&P1pVVzo>&tdB`OAc8XU+}ouM|2wbPfcxEHb0Ugg@#4aay)PR-ovSC@3xs$=@`kmXBi z;*ILLI zX}O!`_-d-3VCUM)W-ixHJuzbJZ9B6iakpJn<<2v?Tc(B_{vKIm^nQ1p{Kc(oMQ>T9 zB4@q)+_$gY-TBsYOa3_TR@1Zv6Sv;{pZ@l_M){oEVvx|%$}&@$u`)x?1e5XVOxc|< z8Q~c#-%OujC7%ARcIyS*v>7WuOqZCi5wqjiu2~-Y7pVG2q`PfueV?*UU1ZH##=BCg z=0E-9HeBm@SJU0*T{`#W55|ihUwOSNn*ICH`eP<>bqiiR33tc|ZG zY8`syyUJzyvNX$?qP07X+vR>0fA)% Z*o`}+&)CkEQ3B>I22WQ%mvv4FO#nABv2y?b delta 1122 zcmV-o1fBb)2lfb%BYy-vNkl!|by-d!04E*^jl?3_%bCK@bE%5ClOG1VIo4L4ObgK@bE%P@YEVo^yL^ z45MR);z7*9Ld>hx`}}fp>{V+J-RBHki~VuMZjNOudzy&nX6?6jTNHiRlSO=aw?)y1 zJxRm~7+!>9&Xs%*DHS z9FLatGZLp}*MIFqT!bgE3b(0}%5^|DMI44_a8LG}LrVHO2m2K5uduGo{bP&w2JXhQ z7+&((ZRwVXhf1SwR%Tm|IVJt&Q~9M1?!O7&WY?D!@r>>N_G)xP#3@*f6EfQhOv2|S z{0+hM?7EZGW(`il^2|1|i0hORG3=1KMZ6lzaByaO1b=5?V@aPU)-N(} z{yKC*6%n7p0Y$r4%EvBJ?{VyctX+00_hl0<#hp^zq|(}xWgS)#u_tRcq#e1Ig}Pvb zR6lG|mx!b|N89!!Q+o5OBH|_ZF}uDFZ{wf}K7VtjYVGvjNo#E#jKUjI*3jf9TwK;+ z6%kiS3-#*Eb{amyaTWYF$#>-?HTZ*LrH$mw%=WQVsOU8R+>WZd^Y=I%PiMAqcwZW+ zWockWc3sC*zEFzm@XYp{^u=$e;<%1H@o!v-Tk&6E8;<9t#k))eWg^BD?M>3Lu`CVT zj(-=Wb(R$8JY0^yD)>fyCzf8^i}UeEVQb(HDV-QGK)-?L`&&xSKsUBwxHQ`C()u$0 z#7xZB+MO#=_u2UsOvc*GHq-Xgs2z2jQpVvuDV=GuPRe7Kmh{;#-KgSxDQ!4!X13;n zKDmSbW3(#Lz0#3#XPHzy@A%BNOsedZsedHxkZ#ozf0s6f1(|IW?(d-Q46V36!4D;# zf1i{GHd%BFpTdsjNE@80!?pvHs z<)vDA=b&aViP*4h>8s9yLsuD0A|6q^7-WAFX~$p^af6i0{ey=LqQ8j*K@bE%5ClOG o1VIo4K@bE%5ClOG1VK0XA1Vv9-W9e~bN~PV07*qoM6N<$g829>ApigX diff --git a/mpuniapp/static/tab-card.png b/mpuniapp/static/tab-card.png index fbb116d59b9cbabc51476ce2ac48eb1fd15297da..1652b64b556fc7064d37594781b25923f1ef9a11 100644 GIT binary patch literal 931 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzk?##^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!X^24)LS7srr_xVN*`7T9No*u>hF z9++gUYE{a0>W<`VDT#;(Aj$v{5fT|Q&YdcIyyy00nQH$}mG|n>ldJ$J64 z6Nh4p0Gya`aYo45*Pd7RXlwm{dPDW~oUqU4GZIBk_5TZfIcxT%pTB#yYP|kwndW`& zY0kGbEB41tJ*Pj__35hj)33gtob(e z&7XLadzYNV8qGf?2Up9N{PT;f*RJ$PDl=AFSJ~gDebzoXm+wSy)b92E+5dU7&rX=F zFLmm&c-NYjWgN) z3vN_%HweBIlQHE=jsp%xO0Jr(p4l<6SF>*g zKYZ(5411%S;pVlP{MX#oRa>+FX?$JQ^;dbLUyEtlg1|Ft3jV2I%T?jsZKf%ipeK2^ zRby+Gp6~?^wC<(K$+J<*Abzhoq1F!fDqYI@T=>4MrQJ!7EsYb$Q^Nt*@#=lQ@z zB&WK9xVfI!+udeGzWk%V#_=S7Z@szN4m;iHk{L^8y3RYbpklWn+rwXnV$v2&OxrfA zu6&!e_gl65X19Lt-yQkI^h&J8aqgm-AO~MvedWWZX{Rm3%BHgiO@DGD>h%`x3LU{~ zGaB7$(~LI!-T!yhU)MDk#jZ5Izr5v*Rh{^$jaJ37EK-rP*4{67iI@AD{r|ho!;No> zSQkv(dh=V{Z_TdU=Vh$Mkvq-Nv7l_ks1I zVfNqHiTCa-|7WtS;GdO&t*)-YW=m_I%%W>^%@Vy1{qkOw;5B*klFuH$3e$OResO=V zE$JDT^46NsXyMzj7-VM8Kg`Uc zvX?~lM_ADVqd!AaNJ)r-kc_gzKPq}bVbY5pqCGH6il{6|GctlM})hS_Iv_Bv~Rvma}(8G;}Pf*=TjAP9mW2!bF8f`1?gf*=Tjpgdh=JInr2{SRIf{$FpS6bYA5U#_i6`t2NoffeR zv+*t-$D<|v41dR&*>x)sm*5Gk!Cfk(a_!Jb5r^Oz+><@$h?2f8zyU@3D{N?S|LEeq z3k&cphL(JGOFAXuk<#d!k=Zt4R!M*PRDP+A`)|WH+4WULJfnNRy&9bmaT3ICoT+-+1IJ9X0hShEM z+l(oAIJ1o`;=7?_EWJ{fh=cF|mP+Sa_!qb0mZDvjd@8?=ZF|tS5yQ<{3_lG$#@Ynr3HG*v|$C#4ZnGTUd;`nR&8Z#W7k z6zy%&NPjHLJ5pSqX12-r5XV>WTS>$z_yEUdwq?@Bvaw1~85d>k)zX?+g>R*N^M%Yd zw(vc*w+`)4MZ~9YNYUOd5Jb~#c>^Z;@`LycjCXoHWbfGi+7m{%6N<_+FPV! zV}Dt?Fc&XM>nthGIk*~sRq&1aPAuDTFD}L(g{=$oq;z6fAN~5G=Wi+9ecjlCq0(rZ zulZ&EiRoCVxjR>)?z8hNn27b6ZMt2jQ7h^=rHsLQQaaOMgOtZEFX^*aI#I>>Qrd9d z%xsMXePSE^M`>21w@XLLJ!L}iypuEA3V*4xQ>K!%TRK%w{9W1@7G<^(xWA3Q(=_Ay z1V5B`{(Vv&*kCcv$FC)PwWO1k?X6N#Vy5Pr_C*{0>X^#wiuZ0Qf1Opt(-G=CVf4jP z>F|G?l;rM?!BUdlpsa|qq;+pSzAovbZTdq*(uY~!@~(8uYwYAdONo0Kwn}BLeqUjr z{qCGk<>i`r=YVD)iP&Z5(pQ}YhmJCkL_DT=F~I&N(u#p3;wCAV`v(shKz|bnf*=Tj sAP9mW2!bF8f*=TjAP9mW2!c-XKY!e{-pBT+t^fc407*qoM6N<$g5riX3;+NC diff --git a/mpuniapp/static/tab-leads-active.png b/mpuniapp/static/tab-leads-active.png index 4018448570ec27da1d0ab57496f094ffe028eab0..f4178cc0d2a83978efa6d20cf47f1120236a9ba3 100644 GIT binary patch delta 1233 zcmV;?1TOo_1LO&iBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1bInBK~#8N?VBNR+b|S{%huYv+u-2f;NW24;NVs{m%+ip!LY)? z!ob49z{0@7!N9=6u&3RVl-7QdY*~^WyL;c=yWX|3WXaNdzki<8vonTa7=~dOhG7_n zVHhTy;!1ulg}lU{^lwZ6g^<6?O3H=_xPSXYexhY(56+UJl0VA|Zi@;Y(8>j@O99sx z0>04lp_CQutU=TRdB6dtS5)woKHo(l;LfhAW(!!;XJ&<3Y61>c z$J%TG>vv1}o`2TmWhu|g3T}!D{#tbz!xcaun?Bev0UO#Gr!9;%eh-hm2J(m*P})Wz z;Hg;3548BCDTQ3oj`TJG8(MED7nS^G)mOm{EjL-T+~~Q4y$0WD{h_F!RjUgF87(te za4Fh@5orSUxI}3iA)sy~bscD#NrFQ;;k#u>Qn@CPlM^4p*ZW-xwu{`@=Ush=@1BuH9qpi0i4pTE|0qdL{L|^Ef znN!xH$LMIibZ>*ll$ubRFHA_#*~idtg932`mWK0wA|3ph^kD$H7ysy=(lNIjve>IwA|3-d=HmT98_@Q zzmw4hWA9U^;JOzc`=0^U>KZyadxFa7n|4<)hz%}u5HS}(%VfoMn<3X(abM_rM9&~1 zn+Cs0=GuCVq7NOo^dc=23eIelX-a)kcG1{TF>VRvz;Z1CSCS`z_C;nkp7_#{c^8!? vQ`+@}@4_$)!!QiPFbu;m48t%C!;Hi~gQ;AKX?1=<00000NkvXXu0mjf1L#^% delta 434 zcmaFDd762Gay{cDPZ!6KiaBp@ZS;yxlxY8`?ka0FO>7QV)8q-R?-wo(zUz7<+dzpg zXx6=^?H8=9Dun&?^d8BUyjkFE<)YaA!1De788WqX1v$mPz|7m7}isvK{+Iwcf z$0HY0E*-2rBgMFXUS%$iOxdnq=N%ub$?w|H|2=J`!EgQ>y!CgFnTA0#*wkd>d%x;Fa(eZ-^QpuR zp1s#ui+?T3s+YW>dFK4B9K&MvnAU6i*Ykuc)v?rti`8rYnJsbQnP*PvzM9iDLI~Rz z_#Rnze%;-F9h;f$IvJ-5pVqxBAEj2q_|574*H>DC`6qJsD%$qFDC09oLUZ&~{@czE zbV}ssN1a*27`^aoxYpsR9oq4Y&8Hr@+RLrqS#0eM4mi(AznPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1h+{WvPn`S8WbU0qj`rCbRrQA}7l7|ZoNP6}rPmsME7B?Jl&sOJK+ zlL;E<=&(s5E6z~Q2Dw|~c~v~2UKeH@jIlv0`si?5FbeRfXM<`(eBRfH6qmV=>GK{Z zMQ{Ak2!C0wP|pUFQFVq!J%o~yDY9ul-uMWUS%m~wWcw7&{PX!8>eb<%f#)A4kx(iu ziNUF8HYEwhv8S$1jIAy;vYkX(Q^)L?A8|7DyS8?hF(BLN>1woc6~W}&VAL^TCRG{p zmf~LJUS)BvOOYMwR{A(TLLZ=X>3mH;_4onJi+|D4vx8#{II&n38{?kr>T;C*WJ;1D zaqVcMQ2Z1F0=5nfClmu;L_8aU(!Ceg6e}TnlW{kc5W2FkD^${$n7q-MJK)^rzlTd| zl%ytk&T=YRwtghr7kM5X8`DQ@s|@y&ba9%PK2It4xz)kF7Jb}FzxQaFb@49-H@ixc zGJhnwjXspJPlOX%L93V(G&?A6WsbKNtz}1iX4UH_l~lUy0!%Y}k*^cqb^x~(PEOLRzxkX5aQj2J$GC}Uq|+}qc?EOjwE8aim_;#OUD zG2Gj@Hn!_dcZg;7$JWW~K4O+%xOQVqQ-8N@MMuf1`UVD$9bsH=O4n!}2t6B+Zaf4A zZ91@T`8c~6-D><;UB?iEz}$6to@6Yy!->{p>$xGBci~$0m+bE5_3_iQGfQGG=Fp4 zI((LHS%rfatjygSl3uHkxrsLX^*fU_qfW#X+Xw8k8cm6IFdphehr1@yXA-_}p@iZk z>bb&Qpo&pGSuxqHQM<(`XIwGax)B@uOg!dTop6_p$f&3{G?-DfcwCyQbM)J^d|=Pl zs5dk*--C;ZgBIN8&&dw{!_fQGeSfgr3lI9s0LHt9&CXm>ImM=(O9r9I1&v6(0Mv;J zcbg&BS+Otp9-%9!SvC!PlZ@MX9iu+v;Oa%xam5^G-1@Zag2Aj9>OwKV(Bg6>c@&gi ztXz$!zI0^bV$~+wo$_4-K@bE%5ClOG1VIo4K@fx^@fXn?P2NXR0ucZJ00{s|MNUMn GLSTY`9#>ib delta 436 zcmZ3)b(VR8ay{b|PZ!6KiaBp@ZS;}}lyLtjY^bTz+%#2SgHX;FS)H{$`bu`q+F1*Q zYFXnIH*Wc$8no0?d0*qwR@6Rx^&hbHd#?dPXfn{WjqBbU_K81pU%Pe2PUgDyYxQe*!j;Z3+G}_FbN^Rk+fpeMJy(DEOn;cQ z49aXXB>u`s+7#&Q*nm-rrA5EY`jgpSn$a P$^ZnOu6{1-oD!MPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1BOXNK~#8N?VBxh+b|G-%huR?Z-aw_gN1{IgM(e9yc7-w4weNL z76uL$77h*;4i**;hMo5AitkUYGQ1G`<<_Et=zRb-f zK4Dx@M~Q-`Vs1Y0TV_QuHCO*lc1LC&g#`qk%2LA(zjqeAnVXMR0j^?Bkt}^B1qzQc z8p-YxtKc;&(|^XG;3%X8DHQzVYb6Q#!BWARE1)gO!mLk@#77JK=4+NU~LlLiuig-f+Z_7JFbLtWuo9SUn^;_8qJk(o@8RioYsesunSha z$v0x4fq!K+LgI{(RB~Tkcayz2S2H(D?1^x*Z6a3D@Q_sl-g_k)-KY z)tkkssZ3L;MoX5-m^;3T^`$&6)isVpb&82x}DBt6#Fo`@OS=*cG|gJK-|WSO+R9H2XtV(btE140ZkF zuFdxlG}0VaWE}I1_-O_=Ij{mZ)G9Itvko<#Vr!t=uXwooq!w$7SwdrI>XmPb1fKb| zF@HdbytCJVEyf!GG4f5#6~8tHLaql(Z2a2Z@V*mc(&9Olub;!rWK6q|l2;6-S z;=_H#1vHgGo%E4-zeA(oiC@<_J|`Vb-gN+~ZSuY22uk00U-p%`yn1sKlV|u2->$VX$jkfl<5jV5ClOG1VIo4K@bE%IFf&usyiO^UOycG0000< KMNUMnLSTZTb=7kK delta 520 zcmey!zJO(day{d7PZ!6KiaBp@Z}by!lsW$Kz5utiG?(@HBkU8-wYXVZ>DF*_EiLt& z(z2M9J1ef?*f~Dw$*&(U`m~&T#I=5N^yb-~5r@z1JpM0j`;PbOiZ|cfId|sYyMHZn zrCAuD;F|A-`|sP0t`;f1jBS^j=e6tK`E0dGb!9JJ7hBd}{k^SCpl18N#Mha| zk=cpAo;BJpD{bcS#$H-@fqUh@K%M70MeR3q<~Ix0>A&;%HKSVK)J=us>L1k#_vK9a zw&?Nn_uAa9f1mzed~C+bpEsUx7=Bd=cw67Fqvv@1l3)A}W%^dDPrZ@9m3dLA-NO^+ zMo)7bI@nq=un`8={BHWLjLXb3?zT>xUU?%zJ?C|GKyquu+m-t~wv_%9?>X+hPF@CN g0xS*~B<3yIzizSBy>D@=n07MMPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1K&wRK~#8N?VBrb+dvS80}Bfa3kwSi0|NuYQeY{a5}i8*WzLN6 z5*Sz*7+6>s7+4rs7$|7y&VO3hnbn>imTgI={bm-#S!r~u+keOHolZ^^MNt$*Q4~c{ z6h%>{##OdFy_&n9sd0~qvCpY->%`c<_&YW3KF!=YzeXX_`SOg6wQeAJYL-9vJtoWL zV)4e$u(F|QB{A;z*YAsW{GO9ymf4RRm+c^VGItmJ-jm=eyM14{WyvVJ$rNKHC5o~! z3O9X8jJv}OLw}-yfs*;nZB@*~HIs5}Bn57StugGc%WUzMUjq<7VN8C_R_p`6CQ1+o zQ{z@;1Gx1pv!A)X#B6RqVdnAcy-dNaLzy_q+%?y&0woc@2gwuHjS4Dfq-64h|8e~~ zs3_<6S|e$3-DvPhLKrk$oa;7$UP?JMWY%!qXh6*41Aj(r<9cmCA`=MN}hO)D7&+L=6Y?AvOQ)e*NXUYv{nsK%(LLQ6klLBzfK1 zw^%pJJ%332zRSvIlwigM8wg(P19$KAoBMzwx~#hu82I%y(Su$gH$oSgj2m+T#dmA* zJ;LRpGLVjq0spycuY7zzDG^<=AXFv^+| z`@W%03me?aCMmQXWDz3Vc}-pUT5{gh7%XJK%0c1(Gh@H(bG=J_%DPOy8hoMNz<>vj zQGdR4s`i568nWmSh7EYkxI~@rs@~%;4H;_Jd+F&|2OWAU?Zc4d$9k!a2<^H-4(+~m z&{4jCAqR4vF|_M81OslUG~^K6I=tyLtPS+gc}A33`>YaLLvOhBU?_&U?ht_c3eVcF z#{@FqYS;6Iho&O*bUIYk3299X_vU&-B7d|w)=Q=i#hALy_r9U;XUfmrM+^@%7xG?% zbVHJy@MkM>4DT;HK6$C&))T%vS}L?4RGJ+< zx$p;ojHO>khXsV^Kl1l4Lc3`-hNQAVeEwr^aIy6$3hYt1@`mDD>upHt?fEhD;4i{Q wk0pBoGfz)fD2k#eilQirq9}@@C`x1g0p(t8RDN&aP5=M^07*qoM6N<$g2#al4*&oF delta 526 zcmX@bv5aMcay{c)PZ!6KiaBp@@6WsJz;OIy{3^b?5mqJHT2C1hx{plC%Q<^t`wNCO z773TE*61=D>mRtZHac>`rmg%9EIB-qCyudgDsf#m%RBbZ?urxNjbm#*{{5*MescP1 z1}HeN>*bE;zh9m8T=UB3(q}2(H=e)h&R6f6wC`%h>%S@WHdPx}EV}&BxAyS0OH#@% z&1a|m`m2;FvhsK2!0p+ zTqO{Bj&0@s&h|-i?Vn1ndRv|D-nXQ#;->di|5pO5Pp98GbpL4jq)%7o0-YIDBV6yY z?*B@ix0Pq*@5}3)?*4TAzx!0XcO$pjmb@p{RdZA%=N@wAVE)dS3j3^P6Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D28u~UK~#8N?VK%axbg9i&Q8Lu{^QdJaK zxa?rymK~}J10z+c76wK|g-a?01{ACc_D%KPj5qe1_h#%}dw+j&^GQ#qOUCy2`Tfq= zdG#uj$z(E_OeT}bWHOmd=CfgDUzf(dD=YX=8asCacSQwDl(K@4__N6+{Dk9*nf;od z;{V&twluIVD{K1*Dc8XD7c=_}Klh7gQrRES%D7VY6L>%?MT_Rwdr?db zeD7S7D_}^06@P{Ve(kdd-Hlu}xZyDc9x!(Dxtt{~QFM%V6dRwD2PvUWIG9W*e%g6C zg-?Znr{H)&iVAM{oX!f$sKSjkl(sGm{7&w-LoD;zd{G*B49?xY&K)K(e*9@e){}By zSPWLC%eC@$?=-Nj*b(ypz=Ky))KZ}|8zDGgkd1~z;yG@lBVyTstpp)4#+7+rhU zSmZ3qzU%t{iVEIqF5Q^df**HOy!(WcHt^V0f#_oRAShc)=W^#;W4OSupd}?$fz$AO zhYBy95P##KfpsSfa&_Q5mRUui7z;N|WxlzDA4{|OkB==X_|0`P!8smJ!mUwJ!Q@EN zt(Pyvl?2dH$U5!3tl-z+cPLZ%gxA8XEIlYJjrhC{j#$nZxaH$GREqH9S_1ce32gDa z9LC4QrI>F1XkHUneE1l$XeBfp1X_&|CY6eVu767rZkm*3uhbI6)u12Hy4u$a&*gtU z7mg1e`cYd$$vRRKk}MFriN1>kn9L^C<}ZG(_Ibm^p*{Gc#71-hX)-a_paq2BMq#O1 zUIaA@Zw2l(#YonO%H`umhgMqn#C;GKas6~FiR@bRrWI)IxcOB;G72T z__)ysid~w398bbh2=4h9ju@|+q9_od?SjTwE!j!Q1xp`3ZZsq-(Yh4gTgPH2!pCzd zrtl{}rU{RAQo&slga}-aI22N`s<~*Ggy16|(?pE7wcv6VZ{-+a64S>^D?5D5Xn#oV zrdeVTz$31RP!{IOqvPDaG0Q@NMTU67YZw2AtQDmN1a0jw$e5|%?G_21Eu^`anrJH# zzC{sh=lDHfQsQGqBdo_FlO?4zCfea?Q(WZhj1<503ZRC2N#}>_l(^*MMuP`$nk>Fd zq<|T@tq?hrH}Pf8wSUF#I%R(EK1MheWS5d8^zF~~`z3~_O*ovGb13oVPraM?R--D2_9zi=9?2x-m2=t%WqYD3)LM7YZc)D>D=J`n&Bv4i zrMQfeI&O4=Uey=5DfjRXKz~*yi+E9p0>@v5zvBNN!8(VG!j^yY!d0iPA|551^8Eu;})$7 zEKaYC*#nGO;)2B(f?t33;8Z%1G4N%OQkd^6FX$WRE}&()RhoSj3J=)Uy@t|V=k^lez07*qo IM6N<$f=m2msQ>@~ delta 901 zcmV;01A6@R4Vwp$BYy*8Nkl5QUeS6yOfxbf69-S73Eur2@xSUgBJM zwOv7+4x|cVci;}R z6~%F<8vluiz6^ZMm1S7jEBr+rhmHHIFYKtjlpjC_}q+-%%o*^L+nN535Bie8bh@5SF9`@4v&QwYJ77M z89GS?lOqx(;y40XNMXLOP&U}U-__$6)>YYx$dM*Ot<)6}@@hw^{8WV=i>KE0Sx4g5 z%3I+`2|CMRr$F@BXo|InTPwF`!Er6k$orU&%XT8}w|}yXOXFHPBbJespyM|KDOhLmq@(B4gpOJ^TS|MC8bl{q1V!J>yzhyX4vW;Z~8@ zXJtVIKBuxapCxy~Q7C)ob@JA82Ua5XS(!H1-91p>64W zOC9%4Wq*C!WN^0c=5mC$IjXbB;#{lmhpa5DynyG;KD)gwJPZqSh^bG(b!Y#3s*0P` zhVH{cM2VFR**8aIsfUmzB2Ny|>pz3aIHAjW>BXN%X1u$J z*Dh}P^0&FKD*EmT4; zuM$yi?D-S0000000000000000000^ b3?ljmQGej137FD_00000NkvXXu0mjfPv*F_ diff --git a/mpuniapp/static/tab-radar.png b/mpuniapp/static/tab-radar.png index 9f9b72854e31bdfbd12d759f756dc0ba629b8d64..bdee691c0bc9e37f08ddba404d016d82042ca8cc 100644 GIT binary patch delta 1764 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 ZkbfoM6)Kajmqq{p002ovPDHLkV1l3M@x}lE delta 959 zcmaFH(atd;tbUHCi(^Pd+}qiP*&>c24ePgnfRJ{!_r^_Ix+l!-j7mv!=5l=4WIcI_ zhccI$lK=~M_mn7(Tamwnw`}HVD(J{~@;3I&z1uVQe!q76O-il2jnlV%b8mh(+P*u# z*j$RUNr3|i@w8m!oxZl``122CjR&&ct<$Q1U7z*3f6L8(OW*b#>$`AZmgc(5$NQ$U zu5n4bllz8?amz>ZtzU(6?@m1TyqjZT&;3KcIYbkdK3vqwwR76<^osaI6RCq-hmSU$ z$oZJE%jjeFyQwh+S_e+85zRe&TfVm62)wpG((v);iar0iB0M)NDkwbF z^z`W0RjbYG|EQ+kectf<<$hfi6+UgvfGN%ql{eV0ojK>KA$58KWMXMKmdMj(AcI3gX*^~8_OnYNjc6&kZ=EnMs?U(Pe?4H0UH0Nya zZ|Au`->Kbe-C=zrmaQOPQtQdgw|Qcvim`?r@6y(B&#bO^u&qmI(cwtePFu_x{;>HT!t)N$iyMbrtF-Lu>DR8A_L zQ=0oO?N-xO?iFk1-=5|m=v@DP66e;dZ>B`5H*vk-GkP8C<=S%p@Lk_R`S;bY&YWw# zTD^G_H>Yaj_qUU7{MoVF^OTGt zXC5u6Dh-$X&Ic4c5d6FheE*}Lyx2m=s!y85}Sb4q9e0Fi0fegFUf diff --git a/mpuniapp/tests/tabbar-icons.test.ts b/mpuniapp/tests/tabbar-icons.test.ts new file mode 100644 index 0000000..b3a8111 --- /dev/null +++ b/mpuniapp/tests/tabbar-icons.test.ts @@ -0,0 +1,63 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import path from 'node:path'; +import crypto from 'node:crypto'; + +const MP_ROOT = path.resolve('m:/2026项目/CRMmp/mpuniapp'); +const pagesJsonPath = path.join(MP_ROOT, 'pages.json'); + +// 旧占位符(来自官方 hello uni-app demo 的 component/api/css/template)的 SHA-256 哈希 +const OBSOLETE_HASHES: Record = { + 'tab-card.png': '694f03d3c20a', + 'tab-card-active.png': '3291476de8d0', + 'tab-radar.png': 'ce31e8591429', + 'tab-radar-active.png': '4c76333c9103', + 'tab-leads.png': 'eec5efb627c1', + 'tab-leads-active.png': '5efc171d40d1', + 'tab-profile.png': '5e550e2f2368', + 'tab-profile-active.png': 'ac196ab3ab73', +}; + +test('1. TabBar 图标静态资源完整性与 Retina 规范校验', () => { + assert.ok(fs.existsSync(pagesJsonPath), 'pages.json 必须存在'); + const config = JSON.parse(fs.readFileSync(pagesJsonPath, 'utf-8')); + const list = config.tabBar?.list || []; + + assert.equal(list.length, 5, 'TabBar 应当精确配置 5 个项'); + + for (const item of list) { + const iconFile = path.join(MP_ROOT, item.iconPath); + const activeIconFile = path.join(MP_ROOT, item.selectedIconPath); + + assert.ok(fs.existsSync(iconFile), `图标文件不存在: ${item.iconPath}`); + assert.ok(fs.existsSync(activeIconFile), `选中态图标文件不存在: ${item.selectedIconPath}`); + + for (const file of [iconFile, activeIconFile]) { + const buf = fs.readFileSync(file); + // 验证 PNG 魔数: 89 50 4E 47 0D 0A 1A 0A + const isPng = buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47; + assert.ok(isPng, `${path.basename(file)} 必须为有效 PNG 文件`); + + // 验证尺寸为 81x81 + const width = buf.readUInt32BE(16); + const height = buf.readUInt32BE(20); + assert.equal(width, 81, `${path.basename(file)} 宽度必须为 81px`); + assert.equal(height, 81, `${path.basename(file)} 高度必须为 81px`); + } + } +}); + +test('2. 杜绝旧版开发占位符(去除 , API, {}, 4方块 等 demo 遗留图标)', () => { + for (const [filename, oldHashPrefix] of Object.entries(OBSOLETE_HASHES)) { + const file = path.join(MP_ROOT, 'static', filename); + assert.ok(fs.existsSync(file), `目标文件 ${filename} 存在`); + const buf = fs.readFileSync(file); + const hash = crypto.createHash('sha256').update(buf).digest('hex'); + assert.notEqual( + hash.slice(0, 12), + oldHashPrefix, + `${filename} 仍为旧版占位符图标,必须替换为正式商务设计图标` + ); + } +});