From 3078271f979e101b72f4eaa0ebb1863343977b92 Mon Sep 17 00:00:00 2001 From: hh <2587203630@qq.com> Date: Mon, 13 Jul 2026 17:35:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=99=90=E5=88=B6=E6=89=8B=E5=8A=A8?= =?UTF-8?q?=E6=AF=94=E4=BE=8B=E8=BE=93=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/frontend/src/routes/ai-tools.tsx | 32 ++++++++++++++++++--------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/core/frontend/src/routes/ai-tools.tsx b/core/frontend/src/routes/ai-tools.tsx index 930d270..decb991 100644 --- a/core/frontend/src/routes/ai-tools.tsx +++ b/core/frontend/src/routes/ai-tools.tsx @@ -656,6 +656,22 @@ export function ImageWorkbenchPage({ const [ratioManual, setRatioManual] = useState(false); const [ratioW, setRatioW] = useState(""); const [ratioH, setRatioH] = useState(""); + const updateRatioDimension = (event: ChangeEvent, dimension: "width" | "height") => { + const value = event.target.value; + const next = value === "" || /^[1-9]\d*$/.test(value) ? value : ""; + event.target.value = next; + + if (dimension === "width") { + setRatioW(next); + if (next && ratioH) setRatio(`${next}:${ratioH}`); + } else { + setRatioH(next); + if (ratioW && next) setRatio(`${ratioW}:${next}`); + } + }; + const blockNonIntegerKey = (event: React.KeyboardEvent) => { + if ([".", "+", "-", "e", "E"].includes(event.key)) event.preventDefault(); + }; // 生图模型选择:默认火山(内衣等敏感品类不被审核拦,还原也更好),可切 gpt-image-2。持久化到 localStorage。 const [genModel, setGenModel] = useState(() => { try { return localStorage.getItem(GEN_MODEL_KEY) || "volcano"; } catch { return "volcano"; } @@ -1954,26 +1970,22 @@ export function ImageWorkbenchPage({ className="input" type="number" min={1} + step={1} placeholder="宽" value={ratioW} - onChange={(event) => { - const w = event.target.value; - setRatioW(w); - if (w && ratioH) setRatio(`${w}:${ratioH}`); - }} + onKeyDown={blockNonIntegerKey} + onChange={(event) => updateRatioDimension(event, "width")} /> : { - const h = event.target.value; - setRatioH(h); - if (ratioW && h) setRatio(`${ratioW}:${h}`); - }} + onKeyDown={blockNonIntegerKey} + onChange={(event) => updateRatioDimension(event, "height")} /> )}