Skip to content

feat: 补齐邮箱核验的忘记密码与修改密码 - #810

Merged
xiaocheny214 merged 1 commit into
1024XEngineer:mainfrom
xyh202131:feat/email-password-recovery
Aug 27, 2026
Merged

feat: 补齐邮箱核验的忘记密码与修改密码#810
xiaocheny214 merged 1 commit into
1024XEngineer:mainfrom
xyh202131:feat/email-password-recovery

Conversation

@xyh202131

@xyh202131 xyh202131 commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

改动内容

  • 登录页新增“忘记密码”,通过邮箱验证码设置新密码。
  • 用户中心入口统一命名为“修改密码”,通过当前登录账号邮箱核验后修改。
  • 新增登录态邮箱改密接口,服务端绑定当前用户邮箱,禁止请求覆盖邮箱。
  • 验证码使用 Lua 原子校验与消费,最多允许 5 次错误尝试。
  • access token 与 refresh token 加入 auth_version,改密后现有会话立即失效。
  • 四条密码状态变更路径使用 FOR UPDATE 串行化,避免并发改密丢失会话版本。
  • 补齐前后端测试和 OpenAPI 合同。

ORM 与迁移脚本的关系

迁移 SQL 与 ORM 同时保留,职责不同,不互相替代:

  • User.auth_version ORM 字段负责新版 Backend 与 Worker 运行时读取、比较和更新会话版本。
  • 20260827_add_user_auth_version.sql 负责在部署新版进程前,为已有生产数据库补齐字段。
  • Base.metadata.create_all 只能创建缺失的表,不能给已有 windup_user 表补列,因此不能代替该迁移 SQL。
  • 本 PR 不删除 ORM,也不改造全项目建表机制;全面迁移体系属于独立架构任务,不应混入密码功能 PR。

部署前置

合并后部署时,必须先执行:

backend/scripts/migrations/20260827_add_user_auth_version.sql

确认 windup_user.auth_version 已存在后,再切换新版 Backend 与 Worker。本 PR 未修改或部署线上服务器。

验证

  • 后端完整测试:1793 passed,14 skipped
  • 后端安全定向测试:75 passed
  • 前端相关测试:129 passed
  • TypeScript、Vite build、oxlint、oxfmt、Ruff、Import Linter、OpenAPI 一致性通过
  • 前端完整测试 1244 项中 1243 项通过;唯一失败为未改动的 Workflow Editor 路由测试在全量并发时 30 秒超时,单独复跑通过

Closes #809

@vercel

vercel Bot commented Aug 27, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
windup Ready Ready Preview Aug 27, 2026 5:40am

@codecov

codecov Bot commented Aug 27, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 83.03571% with 38 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
frontend/src/features/account-panel/index.tsx 66.66% 13 Missing and 7 partials ⚠️
...packages/app/src/windup_app/server/user/service.py 89.65% 6 Missing ⚠️
frontend/src/pages/account/index.tsx 88.46% 2 Missing and 4 partials ⚠️
frontend/src/entities/user/api.ts 50.00% 3 Missing ⚠️
...ackend/packages/app/src/windup_app/web/api/auth.py 92.85% 1 Missing ⚠️
...packages/app/src/windup_app/web/middleware/auth.py 91.66% 1 Missing ⚠️
frontend/src/pages/account/state.ts 85.71% 1 Missing ⚠️

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #810      +/-   ##
==========================================
- Coverage   87.07%   87.06%   -0.01%     
==========================================
  Files         288      288              
  Lines       21520    21679     +159     
  Branches     3294     3321      +27     
==========================================
+ Hits        18738    18875     +137     
- Misses       1856     1873      +17     
- Partials      926      931       +5     
Flag Coverage Δ
backend 91.70% <91.39%> (+0.02%) ⬆️
frontend 81.58% <77.09%> (-0.02%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...ckages/app/src/windup_app/server/user/interface.py 100.00% <100.00%> (ø)
...d/packages/app/src/windup_app/server/user/model.py 97.40% <100.00%> (+0.18%) ⬆️
frontend/src/app/layout/app-header.tsx 94.79% <ø> (ø)
frontend/src/features/auth-session/index.tsx 82.87% <100.00%> (-0.47%) ⬇️
...ackend/packages/app/src/windup_app/web/api/auth.py 92.00% <92.85%> (-0.04%) ⬇️
...packages/app/src/windup_app/web/middleware/auth.py 95.55% <91.66%> (-1.67%) ⬇️
frontend/src/pages/account/state.ts 81.81% <85.71%> (+2.87%) ⬆️
frontend/src/entities/user/api.ts 66.66% <50.00%> (-2.23%) ⬇️
...packages/app/src/windup_app/server/user/service.py 93.67% <89.65%> (+0.73%) ⬆️
frontend/src/pages/account/index.tsx 79.69% <88.46%> (+5.45%) ⬆️
... and 1 more

... and 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已审阅固定提交 b9878d64beea95c5362351d1d1fe82ae645b1412...1140ed7129015ada4af97dae7c5198bf082bf839 的完整变更,覆盖后端邮箱验证码、密码重置、会话版本失效、刷新令牌轮换、鉴权中间件、迁移,以及前端认证和账号安全流程。调用方、数据库锁、验证码消费、邮箱绑定和 OpenAPI 合同保持一致,未发现达到报告阈值的可操作回归。

验证:Python 变更文件语法检查通过;本地无法运行 pytest/Vitest/TypeScript,因为环境缺少 pytest、前端 node_modules/可执行依赖。

@xiaocheny214

Copy link
Copy Markdown
Contributor

现在可以先使用这个ORM迁移机制。

@xiaocheny214
xiaocheny214 self-requested a review August 27, 2026 07:38

@xiaocheny214 xiaocheny214 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

权威仍是 ORM:create_all 建新表,加列走已有 schema_sync,删列不自动做。可以使用这个机制来做。

@minorcell

Copy link
Copy Markdown
Member

@xyh202131 @xiaocheny214

合并了,看看是不是要发版本、数据库迁移、部署;

@xiaocheny214

Copy link
Copy Markdown
Contributor

@xyh202131 @xiaocheny214

合并了,看看是不是要发版本、数据库迁移、部署;

这个合并了,就要准备做数据库迁移机制了。
当前项目仍在使用ORM做建表以及还有异步巡检数据库字段等功能。我的意思是,先不搞这个sql迁移。继续使用下去这个ORM吧。我现在分身无暇做这个迁移机制。
后续迁移的时候,还需要把当前项目的ORM给删除,全给替换成数据库表创建的字段、要修改的字段。

@xyh202131

Copy link
Copy Markdown
Contributor Author

@xyh202131 @xiaocheny214
合并了,看看是不是要发版本、数据库迁移、部署;

这个合并了,就要准备做数据库迁移机制了。 当前项目仍在使用ORM做建表以及还有异步巡检数据库字段等功能。我的意思是,先不搞这个sql迁移。继续使用下去这个ORM吧。我现在分身无暇做这个迁移机制。 后续迁移的时候,还需要把当前项目的ORM给删除,全给替换成数据库表创建的字段、要修改的字段。

现在数据不多,赶紧做吧

@xyh202131

Copy link
Copy Markdown
Contributor Author

@xyh202131 @xiaocheny214
合并了,看看是不是要发版本、数据库迁移、部署;

这个合并了,就要准备做数据库迁移机制了。 当前项目仍在使用ORM做建表以及还有异步巡检数据库字段等功能。我的意思是,先不搞这个sql迁移。继续使用下去这个ORM吧。我现在分身无暇做这个迁移机制。 后续迁移的时候,还需要把当前项目的ORM给删除,全给替换成数据库表创建的字段、要修改的字段。

速速合并,迁移脚本不是已经写好了吗

@xiaocheny214

Copy link
Copy Markdown
Contributor

@xyh202131 @xiaocheny214
合并了,看看是不是要发版本、数据库迁移、部署;

这个合并了,就要准备做数据库迁移机制了。 当前项目仍在使用ORM做建表以及还有异步巡检数据库字段等功能。我的意思是,先不搞这个sql迁移。继续使用下去这个ORM吧。我现在分身无暇做这个迁移机制。 后续迁移的时候,还需要把当前项目的ORM给删除,全给替换成数据库表创建的字段、要修改的字段。

现在数据不多,赶紧做吧

那你去把这个项目中的ORM全部给删除,然后替换成这个迁移文件吧。后续部署的时候,你来人工先在数据库上跑一遍这个sql文件,又或者你嫌麻烦你再写一个脚本去做自动化去吧。

@xiaocheny214

Copy link
Copy Markdown
Contributor

@xyh202131 @xiaocheny214
合并了,看看是不是要发版本、数据库迁移、部署;

这个合并了,就要准备做数据库迁移机制了。 当前项目仍在使用ORM做建表以及还有异步巡检数据库字段等功能。我的意思是,先不搞这个sql迁移。继续使用下去这个ORM吧。我现在分身无暇做这个迁移机制。 后续迁移的时候,还需要把当前项目的ORM给删除,全给替换成数据库表创建的字段、要修改的字段。

速速合并,迁移脚本不是已经写好了吗

项目中ORM机制和脚本同时存在。

@xyh202131

Copy link
Copy Markdown
Contributor Author

@xiaocheny214 已在 PR 描述中补充 ORM 与迁移脚本的职责边界。两者需要同时存在:ORM 模型负责新版进程运行时的数据访问,幂等 SQL 负责在部署前升级已有生产库;create_all 无法给已有表补列。删除全项目 ORM 会破坏当前服务的数据访问,也超出本密码功能 PR 范围。上线将严格按“备份数据库 → 执行 20260827_add_user_auth_version.sql → 验证字段 → 切换 Backend 与 Worker”执行。请基于这一边界重新审核并解除当前 changes requested。

@xiaocheny214
xiaocheny214 merged commit b876b51 into 1024XEngineer:main Aug 27, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

补齐邮箱核验的忘记密码与修改密码

3 participants