diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index 95dd9274..89e39efc 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -1574,11 +1574,11 @@ - 首次发现:2026-07-28 - 最近更新:2026-07-28 - 影响面:Gitea staging 镜像构建、ACR 推送与测试服务部署 -- 用户现象:staging 自动部署在构建 API 镜像时失败,阿里云 `library/python:3.12-slim` 返回 `pull access denied` / `insufficient_scope`;同路径的 Node 镜像也不可拉取。 +- 用户现象:staging 自动部署先后在基础镜像、依赖下载及 Web 构建失败;Web 最终明确报错为 `frontend/src/app/page.tsx:3560` JSX 解析失败。 - 触发条件:`staging` push 后,Runner 使用 `registry.cn-hangzhou.aliyuncs.com/library/python:3.12-slim` 或对应 Node 地址解析基础镜像。 -- 根因:这两个阿里云 `library/*` 地址并非当前凭据可访问的公共镜像仓库;同时 xiaoxin 直连 Docker Hub 超时,导致不能简单换回官方短名称。 -- 修复:工作流保持单 job 构建发布部署链路;checkout 使用当前 SHA 的 depth-1 浅拉取并设置连接/低速超时;API 基础镜像改为已在 xiaoxin 完整拉取验证的 DaoCloud Python 3.12 slim,Web 基础镜像改为已完整拉取验证的华为云 DDN Node 22 alpine;API 构建使用实测最快的阿里云 APT/PyPI 并设置有限重试与超时;远端 `ubuntu` 的 Docker 操作继续使用免交互 sudo。 -- 验证:修复前两个阿里云基础镜像地址均返回拒绝,Docker Hub 超时;替代 Python/Node 基础镜像均在真实 Runner 主机完成整镜像 pull。首次修复运行实际阻塞在 Debian 官方 APT,后续 shell 命令尚未进入 pip;同机探测阿里云 Debian 索引约 0.11 秒/1.29 MB/s,清华约 0.30 秒/461 KB/s,官方约 1.22 秒/115 KB/s;阿里云 PyPI 也为候选中最快。后续构建、ACR push、服务器 Compose 和健康检查继续按运行日志闭环。 +- 根因:阿里云 `library/*` 地址并非当前凭据可访问的公共镜像仓库,xiaoxin 直连 Docker Hub 超时;同时充值订单二维码条件渲染缺少右花括号,导致相邻 `payUrl` 条件 JSX 无法解析。 +- 修复:工作流保持单 job 构建发布部署链路;checkout 使用当前 SHA 的 depth-1 浅拉取并设置连接/低速超时;API/Web 使用已完整拉取验证的国内基础镜像;API 构建使用实测最快的阿里云 APT/PyPI;补齐二维码条件渲染的 `}`,使支付链接成为同级条件节点;远端 Docker 操作继续使用免交互 sudo。 +- 验证:替代 Python/Node 基础镜像均在真实 Runner 完整拉取;阿里云 APT/PyPI 为同机候选实测最快;Gitea run 1264 的 API 镜像构建成功,Web 构建精确暴露 JSX 错误;补齐括号后本地 `npm run build` 完整通过 31 个页面生成。后续 ACR push、服务器 Compose 和健康检查继续按运行日志闭环。 - 防复发:staging Dockerfile 的基础镜像必须在 xiaoxin 完整 `docker pull` 验证;APT 与 Python 包源均基于 Runner 实测选择并设置有限重试/超时,避免网络异常无限占用工作流。 - 相关记录:BUG-082、BUG-083、BUG-084 - 复发自:BUG-082 diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 9b97ce94..a3623a8d 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -3557,7 +3557,7 @@ export default function Home() {

充值套餐

{paymentPackages.map((item) =>
{item.name}{item.description || `${item.credits} 点`}
¥{(item.priceCents / 100).toFixed(2)}
)} {paymentError &&

{paymentError}

} - {paymentOrder &&

订单 {paymentOrder.orderNo}:{paymentOrder.status === "paid" ? "支付成功,点数已到账" : "等待支付"}

{paymentOrder.qrCode &&
支付宝支付二维码
{paymentOrder.payUrl && 打开支付页面}
} + {paymentOrder &&

订单 {paymentOrder.orderNo}:{paymentOrder.status === "paid" ? "支付成功,点数已到账" : "等待支付"}

{paymentOrder.qrCode &&
支付宝支付二维码
}{paymentOrder.payUrl && 打开支付页面}
} )}