From 782c61a38c316b6a329e6762237e2326c6155768 Mon Sep 17 00:00:00 2001 From: rjl <98n9@163.com> Date: Mon, 16 Mar 2026 10:55:53 +0800 Subject: [PATCH] =?UTF-8?q?chore(admin):=20=E4=BC=98=E5=8C=96PWA=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=B9=B6=E6=9B=B4=E6=96=B0=E8=B5=84=E6=BA=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 增强PWA开发环境支持,添加devOptions配置以便调试 - 优化Workbox缓存策略,排除大型SVG文件预缓存 - 添加运行时缓存规则支持SVG、图片等资源的CacheFirst策略 - 更新PWA manifest图标路径,使用public文件夹中的新图标资源 - 添加Service Worker注册文件和Workbox库文件 - 替换favicon.svg为favicon.ico,新增多种尺寸的PWA图标 - 生成PWA构建报告文件 - 优化manifest描述信息 --- apps/admin/.env.dev | 4 +- apps/admin/build/plugins/pwa.ts | 63 +- apps/admin/index.html | 2 +- apps/admin/package.json | 2 +- apps/admin/public/favicon.ico | Bin 0 -> 3676 bytes apps/admin/public/favicon.svg | 60 - apps/admin/public/images/apple-touch-icon.png | Bin 0 -> 2445 bytes apps/admin/public/images/favicon.ico | Bin 0 -> 3676 bytes apps/admin/public/images/favicon.png | Bin 0 -> 1092 bytes apps/admin/public/images/nonsupport.svg | 1 + apps/admin/public/images/pwa_logo_192.png | Bin 0 -> 2584 bytes apps/admin/public/images/pwa_logo_512.png | Bin 0 -> 5649 bytes apps/admin/report.html | 4950 +++++++++++++++++ .../custom/user/CompetitionLayout.vue | 129 +- eslint.config.js | 1 + 15 files changed, 5121 insertions(+), 91 deletions(-) create mode 100644 apps/admin/public/favicon.ico delete mode 100644 apps/admin/public/favicon.svg create mode 100644 apps/admin/public/images/apple-touch-icon.png create mode 100644 apps/admin/public/images/favicon.ico create mode 100644 apps/admin/public/images/favicon.png create mode 100644 apps/admin/public/images/nonsupport.svg create mode 100644 apps/admin/public/images/pwa_logo_192.png create mode 100644 apps/admin/public/images/pwa_logo_512.png create mode 100644 apps/admin/report.html diff --git a/apps/admin/.env.dev b/apps/admin/.env.dev index 6eea838..75238fd 100644 --- a/apps/admin/.env.dev +++ b/apps/admin/.env.dev @@ -3,9 +3,9 @@ # VITE_SERVICE_BASE_URL=http://192.168.5.140:9999 -# VITE_SERVICE_BASE_URL=https://api.qyzhjy.com +VITE_SERVICE_BASE_URL=http://api.ydzx.qyzhjy.com -VITE_SERVICE_BASE_URL=https://172.16.10.130:5000 +# VITE_SERVICE_BASE_URL=https://172.16.10.130:5000 VITE_OTHER_SERVICE_BASE_URL= `{ "demo": "http://localhost:9528" diff --git a/apps/admin/build/plugins/pwa.ts b/apps/admin/build/plugins/pwa.ts index e84ccff..c2b7d65 100644 --- a/apps/admin/build/plugins/pwa.ts +++ b/apps/admin/build/plugins/pwa.ts @@ -1,11 +1,24 @@ +import type { PluginOption } from 'vite' import { VitePWA } from 'vite-plugin-pwa' -export function setupPWA() { +export function setupPWA(): PluginOption { return VitePWA({ registerType: 'autoUpdate', + // 添加 devOptions 以便在开发环境调试 + devOptions: { + enabled: false, // 开发环境启用 + type: 'module', + }, workbox: { - globPatterns: ['**/*.{js,css,html,ico,png,svg,webp,jpg,jpeg}'], + // 排除大型 SVG 文件,避免预缓存 + globIgnores: [ + '**/team-title-bg*.svg', + '**/cover-bg-active*.svg', + '**/*-bg-animation*.svg', + ], + globPatterns: ['**/*.{js,css,html,ico,png,webp,jpg,jpeg}', '**/*.svg'], runtimeCaching: [ + // 字体缓存 { urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i, handler: 'CacheFirst', @@ -17,34 +30,46 @@ export function setupPWA() { }, }, }, + // 大型 SVG 文件运行时缓存 + { + urlPattern: /.*\.(svg)$/, + handler: 'CacheFirst', + options: { + cacheName: 'svg-cache', + expiration: { + maxEntries: 50, + maxAgeSeconds: 60 * 60 * 24 * 30, // 30 days + }, + }, + }, + // 图片资源缓存 + { + urlPattern: /.*\.(png|jpg|jpeg|webp|gif)$/, + handler: 'CacheFirst', + options: { + cacheName: 'images-cache', + expiration: { + maxEntries: 100, + maxAgeSeconds: 60 * 60 * 24 * 30, // 30 days + }, + }, + }, ], }, includeAssets: ['favicon.ico', 'apple-touch-icon.png', 'masked-icon.svg'], manifest: { name: '阅读之星竞赛系统', short_name: '阅读之星', - description: '教育学会树人研究院阅读之星竞赛系统', + description: '树人研究院阅读之星竞赛系统', theme_color: '#ffffff', background_color: '#ffffff', display: 'standalone', orientation: 'landscape', icons: [ - { - src: 'pwa-192x192.png', - sizes: '192x192', - type: 'image/png', - }, - { - src: 'pwa-512x512.png', - sizes: '512x512', - type: 'image/png', - }, - { - src: 'pwa-512x512.png', - sizes: '512x512', - type: 'image/png', - purpose: 'any maskable', - }, + { src: 'images/pwa_logo_192.png', sizes: '192x192', type: 'image/png' }, + { src: 'images/pwa_logo_512.png', sizes: '512x512', type: 'image/png' }, + { src: 'images/pwa_logo_512.png', sizes: '512x512', type: 'image/png', purpose: 'any' }, + { src: 'images/pwa_logo_512.png', sizes: '512x512', type: 'image/png', purpose: 'maskable' }, ], }, }) diff --git a/apps/admin/index.html b/apps/admin/index.html index b04ac55..442f72c 100644 --- a/apps/admin/index.html +++ b/apps/admin/index.html @@ -2,7 +2,7 @@
- +N1BQKw_=5Dqm8QLFWvRd! zuFiyGfvE+AW0wRE`nfCXEE=JvOdh1!ua<2WCBJ_W(IU9HvzyH$-}ZF89ouw>v*_LV zil!cct^@FEQVQ3yrwX2)$!N$=!SRbsDiP384KZf=XbMxkcqo+GYDudaOqGUStuXWA zHZ3@Hord0wI7Dy=NV9C~L2WqVSvz7YluftVUtI^3bDu5-w8{^D%zAQUhxM^Is?`J1 z+ z^1FGaVc*I7b8fHX4#teiy`^Nmym_gk{!Ha{HFc_~%cFsn2>Mj}2riPWE76%c5QE8B zY8P@*>r2!hX?V!0b@|{uyiV%7RDSQ7J%y2eQEuy%5c&kNzc|4EkSnGi6SeR?^7fkd z$tl^x&qgf-zlvU@CY_Lau`YkXB9KYb+_OYBY8=y;N%vCph!DbGIas4uo~9lY+27-j zR3{oFH+%|~KQLRBCQ5R$+lyGaxD|}?Nm4k%h&7i}1?RUeiHQwwzlri&@(N~kx!stk zxP$KSL%O!woO`(tB!GAI=PO40*l-d`@tNgrVXVQx?ZfxzL5T`aWQyCkVDO1G5@NU- znwukcp**G`QQ3>7ce>F$T@Lzzq*SuXlf!ZeN?~w_U!=uLRY!EBec7C;ZZz(EUka5t z7j=h=#zT92aVw1(Ua%B6w~zPy%eoq&nVp`h8tG)*>dCvmeS6LM2hY0@6OG)kb3ShJ zqW8bu_q%INE)GNa{35tlW-VU`90$C^`!_&t2PO9&$wNc~6__4x1T@?|?F{q>-6SmC zU~N}-Zb$ eA(sn8l5G72&5LCzKmTffHeB$K1zh+6>QP<8g;KjZA zjK&oZA$z^d?l?k_zvAc_@j$N}Jc9PF^o$WPiw Aed!0u_u2^k37! 27TI= >LdYC6sVMqJJrI;HHb)4ekx zSk6dSpFXh<0Slg=*1)G}z}2TsGN*Q8uJ|G~v9OuS`L%p?ElnbyagEAV;7Nh-Wv}L= zF6YanoH9imaLy2*H(8+MEg5?0(tl<;HvQg<3XtFZ{bYBjE`7)miGi$5#jXg8)s%Z? zmA!RsIWM6Gpk=3x1qZX;X?nuIOifFgn`WxE#trCk4sbQ1K>PEgQ@RFcyG+`^lrW&x zV4&0x%@y7fmquZNQ^8|Ya>|&Ei?hkNO_wG$EP$-)eCs|WrI63D1GrM{{qYEh;PcWB z4`OOvzYZ5M9knNopn K|zC|Pq69r*G>?lwWaoqE|_9FK6t zz8hi0XK+p%>Djx0)DwJX^s#HnR@FQ{o9@Z (0ZwYEqKRcq! z4L2Pbmqr0DX!7gw)CHTWD@q#2O3jp3LO$lhK$8MoB6)4mFRDJt7OjTayb@IJG&<_b z-RpVRRgcTeO}1*jIjO$dLQDG(N0C2OLPZ!h&5Bl0!!F1BnlKH0;*cw|1@(yKRoT9S z3qCa^Gb$~1l!3STnYL|p6&7Y>=C^fpk3KW16KfS3oo5((!lg6Mv|VH@UXT=UxvlQ3 zUP)@B{wU!(%5%JxtWC5_wC!ffMcI>4$#MCthCGIMJ2Jyt^dM%#%~Sq|RE6Yx>QYW(ci2U`;fy;AxQsRN-if2C&S%O_C! zzL_Z}xS?j9R1zoyD=M;?o9Ywe^IPwiGhSI09eB%M#3A&HOk6lgg%E~Byui@s%rq+= z?}%r1U}}Zp9Q^j&k==UEYTO!6TG9+}L0REbRvGW*dpnG}D!uw;XYS!GpE8n4KMROV giS_67r>`<)W6buQ)*%lc`|%U8Hg~|anEGb?4{1<{P5=M^ literal 0 HcmV?d00001 diff --git a/apps/admin/public/images/pwa_logo_512.png b/apps/admin/public/images/pwa_logo_512.png new file mode 100644 index 0000000000000000000000000000000000000000..e5d82ea9d14be610c2f81f40369a4fec16a04c9a GIT binary patch literal 5649 zcmY*-2|QHq_y4(f%)$&N6p?0%P$U!~%eAyfX;PoGqeauki27(@uANF$Drqro_>`iw zD!E!j3sYGunHEd-lHJVxU7x=H|L^;IUa#{!?>YCGbDn!%=b1U@oha~{ud1S}0syKW z3*5Z{Pzs{JqEXA!Ov6%YaS$w8K6la9VDjJbv-15PFghy~{~zBm hj!LMv*D|mfU*ny5sP#qA>I-I$lvY`^U{weJTXR$p zNI$DXDPM11=@H=JF%4MM2PUW?D6lECixLfl1_-r|iY`L`cili?z5n2C6gK(Kp3!&F zME`gH)_A3V_eW6r(XoJ%Q9J){-59h}v}tSl{%qkk|$Sp&&` z^p+MDh~$rTlBA+0`D1-FgtY&{lnKys$ &iy!ctw1f-?ciHP?_0mP z#%*8!53hHI_|c@z)8!A{I<{R@SM{`dy!Kh`9g~+guC-m=_VMoN#qywjQu> D=0Y zbtgMX9}e-btuttONi`s4olNv=y}Ht~hdfro-_Bg_`+*BnV}>IM#@l<|uGgcm0~!6( zisQE4%=w^R#Xsh}FfzWyw^;6b1(!NVi+jm4&m08&A?GF}SdOV?75%2&I#|S*NWNE3 zHBksSUwh|siMC`uUc+F^S?z=S3M2?s-PE1(m(s@1>C zA8bwkJ wF6(`YTk)I65NjHo1=5fsbpLqt(R_$L9jN!_=4MH; z8gZ+x*T-3%G0hOaQd;zW*f;YHZkY0vQ+xkR?gQkwf2XqF{;$5~%F~ZQvyw gy{&qlTHErpex$@%@`wUkJ*HLLbo4j$)>EO*1_Bx%r7LtLBWpaYxhs e2 z#rik-ZkkWX_n*ZtgN-GN^U$+vt_Qol3XlKt_)49$QS4dexz8{%pwlwx^grZkNByv> z$WS-QUW4tQic&AspC4P8XgDG^^qW6k`e}Buv7;h9d+JMFt1>~t0@{Rq;aH5G@s=H$ zAIX`>huO-tbv@tWnp>j-^{f67;&JY2yx#pt^Cd;I@531 _GJWMT1sBzQzyFp~ug&un-C=B7+o79>^Y`oGSNciQ+2jbX>5@wjJ1Js6 zOXmoq0Jy2f_wYRh^qW)WE(y9$Hkc*0Hfl~{lR4}!@{Fs5QKibstp#L5d0z>d*I;dO zR-v^y`ZE`Ot!4b`xf-(bYA1OJug@fR)N1Zsr}$ALxj21SA7{F2JZ_*X_!d~);qsAp zcPw7LWpKXO%ydUKb9Y~;bqmI~`ZhhTcY9?0P>%BB)FgSl*v6#UV6LO|>==mqF|O=! zL$&`hByaDM*Vkh~`%p;u*+}z!pz~?^#nb8t7NoBwzVU0^`R0aKV`D?YMFtNN^ BN&bqThbt2_A9(%0?q^RxJ-0 z;hwLY0`S=e^^M`zovyrS{T74QFM~NoO{BJUbLm0M8^WIBHUm1+&&TqAEMxHPw~7|t z(woeo_cQQ-Me4Y*U65^_fzy<8AERRMUzN$0F$pK4$zAt6JBxR8a|P%6El*-WFJ |O=bokP%{!w_Vufn<>=@Eu)5k>Pv`;A*} zvYj%A*CYijE`ON840}$bho0_pYFi#RN7cqizCC=&QlHN)g9oJYUy@-*SC2UjJbc qE&F80efkJcsni!?t?UD(1;5%lsKp* zK=4n E=-Mg4hpv zCuvtXh%B#Q!g&0k6YVk^_v}mQ-wWB`8|O6+KVLjGxdl>x|LtbT#_8}e1Ut?HF9d(n zgB#qVO;N_HyB=#fFz!A>!e(mTr~}zx{c^ny-LO-(U_IE#-S}(%Mjj-H`m?pRpM))@C5@-IDvUE*tfFL7nKzy2562=lq#fXBD$@n8xY84 blW^2SdhInNSO(rK x+CKRFychlkJYjaDn8rG{GjEr-frn9!4Cp$ppzbS;cP4Y-K(*bjUu(t^Mk zP(7`dz#=qo-t@dpbiBXJ0=jRgw1*)Us(>@_Bf@d78$(6nN5>a6n(x+yX}65{w=`-= zGryvdZr+;_xwh~w;Y-G`G7K*xk}2EK^6`uZT7ec_O9u6XAS_MCk7q{O1b$kV>oNV> zDuUdJ6_3Lseth@cF>}j-#1s}Dbyb-vevy_0BPsw>!TK-lG$Xh%`|pqp=P7}YcWSV( zxm9!{WvpnDjROmPYN(E%yvkmrf&06OF_~jI%v!$A?*o`X_dn`pznFe1b ESx-^9}Ekaj^@T-KY2XH1@Xd#)llhfg&V?hFIetwMTK4k zqe@_m2H#Ps;4E7S4j=+|S3by8h!gWzsY-a63O;!w?BPwG*v@F%9RR6ysN~J#r1jH9 z<1Drpue%F72F6bf9M`0Z8SCO%g&T~u@YS Di1t@zep~~Zb2fmgn98x$ql{$PMFoP6Th~a;M9M9sW z#)#lZZ&5Y059?nq^-mE&-WWrDpur}Z#RT&8gug+zY)x^~`%^r3NXgZ5h)rkA0RqJ* zRd1$jc>wyELnR>Q1-AjSg6X5)uvsvcaz-8YGEG2(GN=U19?k*eI4KVG??t7F;5S)b zHj^gN0wU@6$(OI4H2$KFOC6Eg_aI_gH41k+s q3wKD=P=b}Hs3uYvL)|kCypN5m zzyi8t2$huc@Wt9suCF`-mA(*KN5j6Jn(77xGvHu5qT^xRa2QM;!~FntLKP0QpdLdQ z5MyxhI=%;w1-7U(f+j%VG%Rm`P{53!el|>j6lH8sl^6@9O0tK_5+T*DxPc-FHTgjK z=Hh)!+&% 0oh_OnaLzte%^o39)L8e1HGhJ<3;gvb 7~GfS<)R2U!v`j8 z1HL*wgy0%bN|PJ_*})KG;iux1HX6j=AuboGOI**h{n=Pg3;9&@i(!$v#j|ebHE`7! z3e42w)y9lejKe#X@yV~geJS7xuUE8$h5b|_=)8oKzQ}|vB<}=OxXy+T+M|Bh_z<1S zrczXPMagzG)qe%Tqao67455mbjRYMZr;H6VaW4%>F3QkU#`>AKs|Fmg*xjupTcRuy zO#lc(q$9oL&0qi-9lHY<6TX9VI*900`*`0RMA>7MAP0n}M#KwLy{M)W9_^NWOY%dZ z{eix8Z`5%%Jf95nb&It?km1~8Q;5i9#W#(8s8(-PA9-}1g)&s%wd=Klm%8HogOi|2 z4_-b(!bHjJ+m^4D@L#HM>NPTOLLN)&E+?70Kpi+Rkcu4n4ijM|bX(FUlp+am7{a>5 z |} 5ey z>m7q1(}vkQ9g}x2K^8UGj#>??pp~P3imC5 G^r~^Mlu!ck{D4lLznJeC#ah3SA2~&LFi7%AKfRYe)Rz^Tp{- z>S{*$1vjj8oH?O+6Qv<04xQbKOzRuPeVT2LtoqK>RHe%+uDWrel0&2P$cXx`58w0; zpGljisP8|~9*xDfA#(fT#o~uOtDm0@nQ~8HvA6SVIX8wT`9vo^dx 4W3|1%9qr|tHZD>rrEP)=~DHt=bIJkO0_J+&zB{NR|};6)>=Z$ zwb5mVA#a8f=jTPT?vzqtWrR`tGPR+BcuNNw@t7-paY!+Bj3nB**>$S$s}fF2A~yZS znTd{&BZ |lJDK>@bK@ao!2H5j$iJOpEV@jw!yKv zyU^g0qtR6+N_;VmHQ
kPb1#|9z@uxFn?7 %5g+ z`p?+qOYget6e_f)^UI!pwYx(*yPjP4qIl*%H0`YBm^Tf?OR_#zx_Zh)WX0QzJap4# zW}G{IX4qpEwr8Jgqnpgzw(HGW+U0^Zip#rFTD2xsy{*1~k#&b0Oh9gP4wsu8S#gX; zEZ~IMdF+#|SzA8s{ED~38LtGw!RTefMb5Lm0%SvkyPIUfG2+#W!KU1voz~S$R SSmomEcAAJV8@JyNppHP<$} zIB%9|6ph$6XTjOsr&w`TSRmDVV_~DyzW+N>y0SbC8(N6~^H;)Mxpe*>T56>}{AuPd zLd;|qoqHX0;WjD+iL&Vf6^nG2S-6n#7Mx~B^JR-j-z7|$H>PI01We48b-u%1iYI^{ z6w`-ObcDw^92=z`Wa5M;3$uYk0WOfyFu+s#m#LUP+vEXBL;mF`EXR94X>z9Mix)>y zH13o6iO{ah$UB)t-kh4=rZ6sNn>-jMx%5e-3l|$s-ox$SeQ>!g7Bc?Bhj?=v8%}z2 zV~L}`eb?9OsUR1A@X}M !)`iSW^#XfzR%!%%Y?5%o|Xv?k`KQo*V%uOWAE3+ zeEciaS>QV(&vnOC!PxG{R6xRhojL-aW)$eUcNps;_kCxfq9UP^EaEMTkgwsE-Zc<@ zi6~n (6wJA$&g^2Wuw7oXoMfGjX#zm=~meM^sgRF9;1UWP7dCtctjGpyn{xGBH z`!+b8aet~XEH)xl9<>Z{E!xD8g_m)N;b5Hww !etj6 z)Q!%(ZvUwNk%dV?Iv!ouv)hO0J#1&v#c!W-VQbfs8D9o-1Zk^US_{&Hg=Zeh3-;d~ jEXuiB&>4{HxocR=(5;Zl@;uu|ODm7LUhX$s{i6N{{0U~h literal 0 HcmV?d00001 diff --git a/apps/admin/report.html b/apps/admin/report.html new file mode 100644 index 0000000..3faf44e --- /dev/null +++ b/apps/admin/report.html @@ -0,0 +1,4950 @@ + + + + + + + + Rollup Visualizer + + + + + + + + + diff --git a/apps/admin/src/components/custom/user/CompetitionLayout.vue b/apps/admin/src/components/custom/user/CompetitionLayout.vue index 87d0b06..20f0295 100644 --- a/apps/admin/src/components/custom/user/CompetitionLayout.vue +++ b/apps/admin/src/components/custom/user/CompetitionLayout.vue @@ -1,6 +1,6 @@ @@ -146,7 +223,22 @@ onMounted(() => { -++ +{{ title }} @@ -221,14 +313,33 @@ onMounted(() => { width: 400px !important; /* Fixed width to prevent squishing during animation */ height: 155px !important; position: relative; - background: no-repeat center center; - background-size: contain; display: flex; align-items: center; justify-content: center; padding-bottom: 10px; flex-shrink: 0; /* Prevent shrinking */ + .scroll-bg-img { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + object-fit: contain; + opacity: 0; + transition: opacity 0.5s ease; + pointer-events: none; + + &.active { + opacity: 1; + } + + &.loading { + opacity: 0; + filter: blur(2px); + } + } + .main-title { font-size: 2.5rem; color: $text-color; @@ -236,6 +347,8 @@ onMounted(() => { letter-spacing: 4px; text-align: center; white-space: nowrap; /* Prevent text wrapping */ + position: relative; + z-index: 1; } } } diff --git a/eslint.config.js b/eslint.config.js index 6f6c453..9f162b0 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -11,6 +11,7 @@ export default readStarConfig( '**/public/**', 'pnpm-lock.yaml', '**/*.md', + '**/report.html', ], }, {