From 2d42c7ef7112207ded151f013325efcd4dce3899 Mon Sep 17 00:00:00 2001 From: shumengya Date: Tue, 23 Jun 2026 21:57:39 +0800 Subject: [PATCH] feat: desktop build support and build list UI improvements Co-authored-by: Cursor --- .gitignore | 2 + frontend/index.html | 3 + frontend/package.json | 3 +- frontend/public/favicon.png | Bin 0 -> 5729 bytes frontend/public/logo-192.png | Bin 0 -> 14595 bytes frontend/public/logo.svg | 71 ++++++++++ frontend/src/components/Layout.tsx | 8 +- frontend/src/pages/BuildList.tsx | 163 ++++++++++++++++++---- frontend/src/styles/doc.css | 217 +++++++++++++++++++++++++++++ frontend/vite.config.ts | 6 +- package.json | 1 + web2app-icon.png | Bin 0 -> 32758 bytes web2app-icon.svg | 71 ++++++++++ 13 files changed, 509 insertions(+), 36 deletions(-) create mode 100644 frontend/public/favicon.png create mode 100644 frontend/public/logo-192.png create mode 100644 frontend/public/logo.svg create mode 100644 web2app-icon.png create mode 100644 web2app-icon.svg diff --git a/.gitignore b/.gitignore index 8335722..5db2ef0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ node_modules/ frontend/dist/ !frontend/dist/index.html +frontend/dist-desktop/ +frontend/.env.desktop uploads/ data/ .env diff --git a/frontend/index.html b/frontend/index.html index 85c6088..6d492eb 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,6 +4,9 @@ Web2App + + +
diff --git a/frontend/package.json b/frontend/package.json index c25d0be..d73159b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,8 @@ "type": "module", "scripts": { "dev": "vite", - "build": "tsc -b && vite build", + "build": "tsc -b && vite build && vite build --mode desktop", + "build:desktop": "vite build --mode desktop", "preview": "vite preview" }, "dependencies": { diff --git a/frontend/public/favicon.png b/frontend/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..90ab7bcc9e06736daa70efaa3a07efa530ed62f5 GIT binary patch literal 5729 zcmV-n7M|&eP)?2Z#QU_e4S=PVE+DyyTq z6*{OTfdGLJN!TDv#>O7(F<|4dXB>8?YK(G@tQi$0-SfS-Z?}$+Nc1ybeyNqe3Cg&W5S&@{QHZ446eg{m4wKgW6fUbnxV#P#@_Ixl z1X&G;B+5ok)x<=pnz?M!f~XwQim2RHMCG+H(du?V2NR%szbz8)1i_Y zgi31=Cap!7Odzji0l0dED;f|%vKl#M6XT2!nca*?8qc%}0ou5{c1}$?5UnAdf-V*y zMr%NfPQU_mBUWz|u;GX+Fmr_#CccPR5nE)Piz%?~rA^N?J|Ly;--0tL%^~6{govw| zP;m`d2uUqMrKAp_GE$FFc|F32qCwEegl9Ez%4UQsTM(fVWVaw9r^FdMK(ki+DuV}L;w1- z;{(&Gd;-%eXM;1V5S&?!U>2YTArex{tc*}EL}=g?jZ9cp(=yFV5yDk12+wY1B68Ze z+;+wpAu^9RBXscq8Uv!V-JH(ID2fzg{0t+%iMF$Gq{6cQT?!0fdlrqDhUU10Nm z>Xi>jtDFr?uS8&a6#_G=5R_4kpiEMOAaMk&d^P7R#AkyA7wMA3}U zEYgBdWeY-8T$rkr%Wgwhc00mzNC(1mNhc!mNEag10*wKYOgE=BB8uotT)vsp6APjW zh!xQcyZVSOv?Hdd2hm0L`G`Wx%TK)K{Zqa*2c%abAiW9!85E#eP=i1UkXef$v48>y z5g1tmvov1bgb;Z%3&3PGBShK4gsNJ(>^6jEx3d6Y*&PVW;hYh|^GFxM)doZmO*f}C zvH+1<6Q?6WfP4!NptrIBQ3WO~v?};hfb?nv zWC${=SpcpUf#Ny@5lKBKZD4|Bjhvh`E!_b;KntgAOvj9;=qz6%ZNiQObdUBWE>U>k~O!=i& zf~$gG8mWd~dNushYv7+jYT=(*ivS|7<0SP=prnD5HX=~kgdiDdMv%N2L5db8I7^^x zMX<6BAxt|95u)lqXg29YXb$N@Xs#g7z^S_tMl?o&31J#D!nMSLa2*$sPppX06B{B6 z?1(HRJ%V0D74;&buy>NZMSAW2cB^knC43(r@03nz;70*iggQ=K&jd&sIB6pSq)jXU zBWpsSyqR%E2+C?jP*xiY5UgxRu!?jbBzw6|girt$!NBEpb7~`}F(FiAMwoUvX9O$4 z^N9@+dOIQtNDm?kNiQOc1bcfCwzoe{OGp#^rA_dcH8TP77EaO11Tt+1%p&awQj!h?sYoY+vbzvW zatvHOv677A%XvqV|>!qA1l23XNswce&Eg%kr2|^1TlOm5jcOH7|se}gwNUDNoGO31VN)5b7svxbF z@lLN3)WbWyfd%l%XoOE@BYeb7jIX4bleRF<2!3+1Y&_Ee|Ex|<*~O_02q4+rTn;fV zMF`9zW(28;MPNm+#)e=mu_IVVdRTyv{9c6UIcJ2>!ajr)_B|AN?5+e0u%`+hNdgKW zL|{^D8LzZDF1;RJ=?(DCAdT?OBu$Jnf{&ybJ`x_lSK10+8EIny{N(NMQ;-h$Jw9G( zKmb`0!N>vxf z?n=1tAysfss)h$iuHjN@S4ypeM`}Gh(?|n6(;MKK(a3mZHgV!+c!^u!Eg`M&mXbF3 z$d+q|kGuoEMA6A*b-|A)4V1E< zG{GaIc`1UYn6$D0UXnIJJG`VFoUD_Rcfy+}y0|O@ytBIDqa;T7sE7%^*~ARr9AbfA zt`&ZH#3r!AUrl=8ui*l;q!$4?2bbT6K%(zwL@qlk;j*g=u4H#Lx2J~LoFquD#by?O zM{rB2hg)g`JjHGBl#q6KN-01)ykr!h^&5cJW8d-+S;>3s3Xi&zrk@A8+3nfxEPm1@Mq{adHFW zjNqvtJc9D=e%xtaMBn%i7@GR=3B!+}|JP{w9>;G^!C$-D_D|BawjmdYau%qx?4~|^x!;x$KIPyLjz>yEg;4(ufy*7x# z^L_ZddImF#_t}RWH%TWa?Sh-s0CySbhP#{?;h``>e{l%2cORg}a1ZZ(J%cM>P2=^Y5UA7{P_x zg3rk4GGjP!bpXe%4`Jcnee677T`}HGM!E$?A%F>v(ZAzQ^$UnE?iDx?zn|N6q#qam zJOf3=Ft!}*!`2egkFAFWnDS4jF?;tRb{!jrx26x?+I|+mM>hZ;-5|Uuz?!XhuzouQ zsAdv$ZCJQ_ALSqRA^&YNzEqsTnS=k1Llw37>m?ZuRn#N%-8+c7eFeI+c6Q}y?8VPU zANeC0!^O|Xa7n-dygP`~H%8b?g#v7rbYZi^zynBEj(3-v5Vz0HuD<^AFyf1Qc!2%H zf%pRsBpm8T>4y_YIWforY&qDEEhPiop+O{;4zau7!0)HvrRj$^(ef+rts8`!dJv+Q zW530^#42ukHMVHl*cG~TdkCfPIhGuGuWy-tlwA|NPX=)GgXIQs^!G#D^+)LHU-{EG z7QVZW?FX!I5qH5=LJV+~l5T945hJtnP%q~0K0tQGAmaA*BCeP?1bv9x&&3}g{fIv} zz?BSQ3pq4|k(v8AerpC^>V9}>2H>UPSKdoI1ee?ah<+FIE!J+U!rJZCSi8LjTeNNL zL6u)&MQTa6z$h>=X@>-dx%5(EM*0zAL3)`L8RV#qJ7z~F(}RKw{cKd?ej5wmA~wK9 zLb_Q1SE&)MGGfBcLk@Nas49lAt;B)U;{!-LK?ad_QczBYkalWVFoN_`BiMCx1o0)0 z0(h$X;i(>gr-lr|Q#*)_*@Ha5D_bh@#GERY z%%K3WcksK|N~}q!#v6$>EWpgdeTYjbKr2)yE$nHZU(o~o*~h#?dZ9l@9MGTZLjgH2 zxX{mC96;`wK6ZX5FQ>QI2S_Zo^8lF!Y!VyT*?rtz8;d|!-$iD66yVGdwjb`p(T^wa zdEEj&uUlkKeC?%Cd|tn}gaW+#AM?!RZ|0G9YLo>ydTSPL>H+qech?NUEpLd8-?3O=qa~cKjP9Wvv2-KG+aPY%v-X%(**7JYr2z6X!`NCfzych)K7qp@O+xw3 zD3VVML;vms_FkJr?uBu7#g*sAp}jH*)rCpKEDPX#%`YFnDQ^U#<>O!8TC)^@p7L~n z8LR0;VvzxfMcvrGml&~qpP<-;9gLaVZ^2G-z{-AIwb}uu5Gb$tOl|;*%Mi z{B)MR?zbNuV*!rbm|b=JCKh1Xcorb9eJKE)-6b6~BJ+p^nPtR^%%g&1R)`rJciavM z)5D$Uh2(?-I}X}b9AHX>J0QN;j_ZG!LGS3_1wSw|ix2SAe*xe9?I+}(AK?Mc46_e6 zrGJ>@0oXHO7Fp-U*lV6%?^nK=N7BhrocMH>p#VFMjbV7^0ZLhbC&#;}M|l9}_?HuE z*>7lh05dzg%X!PrpY-q0Q(kc1fdX=Yp7hI}_7?`Yi)0Xmmj)p|?pQjwqyXZReQad> zz8+lv%j}Brj|a#(Kgt3~Pt$w)02CD?IQQpST>Nqt`u8S~d~yV(H>TNDFaG@$_M8}l z_UaUhug^e#Z5q)fqe6hWRmZz%Mj={0{^f)^_B(nO;4lSfXUEq8Sse&a3RHA_-HE{L zE`b3-B&VCpHL_D%I=&8Gc4|xGS%7jOKyeS&W*D(H!-Tb&CTx^haJz=T1n8%}1o}*0 z($52&;Q@9X8^UgKe3&~if<4SA8^7ly8Anq2ICdN#N8~{s;K!%HyK_<4*!cBQ8~cfl2N-2P+&s&bPb!~4(y0mTI5B~!65%0uYkt-7F4}Pl@M!!i ziS_W2@^^v4^N#FSb){WyXwXvT0Z`j#0I>&y#b$B zO=DvAN3>b*q1k*7EyVJ3zC(+3HQ%q$ZvP$=bNBH@{le0fUoWvhcA5h4@pOPm<9UEV z9-x8;c$OchyZ$fR*E4-QI{db~izLwijn^jR;1$rH{B{9Q&9% z{>W`IfwNAZkxA~4WD5D0N3emewwONcSrNP6vEs_VDd*$Y%X^TpJV5F2GmmEhPEI}w z@X5le<6ZM7A$olLt2;;&UftP@*T}9GZg(rzkUec&Qajcpb>Q`6(uvnoNEhBnB?i2a zM!K;!-MHdu@4WKs#B|F)dD}b3zexcO({b2C$j**oD+};!h5#r(+XL;_*o&o*+|*FPlV6=@iE2AEM;u;;Q2}^8nB1_zlWF zxaJICZ0-Rre!ai~L>?GrA8+;7W^m}^Iqt?hbND7l!|BRLmrg3FgSNW^gQ@Yw; zl<^)1?zJT*;vZN1<=C2J({Eo-HBA2U$KRcF+4r}9S@mxRUr#f-u1z;i{*uRg>|b>K z*}ooLBQ^c@jZ9<5FK_(4wx?eCC%z8iAJ&O2DQm^%v0uW|-edngsoz2TO7uVdT9at{ z^*X67e4W&CX`RH@x=v~zTPL$Ud|t=XXM4AO3uE*N&!c$ZqR0Nlu%)-Ur+oc4ouaD9 TC+f=G00000NkvXXu0mjfhycBY literal 0 HcmV?d00001 diff --git a/frontend/public/logo-192.png b/frontend/public/logo-192.png new file mode 100644 index 0000000000000000000000000000000000000000..dca750f449cc908dbf9cdb7c433532db12e08e0a GIT binary patch literal 14595 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 z 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 b@nnjW#p+)82$d1|t46@w*vhEE02%u~ZPaSE literal 0 HcmV?d00001 diff --git a/frontend/public/logo.svg b/frontend/public/logo.svg new file mode 100644 index 0000000..bdfa519 --- /dev/null +++ b/frontend/public/logo.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index 5843cf3..1f87eff 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -1,11 +1,15 @@ -import { Link, Outlet } from "react-router-dom"; +import { Link, Outlet, useLocation } from "react-router-dom"; export default function Layout() { + const { pathname } = useLocation(); + const isBuilds = pathname === "/jobs"; + return (
+ Web2App
-
+
diff --git a/frontend/src/pages/BuildList.tsx b/frontend/src/pages/BuildList.tsx index 03322b2..ea3edca 100644 --- a/frontend/src/pages/BuildList.tsx +++ b/frontend/src/pages/BuildList.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useState } from "react"; import { Link } from "react-router-dom"; import { fetchBuilds, statusLabel, type Build } from "../api/client"; import { getBuildDuration, isBuildFinished } from "../lib/duration"; @@ -6,6 +6,8 @@ import { getBuildDuration, isBuildFinished } from "../lib/duration"; export default function BuildList() { const [builds, setBuilds] = useState([]); const [error, setError] = useState(null); + const [selectedPkg, setSelectedPkg] = useState(null); + const [sidebarOpen, setSidebarOpen] = useState(false); useEffect(() => { fetchBuilds() @@ -15,35 +17,136 @@ export default function BuildList() { ); }, []); - return ( - <> -

构建记录

-

最近 20 条构建任务。

+ const packages = useMemo(() => { + const map = new Map< + string, + { appName: string; latestAt: string; count: number } + >(); + for (const b of builds) { + const existing = map.get(b.appIdentifier); + if (!existing) { + map.set(b.appIdentifier, { + appName: b.appName, + latestAt: b.createdAt, + count: 1, + }); + } else { + existing.count++; + if (b.createdAt > existing.latestAt) { + existing.latestAt = b.createdAt; + existing.appName = b.appName; + } + } + } + return [...map.entries()] + .sort((a, b) => b[1].latestAt.localeCompare(a[1].latestAt)) + .map(([appIdentifier, { appName, count }]) => ({ + appIdentifier, + appName, + count, + })); + }, [builds]); -
- {error ?

{error}

: null} - {!error && builds.length === 0 ? ( -

暂无构建记录。

- ) : null} - {builds.length > 0 ? ( -
    - {builds.map((build) => ( -
  • - - {build.appName} ({build.appNameEn}) - -
    - v{build.appVersion} · {statusLabel(build.status)} - {isBuildFinished(build.status) - ? ` · 耗时 ${getBuildDuration(build).text}` - : null}{" "} - · {new Date(build.createdAt).toLocaleString()} -
    -
  • - ))} -
- ) : null} -
- + const filtered = selectedPkg + ? builds.filter((b) => b.appIdentifier === selectedPkg) + : builds; + + function selectPkg(pkg: string | null) { + setSelectedPkg(pkg); + setSidebarOpen(false); + } + + return ( +
+ {sidebarOpen && ( +
setSidebarOpen(false)} + /> + )} + + + +
+
+ +

构建记录

+
+

+ {selectedPkg + ? `${selectedPkg} 的构建记录` + : "最近 20 条构建任务。"} +

+ +
+ {error ?

{error}

: null} + {!error && filtered.length === 0 ? ( +

暂无构建记录。

+ ) : null} + {filtered.length > 0 ? ( +
    + {filtered.map((build) => ( +
  • + + {build.appName} ({build.appNameEn}) + +
    + v{build.appVersion} · {statusLabel(build.status)} + {isBuildFinished(build.status) + ? ` · 耗时 ${getBuildDuration(build).text}` + : null}{" "} + · {new Date(build.createdAt).toLocaleString()} +
    +
  • + ))} +
+ ) : null} +
+
+
); } diff --git a/frontend/src/styles/doc.css b/frontend/src/styles/doc.css index 3bd1096..245ef31 100644 --- a/frontend/src/styles/doc.css +++ b/frontend/src/styles/doc.css @@ -74,6 +74,9 @@ a:hover { font-size: 1.125rem; color: var(--text); text-decoration: none; + display: inline-flex; + align-items: center; + gap: 0.5rem; } .site-brand:hover { @@ -81,6 +84,13 @@ a:hover { color: var(--accent); } +.site-logo { + width: 28px; + height: 28px; + border-radius: 6px; + flex-shrink: 0; +} + .site-nav { display: flex; gap: 1rem; @@ -97,6 +107,10 @@ a:hover { margin: 0 auto; } +.content-wide { + max-width: 64rem; +} + .page-title { margin: 0 0 0.25rem; font-size: 1.75rem; @@ -355,6 +369,209 @@ a:hover { color: var(--muted); } +/* ===== Builds page layout ===== */ +.builds-layout { + display: flex; + gap: 1.25rem; + align-items: flex-start; +} + +.builds-sidebar { + width: 190px; + flex-shrink: 0; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 0.5rem 0; + position: sticky; + top: 1rem; +} + +.sidebar-header { + display: none; +} + +.sidebar-title { + font-size: 0.8125rem; + font-weight: 600; + color: var(--muted); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.sidebar-close { + background: none; + border: none; + cursor: pointer; + font-size: 1rem; + padding: 0.25rem; + color: var(--muted); + line-height: 1; +} + +.sidebar-close:hover { + color: var(--text); +} + +.pkg-list { + list-style: none; + margin: 0; + padding: 0; +} + +.pkg-item { + display: flex; + flex-direction: row; + align-items: center; + gap: 0.5rem; + width: 100%; + padding: 0.5rem 0.875rem; + text-align: left; + background: none; + border: none; + cursor: pointer; + font: inherit; + font-size: 0.875rem; + color: var(--text); + border-radius: 0; + transition: background 0.1s; +} + +.pkg-item:hover { + background: var(--bg); +} + +.pkg-item-active { + color: var(--accent); + font-weight: 600; + background: #eff6ff; +} + +.pkg-info { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; +} + +.pkg-name { + line-height: 1.4; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.pkg-en { + font-size: 0.75rem; + color: var(--muted); + line-height: 1.3; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.pkg-item-active .pkg-en { + color: #93c5fd; +} + +.pkg-count { + flex-shrink: 0; + background: #e5e7eb; + color: #6b7280; + font-size: 0.7rem; + font-weight: 600; + padding: 0.1rem 0.4rem; + border-radius: 10px; + min-width: 1.375rem; + text-align: center; + line-height: 1.5; +} + +.pkg-item-active .pkg-count { + background: #bfdbfe; + color: var(--accent); +} + +.builds-main { + flex: 1; + min-width: 0; +} + +.builds-topbar { + display: flex; + align-items: center; + gap: 0.625rem; + margin-bottom: 0.25rem; +} + +.sidebar-toggle { + display: none; +} + +.sidebar-overlay { + display: none; +} + +@media (max-width: 767px) { + .builds-layout { + display: block; + } + + .sidebar-toggle { + display: inline-flex; + align-items: center; + justify-content: center; + width: 2.25rem; + height: 2.25rem; + flex-shrink: 0; + padding: 0; + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + cursor: pointer; + font-size: 1.125rem; + color: var(--text); + } + + .builds-sidebar { + position: fixed; + top: 0; + left: 0; + width: 280px; + max-width: 85vw; + height: 100vh; + z-index: 200; + overflow-y: auto; + transform: translateX(-100%); + transition: transform 0.25s ease; + border-radius: 0; + border: none; + border-right: 1px solid var(--border); + padding-top: 0; + } + + .builds-sidebar.sidebar-open { + transform: translateX(0); + } + + .sidebar-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.875rem 1rem; + border-bottom: 1px solid var(--border); + margin-bottom: 0.25rem; + } + + .sidebar-overlay { + display: block; + position: fixed; + inset: 0; + background: rgba(0, 0, 0, 0.35); + z-index: 199; + } +} + @media (min-width: 768px) { :root { --page-pad: 1.5rem; diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 4454d1e..751ae93 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,7 +1,7 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; -export default defineConfig({ +export default defineConfig(({ mode }) => ({ plugins: [react()], server: { port: 5173, @@ -13,7 +13,7 @@ export default defineConfig({ }, }, build: { - outDir: "dist", + outDir: mode === "desktop" ? "dist-desktop" : "dist", emptyOutDir: true, }, -}); +})); diff --git a/package.json b/package.json index 5e5fd42..b0d050b 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "scripts": { "dev": "concurrently -n web,worker -c green,blue \"npm run dev -w frontend\" \"wrangler dev\"", "build": "npm run build -w frontend", + "build:desktop": "npm run build:desktop -w frontend", "deploy": "npm run build && wrangler deploy", "db:migrate:local": "wrangler d1 migrations apply web2app --local", "db:migrate:remote": "wrangler d1 migrations apply web2app --remote" diff --git a/web2app-icon.png b/web2app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1203924265c97fede7c8563b5936ca877202176d GIT binary patch literal 32758 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 literal 0 HcmV?d00001 diff --git a/web2app-icon.svg b/web2app-icon.svg new file mode 100644 index 0000000..bdfa519 --- /dev/null +++ b/web2app-icon.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +