From 5a776f61cef690565217133fd9b23df92bd0f599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Mon, 5 Oct 2026 11:55:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(=E5=85=85=E5=80=BC=E5=95=86?= =?UTF-8?q?=E5=93=81):=20=E4=BF=9D=E5=AD=98=E5=89=8D=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E5=88=86=E4=B8=8E=E5=9F=BA=E7=A1=80=E6=B3=A5?= =?UTF-8?q?=E7=82=B9=E4=B8=BA=E6=AD=A3=E6=95=B4=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AdminRechargeProductPage 改用严格 parsePositiveInteger 解析价格分与基础泥点 - 空串/非法输入直接提示表单错误,不再静默落库成 0 价或 0 泥点商品 --- .../src/pages/AdminRechargeProductPage.tsx | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/apps/admin-web/src/pages/AdminRechargeProductPage.tsx b/apps/admin-web/src/pages/AdminRechargeProductPage.tsx index 84c2d714c..695bef442 100644 --- a/apps/admin-web/src/pages/AdminRechargeProductPage.tsx +++ b/apps/admin-web/src/pages/AdminRechargeProductPage.tsx @@ -19,7 +19,7 @@ import { } from '../api/adminApiClient'; import type { ProfileRechargeProductConfigAdminResponse } from '../api/adminApiTypes'; import { useAdminWriteConfirm } from '../components/useAdminWriteConfirm'; -import { handlePageError, parsePositiveIntegerOrZero } from './pageUtils'; +import { handlePageError, parsePositiveInteger } from './pageUtils'; interface AdminRechargeProductPageProps { token: string; @@ -117,6 +117,13 @@ export function AdminRechargeProductPage({ } setErrorMessage(''); + // 中文注释:价格分与基础泥点必须是正整数;空串/非法输入不能静默落库成 0。 + const normalizedPriceCents = parsePositiveInteger(priceCents); + const normalizedPointsAmount = parsePositiveInteger(pointsAmount); + if (normalizedPriceCents === null || normalizedPointsAmount === null) { + setErrorMessage('价格分与基础泥点必须是大于 0 的整数'); + return; + } const confirmed = await confirmWrite({ action: enabled ? '保存充值商品' : '停用充值商品', target: productId.trim(), @@ -130,9 +137,9 @@ export function AdminRechargeProductPage({ const response = await upsertProfileRechargeProduct(token, { productId: productId.trim(), title: title.trim(), - priceCents: parsePositiveIntegerOrZero(priceCents), + priceCents: normalizedPriceCents, kind: 'points', - pointsAmount: parsePositiveIntegerOrZero(pointsAmount), + pointsAmount: normalizedPointsAmount, badgeLabel: badgeLabel.trim(), description: description.trim(), enabled,