From 127303b7aa44754572d1287fa40e3ac0fa2fcd2e Mon Sep 17 00:00:00 2001 From: Steven Date: Tue, 3 Nov 2026 01:06:59 +0800 Subject: [PATCH] =?UTF-8?q?docs(roadmap):=20=E8=AE=B0=E4=B8=8B=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E6=B3=A8=E5=86=8C=E7=9A=84=E7=94=9F=E4=BA=A7=E9=AA=8C?= =?UTF-8?q?=E6=94=B6=EF=BC=8C=E9=99=84=E6=B3=A8=E5=86=8C=E9=A1=B5=E5=AE=9E?= =?UTF-8?q?=E6=8B=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2.Design/ROADMAP-M0-M1.md | 14 +++++++++++- 2.Design/screens/prod-register.png | Bin 0 -> 34381 bytes web/e2e/prod-register-check.mjs | 35 +++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 2.Design/screens/prod-register.png create mode 100644 web/e2e/prod-register-check.mjs diff --git a/2.Design/ROADMAP-M0-M1.md b/2.Design/ROADMAP-M0-M1.md index a9ef962..4ff32ad 100644 --- a/2.Design/ROADMAP-M0-M1.md +++ b/2.Design/ROADMAP-M0-M1.md @@ -647,4 +647,16 @@ - `backend/tests/test_email_signup.py`(9 例):真走 SMTP(monkeypatch 记账)、dev echo 不发信、 注册即登录、码用完不能重放、错码/过期、试错上限、邮箱占用、发码节流、弱密码、注册关闭时两条接口都回 2017。 - e2e `web/e2e/register.mjs`:登录页进注册页 → 拿码(dev echo)→ 注册 → 落进首页 → 退出用「邮箱 + 密码」登回来 → - 同一个邮箱再发码回 `2019`。 + 同一个邮箱再发码回 `2019`。7 项全绿。 +- `pytest` 139 passed、`ruff check` / `format --check` 全绿、`tsc --noEmit` 0、`vite build` 通过; + 回归 `account.mjs`(14 项)、`knowledge.mjs`、`login-email-smtp.mjs`(15 项,含真发一封测试信)全绿。 + +### 10.6 上线情况(2026-11-03,commit b5170ad) + +- 生产 `/auth/methods` → `{"password":true,"email_password":true,"sms_code":false,"email_register":true}`。 +- 已注册的邮箱再发码回 `2019`;未注册的地址 `POST /auth/email/code` 返回 `sent:true`(真走了 126 的 SMTP)。 +- 生产登录页出现「用邮箱注册」,注册页渲染正常、控制台零报错(`web/e2e/prod-register-check.mjs`, + 截图 `web/e2e/artifacts/prod-register.png`)。 +- 生产 env **不带** `EMAIL_CODE_DEV_ECHO`:码只发到邮箱,页面不回显。 +- 踩到的坑:dev 库要先 `alembic upgrade head` 到 0011,否则注册接口报 + `column "email_verified_at" of relation "app_user" does not exist` 直接 500——迁移写好不等于跑过。 diff --git a/2.Design/screens/prod-register.png b/2.Design/screens/prod-register.png new file mode 100644 index 0000000000000000000000000000000000000000..56cf5606668779e3d979256f4e4f7a1b99235e84 GIT binary patch literal 34381 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 qzzG1 m.type() === "error" && errors.push(m.text())); +page.on("pageerror", (e) => errors.push(String(e))); + +await page.goto(`${WEB}/login`); +await page.waitForSelector("#account"); +const hasLink = (await page.getByRole("link", { name: "用邮箱注册" }).count()) > 0; +console.log(`登录页有注册入口:${hasLink}`); + +await page.getByRole("link", { name: "用邮箱注册" }).click(); +await page.waitForURL("**/register"); +await page.waitForSelector("#email"); +await page.locator("#email").fill("someone@example.com"); +await page.screenshot({ path: `${OUT}/prod-register.png` }); + +console.log(`控制台报错:${errors.length}`); +await browser.close(); +process.exit(hasLink && errors.length === 0 ? 0 : 1);