| content |
{"Commits":[{"Sha1":"6bd108ddf {"Commits":[{"Sha1":"6bd108ddfd20351569b88f276ed8cfa90e7f6f3b","Message":"feat: 合并邀请登录账号可见性的前端接入\n\n用户发现被邀请人打开邀请链接后只能输入密码,不知道自己的登录账号是什么,管理后台也看不到用户用什么登录。后端已在 dd37c0e 提供邀请只读检查、成员邀请邮箱快照与平台账号登录标识,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 接受邀请页(c88c7be):独立的 InvitationPage 落地后自动只读检查一次,显示登录账号与邀请内容;新账号设置并确认 12—128 个字符的密码,已有账号输入当前密码并提供忘记密码入口;检查与激活按错误码反馈,429 按 Retry-After 倒计时,不自动重试;换链接时旧结果作废;成功后经路由状态把账号预填到登录页,不进网址\n- 管理详情(8209c1b):成员详情显示“邀请邮箱(加入时)”快照,null 显示“无记录”;平台账号详情显示登录标识,只有邮箱显示验证状态;两处列表不变\n- 登录页入口(8f406dc):“收到邀请?接受邀请”改为指向控制台邀请页,没有邮件链接时引导打开邀请邮件\n\n验证:\n- 合并前确认分支基于 06daf4a,main 之后只有后端提交 dd37c0e,与三个前端提交没有共同文件;主目录未提交改动仅在 scripts/experience/、docs/handoff/ 与 iam-demo-video/,与本次合并没有共同文件\n- 核对 dd37c0e 中的交接文档与 InvitationInspectionController,与前端接入所依据的接口路径、字段和错误码一致\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 38 个文件 334 项、构建)\n- 未运行:合并后的前端检查与后端测试、浏览器对真实后端的联调与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:00:38-07:00"},{"Sha1":"8f406dc1a007ea3a5b9a37a79322a9308c2d6559","Message":"fix(console): 登录页邀请入口改为指向控制台邀请页\n\n登录页底部“收到邀请?接受邀请”原先链到服务端简易页 /activate,那里要手动粘贴邀请凭据,也看不到登录账号。改为指向控制台邀请页,没带邮件链接时由该页引导打开邀请邮件。\n\n实现内容:\n- LoginPage 的“接受邀请”链接改为 /console/activate,与同页“忘记密码?”一样使用完整路径的普通链接\n- 邀请页没有链接时的说明改为“接受邀请需要从邀请邮件中的链接进入”,并说明页面隐藏或停留超过 30 分钟时链接会被清除、需要重新打开;不显示表单,也不发起检查或激活\n\n验证:\n- npm --prefix iam-admin-web run check:格式、lint、类型检查通过,Vitest 38 个文件 334 项通过,构建成功\n- 新增 login-protection.test.tsx 1 项(入口地址)、invitation.test.tsx 1 项(无链接时只引导、不发请求)\n- 未运行:浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:57:38-07:00"},{"Sha1":"8209c1bfd928ce9ab6d645b51ff9dc76a544db99","Message":"feat(console): 成员详情与平台账号详情显示邀请邮箱和登录标识\n\n企业管理员和平台管理员此前都看不到用户用什么登录,无法在对方忘记账号时告知。按后端交接文档接入成员详情的 invitation_email 快照与平台账号详情的 login_identifiers。\n\n实现内容:\n- Member 新增可选 invitation_email;成员详情显示“邀请邮箱(加入时)”并可复制,说明它是接受本企业邀请时的快照、不随账号邮箱变化;null 显示“无记录”,旧后端不返回时不显示该行;成员列表不变\n- PlatformUser 新增可选 login_identifiers;平台账号详情显示“登录账号”,逐行列出邮箱或用户名并可复制,只有邮箱显示已验证/未验证;没有标识时显示“无登录标识”,旧后端不返回时不显示该行;账号列表不变\n- management.css 新增 .login-ids 样式,窄屏整行折行\n\n验证:\n- npm --prefix iam-admin-web run check(含上一提交):格式、lint、类型检查通过,Vitest 38 个文件 332 项通过,构建成功;之后只改了成员详情的一处注释,重新运行 format:check 通过\n- management-integration.test.tsx 新增 2 项:邀请邮箱的有值、null、缺失三种情况,登录标识列表与邮箱验证状态\n- 未运行:浏览器检查与真实后端联调(后端改动尚未提交,演示环境仍为旧版本)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:52:57-07:00"},{"Sha1":"c88c7be70cb41dac8c5b962f958b76e8c7ced3f4","Message":"feat(console): 接受邀请页显示登录账号并区分新旧账号\n\n接受邀请页原先只有一个密码框,不告诉被邀请人要注册或关联的是哪个登录账号,也分不清新账号与已有账号。按后端交接文档 docs/console/invitation-login-account-handoff.md 接入 POST /api/v1/invitations/inspect,并把接受邀请拆成独立页面。\n\n实现内容:\n- 新增 pages/InvitationPage.tsx:拿到链接后自动只读检查一次(StrictMode 下也只调用一次,令牌只放在请求体),显示登录账号、邀请内容(企业名称、平台管理员或应用管理员及应用名称)、新账号的邀请姓名与有效期;响应缺少登录账号或账号状态、邀请类型取值未知时按检查失败处理,不猜测新旧账号\n- NEW 显示设置密码与确认密码,前端校验 12—128 个字符及两次一致;EXISTING 只输入当前密码,不设最短长度,并提供忘记密码入口;隐藏的 username 字段供密码管理器关联账号\n- 检查失败按错误码反馈:INVALID_INVITATION、INVITATION_NOT_APPLICABLE 不再提供重新检查;401/403 丢弃缓存的 CSRF 令牌;429 按 Retry-After 倒计时(缺失时 60 秒),结束后由用户手动重新检查;5xx、网络异常与无法识别的响应允许重新检查;不自动重试\n- 激活提交沿用 urlencoded 表单与 HTML 成功响应;503 AUTH_BUSY 提示未提交,INVALID_ACTIVATION 按检查时的账号状态给出提示,激活 429 同样在提交按钮上倒计时;网络异常与其他 5xx 仍提示结果未知\n- 同文档收到新链接时用新 key 重建流程组件,旧链接晚到的检查或提交结果随旧组件作废;页面隐藏、离开或 30 分钟后清除邀请秘密与已输入的密码\n- 成功页写明登录账号;“前往登录”经路由状态把账号预填到登录页,不放进网址,登录页预填时焦点直接落到密码框\n- 链接接收与新密码规则抽到 lib/emailLink.ts;EmailLinkPage 只保留重置密码与验证邮箱,移除激活分支\n- 结果块程序聚焦时一并去掉全局 box-shadow 焦点环,与原注释“不画焦点环”一致;重置密码、验证邮箱的成功块同样受益\n\n验证:\n- npm --prefix iam-admin-web run check(暂时收起管理详情改动,仅含本提交):格式、lint、类型检查通过,Vitest 38 个文件 330 项通过,构建成功\n- 新增 invitation.test.tsx 9 项、login-protection.test.tsx 2 项,覆盖检查一次、新旧账号表单、服务端密码错误、链接不可用、无法识别的账号状态、429 倒计时、旧链接晚到结果、页面隐藏清除秘密与登录预填\n- Vite 开发服务器加页面内模拟检查与激活接口,在内置浏览器查看新账号、已有账号、限流倒计时、链接不可用、成功页与登录预填;手机宽度无横向滚动,深色模式正常\n- 未运行:与真实后端联调(后端改动尚未提交,演示环境仍为旧版本)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:52:13-07:00"},{"Sha1":"dd37c0e1718f50bee4b88148471b6fc1259a572d","Message":"fix(accounts): 补齐邀请登录账号信息的受控展示\n\n邀请收件人和管理员缺少辨认登录账号的信息,增加受权限约束的展示入口,并保留原密码证明与企业隔离边界。\n\n实现内容:\n- 新增匿名邀请检查接口,要求 CSRF,限制来源和令牌预算,不消费邀请\n- 邀请邮件展示登录邮箱及加入对象,保存对象名称快照并过滤控制字符\n- V36 记录成员加入时的邀请邮箱,历史无可靠关联的数据保留为空\n- 平台账号详情返回登录标识,成员详情返回本企业邀请快照,列表及搜索范围不变\n- 同步账号、邮件合同与前端接入交接文档,补充权限、激活及迁移测试\n\n验证:\n- Java 25 下执行 Maven verify:服务端 224 项单元测试通过\n- 邀请、管理读取、邮件、账号及数据库迁移共 7 类 73 项集成用例分批通过,无跳过\n- 最后针对性 verify:29 项单元测试及 6 项邀请检查集成测试通过\n- 提交前重新执行 ./mvnw -B -ntp -pl iam-server -am spotless:check:通过\n- git diff --check 与 git diff --cached --check:通过\n- 前端接入、真实邮件供应商及部署环境验收尚未执行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T23:41:10-07:00"}],"HeadCommit":{"Sha1":"6bd108ddfd20351569b88f276ed8cfa90e7f6f3b","Message":"feat: 合并邀请登录账号可见性的前端接入\n\n用户发现被邀请人打开邀请链接后只能输入密码,不知道自己的登录账号是什么,管理后台也看不到用户用什么登录。后端已在 dd37c0e 提供邀请只读检查、成员邀请邮箱快照与平台账号登录标识,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 接受邀请页(c88c7be):独立的 InvitationPage 落地后自动只读检查一次,显示登录账号与邀请内容;新账号设置并确认 12—128 个字符的密码,已有账号输入当前密码并提供忘记密码入口;检查与激活按错误码反馈,429 按 Retry-After 倒计时,不自动重试;换链接时旧结果作废;成功后经路由状态把账号预填到登录页,不进网址\n- 管理详情(8209c1b):成员详情显示“邀请邮箱(加入时)”快照,null 显示“无记录”;平台账号详情显示登录标识,只有邮箱显示验证状态;两处列表不变\n- 登录页入口(8f406dc):“收到邀请?接受邀请”改为指向控制台邀请页,没有邮件链接时引导打开邀请邮件\n\n验证:\n- 合并前确认分支基于 06daf4a,main 之后只有后端提交 dd37c0e,与三个前端提交没有共同文件;主目录未提交改动仅在 scripts/experience/、docs/handoff/ 与 iam-demo-video/,与本次合并没有共同文件\n- 核对 dd37c0e 中的交接文档与 InvitationInspectionController,与前端接入所依据的接口路径、字段和错误码一致\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 38 个文件 334 项、构建)\n- 未运行:合并后的前端检查与后端测试、浏览器对真实后端的联调与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:00:38-07:00"},"CompareURL":"pengzhiyu/IAM/compare/06daf4a651e1a490ace181ac708099def39e8de0...6bd108ddfd20351569b88f276ed8cfa90e7f6f3b","Len":5}... |