|
37817
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
|
1791877967
|
Edit
Delete
|
|
37818
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"ff5ee3351 {"Commits":[{"Sha1":"ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Message":"feat(console): 接入权限说明与操作记录的操作对象快照\n\n后端已为权限增加可选说明,并在操作记录中返回操作对象类型、代码快照和展示摘要。控制台此前无法填写或查看权限说明,操作记录也看不出操作了哪个对象。\n\n实现内容:\n- 权限类型增加 description;完整清单提交时其余每条权限原样带上当前说明或 null,版本号固定为当前值加 1\n- 平台「新增或修改权限」弹窗增加可选说明多行框:预填已有说明、显示字数、上限 1000、拦截回车,换行/制表符/格式字符在前端提示,首尾空白去掉、清空或全空白提交 null\n- 后端返回 INVALID_PERMISSION_DESCRIPTION 时给出具体修改提示\n- PermissionLabel 支持显示说明;平台权限表、企业权限清单(搜索可匹配说明)与 PermissionPicker 显示说明,为空时不占位\n- PermissionPicker 中说明经 aria-describedby 关联,不并入勾选框名称\n- 操作记录列表在操作名称下显示「类型「代码」 · 应用」;未知类型统一称「对象」,无快照时省略\n- 操作记录详情增加「操作对象」,摘要优先 display_summary,原 summary 移到技术细节「内部摘要」;旧记录说明未记录对象名称\n- acceptance-t03 同步新的按钮名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、227 项通过(新增说明保留与清空、说明校验、编辑弹窗、选择器无障碍名称、操作对象快照与回退用例)\n- 浏览器在 1280 宽、375 窄屏及亮/暗色下用页面内临时拦截 fetch 模拟新字段检查显示:正常\n- 未与包含 V29 的新后端联调;acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:48:33-07:00"},{"Sha1":"9631e78cfeee4abd1ccb7e7f777864e4815ded49","Message":"chore: 合并 main 引入权限说明与操作对象快照后端\n\n前端接入权限说明与操作记录操作对象前,先把 main 上的后端交付(a435000、536e36c、85e2c17)合入前端分支。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:33:36-07:00"},{"Sha1":"3973681b67a737220c25c4bc3f916ca2b687b5ee","Message":"feat(console): 重排个人中心并把登录记录改为当前登录加表格\n\n个人中心原先把邮箱、多因素验证放在最前,账号信息压在下方;登录记录每条都是一张大卡片,十几条记录要滚很久,已过期的登录也和当前登录一样醒目。本次按控制台其他页面的布局约定重排个人中心。\n\n实现内容:\n- 上排并列「我的账号」(名字首字头像 + 平台管理身份徽标)与「我的企业」(企业 / 你的身份 / 成员代码三列表格,手机上收窄内边距不必横向滚动)\n- 邮箱与多因素验证合并为「账号安全」卡片,左侧标题与说明、右侧内容,900px 以下上下排列;多因素验证面板与登录页共用,本次未改\n- 邮箱区域改用与多因素验证相同外观的状态摘要(未登记 / 未验证 / 已验证 + 投递状态);登记或发送验证邮件的表单点按钮后就地展开,展开后聚焦第一个字段,提交后无论成败都清除密码;「取消待处理的验证与恢复链接」改名为「作废已发出的邮件链接」并保持常驻(找回密码链接不体现在邮箱状态里)\n- 登录记录拆为「当前这次登录」单独一块(四个时间 + 期限规则)与「其他登录」表格(登录时间 + 编号缩写 / 状态 / 最近使用 / 自动退出于);表格时间用今天、昨天等简短写法,完整时间在悬停提示中\n- 已退出的登录不再显示退出按钮;已过期、已失效的登录仍可退出以撤销业务系统中残留的授权,按钮改为轻量样式,整行弱化\n- 退出确认弹窗底部改为「取消 + 确认退出」,补充最近使用时间,登录编号带名称与注解;账号标识同样带名称与注解\n- 单测改用新的邮箱按钮与字段名,新增「当前登录单独列出、已退出的登录不提供退出按钮」用例;acceptance-p11-t02 同步新的邮箱登记流程与已验证文案,acceptance-t05 依赖的类名与按钮名保持不变\n\n验证:\n- npm run format:check:通过\n- npm run typecheck:通过\n- npm run lint:通过\n- npm run test:26 个测试文件、224 项全部通过\n- 浏览器检查 1280 宽、375 窄屏与亮暗色,整页无横向溢出;邮箱登记表单与退出确认弹窗只打开查看,未实际提交\n- acceptance-p11-t02、acceptance-t05:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:28:12-07:00"},{"Sha1":"2508f797ba72291a981665d5f4fcc4fb86280af8","Message":"feat(console): 为技术细节中的编号补充名称与用途注解\n\n技术细节原先只列出编号,部分地方连名称都没有,普通使用者看不懂这串字符是什么、什么时候用得上。本次为各页面技术细节中的编号、版本和代码补充名称与一句用途说明。\n\n实现内容:\n- TechDetails 展开后先显示一句总说明:这些编号用于定位记录,日常不需要关心,反馈问题时可复制给管理员或技术支持\n- DescriptionList 每项新增可选 hint,在值下方显示灰色注解;有注解时值包在 .dlist__value 中,按值定位的测试不受注解文字影响\n- 新增 lib/tech-hints.ts 统一注解文案:对象标识、记录版本、账号标识与成员标识的区别、密钥编号、客户端标识与客户端代码的区别等\n- 工作台账号标识、程序接入新建密钥后的密钥编号、应用接入新建客户端后的客户端标识原先只露出编号,改为带名称的描述列表并加注解\n- 企业、账号、成员、部门、用户组、应用接入、应用开通、角色、授权、程序接入、程序身份、权限查询接入、操作记录、状态变更影响预览中的技术细节逐项补充注解\n- 同步 acceptance-p10-t01、acceptance-t03 中按记录版本值定位的选择器为 dd .dlist__value\n\n验证:\n- npm run format:check:通过\n- npm run typecheck:通过\n- npm run lint:通过\n- npm run test:26 个测试文件、223 项全部通过(暂时移开个人中心未提交改动后单独运行)\n- 浏览器检查应用接入客户端详情抽屉的技术细节注解显示正常;其余页面未逐页目测\n- acceptance-p10-t01、acceptance-t03:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:27:34-07:00"},{"Sha1":"e5c32be5d8e106d727495fd92d5b3bf6ab2a3b4f","Message":"feat(console): 把权限查询接入改为分区详情抽屉并以选择代替粘贴标识登记\n\n权限查询接入页列表与详情只显示一串 UUID,登记时需要手动粘贴企业、应用、服务三个标识;系统过期后状态仍显示「正常」,管理员无法看出它的查询已被拒绝。本次按控制台已定的列表、抽屉与弹窗样式重排该页。\n\n实现内容:\n- 列表改为「查询的应用 / 所属企业 / 到期时间 / 状态」,应用名称是打开详情的按钮、整行可点;企业与应用名称各读取第一页(最多 100 个),读不到时回退为「类别 + 标识前 8 位」\n- 正常但已过期的系统显示「已过期」徽标并提示查询会被拒绝,正常且 3 天内到期时提前提醒;列表新增定制空状态\n- 详情抽屉分「基本信息(企业、应用、服务名称)/ 密钥说明 / 停用(危险区)」,四个标识与固定查询范围收进技术细节;停用默认收起为按钮,展开后勾选确认、可取消,停用后抽屉保持打开并把焦点留在抽屉上\n- 登记改为两步:平铺列表选正常状态的企业,再用单选卡片选该企业已启用的应用和应用下的服务,填写摘要与到期时间(输入框限定现在至 30 天后);底部为「重新选择企业 / 确认登记」,提交字段与原来一致\n- 公共样式 .card__actions 不再收缩,卡片说明较长时操作按钮保持一行;600px 以下卡片头部换行,按钮排到标题下方\n- 同步登记单测为按企业、应用、服务选择的流程,acceptance-t03 的 A11 改为点击应用名称打开详情、展开停用并等待停用后的说明\n\n验证:\n- npm run format:check、npm run lint:通过\n- npx tsc -b:通过\n- npm run test:26 个测试文件、223 项全部通过\n- 浏览器在演示环境查看 1280 宽、375 窄屏与亮暗色;演示环境未开启登记功能,登记流程用页面内临时拦截请求验证,提交字段正确且未写入后端\n- acceptance-t03:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T23:49:35-07:00"}],"HeadCommit":{"Sha1":"ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Message":"feat(console): 接入权限说明与操作记录的操作对象快照\n\n后端已为权限增加可选说明,并在操作记录中返回操作对象类型、代码快照和展示摘要。控制台此前无法填写或查看权限说明,操作记录也看不出操作了哪个对象。\n\n实现内容:\n- 权限类型增加 description;完整清单提交时其余每条权限原样带上当前说明或 null,版本号固定为当前值加 1\n- 平台「新增或修改权限」弹窗增加可选说明多行框:预填已有说明、显示字数、上限 1000、拦截回车,换行/制表符/格式字符在前端提示,首尾空白去掉、清空或全空白提交 null\n- 后端返回 INVALID_PERMISSION_DESCRIPTION 时给出具体修改提示\n- PermissionLabel 支持显示说明;平台权限表、企业权限清单(搜索可匹配说明)与 PermissionPicker 显示说明,为空时不占位\n- PermissionPicker 中说明经 aria-describedby 关联,不并入勾选框名称\n- 操作记录列表在操作名称下显示「类型「代码」 · 应用」;未知类型统一称「对象」,无快照时省略\n- 操作记录详情增加「操作对象」,摘要优先 display_summary,原 summary 移到技术细节「内部摘要」;旧记录说明未记录对象名称\n- acceptance-t03 同步新的按钮名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、227 项通过(新增说明保留与清空、说明校验、编辑弹窗、选择器无障碍名称、操作对象快照与回退用例)\n- 浏览器在 1280 宽、375 窄屏及亮/暗色下用页面内临时拦截 fetch 模拟新字段检查显示:正常\n- 未与包含 V29 的新后端联调;acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:48:33-07:00"},"CompareURL":"pengzhiyu/IAM/compare/3cf111b21a47760e5c71fc6b2fba96d882dbd3f1...ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Len":5}...
|
1791877967
|
Edit
Delete
|
|
37819
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"ff5ee3351 {"Commits":[{"Sha1":"ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Message":"feat(console): 接入权限说明与操作记录的操作对象快照\n\n后端已为权限增加可选说明,并在操作记录中返回操作对象类型、代码快照和展示摘要。控制台此前无法填写或查看权限说明,操作记录也看不出操作了哪个对象。\n\n实现内容:\n- 权限类型增加 description;完整清单提交时其余每条权限原样带上当前说明或 null,版本号固定为当前值加 1\n- 平台「新增或修改权限」弹窗增加可选说明多行框:预填已有说明、显示字数、上限 1000、拦截回车,换行/制表符/格式字符在前端提示,首尾空白去掉、清空或全空白提交 null\n- 后端返回 INVALID_PERMISSION_DESCRIPTION 时给出具体修改提示\n- PermissionLabel 支持显示说明;平台权限表、企业权限清单(搜索可匹配说明)与 PermissionPicker 显示说明,为空时不占位\n- PermissionPicker 中说明经 aria-describedby 关联,不并入勾选框名称\n- 操作记录列表在操作名称下显示「类型「代码」 · 应用」;未知类型统一称「对象」,无快照时省略\n- 操作记录详情增加「操作对象」,摘要优先 display_summary,原 summary 移到技术细节「内部摘要」;旧记录说明未记录对象名称\n- acceptance-t03 同步新的按钮名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、227 项通过(新增说明保留与清空、说明校验、编辑弹窗、选择器无障碍名称、操作对象快照与回退用例)\n- 浏览器在 1280 宽、375 窄屏及亮/暗色下用页面内临时拦截 fetch 模拟新字段检查显示:正常\n- 未与包含 V29 的新后端联调;acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:48:33-07:00"},{"Sha1":"9631e78cfeee4abd1ccb7e7f777864e4815ded49","Message":"chore: 合并 main 引入权限说明与操作对象快照后端\n\n前端接入权限说明与操作记录操作对象前,先把 main 上的后端交付(a435000、536e36c、85e2c17)合入前端分支。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:33:36-07:00"},{"Sha1":"3973681b67a737220c25c4bc3f916ca2b687b5ee","Message":"feat(console): 重排个人中心并把登录记录改为当前登录加表格\n\n个人中心原先把邮箱、多因素验证放在最前,账号信息压在下方;登录记录每条都是一张大卡片,十几条记录要滚很久,已过期的登录也和当前登录一样醒目。本次按控制台其他页面的布局约定重排个人中心。\n\n实现内容:\n- 上排并列「我的账号」(名字首字头像 + 平台管理身份徽标)与「我的企业」(企业 / 你的身份 / 成员代码三列表格,手机上收窄内边距不必横向滚动)\n- 邮箱与多因素验证合并为「账号安全」卡片,左侧标题与说明、右侧内容,900px 以下上下排列;多因素验证面板与登录页共用,本次未改\n- 邮箱区域改用与多因素验证相同外观的状态摘要(未登记 / 未验证 / 已验证 + 投递状态);登记或发送验证邮件的表单点按钮后就地展开,展开后聚焦第一个字段,提交后无论成败都清除密码;「取消待处理的验证与恢复链接」改名为「作废已发出的邮件链接」并保持常驻(找回密码链接不体现在邮箱状态里)\n- 登录记录拆为「当前这次登录」单独一块(四个时间 + 期限规则)与「其他登录」表格(登录时间 + 编号缩写 / 状态 / 最近使用 / 自动退出于);表格时间用今天、昨天等简短写法,完整时间在悬停提示中\n- 已退出的登录不再显示退出按钮;已过期、已失效的登录仍可退出以撤销业务系统中残留的授权,按钮改为轻量样式,整行弱化\n- 退出确认弹窗底部改为「取消 + 确认退出」,补充最近使用时间,登录编号带名称与注解;账号标识同样带名称与注解\n- 单测改用新的邮箱按钮与字段名,新增「当前登录单独列出、已退出的登录不提供退出按钮」用例;acceptance-p11-t02 同步新的邮箱登记流程与已验证文案,acceptance-t05 依赖的类名与按钮名保持不变\n\n验证:\n- npm run format:check:通过\n- npm run typecheck:通过\n- npm run lint:通过\n- npm run test:26 个测试文件、224 项全部通过\n- 浏览器检查 1280 宽、375 窄屏与亮暗色,整页无横向溢出;邮箱登记表单与退出确认弹窗只打开查看,未实际提交\n- acceptance-p11-t02、acceptance-t05:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:28:12-07:00"},{"Sha1":"2508f797ba72291a981665d5f4fcc4fb86280af8","Message":"feat(console): 为技术细节中的编号补充名称与用途注解\n\n技术细节原先只列出编号,部分地方连名称都没有,普通使用者看不懂这串字符是什么、什么时候用得上。本次为各页面技术细节中的编号、版本和代码补充名称与一句用途说明。\n\n实现内容:\n- TechDetails 展开后先显示一句总说明:这些编号用于定位记录,日常不需要关心,反馈问题时可复制给管理员或技术支持\n- DescriptionList 每项新增可选 hint,在值下方显示灰色注解;有注解时值包在 .dlist__value 中,按值定位的测试不受注解文字影响\n- 新增 lib/tech-hints.ts 统一注解文案:对象标识、记录版本、账号标识与成员标识的区别、密钥编号、客户端标识与客户端代码的区别等\n- 工作台账号标识、程序接入新建密钥后的密钥编号、应用接入新建客户端后的客户端标识原先只露出编号,改为带名称的描述列表并加注解\n- 企业、账号、成员、部门、用户组、应用接入、应用开通、角色、授权、程序接入、程序身份、权限查询接入、操作记录、状态变更影响预览中的技术细节逐项补充注解\n- 同步 acceptance-p10-t01、acceptance-t03 中按记录版本值定位的选择器为 dd .dlist__value\n\n验证:\n- npm run format:check:通过\n- npm run typecheck:通过\n- npm run lint:通过\n- npm run test:26 个测试文件、223 项全部通过(暂时移开个人中心未提交改动后单独运行)\n- 浏览器检查应用接入客户端详情抽屉的技术细节注解显示正常;其余页面未逐页目测\n- acceptance-p10-t01、acceptance-t03:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:27:34-07:00"},{"Sha1":"e5c32be5d8e106d727495fd92d5b3bf6ab2a3b4f","Message":"feat(console): 把权限查询接入改为分区详情抽屉并以选择代替粘贴标识登记\n\n权限查询接入页列表与详情只显示一串 UUID,登记时需要手动粘贴企业、应用、服务三个标识;系统过期后状态仍显示「正常」,管理员无法看出它的查询已被拒绝。本次按控制台已定的列表、抽屉与弹窗样式重排该页。\n\n实现内容:\n- 列表改为「查询的应用 / 所属企业 / 到期时间 / 状态」,应用名称是打开详情的按钮、整行可点;企业与应用名称各读取第一页(最多 100 个),读不到时回退为「类别 + 标识前 8 位」\n- 正常但已过期的系统显示「已过期」徽标并提示查询会被拒绝,正常且 3 天内到期时提前提醒;列表新增定制空状态\n- 详情抽屉分「基本信息(企业、应用、服务名称)/ 密钥说明 / 停用(危险区)」,四个标识与固定查询范围收进技术细节;停用默认收起为按钮,展开后勾选确认、可取消,停用后抽屉保持打开并把焦点留在抽屉上\n- 登记改为两步:平铺列表选正常状态的企业,再用单选卡片选该企业已启用的应用和应用下的服务,填写摘要与到期时间(输入框限定现在至 30 天后);底部为「重新选择企业 / 确认登记」,提交字段与原来一致\n- 公共样式 .card__actions 不再收缩,卡片说明较长时操作按钮保持一行;600px 以下卡片头部换行,按钮排到标题下方\n- 同步登记单测为按企业、应用、服务选择的流程,acceptance-t03 的 A11 改为点击应用名称打开详情、展开停用并等待停用后的说明\n\n验证:\n- npm run format:check、npm run lint:通过\n- npx tsc -b:通过\n- npm run test:26 个测试文件、223 项全部通过\n- 浏览器在演示环境查看 1280 宽、375 窄屏与亮暗色;演示环境未开启登记功能,登记流程用页面内临时拦截请求验证,提交字段正确且未写入后端\n- acceptance-t03:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T23:49:35-07:00"}],"HeadCommit":{"Sha1":"ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Message":"feat(console): 接入权限说明与操作记录的操作对象快照\n\n后端已为权限增加可选说明,并在操作记录中返回操作对象类型、代码快照和展示摘要。控制台此前无法填写或查看权限说明,操作记录也看不出操作了哪个对象。\n\n实现内容:\n- 权限类型增加 description;完整清单提交时其余每条权限原样带上当前说明或 null,版本号固定为当前值加 1\n- 平台「新增或修改权限」弹窗增加可选说明多行框:预填已有说明、显示字数、上限 1000、拦截回车,换行/制表符/格式字符在前端提示,首尾空白去掉、清空或全空白提交 null\n- 后端返回 INVALID_PERMISSION_DESCRIPTION 时给出具体修改提示\n- PermissionLabel 支持显示说明;平台权限表、企业权限清单(搜索可匹配说明)与 PermissionPicker 显示说明,为空时不占位\n- PermissionPicker 中说明经 aria-describedby 关联,不并入勾选框名称\n- 操作记录列表在操作名称下显示「类型「代码」 · 应用」;未知类型统一称「对象」,无快照时省略\n- 操作记录详情增加「操作对象」,摘要优先 display_summary,原 summary 移到技术细节「内部摘要」;旧记录说明未记录对象名称\n- acceptance-t03 同步新的按钮名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、227 项通过(新增说明保留与清空、说明校验、编辑弹窗、选择器无障碍名称、操作对象快照与回退用例)\n- 浏览器在 1280 宽、375 窄屏及亮/暗色下用页面内临时拦截 fetch 模拟新字段检查显示:正常\n- 未与包含 V29 的新后端联调;acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T00:48:33-07:00"},"CompareURL":"pengzhiyu/IAM/compare/85e2c17b4829f451e34f938ca6c11354a0b17f30...ff5ee33515b0a21b6ba738d00c52373fabfaa50d","Len":5}...
|
1791877984
|
Edit
Delete
|
|
37961
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"cf70e039a {"Commits":[{"Sha1":"cf70e039ad30edff8e3a51877be4561ed564e95f","Message":"feat(console): 合并应用中心导航、权限清单按行修改与概览页重排\n\nmain 停在 ff5ee33 之后,控制台仍是旧的侧栏分组、权限清单整体编辑和早期概览页布局。合并 feat/console-layout 上其后的 4 个前端提交,完成控制台全部页面的布局改造。\n\n实现内容:\n- 权限清单把新增与修改拆开,平台侧支持按行修改名称与说明,企业侧「可用权限」提供去平台修改的入口;权限名称等于代码时编辑弹窗不再预填代码,用户组事件标签改为「创建用户组」\n- 转义 5 处代码输入框 pattern 中的连字符\n- 侧栏分为「平台管理 / 应用 / 企业管理 / 应用授权」四组,应用定义独立成「应用」分组(网址仍为 /platform/applications),统一「应用列表」「权限定义与资源规则」「所有企业共用」「可用权限」等命名\n- 工作台改为平台管理 / 应用 / 企业管理三个并列入口,加上「我的企业」表格与账号摘要;平台概览的「需要你关注」三类事项固定列出;企业概览的应用改为表格;应用概览的三步引导放进卡片并显示进度;三个概览的功能入口按用途分两栏\n\n验证:\n- 分支上各提交前运行 format:check、lint、typecheck 与 Vitest,最后一次 27 个测试文件、234 项全部通过\n- 合并无冲突,只涉及 iam-admin-web/ 下的文件;main 上相对分支只多出 568be88(两处集成测试),合并后的前端文件与分支末端 695ea4d 一致\n- main 上未单独重新运行检查;验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T07:22:40-07:00"},{"Sha1":"568be8853874bf5d720f1c49e060edd5f4d20825","Message":"test(protocol): 按完整迁移历史校验模式切换与启动反例\n\n新增 V29 后,两处固定最高迁移版本为 28 的测试不再符合当前完整提交。改为核对动作前后历史保持,避免每次新增迁移重复修改版本预期。\n\n实现内容:\n- 仅修改 ScopedLifecycleIT 和 IdentityReadLifecycleIT 两处迁移断言\n- 按 installed_rank 比较全部 version、checksum、success,显式要求 V27、V28 已成功\n- 保留并发互斥、释放、SCOPED 函数缺失反例及原安全断言\n\n验证:\n- Java 25,在独立快照执行 ./mvnw -o -B -ntp -pl iam-server -am verify -Dit.test=ScopedLifecycleIT,IdentityReadLifecycleIT -Dfailsafe.failIfNoSpecifiedTests=false -Dfailsafe.skipAfterFailureCount=1 -Dsurefire.skipAfterFailureCount=1:通过\n- 180 项单测、ScopedLifecycleIT 9 项及 IdentityReadLifecycleIT 40 项集成通过,零失败、错误或跳过;格式、编译和打包通过\n- git diff --check:通过\n- 本提交前未运行含控制台全量验收;随后从最新完整提交另建快照验证\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T07:00:04-07:00"},{"Sha1":"695ea4d16f5066a81e3808b0ba4432b2a69cbd87","Message":"feat(console): 重排工作台与平台、企业、应用三个概览页\n\n四个概览页此前沿用早期布局:工作台只有两个入口,待办和应用用零散小卡片展示,功能入口不分组,与已改造的列表页风格不一致。本次按「上方状态卡片、下方两栏分组入口」统一四页布局。\n\n实现内容:\n- 工作台:三个并列入口「平台管理 / 应用 / 企业管理」,新增应用配色 entry--apps;应用管理员入口写明负责的应用,无身份的入口锁定并说明原因\n- 工作台新增「我的企业」可点表格(企业、你的身份,每次读取 10 条,满页时可加载更多),账号摘要放侧栏并链接个人中心,基本概念改为四格横排\n- 平台概览:「需要你关注」改为卡片,三类事项固定列出,没有内容时显示对勾与「目前没有。」,有内容时显示数量、最多 3 个名称与处理入口,读取失败只在该行重试\n- 企业概览:本企业的应用改为卡片内表格,停用的应用不可进入并注明原因;空状态改用公共 EmptyList\n- 应用概览:三步引导放进卡片,步骤之间用分隔线,右上角显示完成进度;任一步读取中或失败时不显示进度\n- 三个概览的功能入口统一用 overview-groups 两栏分组,窄屏改为上下排列;删除不再使用的待办卡片、应用卡片与一切正常提示条样式\n\n验证:\n- npm run typecheck、npm run lint、npm run format:check:通过\n- npm run test:27 个测试文件、234 项通过(同步修改平台、企业、应用概览单测,新增 home.test.tsx 4 项)\n- 浏览器检查 1280 宽、375 窄屏与暗色:四页无页面级横向溢出;待办与停用应用状态用页面内临时拦截 fetch 验证\n- 验收脚本未运行(脚本只依赖「工作台」标题与 .entry--locked,均已保留)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:50:19-07:00"},{"Sha1":"ceb5884bba8e1274c550348e99226f46614e6511","Message":"feat(console): 把应用定义独立成「应用」分组并统一权限相关命名\n\nIAM 面向多租户,一个应用登记后可由多家企业开通。原导航把应用的全局定义(登录客户端、受保护的服务、权限与资源规则)放在「平台管理」下,企业内的应用授权又叫「应用管理」,使用者难以分清权限为何不在应用层维护、改了会影响谁。\n\n实现内容:\n- 侧边栏改为「平台管理 / 应用 / 企业管理 / 应用授权」四组:平台管理只对平台管理员展示链接;新增「应用」分组(应用列表),平台管理员与应用管理员可见;原「应用管理」改名「应用授权」;网址保持不变\n- 应用详情网址仍在 /platform/applications 下,导航高亮、顶部上下文标识(「应用定义」)与面包屑(应用 › 应用列表)归入「应用」\n- 平台侧「应用接入」改为「应用列表」、「权限清单与资源规则」改为「权限定义与资源规则」,徽标改为「所有企业共用」,权限定义卡片与修改弹窗写明对所有开通企业生效\n- 企业侧「权限清单」改为「可用权限」,入口改为「修改权限定义」;工作台、平台概览、切换对话框、无权限说明、操作记录操作名称及相关提示同步新命名\n- 侧边栏测试改为可切换平台角色,新增平台管理员与应用管理员分组可见性用例;弹出面板测试先等待焦点进入面板再按 Esc,消除原有时序抖动\n- acceptance-t03、acceptance-p10-t02、acceptance-p10-t03 同步新的标签名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、230 项通过;侧边栏测试单独连续运行 5 次均通过\n- 浏览器经 5173 连接演示后端,在 1280 宽、375 窄屏及亮/暗色下检查四个分组、应用详情、企业可用权限与跳转、修改弹窗影响说明:正常\n- 应用管理员视角仅有单元测试覆盖(演示环境无应用管理员账号);验收脚本未运行\n- 「已在 N 个企业开通」需后端提供按应用统计的接口,本次未实现\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:36:58-07:00"},{"Sha1":"7a1bd50d627fb56ebd548956a8a05c61fd306f64","Message":"fix(console): 转义代码输入框 pattern 中的连字符\n\n浏览器按 v 模式编译 input 的 pattern,字符类末尾未转义的「-」会被判为非法正则,浏览器报错并直接跳过该格式校验。其余页面已使用转义写法,本次统一。\n\n实现内容:\n- 权限代码(新增权限、资源类型代码)、角色代码、程序身份代码、应用代码共 5 处 pattern 改为 \\- 转义,匹配规则不变\n\n验证:\n- 两种写法用 new RegExp(..., 'v') 编译通过\n- 浏览器中新增权限弹窗输入 Bad-Code 时 validity.patternMismatch 为 true\n- npm run format:check、npm run lint、npm run typecheck:通过;npm test:26 个测试文件、228 项通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:11:02-07:00"}],"HeadCommit":{"Sha1":"cf70e039ad30edff8e3a51877be4561ed564e95f","Message":"feat(console): 合并应用中心导航、权限清单按行修改与概览页重排\n\nmain 停在 ff5ee33 之后,控制台仍是旧的侧栏分组、权限清单整体编辑和早期概览页布局。合并 feat/console-layout 上其后的 4 个前端提交,完成控制台全部页面的布局改造。\n\n实现内容:\n- 权限清单把新增与修改拆开,平台侧支持按行修改名称与说明,企业侧「可用权限」提供去平台修改的入口;权限名称等于代码时编辑弹窗不再预填代码,用户组事件标签改为「创建用户组」\n- 转义 5 处代码输入框 pattern 中的连字符\n- 侧栏分为「平台管理 / 应用 / 企业管理 / 应用授权」四组,应用定义独立成「应用」分组(网址仍为 /platform/applications),统一「应用列表」「权限定义与资源规则」「所有企业共用」「可用权限」等命名\n- 工作台改为平台管理 / 应用 / 企业管理三个并列入口,加上「我的企业」表格与账号摘要;平台概览的「需要你关注」三类事项固定列出;企业概览的应用改为表格;应用概览的三步引导放进卡片并显示进度;三个概览的功能入口按用途分两栏\n\n验证:\n- 分支上各提交前运行 format:check、lint、typecheck 与 Vitest,最后一次 27 个测试文件、234 项全部通过\n- 合并无冲突,只涉及 iam-admin-web/ 下的文件;main 上相对分支只多出 568be88(两处集成测试),合并后的前端文件与分支末端 695ea4d 一致\n- main 上未单独重新运行检查;验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T07:22:40-07:00"},"CompareURL":"pengzhiyu/IAM/compare/ff5ee33515b0a21b6ba738d00c52373fabfaa50d...cf70e039ad30edff8e3a51877be4561ed564e95f","Len":6}...
|
1791901403
|
Edit
Delete
|
|
37962
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"695ea4d16 {"Commits":[{"Sha1":"695ea4d16f5066a81e3808b0ba4432b2a69cbd87","Message":"feat(console): 重排工作台与平台、企业、应用三个概览页\n\n四个概览页此前沿用早期布局:工作台只有两个入口,待办和应用用零散小卡片展示,功能入口不分组,与已改造的列表页风格不一致。本次按「上方状态卡片、下方两栏分组入口」统一四页布局。\n\n实现内容:\n- 工作台:三个并列入口「平台管理 / 应用 / 企业管理」,新增应用配色 entry--apps;应用管理员入口写明负责的应用,无身份的入口锁定并说明原因\n- 工作台新增「我的企业」可点表格(企业、你的身份,每次读取 10 条,满页时可加载更多),账号摘要放侧栏并链接个人中心,基本概念改为四格横排\n- 平台概览:「需要你关注」改为卡片,三类事项固定列出,没有内容时显示对勾与「目前没有。」,有内容时显示数量、最多 3 个名称与处理入口,读取失败只在该行重试\n- 企业概览:本企业的应用改为卡片内表格,停用的应用不可进入并注明原因;空状态改用公共 EmptyList\n- 应用概览:三步引导放进卡片,步骤之间用分隔线,右上角显示完成进度;任一步读取中或失败时不显示进度\n- 三个概览的功能入口统一用 overview-groups 两栏分组,窄屏改为上下排列;删除不再使用的待办卡片、应用卡片与一切正常提示条样式\n\n验证:\n- npm run typecheck、npm run lint、npm run format:check:通过\n- npm run test:27 个测试文件、234 项通过(同步修改平台、企业、应用概览单测,新增 home.test.tsx 4 项)\n- 浏览器检查 1280 宽、375 窄屏与暗色:四页无页面级横向溢出;待办与停用应用状态用页面内临时拦截 fetch 验证\n- 验收脚本未运行(脚本只依赖「工作台」标题与 .entry--locked,均已保留)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:50:19-07:00"},{"Sha1":"ceb5884bba8e1274c550348e99226f46614e6511","Message":"feat(console): 把应用定义独立成「应用」分组并统一权限相关命名\n\nIAM 面向多租户,一个应用登记后可由多家企业开通。原导航把应用的全局定义(登录客户端、受保护的服务、权限与资源规则)放在「平台管理」下,企业内的应用授权又叫「应用管理」,使用者难以分清权限为何不在应用层维护、改了会影响谁。\n\n实现内容:\n- 侧边栏改为「平台管理 / 应用 / 企业管理 / 应用授权」四组:平台管理只对平台管理员展示链接;新增「应用」分组(应用列表),平台管理员与应用管理员可见;原「应用管理」改名「应用授权」;网址保持不变\n- 应用详情网址仍在 /platform/applications 下,导航高亮、顶部上下文标识(「应用定义」)与面包屑(应用 › 应用列表)归入「应用」\n- 平台侧「应用接入」改为「应用列表」、「权限清单与资源规则」改为「权限定义与资源规则」,徽标改为「所有企业共用」,权限定义卡片与修改弹窗写明对所有开通企业生效\n- 企业侧「权限清单」改为「可用权限」,入口改为「修改权限定义」;工作台、平台概览、切换对话框、无权限说明、操作记录操作名称及相关提示同步新命名\n- 侧边栏测试改为可切换平台角色,新增平台管理员与应用管理员分组可见性用例;弹出面板测试先等待焦点进入面板再按 Esc,消除原有时序抖动\n- acceptance-t03、acceptance-p10-t02、acceptance-p10-t03 同步新的标签名称\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、230 项通过;侧边栏测试单独连续运行 5 次均通过\n- 浏览器经 5173 连接演示后端,在 1280 宽、375 窄屏及亮/暗色下检查四个分组、应用详情、企业可用权限与跳转、修改弹窗影响说明:正常\n- 应用管理员视角仅有单元测试覆盖(演示环境无应用管理员账号);验收脚本未运行\n- 「已在 N 个企业开通」需后端提供按应用统计的接口,本次未实现\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:36:58-07:00"},{"Sha1":"7a1bd50d627fb56ebd548956a8a05c61fd306f64","Message":"fix(console): 转义代码输入框 pattern 中的连字符\n\n浏览器按 v 模式编译 input 的 pattern,字符类末尾未转义的「-」会被判为非法正则,浏览器报错并直接跳过该格式校验。其余页面已使用转义写法,本次统一。\n\n实现内容:\n- 权限代码(新增权限、资源类型代码)、角色代码、程序身份代码、应用代码共 5 处 pattern 改为 \\- 转义,匹配规则不变\n\n验证:\n- 两种写法用 new RegExp(..., 'v') 编译通过\n- 浏览器中新增权限弹窗输入 Bad-Code 时 validity.patternMismatch 为 true\n- npm run format:check、npm run lint、npm run typecheck:通过;npm test:26 个测试文件、228 项通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:11:02-07:00"},{"Sha1":"54b1e1ee340da10ec01235cc9d1cf8d6ca22ca5c","Message":"feat(console): 把权限清单的新增与修改拆开并支持按行修改\n\n平台权限清单原先只有一个「新增或修改权限」入口,要修改已有权限必须手输准确的代码,输错会误建一项不能删除的权限;企业侧只读权限清单也看不出该去哪里修改。\n\n实现内容:\n- 平台权限清单每行增加「修改」:代码只读展示,名称和说明预填,内容未变不能保存,修改不再要求勾选确认\n- 未设置名称的权限名称框留空且可留空,只改说明时名称保持原样;已停用的权限也可修改名称和说明\n- 顶部按钮改为「新增权限」:代码与已有权限重复时拦下并引导到列表「修改」,新增仍需勾选确认\n- 企业侧应用权限清单在平台管理员或该应用的应用管理员登录时,页头显示「去平台修改权限」入口\n- 操作记录中 authorization.group_changed 改称「创建用户组」(后端只在新建用户组时写入)\n- 表格行末操作按钮新增 management-actions--end 靠右排列\n- acceptance-t03 改用「新增权限」按钮,并把提交按钮限定在弹窗内\n\n验证:\n- npm run format:check、npm run lint、npm run typecheck:通过\n- npm test:26 个测试文件、228 项通过(新增修改模式与新增重复代码拦截用例)\n- 浏览器经 5173 连接演示后端实际保存:只填说明保存成功且名称保持原样、其余权限说明保留、清单版本逐次加 1;重复代码被拦下;企业侧入口跳转与说明显示正常\n- acceptance-t03 未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:10:34-07:00"}],"HeadCommit":{"Sha1":"695ea4d16f5066a81e3808b0ba4432b2a69cbd87","Message":"feat(console): 重排工作台与平台、企业、应用三个概览页\n\n四个概览页此前沿用早期布局:工作台只有两个入口,待办和应用用零散小卡片展示,功能入口不分组,与已改造的列表页风格不一致。本次按「上方状态卡片、下方两栏分组入口」统一四页布局。\n\n实现内容:\n- 工作台:三个并列入口「平台管理 / 应用 / 企业管理」,新增应用配色 entry--apps;应用管理员入口写明负责的应用,无身份的入口锁定并说明原因\n- 工作台新增「我的企业」可点表格(企业、你的身份,每次读取 10 条,满页时可加载更多),账号摘要放侧栏并链接个人中心,基本概念改为四格横排\n- 平台概览:「需要你关注」改为卡片,三类事项固定列出,没有内容时显示对勾与「目前没有。」,有内容时显示数量、最多 3 个名称与处理入口,读取失败只在该行重试\n- 企业概览:本企业的应用改为卡片内表格,停用的应用不可进入并注明原因;空状态改用公共 EmptyList\n- 应用概览:三步引导放进卡片,步骤之间用分隔线,右上角显示完成进度;任一步读取中或失败时不显示进度\n- 三个概览的功能入口统一用 overview-groups 两栏分组,窄屏改为上下排列;删除不再使用的待办卡片、应用卡片与一切正常提示条样式\n\n验证:\n- npm run typecheck、npm run lint、npm run format:check:通过\n- npm run test:27 个测试文件、234 项通过(同步修改平台、企业、应用概览单测,新增 home.test.tsx 4 项)\n- 浏览器检查 1280 宽、375 窄屏与暗色:四页无页面级横向溢出;待办与停用应用状态用页面内临时拦截 fetch 验证\n- 验收脚本未运行(脚本只依赖「工作台」标题与 .entry--locked,均已保留)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T06:50:19-07:00"},"CompareURL":"pengzhiyu/IAM/compare/ff5ee33515b0a21b6ba738d00c52373fabfaa50d...695ea4d16f5066a81e3808b0ba4432b2a69cbd87","Len":4}...
|
1791901432
|
Edit
Delete
|
|
38011
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"afcd11436 {"Commits":[{"Sha1":"afcd1143678a58861a5cabc05dbd9768c7c58052","Message":"feat(console): 合并多因素验证改造、列表移除退场与状态提示对齐\n\n将 feat/console-layout 上的第三档交互改进、多因素验证绑定与登录验证码改造、列表状态提示对齐合入 main。\n\n实现内容:\n- 合入用户组移除成员的退场动画与个人中心退出其他登录后的行高亮\n- 合入 6 格验证码与输满自动提交、绑定页大字倒计时与取消确认、登录成功标记与倒计时进度环\n- 合入所有账号、企业列表的待办提示与状态徽标同一行\n\n验证:\n- 合并后 iam-admin-web 与 docs/console 的代码树与 feat/console-layout 一致;该树已在 IAM-ui 执行 npm run check 通过,包含格式、Lint、类型检查、27 组共 252 项测试及生产构建\n- git diff --cached --check 通过\n- 主目录中演示数据相关的未提交改动(scripts/experience、docs/console/demo-data.md)与 P12 文档未纳入本次合并\n- 减少动态效果模式未在浏览器中模拟;验收脚本未运行;本次不涉及后端代码,未重跑后端检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:34:37-07:00"},{"Sha1":"e89aafa0cfa32442a18b91a9e6e892cb485fc2ff","Message":"style(console): 把列表状态的待办提示放到状态徽标同一行\n\n平台「所有账号」的待激活账号、「企业列表」的待设置所有者企业,提示写在状态徽标下方另起一行,使这些行比其他行高,列表参差不齐。\n\n实现内容:\n- 公共 OpenableRow 的状态单元格改为徽标与提示同一行(inline-flex,列太窄时整体换行),提示取消上边距\n- 同步更新相关注释中提示位置的描述\n\n验证:\n- npm run check(Prettier、ESLint、tsc、Vitest、构建):通过,27 个测试文件 252 项测试全部通过\n- 浏览器(5173 Vite,连接演示后台):1280 宽下所有账号 20 行(含 4 个待激活)、企业列表 6 行(含 1 个需要设置所有者)行高均为 56px;375 宽下所有账号行高同为 56px,页面无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:37-07:00"},{"Sha1":"2c8b658c8ba637573d666bec33eda68ffe8673dc","Message":"feat(console): 改造多因素验证绑定与登录验证码输入并加入成功标记\n\n绑定认证器页的剩余时间只是二维码下一行小字,验证码是普通输入框还要手动提交,「取消绑定并清除」与确认按钮并排却会作废本次绑定;登录验证成功后直接跳走,没有完成反馈,各处倒计时也只有文字。\n\n实现内容:\n- 新增 CodeInput:外观 6 个数字框,底层一个透明原生输入框,保留粘贴、one-time-code 自动填充与读屏名称;只收数字,带空格的粘贴也可用(不设 maxLength 以免截断),退格删除最后一位,输满调用一次完成回调\n- 绑定页与登录验证都改用 6 格并输满自动提交;首次绑定未设好正式密码时不提交并提示,验证码保留;恢复码仍用普通输入框,切换后焦点移到新输入框\n- 绑定剩余时间改为二维码下方的大字「分:秒」(成功色,最后 1 分钟提醒色)与时限说明,读屏只在剩不到 1 分钟时提醒一次;「确认成功后旧认证器与旧恢复码立即失效」移到确认按钮下方,仅重新绑定时显示\n- 「取消绑定并清除」改为左上角「← 取消绑定」,点击后就地展开确认,确认后才通知服务端作废\n- 宽屏两栏时右栏与二维码托板垂直居中,右栏更高时仍从顶部排列\n- 新增 SuccessMark:登录流程验证成功或绑定完成后面板换成描画对勾,onComplete 仍立即调用并告知外层,MfaPage 与刷新身份并行至少停留 640ms;减少动态效果时不描画不停留\n- 新增 CountdownRing 与 useCountdown:非登录流程的验证剩余时间、验证冷却、登录限流等待在文字旁加 14px 进度环,最后 20% 改用提醒色\n- motion.md 补充成功标记与进度环;原有 MFA 测试中被自动提交取代的点击步骤已删除,冷却测试改为切到假计时器后补满第 6 位;新增 6 格输入、倒计时、未设密码不提交、取消确认、成功标记与进度环测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 252 项测试全部通过;工作区完整 npm run check(含生产构建)通过\n- 浏览器(5173 Vite,1280 宽):用户已在演示环境完成真实绑定并登录,绑定时使用的是改造过程中的哪一版页面未确认;另在页面内临时拦截 MFA 接口、使用虚构二维码与密钥,确认正常、输入一半、取消确认、最后 1 分钟变色与首次绑定(含正式密码)布局,未发出真实绑定请求\n- 减少动态效果模式未在浏览器中模拟;验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:26-07:00"},{"Sha1":"549ada99615519240dea8d63657dc02a35cdd7f7","Message":"feat(console): 为移除用户组成员和退出其他登录加入退场与高亮提示\n\n用户组「已选成员」点移除后整行瞬间消失,下面的行直接跳上来,焦点也会丢失;个人中心退出其他登录后,弹窗关闭时看不出列表里哪一行变了。\n\n实现内容:\n- 新增公共 useLeaving:数据立即更新,被移除的项在原位置保留一个退出时长(200ms,减少动态效果 120ms)并标记退场,重新加回的项不再退场\n- 用户组已选成员改为三层结构,移除时淡出并以 grid-template-rows 收起高度,退场中的行 inert;焦点移到相邻一行的「移除」,没有其他成员时落到列表容器\n- 个人中心退出其他登录成功后记录这次登录,弹窗关闭时对应行以 .is-updated 高亮一次\n- motion.md 新增「移除退场与退出登录提示」一节;补充 useLeaving 与焦点移交测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 246 项测试全部通过\n- 浏览器:用户在演示环境中自行查看了用户组移除与退出登录高亮效果\n- 未运行生产构建与验收脚本\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:32:42-07:00"},{"Sha1":"ac027351294b1b637ff587f0570f635d9f8e2b38","Message":"feat(console): 合并第二档交互动效与开通企业数容错\n\n将 feat/console-layout 上的开通企业数容错修正与第二档交互动效合入 main。\n\n实现内容:\n- 合入后端未返回 tenant_counts 时概况显示「暂时无法获取」而不出错的修正\n- 合入详情页标签下划线滑动(切换标签不再整页重挂载)、四个概览页首屏错落入场、平台概览对勾描画与组织架构图以视野中心为锚点的平滑缩放\n\n验证:\n- feat/console-layout 以当前 main 为基础,合并后的代码树与分支一致;该树已在 IAM-ui 执行 npm run check 通过,包含格式、Lint、类型检查、27 组共 244 项测试及生产构建\n- git diff --cached --check 通过\n- 减少动态效果模式未在浏览器中模拟;验收脚本未运行;本次不涉及后端代码,未重跑后端检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T19:26:33-07:00"}],"HeadCommit":{"Sha1":"afcd1143678a58861a5cabc05dbd9768c7c58052","Message":"feat(console): 合并多因素验证改造、列表移除退场与状态提示对齐\n\n将 feat/console-layout 上的第三档交互改进、多因素验证绑定与登录验证码改造、列表状态提示对齐合入 main。\n\n实现内容:\n- 合入用户组移除成员的退场动画与个人中心退出其他登录后的行高亮\n- 合入 6 格验证码与输满自动提交、绑定页大字倒计时与取消确认、登录成功标记与倒计时进度环\n- 合入所有账号、企业列表的待办提示与状态徽标同一行\n\n验证:\n- 合并后 iam-admin-web 与 docs/console 的代码树与 feat/console-layout 一致;该树已在 IAM-ui 执行 npm run check 通过,包含格式、Lint、类型检查、27 组共 252 项测试及生产构建\n- git diff --cached --check 通过\n- 主目录中演示数据相关的未提交改动(scripts/experience、docs/console/demo-data.md)与 P12 文档未纳入本次合并\n- 减少动态效果模式未在浏览器中模拟;验收脚本未运行;本次不涉及后端代码,未重跑后端检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:34:37-07:00"},"CompareURL":"pengzhiyu/IAM/compare/cf70e039ad30edff8e3a51877be4561ed564e95f...afcd1143678a58861a5cabc05dbd9768c7c58052","Len":15}...
|
1791948968
|
Edit
Delete
|
|
38012
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"e89aafa0c {"Commits":[{"Sha1":"e89aafa0cfa32442a18b91a9e6e892cb485fc2ff","Message":"style(console): 把列表状态的待办提示放到状态徽标同一行\n\n平台「所有账号」的待激活账号、「企业列表」的待设置所有者企业,提示写在状态徽标下方另起一行,使这些行比其他行高,列表参差不齐。\n\n实现内容:\n- 公共 OpenableRow 的状态单元格改为徽标与提示同一行(inline-flex,列太窄时整体换行),提示取消上边距\n- 同步更新相关注释中提示位置的描述\n\n验证:\n- npm run check(Prettier、ESLint、tsc、Vitest、构建):通过,27 个测试文件 252 项测试全部通过\n- 浏览器(5173 Vite,连接演示后台):1280 宽下所有账号 20 行(含 4 个待激活)、企业列表 6 行(含 1 个需要设置所有者)行高均为 56px;375 宽下所有账号行高同为 56px,页面无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:37-07:00"},{"Sha1":"2c8b658c8ba637573d666bec33eda68ffe8673dc","Message":"feat(console): 改造多因素验证绑定与登录验证码输入并加入成功标记\n\n绑定认证器页的剩余时间只是二维码下一行小字,验证码是普通输入框还要手动提交,「取消绑定并清除」与确认按钮并排却会作废本次绑定;登录验证成功后直接跳走,没有完成反馈,各处倒计时也只有文字。\n\n实现内容:\n- 新增 CodeInput:外观 6 个数字框,底层一个透明原生输入框,保留粘贴、one-time-code 自动填充与读屏名称;只收数字,带空格的粘贴也可用(不设 maxLength 以免截断),退格删除最后一位,输满调用一次完成回调\n- 绑定页与登录验证都改用 6 格并输满自动提交;首次绑定未设好正式密码时不提交并提示,验证码保留;恢复码仍用普通输入框,切换后焦点移到新输入框\n- 绑定剩余时间改为二维码下方的大字「分:秒」(成功色,最后 1 分钟提醒色)与时限说明,读屏只在剩不到 1 分钟时提醒一次;「确认成功后旧认证器与旧恢复码立即失效」移到确认按钮下方,仅重新绑定时显示\n- 「取消绑定并清除」改为左上角「← 取消绑定」,点击后就地展开确认,确认后才通知服务端作废\n- 宽屏两栏时右栏与二维码托板垂直居中,右栏更高时仍从顶部排列\n- 新增 SuccessMark:登录流程验证成功或绑定完成后面板换成描画对勾,onComplete 仍立即调用并告知外层,MfaPage 与刷新身份并行至少停留 640ms;减少动态效果时不描画不停留\n- 新增 CountdownRing 与 useCountdown:非登录流程的验证剩余时间、验证冷却、登录限流等待在文字旁加 14px 进度环,最后 20% 改用提醒色\n- motion.md 补充成功标记与进度环;原有 MFA 测试中被自动提交取代的点击步骤已删除,冷却测试改为切到假计时器后补满第 6 位;新增 6 格输入、倒计时、未设密码不提交、取消确认、成功标记与进度环测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 252 项测试全部通过;工作区完整 npm run check(含生产构建)通过\n- 浏览器(5173 Vite,1280 宽):用户已在演示环境完成真实绑定并登录,绑定时使用的是改造过程中的哪一版页面未确认;另在页面内临时拦截 MFA 接口、使用虚构二维码与密钥,确认正常、输入一半、取消确认、最后 1 分钟变色与首次绑定(含正式密码)布局,未发出真实绑定请求\n- 减少动态效果模式未在浏览器中模拟;验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:26-07:00"},{"Sha1":"549ada99615519240dea8d63657dc02a35cdd7f7","Message":"feat(console): 为移除用户组成员和退出其他登录加入退场与高亮提示\n\n用户组「已选成员」点移除后整行瞬间消失,下面的行直接跳上来,焦点也会丢失;个人中心退出其他登录后,弹窗关闭时看不出列表里哪一行变了。\n\n实现内容:\n- 新增公共 useLeaving:数据立即更新,被移除的项在原位置保留一个退出时长(200ms,减少动态效果 120ms)并标记退场,重新加回的项不再退场\n- 用户组已选成员改为三层结构,移除时淡出并以 grid-template-rows 收起高度,退场中的行 inert;焦点移到相邻一行的「移除」,没有其他成员时落到列表容器\n- 个人中心退出其他登录成功后记录这次登录,弹窗关闭时对应行以 .is-updated 高亮一次\n- motion.md 新增「移除退场与退出登录提示」一节;补充 useLeaving 与焦点移交测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 246 项测试全部通过\n- 浏览器:用户在演示环境中自行查看了用户组移除与退出登录高亮效果\n- 未运行生产构建与验收脚本\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:32:42-07:00"},{"Sha1":"5f34b48affdaccbdce04811a2e8013ffccd3b335","Message":"feat(console): 加入标签下划线滑动、概览页错落入场与架构图平滑缩放\n\n第一档动效之后补第二档观感改进:详情页标签下划线原先随整页重挂载瞬间出现,概览页首屏一次性整体出现,组织架构图缩放瞬间跳变。本次让三处都有连续的过渡,不新增也不修改动效令牌。\n\n实现内容:\n- 新增公共 TabNav/TabPanel:整条标签栏一条下划线,用 translateX + scaleX 对准当前标签,切换时滑动 --dur-base;首次定位与宽度变化直接就位;应用详情、企业详情改用它\n- 带标签的详情路由加 handle.tabbed,壳层改用 usePageKey:切换标签不再整页重挂载,页头与标签栏保留、不重新读取详情、焦点留在标签上、不回到页顶,标签内容由 TabPanel 淡入\n- 工作台与平台、企业、应用三个概览页首屏区块依次 rise-in,每档 35ms;入口卡与功能分组按组内顺序错开;useFirstEntrance 保证本次打开控制台后每页只播放一次,只用 backwards 填充不影响悬停上浮\n- 平台概览「需要你关注」中没有事项的类别,对勾以 stroke-dashoffset 描画\n- 组织架构图保留 CSS zoom 布局,缩放时以视野中心为锚点调整滚动,并用 Web Animations 从新旧实际宽度之比过渡到原样(180ms);连续点击取消上一段并按当前显示大小继续;测量根节点而非占满宽度的列表\n- 减少动态效果时:下划线不滑动、入场不错开、对勾直接显示、缩放只保留中心锚点\n- motion.md 新增「标签滑动、概览入场与架构图缩放」一节;新增标签栏定位与首屏入场判断测试\n\n验证:\n- npm run check(Prettier、ESLint、tsc、Vitest、构建):通过,27 个测试文件 244 项测试全部通过;构建仅有代码包体积提示\n- 浏览器(5173 Vite,1280 宽):应用详情切换标签时下划线 transform 从 translateX 12px 逐帧过渡到 278px,页头与标签栏为同一节点、未重新请求详情,真实点击后焦点留在标签;企业详情标签同样滑动;四个概览页入场延迟依次为 0/35/70/105/140ms,再次进入不重播;对勾描画 dashoffset 从 11 过渡到 0;架构图在页面内临时拦截接口提供 33 个虚构部门,放大缩小时中心部门不变、偏移随比例缩放,连续三次放大结果正确且无残留动画,未写入演示数据\n- 减少动态效果模式:未在浏览器中模拟,仅按样式与代码逻辑确认\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T19:25:14-07:00"},{"Sha1":"4f344b38d882e1015d12e589c84abe698a527368","Message":"fix(console): 后端未返回开通企业数时概况不再出错\n\n应用概况默认详情接口一定返回 tenant_counts;连接尚未执行 V30 迁移的后端时字段缺失,概况标签直接抛错白屏。改为按「暂时无法获取」处理,不显示为 0,整页正常展示。\n\n实现内容:\n- ApplicationDetail.tenant_counts 改为可选,TenantReach.counts 允许为 null,表示后端没有返回统计\n- 「开通情况」卡片在没有统计时只显示「暂时无法获取开通企业数,可以稍后点「重新统计」再试。」并保留重新统计按钮\n- 权限弹窗的开通企业说明在没有统计时给出不带数量的共享说明并注明暂时无法获取\n- 新增后端缺少统计字段时的概况与文案测试\n\n验证:\n- 从暂存内容导出的独立快照执行 Prettier 检查、tsc、ESLint 与 Vitest:通过,27 个测试文件 241 项测试全部通过\n- 浏览器(5173 Vite 加载的工作区版本,同时含后续动效改动;连接尚无 V30 的演示后台):sales 应用概况正常打开,「开通情况」显示暂时无法获取\n- 未运行生产构建与验收脚本\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T19:24:45-07:00"}],"HeadCommit":{"Sha1":"e89aafa0cfa32442a18b91a9e6e892cb485fc2ff","Message":"style(console): 把列表状态的待办提示放到状态徽标同一行\n\n平台「所有账号」的待激活账号、「企业列表」的待设置所有者企业,提示写在状态徽标下方另起一行,使这些行比其他行高,列表参差不齐。\n\n实现内容:\n- 公共 OpenableRow 的状态单元格改为徽标与提示同一行(inline-flex,列太窄时整体换行),提示取消上边距\n- 同步更新相关注释中提示位置的描述\n\n验证:\n- npm run check(Prettier、ESLint、tsc、Vitest、构建):通过,27 个测试文件 252 项测试全部通过\n- 浏览器(5173 Vite,连接演示后台):1280 宽下所有账号 20 行(含 4 个待激活)、企业列表 6 行(含 1 个需要设置所有者)行高均为 56px;375 宽下所有账号行高同为 56px,页面无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-13T20:33:37-07:00"},"CompareURL":"pengzhiyu/IAM/compare/695ea4d16f5066a81e3808b0ba4432b2a69cbd87...e89aafa0cfa32442a18b91a9e6e892cb485fc2ff","Len":14}...
|
1791948977
|
Edit
Delete
|
|
38138
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"1bcbe8d10 {"Commits":[{"Sha1":"1bcbe8d10af01d2081b561a4531c4549a72387bd","Message":"feat(console): 合并控制台质感改造前四批\n\n合并 feat/console-layout 上的控制台质感改造第 1–4 批及随附修正:壳层精简、命令面板、目录工具栏精简与第一组动效。\n\n实现内容:\n- 删除禁止渐变与禁止逐行入场的设计规则(d206928)\n- 面包屑并入顶栏、侧栏当前页滑块与虚线上下文选择按钮(a3fea08),滑块在画面暂停与侧栏滚动变化后的错位修正(5ee785b)\n- ⌘K 命令面板(d2cd40b),窄屏上下文带焦点环裁切修正(9b28da3)\n- 列表行高统一与同行提示(93a5496)\n- 目录工具栏改为搜索框、状态分段切换、刷新图标与更多操作菜单(cf32ed3)\n- 标签页内容间距、滚动条消失导致的页面跳动及弹层锁定重复补偿修正(77f8300、0d4c13b)\n- 数字滚动、骨架交叉淡入、保存按钮「已保存」变形与通知叠放(9653ba1)\n- 开通企业统计测试随运行时间误报的修正(d25fdbf)\n\n验证:\n- 分支最新提交上 npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功\n- main 在分支创建后的新增提交只涉及后端,与本次合并无文件重叠,git merge-tree 无冲突\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:15:14-07:00"},{"Sha1":"9653ba1c28cf197bb8f493be032cd9d7017c5b0b","Message":"feat(console): 加入数字滚动、骨架交叉淡入、保存按钮变形与通知叠放\n\n控制台质感改造第 4 批。原先数字直接出现、骨架被内容硬切替换、保存成功只靠右下角通知告知、多条通知竖排挡住右下角内容。本次为这四处加入过渡,请求时机不变。\n\n实现内容:\n- 新增 CountUp:以 @property --count 整数插值、CSS 计数器绘制,挂载时从 0、之后从旧值滚到新值(--dur-count 600ms);读屏与文本读取始终是最终值;只用于平台概览待办数、应用概览可分配权限数与应用开通情况\n- ResourceView 外层改为恒定存在的 display: contents 容器:骨架出现过(等待超过 160ms)的那次加载,骨架残影在原位置模糊淡出、内容淡入;组件首次换上内容时表格前 8 行依次上浮(--stagger-row 40ms);残影只在骨架处于块级容器时出现,已高亮的行不参与\n- useMutation 增加 hold 选项与 saved 状态:成功后停留 SAVED_HOLD_MS(600ms)再执行成功回调,停留中卸载表单立即执行;Button 增加 saved/savedLabel,显示 --success-fill 实底、描画对勾与「已保存」,提交中与已保存时宽度以 WAAPI 过渡;接入 13 处「保存…」按钮(确认启用、确认撤销等按钮不变)\n- 通知改为叠放:后层上移 10px、缩小 5%、与最前一条等高且隐去内容,只露出前 3 层;指针移入或焦点进入时按各自高度展开并暂停全部计时;两个播报区共用叠放顺序\n- 新增令牌 --dur-count、--stagger-row、--success-fill(既有动效令牌未改);authorization-scopes 的 min-width 规则覆盖新外层;motion.md 补充四项动效并登记按钮宽度、通知高度为宽高动画例外\n\n验证:\n- npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功;新增 motion-feedback.test.tsx 5 项(已保存停留与卸载、通知叠放与悬停暂停、骨架换内容的 rows/fade/不播放、数字回退显示)\n- 浏览器实测:sales 应用开通情况数字逐帧采样为 0→1→2;所有账号页延迟读取 700ms 时残影与骨架位置宽度一致并在结束后移除,前 8 行延迟 0–280ms,再次加载只淡入;部门编辑表单在页面内拦截写请求返回成功(未写入演示数据),按钮经提交中到「✓ 已保存」,两次宽度过渡均触发,停留后抽屉关闭并高亮该行;通知在桌面宽度叠放、悬停展开,375 宽暗色下叠放正常且无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:14:53-07:00"},{"Sha1":"0d4c13bbd0341fb82dbea0b33c13a3a13d5a3abd","Message":"fix(console): 预留滚动条位置后不再重复补偿弹层锁定宽度\n\n上一提交给根元素设置了 scrollbar-gutter: stable,打开对话框或抽屉锁定滚动时仍按滚动条宽度给 body 加右内边距,页面内容与上下文带右侧的搜索入口会左移 15px。\n\n实现内容:\n- useScrollLock 在浏览器支持 scrollbar-gutter 时补偿值为 0,不支持时沿用原来按滚动条宽度补偿的做法\n- data-scroll-locked 标记与锁定计数不变\n\n验证:\n- 浏览器实测所有账号页(经典滚动条、页面可滚动):打开与关闭账号详情抽屉前后,搜索入口与搜索框位置不变,--scrollbar-compensation 为 0\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:57:10-07:00"},{"Sha1":"cf32ed31e26dd552caa280de1996b4f23da1123e","Message":"feat(console): 精简目录工具栏为搜索框与状态分段切换\n\n目录工具条原先由带标签的输入框、状态下拉框、「搜索」按钮、常驻的「清除筛选」和文字刷新按钮组成,占位多且需要两步才能筛选。改为回车即搜索的搜索框、选中即生效的状态分段,次要操作收进图标按钮与菜单。\n\n实现内容:\n- DirectoryFilters 改为带放大镜的搜索框(占位文字即无障碍名称,回车生效,有内容时框内出现「清空搜索内容」);不合规输入不发请求,提示以 role=alert 显示\n- 新增 StatusSegments:原生单选组(名称「状态筛选」),选中即生效并带上当前搜索词,选中白底平移到新选项;counts 只在数据全在前端时传入(可用权限页)\n- 「清除筛选」只在有生效条件时出现,点击后焦点回到搜索框;apply 增加第三个参数 search/status/clear,调用方只在回车搜索时把焦点移到结果区\n- 新增 DirectoryTools:刷新改为图标按钮,次要操作进入「更多操作」菜单;平台企业列表的「按标识打开」收入菜单;新增 more 图标\n- 删除通用的「不区分大小写」提示,有实际信息的说明以一行小字放在工具条下方;窄屏搜索框占满一行,分段可横向滚动并收窄选项间距\n- 成员、平台企业与账号、用户组、操作记录、配置目录、角色权限清单等页面改用新组件;设计规范补充「工具条精简」,动效清单新增「状态分段切换」\n\n验证:\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功;management-integration 新增分段即时生效、清除筛选出现与焦点、清空按钮与不合规输入等用例,application-management、authorization-management 改为回车搜索\n- 浏览器实测企业列表:状态分段立即生效且焦点留在分段,回车搜索后焦点移到结果,搜索词与状态可叠加,清除筛选后恢复并回到搜索框,更多操作菜单含「按标识打开」;可用权限分段数量为全部 5 / 正常 4 / 已停用 1;375 宽暗色下五个状态可放下且页面无横向溢出\n- 验收脚本 acceptance-p10-t01、p10-t02、t02、t03、t04 已同步为回车搜索、点击分段和打开更多操作菜单:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:53:14-07:00"},{"Sha1":"77f8300377a586c241661e9e749fbc3fe0f69347","Message":"fix(console): 修复标签页内容贴边与滚动条消失导致的页面跳动\n\n企业详情「成员」「应用」标签里的平台提示条与下方卡片之间没有间距;列表筛选后结果变短、经典滚动条消失时,页面可用宽度变化 15px,居中内容与上下文带右侧的搜索入口左右跳动。\n\n实现内容:\n- .tab-panel 改为纵向排列,块间距 var(--space-5),与 management-stack 一致;应用详情各标签只有单块内容,不受影响\n- html 设置 scrollbar-gutter: stable,始终预留滚动条位置;系统使用覆盖式滚动条时没有影响\n\n验证:\n- 浏览器实测企业详情成员、应用标签:提示条与卡片间距为 20px;应用详情四个标签布局不变\n- 浏览器实测所有账号页依次切换五个状态:移除修复时搜索入口在两个位置间偏移 15px,加上修复后位置不变\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功\n- 验收脚本:未运行;与页面宽度相关的断言均为内容不超出窗口,预留滚动条不会使其失败\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:52:56-07:00"}],"HeadCommit":{"Sha1":"1bcbe8d10af01d2081b561a4531c4549a72387bd","Message":"feat(console): 合并控制台质感改造前四批\n\n合并 feat/console-layout 上的控制台质感改造第 1–4 批及随附修正:壳层精简、命令面板、目录工具栏精简与第一组动效。\n\n实现内容:\n- 删除禁止渐变与禁止逐行入场的设计规则(d206928)\n- 面包屑并入顶栏、侧栏当前页滑块与虚线上下文选择按钮(a3fea08),滑块在画面暂停与侧栏滚动变化后的错位修正(5ee785b)\n- ⌘K 命令面板(d2cd40b),窄屏上下文带焦点环裁切修正(9b28da3)\n- 列表行高统一与同行提示(93a5496)\n- 目录工具栏改为搜索框、状态分段切换、刷新图标与更多操作菜单(cf32ed3)\n- 标签页内容间距、滚动条消失导致的页面跳动及弹层锁定重复补偿修正(77f8300、0d4c13b)\n- 数字滚动、骨架交叉淡入、保存按钮「已保存」变形与通知叠放(9653ba1)\n- 开通企业统计测试随运行时间误报的修正(d25fdbf)\n\n验证:\n- 分支最新提交上 npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功\n- main 在分支创建后的新增提交只涉及后端,与本次合并无文件重叠,git merge-tree 无冲突\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:15:14-07:00"},"CompareURL":"pengzhiyu/IAM/compare/afcd1143678a58861a5cabc05dbd9768c7c58052...1bcbe8d10af01d2081b561a4531c4549a72387bd","Len":17}...
|
1791990975
|
Edit
Delete
|
|
38139
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"1bcbe8d10 {"Commits":[{"Sha1":"1bcbe8d10af01d2081b561a4531c4549a72387bd","Message":"feat(console): 合并控制台质感改造前四批\n\n合并 feat/console-layout 上的控制台质感改造第 1–4 批及随附修正:壳层精简、命令面板、目录工具栏精简与第一组动效。\n\n实现内容:\n- 删除禁止渐变与禁止逐行入场的设计规则(d206928)\n- 面包屑并入顶栏、侧栏当前页滑块与虚线上下文选择按钮(a3fea08),滑块在画面暂停与侧栏滚动变化后的错位修正(5ee785b)\n- ⌘K 命令面板(d2cd40b),窄屏上下文带焦点环裁切修正(9b28da3)\n- 列表行高统一与同行提示(93a5496)\n- 目录工具栏改为搜索框、状态分段切换、刷新图标与更多操作菜单(cf32ed3)\n- 标签页内容间距、滚动条消失导致的页面跳动及弹层锁定重复补偿修正(77f8300、0d4c13b)\n- 数字滚动、骨架交叉淡入、保存按钮「已保存」变形与通知叠放(9653ba1)\n- 开通企业统计测试随运行时间误报的修正(d25fdbf)\n\n验证:\n- 分支最新提交上 npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功\n- main 在分支创建后的新增提交只涉及后端,与本次合并无文件重叠,git merge-tree 无冲突\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:15:14-07:00"},{"Sha1":"9653ba1c28cf197bb8f493be032cd9d7017c5b0b","Message":"feat(console): 加入数字滚动、骨架交叉淡入、保存按钮变形与通知叠放\n\n控制台质感改造第 4 批。原先数字直接出现、骨架被内容硬切替换、保存成功只靠右下角通知告知、多条通知竖排挡住右下角内容。本次为这四处加入过渡,请求时机不变。\n\n实现内容:\n- 新增 CountUp:以 @property --count 整数插值、CSS 计数器绘制,挂载时从 0、之后从旧值滚到新值(--dur-count 600ms);读屏与文本读取始终是最终值;只用于平台概览待办数、应用概览可分配权限数与应用开通情况\n- ResourceView 外层改为恒定存在的 display: contents 容器:骨架出现过(等待超过 160ms)的那次加载,骨架残影在原位置模糊淡出、内容淡入;组件首次换上内容时表格前 8 行依次上浮(--stagger-row 40ms);残影只在骨架处于块级容器时出现,已高亮的行不参与\n- useMutation 增加 hold 选项与 saved 状态:成功后停留 SAVED_HOLD_MS(600ms)再执行成功回调,停留中卸载表单立即执行;Button 增加 saved/savedLabel,显示 --success-fill 实底、描画对勾与「已保存」,提交中与已保存时宽度以 WAAPI 过渡;接入 13 处「保存…」按钮(确认启用、确认撤销等按钮不变)\n- 通知改为叠放:后层上移 10px、缩小 5%、与最前一条等高且隐去内容,只露出前 3 层;指针移入或焦点进入时按各自高度展开并暂停全部计时;两个播报区共用叠放顺序\n- 新增令牌 --dur-count、--stagger-row、--success-fill(既有动效令牌未改);authorization-scopes 的 min-width 规则覆盖新外层;motion.md 补充四项动效并登记按钮宽度、通知高度为宽高动画例外\n\n验证:\n- npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功;新增 motion-feedback.test.tsx 5 项(已保存停留与卸载、通知叠放与悬停暂停、骨架换内容的 rows/fade/不播放、数字回退显示)\n- 浏览器实测:sales 应用开通情况数字逐帧采样为 0→1→2;所有账号页延迟读取 700ms 时残影与骨架位置宽度一致并在结束后移除,前 8 行延迟 0–280ms,再次加载只淡入;部门编辑表单在页面内拦截写请求返回成功(未写入演示数据),按钮经提交中到「✓ 已保存」,两次宽度过渡均触发,停留后抽屉关闭并高亮该行;通知在桌面宽度叠放、悬停展开,375 宽暗色下叠放正常且无横向溢出\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:14:53-07:00"},{"Sha1":"0d4c13bbd0341fb82dbea0b33c13a3a13d5a3abd","Message":"fix(console): 预留滚动条位置后不再重复补偿弹层锁定宽度\n\n上一提交给根元素设置了 scrollbar-gutter: stable,打开对话框或抽屉锁定滚动时仍按滚动条宽度给 body 加右内边距,页面内容与上下文带右侧的搜索入口会左移 15px。\n\n实现内容:\n- useScrollLock 在浏览器支持 scrollbar-gutter 时补偿值为 0,不支持时沿用原来按滚动条宽度补偿的做法\n- data-scroll-locked 标记与锁定计数不变\n\n验证:\n- 浏览器实测所有账号页(经典滚动条、页面可滚动):打开与关闭账号详情抽屉前后,搜索入口与搜索框位置不变,--scrollbar-compensation 为 0\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:57:10-07:00"},{"Sha1":"cf32ed31e26dd552caa280de1996b4f23da1123e","Message":"feat(console): 精简目录工具栏为搜索框与状态分段切换\n\n目录工具条原先由带标签的输入框、状态下拉框、「搜索」按钮、常驻的「清除筛选」和文字刷新按钮组成,占位多且需要两步才能筛选。改为回车即搜索的搜索框、选中即生效的状态分段,次要操作收进图标按钮与菜单。\n\n实现内容:\n- DirectoryFilters 改为带放大镜的搜索框(占位文字即无障碍名称,回车生效,有内容时框内出现「清空搜索内容」);不合规输入不发请求,提示以 role=alert 显示\n- 新增 StatusSegments:原生单选组(名称「状态筛选」),选中即生效并带上当前搜索词,选中白底平移到新选项;counts 只在数据全在前端时传入(可用权限页)\n- 「清除筛选」只在有生效条件时出现,点击后焦点回到搜索框;apply 增加第三个参数 search/status/clear,调用方只在回车搜索时把焦点移到结果区\n- 新增 DirectoryTools:刷新改为图标按钮,次要操作进入「更多操作」菜单;平台企业列表的「按标识打开」收入菜单;新增 more 图标\n- 删除通用的「不区分大小写」提示,有实际信息的说明以一行小字放在工具条下方;窄屏搜索框占满一行,分段可横向滚动并收窄选项间距\n- 成员、平台企业与账号、用户组、操作记录、配置目录、角色权限清单等页面改用新组件;设计规范补充「工具条精简」,动效清单新增「状态分段切换」\n\n验证:\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功;management-integration 新增分段即时生效、清除筛选出现与焦点、清空按钮与不合规输入等用例,application-management、authorization-management 改为回车搜索\n- 浏览器实测企业列表:状态分段立即生效且焦点留在分段,回车搜索后焦点移到结果,搜索词与状态可叠加,清除筛选后恢复并回到搜索框,更多操作菜单含「按标识打开」;可用权限分段数量为全部 5 / 正常 4 / 已停用 1;375 宽暗色下五个状态可放下且页面无横向溢出\n- 验收脚本 acceptance-p10-t01、p10-t02、t02、t03、t04 已同步为回车搜索、点击分段和打开更多操作菜单:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:53:14-07:00"},{"Sha1":"77f8300377a586c241661e9e749fbc3fe0f69347","Message":"fix(console): 修复标签页内容贴边与滚动条消失导致的页面跳动\n\n企业详情「成员」「应用」标签里的平台提示条与下方卡片之间没有间距;列表筛选后结果变短、经典滚动条消失时,页面可用宽度变化 15px,居中内容与上下文带右侧的搜索入口左右跳动。\n\n实现内容:\n- .tab-panel 改为纵向排列,块间距 var(--space-5),与 management-stack 一致;应用详情各标签只有单块内容,不受影响\n- html 设置 scrollbar-gutter: stable,始终预留滚动条位置;系统使用覆盖式滚动条时没有影响\n\n验证:\n- 浏览器实测企业详情成员、应用标签:提示条与卡片间距为 20px;应用详情四个标签布局不变\n- 浏览器实测所有账号页依次切换五个状态:移除修复时搜索入口在两个位置间偏移 15px,加上修复后位置不变\n- npm run check:格式、lint、类型检查通过,28 个测试文件 261 项通过,构建成功\n- 验收脚本:未运行;与页面宽度相关的断言均为内容不超出窗口,预留滚动条不会使其失败\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T07:52:56-07:00"}],"HeadCommit":{"Sha1":"1bcbe8d10af01d2081b561a4531c4549a72387bd","Message":"feat(console): 合并控制台质感改造前四批\n\n合并 feat/console-layout 上的控制台质感改造第 1–4 批及随附修正:壳层精简、命令面板、目录工具栏精简与第一组动效。\n\n实现内容:\n- 删除禁止渐变与禁止逐行入场的设计规则(d206928)\n- 面包屑并入顶栏、侧栏当前页滑块与虚线上下文选择按钮(a3fea08),滑块在画面暂停与侧栏滚动变化后的错位修正(5ee785b)\n- ⌘K 命令面板(d2cd40b),窄屏上下文带焦点环裁切修正(9b28da3)\n- 列表行高统一与同行提示(93a5496)\n- 目录工具栏改为搜索框、状态分段切换、刷新图标与更多操作菜单(cf32ed3)\n- 标签页内容间距、滚动条消失导致的页面跳动及弹层锁定重复补偿修正(77f8300、0d4c13b)\n- 数字滚动、骨架交叉淡入、保存按钮「已保存」变形与通知叠放(9653ba1)\n- 开通企业统计测试随运行时间误报的修正(d25fdbf)\n\n验证:\n- 分支最新提交上 npm run check:格式、lint、类型检查通过,29 个测试文件 266 项通过,构建成功\n- main 在分支创建后的新增提交只涉及后端,与本次合并无文件重叠,git merge-tree 无冲突\n- 验收脚本:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-14T08:15:14-07:00"},"CompareURL":"pengzhiyu/IAM/compare/e89aafa0cfa32442a18b91a9e6e892cb485fc2ff...1bcbe8d10af01d2081b561a4531c4549a72387bd","Len":20}...
|
1791990986
|
Edit
Delete
|
|
38291
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"972164fbd {"Commits":[{"Sha1":"972164fbd3e90b74e1c6f61434ddc8b0db52fc65","Message":"docs: 补齐 P12 诊断历史和退出通知避锁设计\n\n补齐原两份任务文档的累计进展,保留历史失败与未验收事项,明确最新方案尚未实施。\n\n实现内容:\n- 记录 E2a 至 E2d 的冻结身份、实际诊断结果及失败边界\n- 记录编码实验暂停、入口拥塞离线归因、短等待验证和固定短峰结果\n- 补齐生命周期锁审查及退出通知空轮询安全设计,列出 22 项待执行用例\n- 明确投递延迟、查询超时、连接归还与原事务重查边界\n\n验证:\n- git diff --check 与新增内容敏感模式检查通过\n- 冻结候选摘要及最新设计交付的 15 项文件清单核对通过\n- 本次仅提交文档,没有重新运行产品测试、数据库或负载\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T00:12:18-07:00"},{"Sha1":"bd1023293fa824517ba91072a006c3da5e4a737b","Message":"chore: 忽略 P12 本地编码实验失败现场\n\n保留原失败目录及证据,避免将交付脚本、临时结果误纳入产品源码。\n\n实现内容:\n- 仅忽略 scripts/p12-encode-local-20261014-46ce41f 目录\n- 继续沿用已有 release 忽略规则,不移动或删除旧证据\n\n验证:\n- git check-ignore 确认两个交付目录被忽略\n- git diff --check 通过;本批不涉及可运行代码\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T00:11:50-07:00"}],"HeadCommit":{"Sha1":"972164fbd3e90b74e1c6f61434ddc8b0db52fc65","Message":"docs: 补齐 P12 诊断历史和退出通知避锁设计\n\n补齐原两份任务文档的累计进展,保留历史失败与未验收事项,明确最新方案尚未实施。\n\n实现内容:\n- 记录 E2a 至 E2d 的冻结身份、实际诊断结果及失败边界\n- 记录编码实验暂停、入口拥塞离线归因、短等待验证和固定短峰结果\n- 补齐生命周期锁审查及退出通知空轮询安全设计,列出 22 项待执行用例\n- 明确投递延迟、查询超时、连接归还与原事务重查边界\n\n验证:\n- git diff --check 与新增内容敏感模式检查通过\n- 冻结候选摘要及最新设计交付的 15 项文件清单核对通过\n- 本次仅提交文档,没有重新运行产品测试、数据库或负载\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T00:12:18-07:00"},"CompareURL":"pengzhiyu/IAM/compare/1bcbe8d10af01d2081b561a4531c4549a72387bd...972164fbd3e90b74e1c6f61434ddc8b0db52fc65","Len":2}...
|
1792048606
|
Edit
Delete
|
|
38473
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"d2ff1f1d1 {"Commits":[{"Sha1":"d2ff1f1d1423e14426de9db677c5239376cec6a8","Message":"feat: 合并企业名称、邀请弹窗修复与平台管理员邀请\n\n用户测试时发现三个问题:开通企业没有名称输入项;未配置邮件服务时邀请弹窗关不掉;平台侧无法增加第二位平台管理员。本次把后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/tenant-name-platform-invite):开通企业时必填 displayName,平台管理员与企业所有者可以改名,企业搜索同时匹配名称;/api/v1/me 返回 mail_delivery_available,并明确 MAIL_UNAVAILABLE 一定回滚;新增平台级邮箱邀请、待接受列表与撤销(V31、V32)\n- 前端:开通弹窗加名称,平台详情页与企业概览可以改名;确定失败的邮件错误码不再锁定弹窗,结果不确定时提供「关闭,稍后核对」,邮件不可用时提前置灰邀请;平台管理员页新增邮箱邀请与待接受邀请列表,激活页文案改为「接受邀请」\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,10 个集成测试类共 93 项及服务器单元测试 157 项通过(见交接文档 docs/console/tenant-name-platform-invite-handoff.md)\n- 前端:npm run check 通过,测试 279 项\n- 浏览器只用页面内模拟接口验证,未与真实后端联调,未验证真实邮件投递;合并后未重新运行后端测试\n\nBREAKING CHANGE: POST /api/v1/platform/tenants 必须提供 displayName,前后端需同时发布;部署前先执行 V31、V32 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T18:54:10-07:00"},{"Sha1":"1079b27dfca2ad1535dbab213431ca3895478780","Message":"feat(console): 支持按邮箱邀请平台管理员\n\n平台管理员原先只能从已有账号中添加,而新账号只能通过企业邀请产生,导致想增加平台管理员必须先把对方拉进某家企业,没有邮件服务时则根本加不了。后端已提供平台级邀请,前端随之接入。\n\n实现内容:\n- 平台管理员页新增「邀请管理员」(主要入口),原「添加管理员」在平台侧改名为「添加已有账号」并说明适用场景\n- 邀请表单:邮箱、管理职责(不预选,平台管理员或应用管理员)、应用管理员的负责应用、生效与截止时间、确认勾选;邮件不可用时说明原因并禁用表单\n- 后端错误码分别说明:SELF_INVITATION、INVALID_INPUT、INVITATION_PENDING、INVITATION_NOT_APPLICABLE、LIMIT_EXCEEDED;冲突后「重新填写」并刷新待接受列表\n- 新增「待接受的邀请」列表:邮箱、管理职责与应用名称、邀请有效期,管理职责已过截止时间的标注提示;可按读到的版本撤销,409 时关闭并刷新列表\n- WriteError 新增 conflictAction,允许新建类表单改写冲突按钮文字\n- 激活页与登录页文案改为通用的「接受邀请」,成功提示说明含管理职责时需要按提示开通两步验证\n\n验证:\n- npm run check(格式、lint、类型检查、测试、构建):通过,测试 279 项,含新增 platform-invitations.test.tsx 5 项\n- 浏览器(Vite + 页面内模拟接口):发送邀请后列表新增记录;邮件不可用时表单禁用并显示说明\n- 未与真实后端联调,未验证真实邮件投递与收件人接受邀请流程\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:43:58-07:00"},{"Sha1":"18ddef4d5ee7662de116717dc7970482b123e033","Message":"feat(console): 开通企业时填写名称并支持修改企业名称\n\n开通企业原先只能填企业代码,之后各处只能靠代码辨认企业。后端已支持开通时必填 displayName、平台管理员与企业所有者改名,前端随之接入。\n\n实现内容:\n- 开通企业弹窗新增必填「企业名称」,按后端同样的规则预检(去首尾空白后 1—160 个 Unicode 字符,拒绝控制字符与行、段落分隔符),提交时去掉首尾空白;成功卡片显示企业名称\n- 平台企业详情「基本信息」提供「设置名称 / 修改名称」,已归档企业不提供入口\n- 企业概览页头仅对本企业所有者显示改名入口;企业版本取自 GET /api/v1/me/tenants/{tenant} 的 tenant_version,缺失时不提交\n- 两处共用 TenantNameEditor:每次打开重新读取企业版本;409 冲突后重新读取但保留已输入的名称;未命名企业不把代码预填为名称\n- 企业侧改名成功后,就地更新上下文里的企业名称,页头与切换器立即显示新名称,不重新校验整个上下文\n- 企业列表搜索文案改为「搜索企业名称或代码」,操作记录新增 tenant.renamed 的「修改企业名称」标签\n\n验证:\n- 本提交暂存快照 npx tsc -b --noEmit、npx eslint .、npx prettier --check src:通过\n- 本提交暂存快照 npx vitest run:274 项通过,含新增 tenant-name.test.tsx 4 项;tenant-overview.test.tsx 改为包裹 ToastProvider\n- 浏览器(Vite + 页面内模拟接口):开通企业提交 code 与 displayName;未命名企业设置名称后标题更新;所有者改名遇到 409 时保留输入,带新版本重提成功\n- 未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:43:27-07:00"},{"Sha1":"327cad554ad55a68f628c06f3b486bf54a76184b","Message":"fix(console): 邀请邮件未配置时不再锁死弹窗\n\n未配置邮件服务时,邀请接口返回 503 MAIL_UNAVAILABLE,此时邀请已经整体回滚;但前端把所有 503 都当作结果不确定,锁定表单并禁止关闭,只剩原样重试,邀请弹窗因此关不掉。\n\n实现内容:\n- useMutation 对后端合同保证已回滚的错误码(MAIL_UNAVAILABLE、MAIL_TEST_RECIPIENT_REQUIRED)按确定失败处理:不锁定输入,可以取消和关闭;其余 503、5xx 和网络错误仍按结果不确定处理\n- 业务弹层通过 ForceDismiss 向错误提示提供「关闭,稍后核对」,结果不确定时用户可以显式离开,原样重试仍然保留\n- 两个邮件错误码给出具体说明:邀请没有发出也没有保存,或只能邀请 .test 邮箱\n- /api/v1/me 的 mail_delivery_available 为 false 时,成员页置灰「邀请成员」并在列表上方说明原因;字段缺失时按可用处理\n\n验证:\n- 本提交暂存快照 npx tsc -b --noEmit、npx eslint .、npx prettier --check src:通过\n- 本提交暂存快照 npx vitest run:270 项通过,含新增 write-dismiss.test.tsx 4 项\n- 浏览器(Vite + 页面内模拟接口):成员邀请遇到通用 503 时可用「关闭,稍后核对」关闭;MAIL_UNAVAILABLE 时输入不锁定、可以取消;邮件不可用时邀请按钮置灰并显示说明\n- 未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:42:56-07:00"},{"Sha1":"e2c4a59663c315cfdfc12159c26306a8f32859ae","Message":"merge: 合入企业名称、邀请邮件能力与平台管理员邀请后端\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:24:35-07:00"}],"HeadCommit":{"Sha1":"d2ff1f1d1423e14426de9db677c5239376cec6a8","Message":"feat: 合并企业名称、邀请弹窗修复与平台管理员邀请\n\n用户测试时发现三个问题:开通企业没有名称输入项;未配置邮件服务时邀请弹窗关不掉;平台侧无法增加第二位平台管理员。本次把后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/tenant-name-platform-invite):开通企业时必填 displayName,平台管理员与企业所有者可以改名,企业搜索同时匹配名称;/api/v1/me 返回 mail_delivery_available,并明确 MAIL_UNAVAILABLE 一定回滚;新增平台级邮箱邀请、待接受列表与撤销(V31、V32)\n- 前端:开通弹窗加名称,平台详情页与企业概览可以改名;确定失败的邮件错误码不再锁定弹窗,结果不确定时提供「关闭,稍后核对」,邮件不可用时提前置灰邀请;平台管理员页新增邮箱邀请与待接受邀请列表,激活页文案改为「接受邀请」\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,10 个集成测试类共 93 项及服务器单元测试 157 项通过(见交接文档 docs/console/tenant-name-platform-invite-handoff.md)\n- 前端:npm run check 通过,测试 279 项\n- 浏览器只用页面内模拟接口验证,未与真实后端联调,未验证真实邮件投递;合并后未重新运行后端测试\n\nBREAKING CHANGE: POST /api/v1/platform/tenants 必须提供 displayName,前后端需同时发布;部署前先执行 V31、V32 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T18:54:10-07:00"},"CompareURL":"pengzhiyu/IAM/compare/972164fbd3e90b74e1c6f61434ddc8b0db52fc65...d2ff1f1d1423e14426de9db677c5239376cec6a8","Len":10}...
|
1792116375
|
Edit
Delete
|
|
38474
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"d2ff1f1d1 {"Commits":[{"Sha1":"d2ff1f1d1423e14426de9db677c5239376cec6a8","Message":"feat: 合并企业名称、邀请弹窗修复与平台管理员邀请\n\n用户测试时发现三个问题:开通企业没有名称输入项;未配置邮件服务时邀请弹窗关不掉;平台侧无法增加第二位平台管理员。本次把后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/tenant-name-platform-invite):开通企业时必填 displayName,平台管理员与企业所有者可以改名,企业搜索同时匹配名称;/api/v1/me 返回 mail_delivery_available,并明确 MAIL_UNAVAILABLE 一定回滚;新增平台级邮箱邀请、待接受列表与撤销(V31、V32)\n- 前端:开通弹窗加名称,平台详情页与企业概览可以改名;确定失败的邮件错误码不再锁定弹窗,结果不确定时提供「关闭,稍后核对」,邮件不可用时提前置灰邀请;平台管理员页新增邮箱邀请与待接受邀请列表,激活页文案改为「接受邀请」\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,10 个集成测试类共 93 项及服务器单元测试 157 项通过(见交接文档 docs/console/tenant-name-platform-invite-handoff.md)\n- 前端:npm run check 通过,测试 279 项\n- 浏览器只用页面内模拟接口验证,未与真实后端联调,未验证真实邮件投递;合并后未重新运行后端测试\n\nBREAKING CHANGE: POST /api/v1/platform/tenants 必须提供 displayName,前后端需同时发布;部署前先执行 V31、V32 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T18:54:10-07:00"},{"Sha1":"1079b27dfca2ad1535dbab213431ca3895478780","Message":"feat(console): 支持按邮箱邀请平台管理员\n\n平台管理员原先只能从已有账号中添加,而新账号只能通过企业邀请产生,导致想增加平台管理员必须先把对方拉进某家企业,没有邮件服务时则根本加不了。后端已提供平台级邀请,前端随之接入。\n\n实现内容:\n- 平台管理员页新增「邀请管理员」(主要入口),原「添加管理员」在平台侧改名为「添加已有账号」并说明适用场景\n- 邀请表单:邮箱、管理职责(不预选,平台管理员或应用管理员)、应用管理员的负责应用、生效与截止时间、确认勾选;邮件不可用时说明原因并禁用表单\n- 后端错误码分别说明:SELF_INVITATION、INVALID_INPUT、INVITATION_PENDING、INVITATION_NOT_APPLICABLE、LIMIT_EXCEEDED;冲突后「重新填写」并刷新待接受列表\n- 新增「待接受的邀请」列表:邮箱、管理职责与应用名称、邀请有效期,管理职责已过截止时间的标注提示;可按读到的版本撤销,409 时关闭并刷新列表\n- WriteError 新增 conflictAction,允许新建类表单改写冲突按钮文字\n- 激活页与登录页文案改为通用的「接受邀请」,成功提示说明含管理职责时需要按提示开通两步验证\n\n验证:\n- npm run check(格式、lint、类型检查、测试、构建):通过,测试 279 项,含新增 platform-invitations.test.tsx 5 项\n- 浏览器(Vite + 页面内模拟接口):发送邀请后列表新增记录;邮件不可用时表单禁用并显示说明\n- 未与真实后端联调,未验证真实邮件投递与收件人接受邀请流程\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:43:58-07:00"},{"Sha1":"18ddef4d5ee7662de116717dc7970482b123e033","Message":"feat(console): 开通企业时填写名称并支持修改企业名称\n\n开通企业原先只能填企业代码,之后各处只能靠代码辨认企业。后端已支持开通时必填 displayName、平台管理员与企业所有者改名,前端随之接入。\n\n实现内容:\n- 开通企业弹窗新增必填「企业名称」,按后端同样的规则预检(去首尾空白后 1—160 个 Unicode 字符,拒绝控制字符与行、段落分隔符),提交时去掉首尾空白;成功卡片显示企业名称\n- 平台企业详情「基本信息」提供「设置名称 / 修改名称」,已归档企业不提供入口\n- 企业概览页头仅对本企业所有者显示改名入口;企业版本取自 GET /api/v1/me/tenants/{tenant} 的 tenant_version,缺失时不提交\n- 两处共用 TenantNameEditor:每次打开重新读取企业版本;409 冲突后重新读取但保留已输入的名称;未命名企业不把代码预填为名称\n- 企业侧改名成功后,就地更新上下文里的企业名称,页头与切换器立即显示新名称,不重新校验整个上下文\n- 企业列表搜索文案改为「搜索企业名称或代码」,操作记录新增 tenant.renamed 的「修改企业名称」标签\n\n验证:\n- 本提交暂存快照 npx tsc -b --noEmit、npx eslint .、npx prettier --check src:通过\n- 本提交暂存快照 npx vitest run:274 项通过,含新增 tenant-name.test.tsx 4 项;tenant-overview.test.tsx 改为包裹 ToastProvider\n- 浏览器(Vite + 页面内模拟接口):开通企业提交 code 与 displayName;未命名企业设置名称后标题更新;所有者改名遇到 409 时保留输入,带新版本重提成功\n- 未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:43:27-07:00"},{"Sha1":"327cad554ad55a68f628c06f3b486bf54a76184b","Message":"fix(console): 邀请邮件未配置时不再锁死弹窗\n\n未配置邮件服务时,邀请接口返回 503 MAIL_UNAVAILABLE,此时邀请已经整体回滚;但前端把所有 503 都当作结果不确定,锁定表单并禁止关闭,只剩原样重试,邀请弹窗因此关不掉。\n\n实现内容:\n- useMutation 对后端合同保证已回滚的错误码(MAIL_UNAVAILABLE、MAIL_TEST_RECIPIENT_REQUIRED)按确定失败处理:不锁定输入,可以取消和关闭;其余 503、5xx 和网络错误仍按结果不确定处理\n- 业务弹层通过 ForceDismiss 向错误提示提供「关闭,稍后核对」,结果不确定时用户可以显式离开,原样重试仍然保留\n- 两个邮件错误码给出具体说明:邀请没有发出也没有保存,或只能邀请 .test 邮箱\n- /api/v1/me 的 mail_delivery_available 为 false 时,成员页置灰「邀请成员」并在列表上方说明原因;字段缺失时按可用处理\n\n验证:\n- 本提交暂存快照 npx tsc -b --noEmit、npx eslint .、npx prettier --check src:通过\n- 本提交暂存快照 npx vitest run:270 项通过,含新增 write-dismiss.test.tsx 4 项\n- 浏览器(Vite + 页面内模拟接口):成员邀请遇到通用 503 时可用「关闭,稍后核对」关闭;MAIL_UNAVAILABLE 时输入不锁定、可以取消;邮件不可用时邀请按钮置灰并显示说明\n- 未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:42:56-07:00"},{"Sha1":"e2c4a59663c315cfdfc12159c26306a8f32859ae","Message":"merge: 合入企业名称、邀请邮件能力与平台管理员邀请后端\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T17:24:35-07:00"}],"HeadCommit":{"Sha1":"d2ff1f1d1423e14426de9db677c5239376cec6a8","Message":"feat: 合并企业名称、邀请弹窗修复与平台管理员邀请\n\n用户测试时发现三个问题:开通企业没有名称输入项;未配置邮件服务时邀请弹窗关不掉;平台侧无法增加第二位平台管理员。本次把后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/tenant-name-platform-invite):开通企业时必填 displayName,平台管理员与企业所有者可以改名,企业搜索同时匹配名称;/api/v1/me 返回 mail_delivery_available,并明确 MAIL_UNAVAILABLE 一定回滚;新增平台级邮箱邀请、待接受列表与撤销(V31、V32)\n- 前端:开通弹窗加名称,平台详情页与企业概览可以改名;确定失败的邮件错误码不再锁定弹窗,结果不确定时提供「关闭,稍后核对」,邮件不可用时提前置灰邀请;平台管理员页新增邮箱邀请与待接受邀请列表,激活页文案改为「接受邀请」\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,10 个集成测试类共 93 项及服务器单元测试 157 项通过(见交接文档 docs/console/tenant-name-platform-invite-handoff.md)\n- 前端:npm run check 通过,测试 279 项\n- 浏览器只用页面内模拟接口验证,未与真实后端联调,未验证真实邮件投递;合并后未重新运行后端测试\n\nBREAKING CHANGE: POST /api/v1/platform/tenants 必须提供 displayName,前后端需同时发布;部署前先执行 V31、V32 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T18:54:10-07:00"},"CompareURL":"pengzhiyu/IAM/compare/1bcbe8d10af01d2081b561a4531c4549a72387bd...d2ff1f1d1423e14426de9db677c5239376cec6a8","Len":12}...
|
1792116394
|
Edit
Delete
|
|
38507
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"36fd05364 {"Commits":[{"Sha1":"36fd0536408149355981d06096633ca3249a035e","Message":"feat: 合并成员姓名、应用、登录客户端与资源类型名称\n\n用户测试时发现成员只有成员代码、应用登记只有应用代码,登录客户端和资源类型也只有代码。本次把四项名称的后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/display-names):两类邀请必填 displayName,新账号使用邀请姓名、已有账号不覆盖;本人与平台管理员可改姓名(带账号版本,不影响会话与授权),历史默认姓名标记 display_name_set=false;成员列表可按姓名搜索;应用登记必填名称并可改名,管理角色返回 application_name;登录客户端与资源类型新增可选名称及改名接口(资源类型使用独立 name_version);V33 迁移\n- 前端:两类邀请表单加姓名;个人中心确认/修改姓名,所有账号可更正姓名;应用登记填写名称、概况页改名,角色标签与切换器显示应用名称;客户端与资源规则可设置、修改、清除名称,企业侧数据范围显示资源类型名称\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,237 项单元测试与 142 项集成测试通过,同步 main 0200f78 后复验 1 项单元测试与 19 项集成测试通过(见交接文档 docs/console/display-names-handoff.md)\n- 前端:npm run check 通过,测试 293 项\n- 合并前核对 main 新增的 P12 提交 f8a1e54、b892d79 与本次合并内容没有共同修改的文件,也没有新增迁移;合并后未重新运行后端测试\n- 未做浏览器检查,未与真实后端联调\n\nBREAKING CHANGE: 企业邀请、平台管理员邀请与应用登记必须提供 displayName,前后端需同时发布;部署前先执行 V33 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T20:00:56-07:00"},{"Sha1":"b892d7971af67f4f48c971d89b1a96f4c27d9249","Message":"test(capacity): 驱动支持恢复合同统计、专用报告与受控拥塞诊断\n\n容量驱动原来把任何刷新 503 都记为会话不可用,本地也没有办法制造真实的入口名额占满。本提交合入隔离实验中的驱动恢复选项、专用报告与拥塞辅助;正式容量命令默认路径不变。\n\n实现内容:\n- CapacityDriver 新增默认关闭的恢复选项:仅原 token 端点的完整响应可判定未执行,响应头、长度或 chunk 合同不明确时不授予重试资格;每次刷新最多两次串行尝试、25ms 退避、250ms 预算;原始 503、额外尝试、额外 HTTP 与台账父子耗时分别计入样本与汇总;私有轮换台账按 pending/completed/not_started 配对并 force 落盘,未知 pending 永不被后续记录洗白\n- 新增 CapacityRefreshRecovery(台账状态机与合同判定)、CapacityRecoveryEvidence、CapacityRecoveryExperimentDriver(只通过显式构造器开启恢复的计划入口)以及 CapacityRefreshRecoveryTest 15、CapacityRecoveryStatisticsTest 3;RefreshRecoveryContractIT 用真实双实例与数据库屏障验证 503→200 且旧令牌只消费一次,撤权/到期/已消费/回滚仍按原规则\n- scripts/capacity:recovery_report.py 严格复算恢复样本(业务成功、原始拒绝、额外 HTTP 分别计账,样本/汇总/存量三方对账);http_report.py 对恢复合同样本按设计拒绝;environment.py 与 round.py 新增 --driver-main 白名单;prepare.py 编译清单加入新驱动类;round.py --congestion 与 congestion.py 按日程持有部署独占屏障制造真实入口拥塞(持有 50–1000ms、最多 60 窗口、失败即停);README 补充说明\n- 工具测试:test_recovery_report 28、test_congestion 9、test_tools 新增 2\n\n验证:\n- PYTHONDONTWRITEBYTECODE=1 python3 -I -m unittest discover -s scripts/capacity -p 'test_*.py':66 项通过\n- 单元 283 项与集成回归同上一提交,在同一工作树上执行:12 个类 134 项通过,0 失败(ProtocolIT 14、AttackProtectionIT 12、MachineBudgetIT 6、AuthIngressLifecycleIT 6、AuthIngressConservativeIT 1、AuthIngressTimeContractIT 1、RefreshRecoveryContractIT 5、SdkRefreshRecoveryIT 8、DualApplicationsIT 23、RefreshExpiryLifecycleIT 23、ScopedLifecycleIT 9、SessionLifecycleIT 26),335 秒\n- 本地对照证据见未入库的 release/p12-recovery-contrast-local-20261015-b80658e8(低负载零 503)与 release/p12-congestion-recovery-local-20261015-b9411306(真实 503 下恢复率 21.9%、会话零丢失)\n- 未运行云端容量验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:59:08-07:00"},{"Sha1":"f8a1e548ef6adf50a225636d7005b3f13cb259da","Message":"feat(protocol): 入口名额拒绝返回未执行标记并由 SDK 有界重试一次\n\n每实例 8 个协议入口名额占满时 POST /oauth2/token 立即 503,客户端无法区分“业务未开始”与“结果未知”,只能丢弃会话重新登录;E2d 云测 30 次此类拒绝使原始可用会话 19970/20000,正式测量未开始。本提交把隔离候选的恢复合同合入主区:服务端只在该分支标记未执行,SDK 据此最多再试一次,其余失败语义不变。\n\n实现内容:\n- AttackProtectionConfiguration:仅 POST /oauth2/token 的 tryAcquire 失败分支,在调用过滤链之前加响应头 IAM-Request-Outcome: not-started-v1;状态 503、Cache-Control: no-store 与正文 {\"error\":\"server_error\"} 不变,/internal/protocol/* 与其他 503 不带标记,名额数与释放逻辑不变\n- iam-java-sdk 新增 RefreshRecovery:只有状态、唯一头、no-store 与固定正文(多读一字节)全部匹配才判定未执行;同一会话串行,最多额外一次,退避 25ms,第二次须在首次发起后 250ms 内发出,每次发起前重查撤销/绝对/闲置期限;BffSessions 第二次仍未执行时保留原代与 lastUse 并返回 503 TOKEN_REQUEST_NOT_STARTED,未知结果、invalid_grant、验签失败仍结束会话\n- 测试:RefreshRecoveryTest 15 项(真实 Spring 协议解析加模拟 HTTP)、IngressOutcomeContractTest(八名额占满时只有拒绝分支带标记且名额全部归还)、SdkRefreshRecoveryIT(真实 Java SDK、浏览器、双 IAM 与数据库屏障:单次/两次拒绝后恢复、撤销/到期/已消费拒绝、提交后丢响应不重放、本地闲置不发第二次)及支撑类 SdkRecoveryTestBridge、SdkLoginDiagnostics、SdkTestClock;测试签名密钥改为 3072 位与生产一致\n- 文档:attack-protection.md 新增“P12 入口拒绝的明确未执行标记”,sdk.md 新增“P12 明确未执行的刷新恢复”并修正刷新尝试次数描述\n\n验证(在同时含后续 test(capacity) 提交内容的同一工作树上执行):\n- ./mvnw -o -B -ntp -pl iam-key-security,iam-java-sdk,iam-server -am test:6 个模块 283 项单元测试通过\n- ./mvnw -o -B -ntp -pl iam-server -am verify -Dit.test=SdkRefreshRecoveryIT,RefreshRecoveryContractIT,AuthIngressLifecycleIT,AuthIngressConservativeIT,AuthIngressTimeContractIT,AttackProtectionIT,MachineBudgetIT,RefreshExpiryLifecycleIT,ScopedLifecycleIT,SessionLifecycleIT,DualApplicationsIT,ProtocolIT(含 spotless:check):12 个类 134 项通过,0 失败(ProtocolIT 14、AttackProtectionIT 12、MachineBudgetIT 6、AuthIngressLifecycleIT 6、AuthIngressConservativeIT 1、AuthIngressTimeContractIT 1、RefreshRecoveryContractIT 5、SdkRefreshRecoveryIT 8、DualApplicationsIT 23、RefreshExpiryLifecycleIT 23、ScopedLifecycleIT 9、SessionLifecycleIT 26),335 秒\n- 本提交单独检出到临时工作树执行 ./mvnw -o -B -ntp -pl iam-server,iam-java-sdk -am test-compile:通过\n- 本地证据见未入库的 release/p12-id-clock-sdk-recovery-local-20261015-87b969eb 与 release/p12-congestion-recovery-local-20261015-b9411306(受控拥塞下开启组 228 次拒绝全部确认未执行、恢复 50 次、会话零丢失)\n- 未运行云端容量验收,P12 正式门槛未变\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:58:41-07:00"},{"Sha1":"bcd9b9cd1cc5de30b234888c49738613500d7511","Message":"feat(console): 支持应用、登录客户端与资源类型名称\n\n应用登记原先只能填写代码,登录客户端和资源类型也只有代码,角色标签显示的是「应用管理员 · sales」这类代码。后端已补齐三类名称的写入与读取,控制台同步接入。\n\n实现内容:\n- 应用:登记时名称与代码都必填,提交 displayName;概况页「基本信息」增加设置/修改名称(读取应用版本,归档应用不提供入口);应用列表可按名称或代码搜索\n- 角色标签、工作台、企业切换器与平台入口提示改用 application_name,旧后端未返回时回退为应用代码;权限与路由仍以 application_id 为准\n- 登录客户端:创建时可选填名称(留空不提交该字段);列表以名称为主、代码为辅;详情可就地设置、修改或清除名称(清除提交 null,使用客户端版本)\n- 资源类型:添加资源规则时可选填名称;规则标题以名称为主,可就地改名,改名使用资源类型自己的 name_version,旧后端没有 name_version 时不提供改名;企业侧数据范围与选项显示「名称(代码)」\n- 新增 InlineNameEditor(就地展开的改名表单)与 codeWithName 展示工具\n\n验证:\n- npm run check:格式、lint、类型检查通过,33 个测试文件 293 项测试通过,构建成功\n- 新增 display-names.test.tsx 共 8 项:角色标签回退、可选名称校验、应用登记与改名请求体、客户端创建可选名称与清除名称、资源规则名称提交与按 name_version 改名\n- 未与真实后端联调,未做浏览器检查\n\nBREAKING CHANGE: 登记应用请求新增必填 displayName,须与 V33 及对应后端同时发布\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:57:20-07:00"},{"Sha1":"873358da99c3ab27ed78c5f4c87edba00229b960","Message":"feat(console): 邀请时填写姓名并支持本人与平台修改姓名\n\n新账号的姓名原先固定为「成员」,成员列表、所有账号等处只能靠成员代码区分。后端已支持邀请时填写姓名、本人改名和平台代改,控制台同步接入。\n\n实现内容:\n- 企业邀请成员、邀请平台管理员均增加必填「姓名」,提交 displayName;待接受的平台邀请以姓名为主、邮箱为辅显示,旧邀请没有姓名时只显示邮箱\n- 个人中心增加「修改姓名」,读取 /api/v1/me 的 version 提交;display_name_set=false 时提示确认姓名,输入框不预填默认名称,成功后用回执更新会话身份\n- 「所有账号」详情增加「更正姓名」,展开时重新读取账号版本,已归档账号不提供入口;企业侧不提供代改\n- 成员列表与设置所有者的搜索改为可按姓名或成员代码搜索;姓名未确认的成员和账号在列表与详情中标出\n- 企业改名弹窗抽成通用 NameEditor(必填/可选、提交 { displayName, version },409 保留草稿),名称校验抽成 nameError,规则仍为 1—160 个 Unicode 字符、拒绝控制字符与行/段落分隔符\n\n验证:\n- npm run check:格式、lint、类型检查通过,32 个测试文件 285 项测试通过,构建成功\n- 新增用例覆盖两类邀请的姓名必填与请求体、按姓名搜索与未确认标记、本人确认姓名、平台更正姓名及版本来源、归档账号无入口\n- 未与真实后端联调,未做浏览器检查\n\nBREAKING CHANGE: 两类邀请请求新增必填 displayName,须与 V33 及对应后端同时发布\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:52:20-07:00"}],"HeadCommit":{"Sha1":"36fd0536408149355981d06096633ca3249a035e","Message":"feat: 合并成员姓名、应用、登录客户端与资源类型名称\n\n用户测试时发现成员只有成员代码、应用登记只有应用代码,登录客户端和资源类型也只有代码。本次把四项名称的后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/display-names):两类邀请必填 displayName,新账号使用邀请姓名、已有账号不覆盖;本人与平台管理员可改姓名(带账号版本,不影响会话与授权),历史默认姓名标记 display_name_set=false;成员列表可按姓名搜索;应用登记必填名称并可改名,管理角色返回 application_name;登录客户端与资源类型新增可选名称及改名接口(资源类型使用独立 name_version);V33 迁移\n- 前端:两类邀请表单加姓名;个人中心确认/修改姓名,所有账号可更正姓名;应用登记填写名称、概况页改名,角色标签与切换器显示应用名称;客户端与资源规则可设置、修改、清除名称,企业侧数据范围显示资源类型名称\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,237 项单元测试与 142 项集成测试通过,同步 main 0200f78 后复验 1 项单元测试与 19 项集成测试通过(见交接文档 docs/console/display-names-handoff.md)\n- 前端:npm run check 通过,测试 293 项\n- 合并前核对 main 新增的 P12 提交 f8a1e54、b892d79 与本次合并内容没有共同修改的文件,也没有新增迁移;合并后未重新运行后端测试\n- 未做浏览器检查,未与真实后端联调\n\nBREAKING CHANGE: 企业邀请、平台管理员邀请与应用登记必须提供 displayName,前后端需同时发布;部署前先执行 V33 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T20:00:56-07:00"},"CompareURL":"pengzhiyu/IAM/compare/d2ff1f1d1423e14426de9db677c5239376cec6a8...36fd0536408149355981d06096633ca3249a035e","Len":9}...
|
1792119771
|
Edit
Delete
|
|
38508
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"36fd05364 {"Commits":[{"Sha1":"36fd0536408149355981d06096633ca3249a035e","Message":"feat: 合并成员姓名、应用、登录客户端与资源类型名称\n\n用户测试时发现成员只有成员代码、应用登记只有应用代码,登录客户端和资源类型也只有代码。本次把四项名称的后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/display-names):两类邀请必填 displayName,新账号使用邀请姓名、已有账号不覆盖;本人与平台管理员可改姓名(带账号版本,不影响会话与授权),历史默认姓名标记 display_name_set=false;成员列表可按姓名搜索;应用登记必填名称并可改名,管理角色返回 application_name;登录客户端与资源类型新增可选名称及改名接口(资源类型使用独立 name_version);V33 迁移\n- 前端:两类邀请表单加姓名;个人中心确认/修改姓名,所有账号可更正姓名;应用登记填写名称、概况页改名,角色标签与切换器显示应用名称;客户端与资源规则可设置、修改、清除名称,企业侧数据范围显示资源类型名称\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,237 项单元测试与 142 项集成测试通过,同步 main 0200f78 后复验 1 项单元测试与 19 项集成测试通过(见交接文档 docs/console/display-names-handoff.md)\n- 前端:npm run check 通过,测试 293 项\n- 合并前核对 main 新增的 P12 提交 f8a1e54、b892d79 与本次合并内容没有共同修改的文件,也没有新增迁移;合并后未重新运行后端测试\n- 未做浏览器检查,未与真实后端联调\n\nBREAKING CHANGE: 企业邀请、平台管理员邀请与应用登记必须提供 displayName,前后端需同时发布;部署前先执行 V33 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T20:00:56-07:00"},{"Sha1":"b892d7971af67f4f48c971d89b1a96f4c27d9249","Message":"test(capacity): 驱动支持恢复合同统计、专用报告与受控拥塞诊断\n\n容量驱动原来把任何刷新 503 都记为会话不可用,本地也没有办法制造真实的入口名额占满。本提交合入隔离实验中的驱动恢复选项、专用报告与拥塞辅助;正式容量命令默认路径不变。\n\n实现内容:\n- CapacityDriver 新增默认关闭的恢复选项:仅原 token 端点的完整响应可判定未执行,响应头、长度或 chunk 合同不明确时不授予重试资格;每次刷新最多两次串行尝试、25ms 退避、250ms 预算;原始 503、额外尝试、额外 HTTP 与台账父子耗时分别计入样本与汇总;私有轮换台账按 pending/completed/not_started 配对并 force 落盘,未知 pending 永不被后续记录洗白\n- 新增 CapacityRefreshRecovery(台账状态机与合同判定)、CapacityRecoveryEvidence、CapacityRecoveryExperimentDriver(只通过显式构造器开启恢复的计划入口)以及 CapacityRefreshRecoveryTest 15、CapacityRecoveryStatisticsTest 3;RefreshRecoveryContractIT 用真实双实例与数据库屏障验证 503→200 且旧令牌只消费一次,撤权/到期/已消费/回滚仍按原规则\n- scripts/capacity:recovery_report.py 严格复算恢复样本(业务成功、原始拒绝、额外 HTTP 分别计账,样本/汇总/存量三方对账);http_report.py 对恢复合同样本按设计拒绝;environment.py 与 round.py 新增 --driver-main 白名单;prepare.py 编译清单加入新驱动类;round.py --congestion 与 congestion.py 按日程持有部署独占屏障制造真实入口拥塞(持有 50–1000ms、最多 60 窗口、失败即停);README 补充说明\n- 工具测试:test_recovery_report 28、test_congestion 9、test_tools 新增 2\n\n验证:\n- PYTHONDONTWRITEBYTECODE=1 python3 -I -m unittest discover -s scripts/capacity -p 'test_*.py':66 项通过\n- 单元 283 项与集成回归同上一提交,在同一工作树上执行:12 个类 134 项通过,0 失败(ProtocolIT 14、AttackProtectionIT 12、MachineBudgetIT 6、AuthIngressLifecycleIT 6、AuthIngressConservativeIT 1、AuthIngressTimeContractIT 1、RefreshRecoveryContractIT 5、SdkRefreshRecoveryIT 8、DualApplicationsIT 23、RefreshExpiryLifecycleIT 23、ScopedLifecycleIT 9、SessionLifecycleIT 26),335 秒\n- 本地对照证据见未入库的 release/p12-recovery-contrast-local-20261015-b80658e8(低负载零 503)与 release/p12-congestion-recovery-local-20261015-b9411306(真实 503 下恢复率 21.9%、会话零丢失)\n- 未运行云端容量验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:59:08-07:00"},{"Sha1":"f8a1e548ef6adf50a225636d7005b3f13cb259da","Message":"feat(protocol): 入口名额拒绝返回未执行标记并由 SDK 有界重试一次\n\n每实例 8 个协议入口名额占满时 POST /oauth2/token 立即 503,客户端无法区分“业务未开始”与“结果未知”,只能丢弃会话重新登录;E2d 云测 30 次此类拒绝使原始可用会话 19970/20000,正式测量未开始。本提交把隔离候选的恢复合同合入主区:服务端只在该分支标记未执行,SDK 据此最多再试一次,其余失败语义不变。\n\n实现内容:\n- AttackProtectionConfiguration:仅 POST /oauth2/token 的 tryAcquire 失败分支,在调用过滤链之前加响应头 IAM-Request-Outcome: not-started-v1;状态 503、Cache-Control: no-store 与正文 {\"error\":\"server_error\"} 不变,/internal/protocol/* 与其他 503 不带标记,名额数与释放逻辑不变\n- iam-java-sdk 新增 RefreshRecovery:只有状态、唯一头、no-store 与固定正文(多读一字节)全部匹配才判定未执行;同一会话串行,最多额外一次,退避 25ms,第二次须在首次发起后 250ms 内发出,每次发起前重查撤销/绝对/闲置期限;BffSessions 第二次仍未执行时保留原代与 lastUse 并返回 503 TOKEN_REQUEST_NOT_STARTED,未知结果、invalid_grant、验签失败仍结束会话\n- 测试:RefreshRecoveryTest 15 项(真实 Spring 协议解析加模拟 HTTP)、IngressOutcomeContractTest(八名额占满时只有拒绝分支带标记且名额全部归还)、SdkRefreshRecoveryIT(真实 Java SDK、浏览器、双 IAM 与数据库屏障:单次/两次拒绝后恢复、撤销/到期/已消费拒绝、提交后丢响应不重放、本地闲置不发第二次)及支撑类 SdkRecoveryTestBridge、SdkLoginDiagnostics、SdkTestClock;测试签名密钥改为 3072 位与生产一致\n- 文档:attack-protection.md 新增“P12 入口拒绝的明确未执行标记”,sdk.md 新增“P12 明确未执行的刷新恢复”并修正刷新尝试次数描述\n\n验证(在同时含后续 test(capacity) 提交内容的同一工作树上执行):\n- ./mvnw -o -B -ntp -pl iam-key-security,iam-java-sdk,iam-server -am test:6 个模块 283 项单元测试通过\n- ./mvnw -o -B -ntp -pl iam-server -am verify -Dit.test=SdkRefreshRecoveryIT,RefreshRecoveryContractIT,AuthIngressLifecycleIT,AuthIngressConservativeIT,AuthIngressTimeContractIT,AttackProtectionIT,MachineBudgetIT,RefreshExpiryLifecycleIT,ScopedLifecycleIT,SessionLifecycleIT,DualApplicationsIT,ProtocolIT(含 spotless:check):12 个类 134 项通过,0 失败(ProtocolIT 14、AttackProtectionIT 12、MachineBudgetIT 6、AuthIngressLifecycleIT 6、AuthIngressConservativeIT 1、AuthIngressTimeContractIT 1、RefreshRecoveryContractIT 5、SdkRefreshRecoveryIT 8、DualApplicationsIT 23、RefreshExpiryLifecycleIT 23、ScopedLifecycleIT 9、SessionLifecycleIT 26),335 秒\n- 本提交单独检出到临时工作树执行 ./mvnw -o -B -ntp -pl iam-server,iam-java-sdk -am test-compile:通过\n- 本地证据见未入库的 release/p12-id-clock-sdk-recovery-local-20261015-87b969eb 与 release/p12-congestion-recovery-local-20261015-b9411306(受控拥塞下开启组 228 次拒绝全部确认未执行、恢复 50 次、会话零丢失)\n- 未运行云端容量验收,P12 正式门槛未变\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:58:41-07:00"},{"Sha1":"bcd9b9cd1cc5de30b234888c49738613500d7511","Message":"feat(console): 支持应用、登录客户端与资源类型名称\n\n应用登记原先只能填写代码,登录客户端和资源类型也只有代码,角色标签显示的是「应用管理员 · sales」这类代码。后端已补齐三类名称的写入与读取,控制台同步接入。\n\n实现内容:\n- 应用:登记时名称与代码都必填,提交 displayName;概况页「基本信息」增加设置/修改名称(读取应用版本,归档应用不提供入口);应用列表可按名称或代码搜索\n- 角色标签、工作台、企业切换器与平台入口提示改用 application_name,旧后端未返回时回退为应用代码;权限与路由仍以 application_id 为准\n- 登录客户端:创建时可选填名称(留空不提交该字段);列表以名称为主、代码为辅;详情可就地设置、修改或清除名称(清除提交 null,使用客户端版本)\n- 资源类型:添加资源规则时可选填名称;规则标题以名称为主,可就地改名,改名使用资源类型自己的 name_version,旧后端没有 name_version 时不提供改名;企业侧数据范围与选项显示「名称(代码)」\n- 新增 InlineNameEditor(就地展开的改名表单)与 codeWithName 展示工具\n\n验证:\n- npm run check:格式、lint、类型检查通过,33 个测试文件 293 项测试通过,构建成功\n- 新增 display-names.test.tsx 共 8 项:角色标签回退、可选名称校验、应用登记与改名请求体、客户端创建可选名称与清除名称、资源规则名称提交与按 name_version 改名\n- 未与真实后端联调,未做浏览器检查\n\nBREAKING CHANGE: 登记应用请求新增必填 displayName,须与 V33 及对应后端同时发布\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:57:20-07:00"},{"Sha1":"873358da99c3ab27ed78c5f4c87edba00229b960","Message":"feat(console): 邀请时填写姓名并支持本人与平台修改姓名\n\n新账号的姓名原先固定为「成员」,成员列表、所有账号等处只能靠成员代码区分。后端已支持邀请时填写姓名、本人改名和平台代改,控制台同步接入。\n\n实现内容:\n- 企业邀请成员、邀请平台管理员均增加必填「姓名」,提交 displayName;待接受的平台邀请以姓名为主、邮箱为辅显示,旧邀请没有姓名时只显示邮箱\n- 个人中心增加「修改姓名」,读取 /api/v1/me 的 version 提交;display_name_set=false 时提示确认姓名,输入框不预填默认名称,成功后用回执更新会话身份\n- 「所有账号」详情增加「更正姓名」,展开时重新读取账号版本,已归档账号不提供入口;企业侧不提供代改\n- 成员列表与设置所有者的搜索改为可按姓名或成员代码搜索;姓名未确认的成员和账号在列表与详情中标出\n- 企业改名弹窗抽成通用 NameEditor(必填/可选、提交 { displayName, version },409 保留草稿),名称校验抽成 nameError,规则仍为 1—160 个 Unicode 字符、拒绝控制字符与行/段落分隔符\n\n验证:\n- npm run check:格式、lint、类型检查通过,32 个测试文件 285 项测试通过,构建成功\n- 新增用例覆盖两类邀请的姓名必填与请求体、按姓名搜索与未确认标记、本人确认姓名、平台更正姓名及版本来源、归档账号无入口\n- 未与真实后端联调,未做浏览器检查\n\nBREAKING CHANGE: 两类邀请请求新增必填 displayName,须与 V33 及对应后端同时发布\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T19:52:20-07:00"}],"HeadCommit":{"Sha1":"36fd0536408149355981d06096633ca3249a035e","Message":"feat: 合并成员姓名、应用、登录客户端与资源类型名称\n\n用户测试时发现成员只有成员代码、应用登记只有应用代码,登录客户端和资源类型也只有代码。本次把四项名称的后端实现与前端接入一起合入 main。\n\n实现内容:\n- 后端(feat/display-names):两类邀请必填 displayName,新账号使用邀请姓名、已有账号不覆盖;本人与平台管理员可改姓名(带账号版本,不影响会话与授权),历史默认姓名标记 display_name_set=false;成员列表可按姓名搜索;应用登记必填名称并可改名,管理角色返回 application_name;登录客户端与资源类型新增可选名称及改名接口(资源类型使用独立 name_version);V33 迁移\n- 前端:两类邀请表单加姓名;个人中心确认/修改姓名,所有账号可更正姓名;应用登记填写名称、概况页改名,角色标签与切换器显示应用名称;客户端与资源规则可设置、修改、清除名称,企业侧数据范围显示资源类型名称\n\n验证:\n- 后端:Codex 在功能分支上执行定向 verify,237 项单元测试与 142 项集成测试通过,同步 main 0200f78 后复验 1 项单元测试与 19 项集成测试通过(见交接文档 docs/console/display-names-handoff.md)\n- 前端:npm run check 通过,测试 293 项\n- 合并前核对 main 新增的 P12 提交 f8a1e54、b892d79 与本次合并内容没有共同修改的文件,也没有新增迁移;合并后未重新运行后端测试\n- 未做浏览器检查,未与真实后端联调\n\nBREAKING CHANGE: 企业邀请、平台管理员邀请与应用登记必须提供 displayName,前后端需同时发布;部署前先执行 V33 迁移。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T20:00:56-07:00"},"CompareURL":"pengzhiyu/IAM/compare/d2ff1f1d1423e14426de9db677c5239376cec6a8...36fd0536408149355981d06096633ca3249a035e","Len":9}...
|
1792119824
|
Edit
Delete
|
|
38547
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"90fdca65c {"Commits":[{"Sha1":"90fdca65cfd995e173023f259957080c0318a3d3","Message":"docs: 补记 P12 入口名额服务端台账诊断并更新候选合同合入状态\n\n两份 P12 任务文档顶部状态仍写“候选合同未合入”,且没有服务端名额台账诊断的记录。本次更新顶部状态,追加软件优化文档第六十九步与归因设计文档第67节。\n\n实现内容:\n- 顶部状态改为台账诊断已完成,并写明恢复合同已以 f8a1e54、b892d79 合入主区,不改变诊断边界\n- 第六十九步 / 第67节记录诊断设计、验证过程、对账、三个问题的服务端直接答案(229 次拒绝快照恰 8 持有者;186 次 CLIENT_AUTH×4 + LIFECYCLE_WAIT×4;名额首次空出中位 80.3ms;重试到达 25.8–40.9ms,55 次恢复与“首次空出早于到达”逐条等价)、与第六十八步 E2d 复算的对照(可回收约 21–24/30)、边界与下一步\n\n验证:\n- 内容来自 release/p12-permit-ledger-congestion-local-20261015-8fe8eb8b 公开包 README 与报告;纯文档改动,未运行代码检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T22:29:30-07:00"},{"Sha1":"dd8a73c4b76dc7dd380609cc7d1caff21a01cee1","Message":"test(capacity): 采集入口名额台账并支持按需开启服务端诊断\n\n容量脚本此前不开启产品的 iam.auth.diagnostics.enabled,观察器也没有读取新增的入口名额台账,无法把服务端拒绝瞬间的持有者阶段与驱动样本按 X-Request-Id 关联。本次让本地诊断轮可按需开启该开关并以固定周期拉取台账,正式容量命令路径不变。\n\n实现内容:\n- round.py 新增 --server-diagnostics,environment.py 据此在两实例启动参数末尾追加 --iam.auth.diagnostics.enabled=true,默认不加并记入 environment.json 与 round.json\n- CapacityMeters 新增 PermitLedgerCollector(按游标拉取直到追平,每次最多 16 页,缺口/重启/截断显式记录,每文件 16MiB 上限)与 validatePermitLedgerPage(页、held、rejected、持有者字段白名单,阶段名只接受固定枚举)\n- CapacityObserver 新增独立线程每 2 秒拉取两实例台账写 permit-ledger-iam0/1.jsonl,状态写 permit-ledger-collector.jsonl,停止标记后再拉取一次保留收尾记录\n- 新增 AuthIngressPermitLedgerIT:真实双实例 PG 屏障下第九个到达的 503 与合同头不变、busy 恰加 1、台账快照恰为 8 个真实持有者(含 LIFECYCLE_WAIT)、释放全部晚于拒绝、每实例只暴露一个只读 read 的台账 MBean,页面同时通过工具侧白名单校验\n- 新增 test_server_diagnostics.py 4 项;README 补“入口名额台账”一节\n\n验证:\n- ./mvnw -o -pl iam-server -am verify -Dit.test=AuthIngressPermitLedgerIT,AuthIngressLifecycleIT,RefreshRecoveryContractIT,SdkRefreshRecoveryIT:21 项通过(AuthIngressPermitLedgerIT 2 项)\n- python3 -m unittest discover -s scripts/capacity -p 'test_*.py':70 项通过\n- 本地受控拥塞一轮(刷新 83/s、池 20000、屏障 200/300/400ms × 20 窗口):229 次首次 503 全部关联到台账,dropped/slot_misses/overwritten 均 0,公开包 release/p12-permit-ledger-congestion-local-20261015-8fe8eb8b\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T22:29:30-07:00"},{"Sha1":"5435f06bd1327ad91bcf3d7f58438a53502b9dd1","Message":"feat(security): 新增默认关闭的认证入口名额台账诊断\n\n入口 8 个名额被占满时只有 503 计数与客户端时间线可查,无法知道拒绝瞬间 8 个持有者各在服务端哪个阶段、名额多久空出、带未执行标记的重试到达时名额是否仍满。本次在既有 iam.auth.diagnostics.enabled 开关下补采有界的服务端台账,默认关闭,不改变名额数、tryAcquire/release 顺序、指标与响应。\n\n实现内容:\n- 新增 AuthIngressPermitLedger:8 个持有者槽位(与 Semaphore(8) 对应)、4096 条无锁环形缓冲、read(after) 每页最多 512 条、单条上限 1800 字符;只记录既有 TraceIds 规范化的随机关联号、端点、阶段枚举名、纳秒计数与状态码,时钟故障或超长整条丢弃并计数\n- 每个 token/internal 请求取得名额后登记(取得时刻、取得前可用名额、槽位),释放后写 held;每次 AUTH_BUSY 紧跟 tryAcquire 失败写 rejected,快照至多 8 个持有者的关联号、端点、当前阶段与已持有时长\n- AttackProtectionConfiguration.attackIngress 新增带台账参数的 @Bean 重载,原 3 参方法保留为关闭台账的非 @Bean 重载;释放时先腾槽位、再释放名额、记录指标,最后登记释放时刻\n- AuthRequestDiagnostics 新增同包 current(),供台账读取当前上下文的关联号与阶段,不创建上下文\n- 新增 AuthIngressPermitLedgerConfiguration:台账 bean 随开关创建;开启时注册只读 MBean com.iam:type=AuthIngressPermitLedger,复用既有隔离 JMX 通道\n- 新增 AuthIngressPermitLedgerTest(受控时钟:拒绝快照、释放复用槽位、环形覆盖与分页、时钟故障丢弃)与 IngressPermitLedgerContractTest(台账开启、关闭、旧重载三种构造的状态码、正文、合同头、ingress 指标与预算调用次数逐项一致)\n\n验证:\n- ./mvnw -o -pl iam-server -am test(AuthIngressPermitLedgerTest、IngressPermitLedgerContractTest、IngressOutcomeContractTest、AttackIngressMetricsTest、AuthRequestDiagnosticsTest、AuthDiagnosticsTestProbeTest 等 15 类):104 项通过\n- ./mvnw -o -pl iam-server,iam-java-sdk spotless:check:通过\n- 仅含前一提交与本提交改动的临时工作树 ./mvnw -o -pl iam-server -am test-compile:通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T22:29:30-07:00"},{"Sha1":"27e4c1c46a88cef96d65a275f0a70def221813b0","Message":"test(protocol): 适配 ApplicationRegistry.client 新增的 displayName 参数\n\n36fd053 为 ApplicationRegistry.client 增加 displayName 参数并更新了 ProtocolFixture,但同期合入的 RefreshRecoveryContractIT 与 SdkRefreshRecoveryIT 仍按旧签名调用,iam-server 测试源码自 36fd053 起无法编译。\n\n实现内容:\n- 两处 registry.client(...) 调用在 clientId 之后补传 displayName 为 null,与 ProtocolFixture 的写法一致;测试逻辑不变\n\n验证:\n- ./mvnw -o -pl iam-server -am verify -Dit.test=RefreshRecoveryContractIT,SdkRefreshRecoveryIT,AuthIngressLifecycleIT,AuthIngressPermitLedgerIT:21 项通过(修正前 iam-server 测试源码在 testCompile 阶段失败)\n- ./mvnw -o -pl iam-server,iam-java-sdk spotless:check:通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T22:29:30-07:00"}],"HeadCommit":{"Sha1":"90fdca65cfd995e173023f259957080c0318a3d3","Message":"docs: 补记 P12 入口名额服务端台账诊断并更新候选合同合入状态\n\n两份 P12 任务文档顶部状态仍写“候选合同未合入”,且没有服务端名额台账诊断的记录。本次更新顶部状态,追加软件优化文档第六十九步与归因设计文档第67节。\n\n实现内容:\n- 顶部状态改为台账诊断已完成,并写明恢复合同已以 f8a1e54、b892d79 合入主区,不改变诊断边界\n- 第六十九步 / 第67节记录诊断设计、验证过程、对账、三个问题的服务端直接答案(229 次拒绝快照恰 8 持有者;186 次 CLIENT_AUTH×4 + LIFECYCLE_WAIT×4;名额首次空出中位 80.3ms;重试到达 25.8–40.9ms,55 次恢复与“首次空出早于到达”逐条等价)、与第六十八步 E2d 复算的对照(可回收约 21–24/30)、边界与下一步\n\n验证:\n- 内容来自 release/p12-permit-ledger-congestion-local-20261015-8fe8eb8b 公开包 README 与报告;纯文档改动,未运行代码检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-15T22:29:30-07:00"},"CompareURL":"pengzhiyu/IAM/compare/36fd0536408149355981d06096633ca3249a035e...90fdca65cfd995e173023f259957080c0318a3d3","Len":4}...
|
1792128686
|
Edit
Delete
|
|
38627
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"fd4d21c62 {"Commits":[{"Sha1":"fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Message":"feat: 合并组织架构图拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看,部门多时不便浏览,也无法铺满屏幕查看。本次合入 feat/console-layout 上的组织架构图交互增强。\n\n实现内容:\n- 组织架构图(e40df4d):按住鼠标拖动平移且松手不误开详情;「全屏」立即铺满窗口并尝试浏览器原生全屏,Esc 或「退出全屏」返回;全屏下沿用缩放按钮;鼠标滚轮以指针为中心放大缩小(50%–150%),Shift + 滚轮与横向滑动保留横向滚动\n\n验证:\n- 合并前确认 main 为分支起点 ff21ad9,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web format:check、lint、typecheck、build 通过,Vitest 34 个文件 300 项通过\n- 未运行:后端测试;浏览器原生全屏与真实 Mac 触控板手势未实测\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:13:04-07:00"},{"Sha1":"e40df4d323d530d8e43f53c49c898f046ca59719","Message":"feat(console): 组织架构图支持拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看超出范围的部门,部门多时不便浏览,也无法放大到整个屏幕查看。增加直接拖动、全屏展示和鼠标滚轮缩放。\n\n实现内容:\n- 按住鼠标左键拖动图即可平移,移动超过 4 像素才算拖动,松手时不会误开部门详情;触屏保留原生滚动\n- 新增「全屏」按钮:点击后立即铺满浏览器窗口,并尝试浏览器原生全屏;原生全屏不可用、被拒绝或请求无回应时保持铺满窗口,按 Esc 或「退出全屏」返回\n- 全屏下沿用缩小、放大、原始大小按钮,进出全屏时保持原来位于中心的部门\n- 鼠标滚轮向上放大、向下缩小,以指针为中心,范围仍为 50%–150%;按住 Shift 或横向滑动时保留浏览器原有的横向滚动,并阻止 Ctrl + 滚轮放大整个网页\n- 新增 maximize、minimize 图标,更新页面与全屏提示文案\n- 补充拖动平移、窗口铺满、原生全屏请求无回应、原生全屏 Esc 退出、滚轮缩放共 5 条单测\n\n验证:\n- npm run format:check、lint、typecheck:通过\n- npm run test:34 个测试文件 300 项全部通过\n- npm run build:通过\n- 内置浏览器连接演示环境 p08-alpha 实测:拖动平移与点击、全屏铺满窗口与退出、全屏下按钮与滚轮缩放、滚轮以指针为中心、375 宽窄屏与暗色均正常\n- 未验证:浏览器原生全屏(内置浏览器中原生全屏请求无回应)及真实 Mac 触控板手势\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:11:56-07:00"},{"Sha1":"ff21ad957d0a9077aaf58390df732d1fce85afb1","Message":"feat(auth): 统一认证页样式与控制台登录页一致\n\n业务应用走统一登录时,用户看到的 /login、/oidc/select、/activate 由服务端直接输出,原样式为绿色配色、没有品牌标识,企业选择的每家企业都是同样的实心主按钮,登录失败只有一行红字,与控制台登录页风格不一致。本次只调整 auth.css,不改服务端 HTML、表单字段与 CSP。\n\n实现内容:\n- 配色改为控制台“暖石与墨”:暖白方格底、白色卡片、墨黑主按钮,陶土色只用于链接;焦点环用墨黑,避免与错误红混淆\n- 页面 CSP 为 default-src 'none'; style-src 'self',不能加载图片与字体,左上角品牌标识用伪元素与渐变绘制(墨黑圆角方块内绘锁孔 + “IAM 统一身份认证”),卡片底部统一显示“由 IAM 统一身份认证保护”\n- 企业选择的每家企业改为可点击的列表行(左侧企业名、右侧“进入 →”),悬停描边加深;无可选企业时显示虚线说明框\n- 登录失败提示改为带浅红底色与左侧强调条的提示块;输入框 44px 高,悬停与聚焦有明确状态\n- 暗色跟随系统设置;窄屏(≤520px)缩小留白;卡片入场只做 6px 上移,不从透明淡入,动画未执行时也始终可见,减少动态效果时不播放\n- 同步 docs/handoff/demo-apps-frontend.md:记录本次样式改动、验证方式与部署后的检查项\n\n验证:\n- 按 AccountController 与 ProtocolController 的输出复刻登录、登录失败、选择企业、无可选企业、接受邀请、激活成功 6 种页面,以与服务端相同的 CSP 本地预览,检查亮色、暗色与 375px 宽度,浏览器控制台无 CSP 拦截\n- 核对 LoginSelectionIT 只断言页面引用 /auth.css 且返回 200,不依赖样式内容\n- 未运行:后端测试、IAM 制品构建与真实登录流程中的页面检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:46:38-07:00"},{"Sha1":"4ee4225dec2523e41b58301645a83bb63532ce61","Message":"feat: 合并客户与商机管理和售后服务台演示前端\n\n演示后端 iam-demo-app 已在 main,但缺少前端,-Pdemo-web 无法打包完整页面。本次合入演示前端、控制台“创建交付工单”选项以及方案与交接文档,供后端打包、部署与联调。\n\n实现内容:\n- 演示前端(58e3700):新增 iam-demo-web,CRM 与工单台两套入口,构建输出 iam-demo-web/dist/crm、dist/support,与 demo-web profile 读取路径一致;接入会话门禁、“我的权限”抽屉、tenant_hint 跳转、切换企业与两种退出、客户/商机/跟进/交付、工单流转/转派/处理记录与报表导出\n- 控制台(e295811):平台可批准的程序操作增加 ticket:create(创建交付工单)\n- 文档(efc7c1a):docs/demo-apps.md 原始方案,docs/handoff/demo-apps-backend-01.md 当初的后端建议,docs/handoff/demo-apps-frontend.md 前端交付与部署联调建议\n\n验证:\n- 合并前确认 main 为分支起点 3451213,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- iam-demo-web npm run check 通过(Vitest 30 项);iam-admin-web npm run check 通过(Vitest 295 项)\n- 未运行:-Pdemo-web 打包、后端测试、真实后端联调与内网部署\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:29:48-07:00"},{"Sha1":"efc7c1a07ab3e7fe97ffe18fb71071f10d41d045","Message":"docs(demo): 补充演示应用方案与前后端交接文档\n\n演示应用的原始方案和给后端的建议此前只在本地,前端完成后也缺少交付说明与部署联调的交接。补齐三份文档,记录方案、已确认的决定、前端实际交付与待后端执行的事项。\n\n实现内容:\n- docs/demo-apps.md:CRM 与工单台的功能、页面、权限映射、登录与企业选择体验、阶段二赢单自动建单设计、演示脚本与验收标准;状态标为“原始方案,已据此实现”,与交接文档冲突时以交接文档为准\n- docs/handoff/demo-apps-backend-01.md:当初交给后端评估的建议提示词,保留用于追溯\n- docs/handoff/demo-apps-frontend.md:前端实际交付、对后端合同的处理、前端验证结果与未执行项,以及给后端的打包、部署与联调测试建议\n\n验证:\n- 文档中的命令、路径与测试数量对照本次 iam-demo-web 与 iam-admin-web 的实际检查结果核对\n- 未运行:文档所述的打包、部署与真实联调步骤\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:29:00-07:00"}],"HeadCommit":{"Sha1":"fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Message":"feat: 合并组织架构图拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看,部门多时不便浏览,也无法铺满屏幕查看。本次合入 feat/console-layout 上的组织架构图交互增强。\n\n实现内容:\n- 组织架构图(e40df4d):按住鼠标拖动平移且松手不误开详情;「全屏」立即铺满窗口并尝试浏览器原生全屏,Esc 或「退出全屏」返回;全屏下沿用缩放按钮;鼠标滚轮以指针为中心放大缩小(50%–150%),Shift + 滚轮与横向滑动保留横向滚动\n\n验证:\n- 合并前确认 main 为分支起点 ff21ad9,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web format:check、lint、typecheck、build 通过,Vitest 34 个文件 300 项通过\n- 未运行:后端测试;浏览器原生全屏与真实 Mac 触控板手势未实测\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:13:04-07:00"},"CompareURL":"pengzhiyu/IAM/compare/90fdca65cfd995e173023f259957080c0318a3d3...fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Len":11}...
|
1792138433
|
Edit
Delete
|
|
38628
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"fd4d21c62 {"Commits":[{"Sha1":"fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Message":"feat: 合并组织架构图拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看,部门多时不便浏览,也无法铺满屏幕查看。本次合入 feat/console-layout 上的组织架构图交互增强。\n\n实现内容:\n- 组织架构图(e40df4d):按住鼠标拖动平移且松手不误开详情;「全屏」立即铺满窗口并尝试浏览器原生全屏,Esc 或「退出全屏」返回;全屏下沿用缩放按钮;鼠标滚轮以指针为中心放大缩小(50%–150%),Shift + 滚轮与横向滑动保留横向滚动\n\n验证:\n- 合并前确认 main 为分支起点 ff21ad9,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web format:check、lint、typecheck、build 通过,Vitest 34 个文件 300 项通过\n- 未运行:后端测试;浏览器原生全屏与真实 Mac 触控板手势未实测\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:13:04-07:00"},{"Sha1":"e40df4d323d530d8e43f53c49c898f046ca59719","Message":"feat(console): 组织架构图支持拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看超出范围的部门,部门多时不便浏览,也无法放大到整个屏幕查看。增加直接拖动、全屏展示和鼠标滚轮缩放。\n\n实现内容:\n- 按住鼠标左键拖动图即可平移,移动超过 4 像素才算拖动,松手时不会误开部门详情;触屏保留原生滚动\n- 新增「全屏」按钮:点击后立即铺满浏览器窗口,并尝试浏览器原生全屏;原生全屏不可用、被拒绝或请求无回应时保持铺满窗口,按 Esc 或「退出全屏」返回\n- 全屏下沿用缩小、放大、原始大小按钮,进出全屏时保持原来位于中心的部门\n- 鼠标滚轮向上放大、向下缩小,以指针为中心,范围仍为 50%–150%;按住 Shift 或横向滑动时保留浏览器原有的横向滚动,并阻止 Ctrl + 滚轮放大整个网页\n- 新增 maximize、minimize 图标,更新页面与全屏提示文案\n- 补充拖动平移、窗口铺满、原生全屏请求无回应、原生全屏 Esc 退出、滚轮缩放共 5 条单测\n\n验证:\n- npm run format:check、lint、typecheck:通过\n- npm run test:34 个测试文件 300 项全部通过\n- npm run build:通过\n- 内置浏览器连接演示环境 p08-alpha 实测:拖动平移与点击、全屏铺满窗口与退出、全屏下按钮与滚轮缩放、滚轮以指针为中心、375 宽窄屏与暗色均正常\n- 未验证:浏览器原生全屏(内置浏览器中原生全屏请求无回应)及真实 Mac 触控板手势\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:11:56-07:00"},{"Sha1":"ff21ad957d0a9077aaf58390df732d1fce85afb1","Message":"feat(auth): 统一认证页样式与控制台登录页一致\n\n业务应用走统一登录时,用户看到的 /login、/oidc/select、/activate 由服务端直接输出,原样式为绿色配色、没有品牌标识,企业选择的每家企业都是同样的实心主按钮,登录失败只有一行红字,与控制台登录页风格不一致。本次只调整 auth.css,不改服务端 HTML、表单字段与 CSP。\n\n实现内容:\n- 配色改为控制台“暖石与墨”:暖白方格底、白色卡片、墨黑主按钮,陶土色只用于链接;焦点环用墨黑,避免与错误红混淆\n- 页面 CSP 为 default-src 'none'; style-src 'self',不能加载图片与字体,左上角品牌标识用伪元素与渐变绘制(墨黑圆角方块内绘锁孔 + “IAM 统一身份认证”),卡片底部统一显示“由 IAM 统一身份认证保护”\n- 企业选择的每家企业改为可点击的列表行(左侧企业名、右侧“进入 →”),悬停描边加深;无可选企业时显示虚线说明框\n- 登录失败提示改为带浅红底色与左侧强调条的提示块;输入框 44px 高,悬停与聚焦有明确状态\n- 暗色跟随系统设置;窄屏(≤520px)缩小留白;卡片入场只做 6px 上移,不从透明淡入,动画未执行时也始终可见,减少动态效果时不播放\n- 同步 docs/handoff/demo-apps-frontend.md:记录本次样式改动、验证方式与部署后的检查项\n\n验证:\n- 按 AccountController 与 ProtocolController 的输出复刻登录、登录失败、选择企业、无可选企业、接受邀请、激活成功 6 种页面,以与服务端相同的 CSP 本地预览,检查亮色、暗色与 375px 宽度,浏览器控制台无 CSP 拦截\n- 核对 LoginSelectionIT 只断言页面引用 /auth.css 且返回 200,不依赖样式内容\n- 未运行:后端测试、IAM 制品构建与真实登录流程中的页面检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:46:38-07:00"},{"Sha1":"4ee4225dec2523e41b58301645a83bb63532ce61","Message":"feat: 合并客户与商机管理和售后服务台演示前端\n\n演示后端 iam-demo-app 已在 main,但缺少前端,-Pdemo-web 无法打包完整页面。本次合入演示前端、控制台“创建交付工单”选项以及方案与交接文档,供后端打包、部署与联调。\n\n实现内容:\n- 演示前端(58e3700):新增 iam-demo-web,CRM 与工单台两套入口,构建输出 iam-demo-web/dist/crm、dist/support,与 demo-web profile 读取路径一致;接入会话门禁、“我的权限”抽屉、tenant_hint 跳转、切换企业与两种退出、客户/商机/跟进/交付、工单流转/转派/处理记录与报表导出\n- 控制台(e295811):平台可批准的程序操作增加 ticket:create(创建交付工单)\n- 文档(efc7c1a):docs/demo-apps.md 原始方案,docs/handoff/demo-apps-backend-01.md 当初的后端建议,docs/handoff/demo-apps-frontend.md 前端交付与部署联调建议\n\n验证:\n- 合并前确认 main 为分支起点 3451213,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- iam-demo-web npm run check 通过(Vitest 30 项);iam-admin-web npm run check 通过(Vitest 295 项)\n- 未运行:-Pdemo-web 打包、后端测试、真实后端联调与内网部署\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:29:48-07:00"},{"Sha1":"efc7c1a07ab3e7fe97ffe18fb71071f10d41d045","Message":"docs(demo): 补充演示应用方案与前后端交接文档\n\n演示应用的原始方案和给后端的建议此前只在本地,前端完成后也缺少交付说明与部署联调的交接。补齐三份文档,记录方案、已确认的决定、前端实际交付与待后端执行的事项。\n\n实现内容:\n- docs/demo-apps.md:CRM 与工单台的功能、页面、权限映射、登录与企业选择体验、阶段二赢单自动建单设计、演示脚本与验收标准;状态标为“原始方案,已据此实现”,与交接文档冲突时以交接文档为准\n- docs/handoff/demo-apps-backend-01.md:当初交给后端评估的建议提示词,保留用于追溯\n- docs/handoff/demo-apps-frontend.md:前端实际交付、对后端合同的处理、前端验证结果与未执行项,以及给后端的打包、部署与联调测试建议\n\n验证:\n- 文档中的命令、路径与测试数量对照本次 iam-demo-web 与 iam-admin-web 的实际检查结果核对\n- 未运行:文档所述的打包、部署与真实联调步骤\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T00:29:00-07:00"}],"HeadCommit":{"Sha1":"fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Message":"feat: 合并组织架构图拖动平移、全屏与滚轮缩放\n\n组织架构图原先只能拉动滚动条查看,部门多时不便浏览,也无法铺满屏幕查看。本次合入 feat/console-layout 上的组织架构图交互增强。\n\n实现内容:\n- 组织架构图(e40df4d):按住鼠标拖动平移且松手不误开详情;「全屏」立即铺满窗口并尝试浏览器原生全屏,Esc 或「退出全屏」返回;全屏下沿用缩放按钮;鼠标滚轮以指针为中心放大缩小(50%–150%),Shift + 滚轮与横向滑动保留横向滚动\n\n验证:\n- 合并前确认 main 为分支起点 ff21ad9,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web format:check、lint、typecheck、build 通过,Vitest 34 个文件 300 项通过\n- 未运行:后端测试;浏览器原生全屏与真实 Mac 触控板手势未实测\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T01:13:04-07:00"},"CompareURL":"pengzhiyu/IAM/compare/36fd0536408149355981d06096633ca3249a035e...fd4d21c62aca9d27e2056be38444fb25cecd9ef5","Len":15}...
|
1792138442
|
Edit
Delete
|
|
38660
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"0c742655b {"Commits":[{"Sha1":"0c742655b78b87ea5d7cd9c43028ad20e7527e25","Message":"fix: 合并控制台应用名称与成员姓名显示修复\n\n企业「应用开通 → 启用新应用」候选列表原先只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐读接口名称字段,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 控制台名称显示(c2dc522):应用候选与应用详情显示应用名称;成员准入、管理员分配、管理员候选、程序身份负责人显示姓名与成员代码,姓名未确认时提示;业务授权候选、用户组候选、业务角色分配按最小披露合同继续只显示成员代码\n\n验证:\n- 合并前确认 main 为分支起点 63f1e0d,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 307 项、构建)\n- 未运行:后端测试;浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:24:14-07:00"},{"Sha1":"c2dc52296ef54797419f350f43456e973fadc03c","Message":"fix(console): 显示应用名称与成员姓名而不只显示代码\n\n企业「应用开通 → 启用新应用」候选列表只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐这些读接口的名称字段,本次在控制台接入。\n\n实现内容:\n- 新增 memberNaming:姓名为主、成员代码为辅;没有姓名或姓名等于代码时只显示代码,仅在 display_name_set 明确为 false 时提示「姓名未确认」\n- 应用开通:候选列表显示应用名称并附代码,搜索提示改为「搜索应用名称或代码」;应用详情优先使用详情接口的 application_name;按成员设置的列表与单人设置显示姓名和成员代码,搜索提示改为按姓名或成员代码查找\n- 企业/平台管理员分配:负责范围显示应用名称(详情补充应用代码),分配对象姓名未确认时提示\n- 管理员候选显示姓名未确认提示;业务授权候选、用户组候选、业务角色分配按后端最小披露合同继续只显示成员代码,不联查成员目录\n- 程序身份:负责人列表、详情、候选显示姓名与成员代码,候选搜索提示改为「搜索姓名或成员代码」;技术细节中企业、应用显示名称(括号内为代码)\n- 新增字段均按可缺失处理,较早的后端不返回时回退显示代码\n\n验证:\n- npm run check:格式、lint、类型检查、307 项测试、构建均通过\n- 新增 display-name-reads.test.tsx 7 项:候选名称与旧后端回退、详情名称优先、成员准入姓名、管理员分配、候选最小披露、负责人候选\n- 未运行:浏览器检查与真实后端联调(需重建 jar 并重启演示环境,本次未做)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:22:03-07:00"},{"Sha1":"63f1e0d5fd0dac58c74be467a927e4f5cab3ce06","Message":"fix: 补齐管理读接口的应用名称与成员姓名\n\n修复启用新应用候选仅显示代码的问题,并补齐原有姓名读取权限内的管理目录展示字段。\n\n实现内容:\n- 补齐应用候选、应用关系、管理员分配及程序身份的应用名称与相关名称搜索\n- 为成员准入、负责人、管理员候选和分配提供姓名及确认标记,保留独立代码字段\n- 保持用户组候选、业务授权候选和业务角色绑定的姓名最小披露边界,不改变权限判断、错误码与排序\n- 增加字段、搜索及权限边界回归测试,同步接口合同并提供九项建议的前端接入交接\n\n验证:\n- Java 25 执行 ./mvnw -B -ntp -pl iam-server -am verify -Dit.test=DisplayNameReadIT,ApplicationManagementIT,AuthorizationManagementIT,ManagementReadIT,ServicePrincipalIT,ManagedDisplayNamesIT -Dfailsafe.failIfNoSpecifiedTests=false:BUILD SUCCESS\n- 291 项单元测试、50 项集成测试通过,失败、错误和跳过均为 0;格式检查、编译、架构检查及后端打包通过\n- git diff --check 与暂存区差异检查通过,交接文档 10 个 JSON 示例解析有效\n- 未运行全部集成测试、性能对照、安全漏洞扫描或前端验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:02:27-07:00"}],"HeadCommit":{"Sha1":"0c742655b78b87ea5d7cd9c43028ad20e7527e25","Message":"fix: 合并控制台应用名称与成员姓名显示修复\n\n企业「应用开通 → 启用新应用」候选列表原先只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐读接口名称字段,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 控制台名称显示(c2dc522):应用候选与应用详情显示应用名称;成员准入、管理员分配、管理员候选、程序身份负责人显示姓名与成员代码,姓名未确认时提示;业务授权候选、用户组候选、业务角色分配按最小披露合同继续只显示成员代码\n\n验证:\n- 合并前确认 main 为分支起点 63f1e0d,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 307 项、构建)\n- 未运行:后端测试;浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:24:14-07:00"},"CompareURL":"pengzhiyu/IAM/compare/fd4d21c62aca9d27e2056be38444fb25cecd9ef5...0c742655b78b87ea5d7cd9c43028ad20e7527e25","Len":3}...
|
1792142761
|
Edit
Delete
|
|
38661
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"0c742655b {"Commits":[{"Sha1":"0c742655b78b87ea5d7cd9c43028ad20e7527e25","Message":"fix: 合并控制台应用名称与成员姓名显示修复\n\n企业「应用开通 → 启用新应用」候选列表原先只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐读接口名称字段,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 控制台名称显示(c2dc522):应用候选与应用详情显示应用名称;成员准入、管理员分配、管理员候选、程序身份负责人显示姓名与成员代码,姓名未确认时提示;业务授权候选、用户组候选、业务角色分配按最小披露合同继续只显示成员代码\n\n验证:\n- 合并前确认 main 为分支起点 63f1e0d,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 307 项、构建)\n- 未运行:后端测试;浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:24:14-07:00"},{"Sha1":"c2dc52296ef54797419f350f43456e973fadc03c","Message":"fix(console): 显示应用名称与成员姓名而不只显示代码\n\n企业「应用开通 → 启用新应用」候选列表只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐这些读接口的名称字段,本次在控制台接入。\n\n实现内容:\n- 新增 memberNaming:姓名为主、成员代码为辅;没有姓名或姓名等于代码时只显示代码,仅在 display_name_set 明确为 false 时提示「姓名未确认」\n- 应用开通:候选列表显示应用名称并附代码,搜索提示改为「搜索应用名称或代码」;应用详情优先使用详情接口的 application_name;按成员设置的列表与单人设置显示姓名和成员代码,搜索提示改为按姓名或成员代码查找\n- 企业/平台管理员分配:负责范围显示应用名称(详情补充应用代码),分配对象姓名未确认时提示\n- 管理员候选显示姓名未确认提示;业务授权候选、用户组候选、业务角色分配按后端最小披露合同继续只显示成员代码,不联查成员目录\n- 程序身份:负责人列表、详情、候选显示姓名与成员代码,候选搜索提示改为「搜索姓名或成员代码」;技术细节中企业、应用显示名称(括号内为代码)\n- 新增字段均按可缺失处理,较早的后端不返回时回退显示代码\n\n验证:\n- npm run check:格式、lint、类型检查、307 项测试、构建均通过\n- 新增 display-name-reads.test.tsx 7 项:候选名称与旧后端回退、详情名称优先、成员准入姓名、管理员分配、候选最小披露、负责人候选\n- 未运行:浏览器检查与真实后端联调(需重建 jar 并重启演示环境,本次未做)\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:22:03-07:00"},{"Sha1":"63f1e0d5fd0dac58c74be467a927e4f5cab3ce06","Message":"fix: 补齐管理读接口的应用名称与成员姓名\n\n修复启用新应用候选仅显示代码的问题,并补齐原有姓名读取权限内的管理目录展示字段。\n\n实现内容:\n- 补齐应用候选、应用关系、管理员分配及程序身份的应用名称与相关名称搜索\n- 为成员准入、负责人、管理员候选和分配提供姓名及确认标记,保留独立代码字段\n- 保持用户组候选、业务授权候选和业务角色绑定的姓名最小披露边界,不改变权限判断、错误码与排序\n- 增加字段、搜索及权限边界回归测试,同步接口合同并提供九项建议的前端接入交接\n\n验证:\n- Java 25 执行 ./mvnw -B -ntp -pl iam-server -am verify -Dit.test=DisplayNameReadIT,ApplicationManagementIT,AuthorizationManagementIT,ManagementReadIT,ServicePrincipalIT,ManagedDisplayNamesIT -Dfailsafe.failIfNoSpecifiedTests=false:BUILD SUCCESS\n- 291 项单元测试、50 项集成测试通过,失败、错误和跳过均为 0;格式检查、编译、架构检查及后端打包通过\n- git diff --check 与暂存区差异检查通过,交接文档 10 个 JSON 示例解析有效\n- 未运行全部集成测试、性能对照、安全漏洞扫描或前端验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:02:27-07:00"}],"HeadCommit":{"Sha1":"0c742655b78b87ea5d7cd9c43028ad20e7527e25","Message":"fix: 合并控制台应用名称与成员姓名显示修复\n\n企业「应用开通 → 启用新应用」候选列表原先只显示应用代码,管理员分配、按成员设置、程序身份负责人等处也只显示代码。后端 63f1e0d 已补齐读接口名称字段,本次合入 feat/console-layout 上的前端接入。\n\n实现内容:\n- 控制台名称显示(c2dc522):应用候选与应用详情显示应用名称;成员准入、管理员分配、管理员候选、程序身份负责人显示姓名与成员代码,姓名未确认时提示;业务授权候选、用户组候选、业务角色分配按最小披露合同继续只显示成员代码\n\n验证:\n- 合并前确认 main 为分支起点 63f1e0d,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 307 项、构建)\n- 未运行:后端测试;浏览器检查与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:24:14-07:00"},"CompareURL":"pengzhiyu/IAM/compare/fd4d21c62aca9d27e2056be38444fb25cecd9ef5...0c742655b78b87ea5d7cd9c43028ad20e7527e25","Len":3}...
|
1792142767
|
Edit
Delete
|
|
38803
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"58745d8c2 {"Commits":[{"Sha1":"58745d8c25c809411e3c9cb00249b911ba89d5db","Message":"fix: 合并业务应用登录回跳与管理工作台门禁修复\n\n演示部署后发现两个问题:从业务应用登录并完成 MFA 后会先进入 IAM 控制台首页再回到业务应用;只能登录业务应用的普通员工也能进入管理工作台外壳。本次合入 feat/console-layout 上的前端修复与交接说明。\n\n实现内容:\n- MFA 回跳(a328b99):完成回执带受控续办地址时成功标记停留后直接整页跳回 /oidc/select,不刷新控制台身份,只有一次导航;refresh 增加 quiet 选项避免流程中页面重挂\n- 认证页文案(c7966f8):品牌字样改为“IAM 统一身份认证”,MFA 副标题由“进入控制台”改为“完成登录”\n- 管理工作台门禁(443dc01):平台角色或任一企业管理角色(逐页读完本人企业)才渲染管理工作台;没有管理身份只显示“IAM 账号中心”个人账号页,读取失败可重试且不放行\n- 交接说明(28fda4f):docs/handoff/login-return-and-console-gate.md,含给后端的部署与改进建议\n\n验证:\n- 合并前确认 main 为分支起点 0c74265,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 36 个文件 314 项、构建)\n- 未运行:后端测试;真实账号 MFA、业务应用全链路与部署环境浏览器验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:44:05-07:00"},{"Sha1":"28fda4f953efc9cdb31bad0fae81ae1b074efce4","Message":"docs(handoff): 补充登录回跳与管理工作台门禁的交接说明\n\n记录演示部署后两个问题的根因、前端修复与验证结果,并整理给后端的部署与改进建议,供 Codex 对照实际项目判断后执行。\n\n实现内容:\n- 说明 MFA 完成后双导航竞争与缺少管理身份门禁两个根因,以及对应的三个前端提交\n- 给后端的建议:重新打包部署控制台、服务端 /login 页品牌文案、可选的统一控制台准入结果接口、可选的 MFA 续办提示\n- 列出部署后人工验收项\n\n验证:\n- 文档内容与 a328b99、c7966f8、443dc01 的实际改动及测试结果逐项核对\n- 文档无可运行检查;未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:43:06-07:00"},{"Sha1":"443dc01bf44b0bb0a93a6e9ff2f715adacb09ab9","Message":"feat(console): 没有管理身份的账号只显示个人账号页\n\n原先只要能登录就渲染管理工作台壳层,只能登录业务应用的普通员工也能看到侧栏、工作台和企业入口(管理数据由后端逐接口拒绝)。增加管理身份门禁,普通员工只保留本人账号安全设置。\n\n实现内容:\n- 新增 shell/admission.ts:平台角色非空直接放行,不发请求;否则逐页读取 /api/v1/me/tenants?limit=100(不只看第一页,偏移上限 100000),任一企业 admin_roles 非空即放行并停止读取;业务应用角色不计入\n- ProtectedRoute 已登录后经 AdminGate:读取中显示加载页,读取失败显示可重试的故障页(不放行也不降级),有管理身份渲染 AppShell,否则渲染 MemberShell;登录、MFA、邮件链接路由不受门禁影响\n- 新增 MemberShell:顶部为“IAM 账号中心”品牌、主题切换与账号菜单,内容为个人中心;不渲染侧栏、上下文切换和命令面板,其他控制台地址一律改到 /me\n- 新增 useOptionalScope;PersonalPage 不在控制台壳层内时隐藏“切换企业”并改用不提管理功能的企业说明\n- layout.css 增加个人账号页顶部条样式与 600px 以下窄屏留白\n- login-handoff.test.tsx 增加 4 项门禁测试,personal.test.tsx 补充 useOptionalScope 模拟\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 36 个文件 314 项、Vite 构建全部通过\n- 新增测试覆盖:普通员工被改到 /me 且企业读两页、第二页才有管理角色时放行、有平台角色时不为门禁读取企业、读取失败可重试\n- 真实员工账号与部署环境浏览器验收:未运行;角色在会话中途被撤销时,界面在下次身份复核或重新登录后才切换,期间仍由后端拒绝管理接口\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:55-07:00"},{"Sha1":"c7966f8b5cfc3fb5a6b26c349ecb7d84b9cb7f30","Message":"fix(console): 认证页品牌与 MFA 提示不再写成进入控制台\n\n从业务应用登录的员工同样经过登录与 MFA 页面,原文案“IAM 控制台”“即可进入控制台”会让人误以为要进入管理后台。改为对两种登录目的都成立的中性说法。\n\n实现内容:\n- AuthShell 顶部品牌字样由“IAM 控制台”改为“IAM 统一身份认证”,同步更新组件注释\n- MFA 页三处副标题由“进入控制台”改为“完成登录”;标题、步骤与按钮不变\n\n验证:\n- npx vitest run:36 个文件 310 项通过;首次全量运行时 group-lifecycle.test.tsx 的“404显示可聚焦完整错误”偶发失败 1 次,该文件单独连续运行 3 次及全量重跑均通过,与本次文案无关\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 浏览器:本机 Vite 开发服务器登录页已显示新品牌字样;服务端渲染的 /login 页面不在本次范围\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:20-07:00"},{"Sha1":"a328b990fc462631d30a0a07378f2ee4fe39c0bf","Message":"fix(console): 业务应用登录完成 MFA 后只回跳一次\n\n从业务应用登录并完成 MFA 后,页面会先进入 IAM 控制台首页,过一会儿才回到业务应用。原因是完成回调先刷新身份(状态切到 checking 卸载了 MFA 面板),身份读回后重新挂载的面板拿不到续办地址,把人导航到首页;随后旧回调才整页跳回 /oidc/select,形成两个导航负责人竞争。\n\n实现内容:\n- MfaPage 完成回执带受控续办地址(只接受 /oidc/select?transaction=\u003cuuid\u003e)时,成功标记停留后直接整页跳转,不刷新控制台身份,全程只有这一次导航\n- 没有续办地址(直接登录控制台)时才刷新身份并进入工作台;恢复码仍须勾选已保存后才继续,外部 next 仍不接受\n- AuthProvider 的 refresh 增加 quiet 选项:读取期间不切到 checking,只在拿到结果后一次性更新,避免流程中页面被卸载重挂\n- 新增 login-handoff.test.tsx:用正式路由树与真实 AuthProvider 覆盖已绑定验证、首次绑定并保存恢复码、减少动态效果三种情况\n\n验证:\n- npx vitest run:36 个文件 310 项通过;新增 3 项在 MfaPage 还原为修复前版本时有 2 项失败,能复现原问题\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 真实账号 MFA 与业务应用全链路浏览器验收:未运行,需重新部署后人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:41:39-07:00"}],"HeadCommit":{"Sha1":"58745d8c25c809411e3c9cb00249b911ba89d5db","Message":"fix: 合并业务应用登录回跳与管理工作台门禁修复\n\n演示部署后发现两个问题:从业务应用登录并完成 MFA 后会先进入 IAM 控制台首页再回到业务应用;只能登录业务应用的普通员工也能进入管理工作台外壳。本次合入 feat/console-layout 上的前端修复与交接说明。\n\n实现内容:\n- MFA 回跳(a328b99):完成回执带受控续办地址时成功标记停留后直接整页跳回 /oidc/select,不刷新控制台身份,只有一次导航;refresh 增加 quiet 选项避免流程中页面重挂\n- 认证页文案(c7966f8):品牌字样改为“IAM 统一身份认证”,MFA 副标题由“进入控制台”改为“完成登录”\n- 管理工作台门禁(443dc01):平台角色或任一企业管理角色(逐页读完本人企业)才渲染管理工作台;没有管理身份只显示“IAM 账号中心”个人账号页,读取失败可重试且不放行\n- 交接说明(28fda4f):docs/handoff/login-return-and-console-gate.md,含给后端的部署与改进建议\n\n验证:\n- 合并前确认 main 为分支起点 0c74265,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 36 个文件 314 项、构建)\n- 未运行:后端测试;真实账号 MFA、业务应用全链路与部署环境浏览器验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:44:05-07:00"},"CompareURL":"pengzhiyu/IAM/compare/0c742655b78b87ea5d7cd9c43028ad20e7527e25...58745d8c25c809411e3c9cb00249b911ba89d5db","Len":5}...
|
1792205215
|
Edit
Delete
|
|
38804
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"28fda4f95 {"Commits":[{"Sha1":"28fda4f953efc9cdb31bad0fae81ae1b074efce4","Message":"docs(handoff): 补充登录回跳与管理工作台门禁的交接说明\n\n记录演示部署后两个问题的根因、前端修复与验证结果,并整理给后端的部署与改进建议,供 Codex 对照实际项目判断后执行。\n\n实现内容:\n- 说明 MFA 完成后双导航竞争与缺少管理身份门禁两个根因,以及对应的三个前端提交\n- 给后端的建议:重新打包部署控制台、服务端 /login 页品牌文案、可选的统一控制台准入结果接口、可选的 MFA 续办提示\n- 列出部署后人工验收项\n\n验证:\n- 文档内容与 a328b99、c7966f8、443dc01 的实际改动及测试结果逐项核对\n- 文档无可运行检查;未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:43:06-07:00"},{"Sha1":"443dc01bf44b0bb0a93a6e9ff2f715adacb09ab9","Message":"feat(console): 没有管理身份的账号只显示个人账号页\n\n原先只要能登录就渲染管理工作台壳层,只能登录业务应用的普通员工也能看到侧栏、工作台和企业入口(管理数据由后端逐接口拒绝)。增加管理身份门禁,普通员工只保留本人账号安全设置。\n\n实现内容:\n- 新增 shell/admission.ts:平台角色非空直接放行,不发请求;否则逐页读取 /api/v1/me/tenants?limit=100(不只看第一页,偏移上限 100000),任一企业 admin_roles 非空即放行并停止读取;业务应用角色不计入\n- ProtectedRoute 已登录后经 AdminGate:读取中显示加载页,读取失败显示可重试的故障页(不放行也不降级),有管理身份渲染 AppShell,否则渲染 MemberShell;登录、MFA、邮件链接路由不受门禁影响\n- 新增 MemberShell:顶部为“IAM 账号中心”品牌、主题切换与账号菜单,内容为个人中心;不渲染侧栏、上下文切换和命令面板,其他控制台地址一律改到 /me\n- 新增 useOptionalScope;PersonalPage 不在控制台壳层内时隐藏“切换企业”并改用不提管理功能的企业说明\n- layout.css 增加个人账号页顶部条样式与 600px 以下窄屏留白\n- login-handoff.test.tsx 增加 4 项门禁测试,personal.test.tsx 补充 useOptionalScope 模拟\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 36 个文件 314 项、Vite 构建全部通过\n- 新增测试覆盖:普通员工被改到 /me 且企业读两页、第二页才有管理角色时放行、有平台角色时不为门禁读取企业、读取失败可重试\n- 真实员工账号与部署环境浏览器验收:未运行;角色在会话中途被撤销时,界面在下次身份复核或重新登录后才切换,期间仍由后端拒绝管理接口\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:55-07:00"},{"Sha1":"c7966f8b5cfc3fb5a6b26c349ecb7d84b9cb7f30","Message":"fix(console): 认证页品牌与 MFA 提示不再写成进入控制台\n\n从业务应用登录的员工同样经过登录与 MFA 页面,原文案“IAM 控制台”“即可进入控制台”会让人误以为要进入管理后台。改为对两种登录目的都成立的中性说法。\n\n实现内容:\n- AuthShell 顶部品牌字样由“IAM 控制台”改为“IAM 统一身份认证”,同步更新组件注释\n- MFA 页三处副标题由“进入控制台”改为“完成登录”;标题、步骤与按钮不变\n\n验证:\n- npx vitest run:36 个文件 310 项通过;首次全量运行时 group-lifecycle.test.tsx 的“404显示可聚焦完整错误”偶发失败 1 次,该文件单独连续运行 3 次及全量重跑均通过,与本次文案无关\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 浏览器:本机 Vite 开发服务器登录页已显示新品牌字样;服务端渲染的 /login 页面不在本次范围\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:20-07:00"},{"Sha1":"a328b990fc462631d30a0a07378f2ee4fe39c0bf","Message":"fix(console): 业务应用登录完成 MFA 后只回跳一次\n\n从业务应用登录并完成 MFA 后,页面会先进入 IAM 控制台首页,过一会儿才回到业务应用。原因是完成回调先刷新身份(状态切到 checking 卸载了 MFA 面板),身份读回后重新挂载的面板拿不到续办地址,把人导航到首页;随后旧回调才整页跳回 /oidc/select,形成两个导航负责人竞争。\n\n实现内容:\n- MfaPage 完成回执带受控续办地址(只接受 /oidc/select?transaction=\u003cuuid\u003e)时,成功标记停留后直接整页跳转,不刷新控制台身份,全程只有这一次导航\n- 没有续办地址(直接登录控制台)时才刷新身份并进入工作台;恢复码仍须勾选已保存后才继续,外部 next 仍不接受\n- AuthProvider 的 refresh 增加 quiet 选项:读取期间不切到 checking,只在拿到结果后一次性更新,避免流程中页面被卸载重挂\n- 新增 login-handoff.test.tsx:用正式路由树与真实 AuthProvider 覆盖已绑定验证、首次绑定并保存恢复码、减少动态效果三种情况\n\n验证:\n- npx vitest run:36 个文件 310 项通过;新增 3 项在 MfaPage 还原为修复前版本时有 2 项失败,能复现原问题\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 真实账号 MFA 与业务应用全链路浏览器验收:未运行,需重新部署后人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:41:39-07:00"}],"HeadCommit":{"Sha1":"28fda4f953efc9cdb31bad0fae81ae1b074efce4","Message":"docs(handoff): 补充登录回跳与管理工作台门禁的交接说明\n\n记录演示部署后两个问题的根因、前端修复与验证结果,并整理给后端的部署与改进建议,供 Codex 对照实际项目判断后执行。\n\n实现内容:\n- 说明 MFA 完成后双导航竞争与缺少管理身份门禁两个根因,以及对应的三个前端提交\n- 给后端的建议:重新打包部署控制台、服务端 /login 页品牌文案、可选的统一控制台准入结果接口、可选的 MFA 续办提示\n- 列出部署后人工验收项\n\n验证:\n- 文档内容与 a328b99、c7966f8、443dc01 的实际改动及测试结果逐项核对\n- 文档无可运行检查;未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:43:06-07:00"},"CompareURL":"pengzhiyu/IAM/compare/0c742655b78b87ea5d7cd9c43028ad20e7527e25...28fda4f953efc9cdb31bad0fae81ae1b074efce4","Len":4}...
|
1792205228
|
Edit
Delete
|
|
38819
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"6ab56b752 {"Commits":[{"Sha1":"6ab56b752dc0439c6c33c0e9943e2ede21a3f5b7","Message":"feat: 合并隐藏无权进入的平台与应用入口\n\n用户验收后提出,只负责企业的管理员不应看到平台管理与应用列表入口。按“进不去的入口一律不显示”的统一规则,合入 feat/console-layout 上的前端调整。\n\n实现内容:\n- 入口隐藏(3ddc9da):侧栏无权分组整组隐藏;切换弹窗的平台入口只对平台管理员显示;工作台入口卡只渲染可进入的入口(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个,单入口整行横排);工作台账号卡不再显示“没有平台管理身份”\n\n验证:\n- 合并前确认分支基于 28fda4f,main 在其后只有合并提交 58745d8,与分支内容无冲突;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 37 个文件 319 项、构建)\n- 未运行:后端测试;真实企业管理员、应用管理员账号的整页走查与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:38:26-07:00"},{"Sha1":"3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f","Message":"feat(console): 隐藏没有权限进入的平台与应用入口\n\n只负责企业的管理员原先仍能在侧栏、切换弹窗和工作台看到上锁的“平台管理”“应用”入口及说明,容易分散注意力、引出“是否缺少权限”的疑问。统一改为“进不去的入口一律不显示”,让各角色只看到与自己职责相关的入口。\n\n实现内容:\n- 侧栏:分组按 visible 过滤,平台分组只对平台管理员、应用分组只对平台管理员与应用管理员显示;展开与收起形态一致,删除不再使用的锁定说明与 .side-group__note 样式\n- 切换弹窗:平台入口与“或进入企业”分隔只对 PLATFORM_ADMIN 显示;应用管理员与只负责企业的管理员直接从企业列表开始,初始焦点回退到弹窗内第一个可聚焦元素\n- 工作台:入口卡只渲染可进入的(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个),去掉锁定样式;入口数量写入 data-entrance-group 决定列数与入场顺延;单入口整行横排,600px 以下改回竖排;账号卡没有平台角色时不再显示“没有平台管理身份”\n- 测试:新增 context-switcher.test.tsx 3 项;sidebar.test.tsx 增加只负责企业的管理员展开/收起 2 项并改写应用管理员用例;home.test.tsx 按新规则改写 3 项\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 37 个文件 319 项、Vite 构建全部通过\n- 将侧栏、切换弹窗、工作台三个组件临时还原为修改前版本时,新增与改写的 7 项测试失败,能发现旧行为\n- 浏览器:在本机 Vite 开发服务器页面临时插入入口卡样例标记,检查 1280、800、375 宽度与暗色模式下单入口与双入口布局;375 宽度发现单入口对齐错误并已修正\n- 未运行:真实企业管理员、应用管理员账号的整页走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:32:27-07:00"}],"HeadCommit":{"Sha1":"6ab56b752dc0439c6c33c0e9943e2ede21a3f5b7","Message":"feat: 合并隐藏无权进入的平台与应用入口\n\n用户验收后提出,只负责企业的管理员不应看到平台管理与应用列表入口。按“进不去的入口一律不显示”的统一规则,合入 feat/console-layout 上的前端调整。\n\n实现内容:\n- 入口隐藏(3ddc9da):侧栏无权分组整组隐藏;切换弹窗的平台入口只对平台管理员显示;工作台入口卡只渲染可进入的入口(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个,单入口整行横排);工作台账号卡不再显示“没有平台管理身份”\n\n验证:\n- 合并前确认分支基于 28fda4f,main 在其后只有合并提交 58745d8,与分支内容无冲突;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 37 个文件 319 项、构建)\n- 未运行:后端测试;真实企业管理员、应用管理员账号的整页走查与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:38:26-07:00"},"CompareURL":"pengzhiyu/IAM/compare/58745d8c25c809411e3c9cb00249b911ba89d5db...6ab56b752dc0439c6c33c0e9943e2ede21a3f5b7","Len":2}...
|
1792208454
|
Edit
Delete
|
|
38821
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/fix/display-name-reads
|
0
|
|
1792208460
|
Edit
Delete
|
|
38822
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/fix/display-name-reads
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"63f1e0d5fd0dac58c74be467a927e4f5cab3ce06","Message":"fix: 补齐管理读接口的应用名称与成员姓名\n\n修复启用新应用候选仅显示代码的问题,并补齐原有姓名读取权限内的管理目录展示字段。\n\n实现内容:\n- 补齐应用候选、应用关系、管理员分配及程序身份的应用名称与相关名称搜索\n- 为成员准入、负责人、管理员候选和分配提供姓名及确认标记,保留独立代码字段\n- 保持用户组候选、业务授权候选和业务角色绑定的姓名最小披露边界,不改变权限判断、错误码与排序\n- 增加字段、搜索及权限边界回归测试,同步接口合同并提供九项建议的前端接入交接\n\n验证:\n- Java 25 执行 ./mvnw -B -ntp -pl iam-server -am verify -Dit.test=DisplayNameReadIT,ApplicationManagementIT,AuthorizationManagementIT,ManagementReadIT,ServicePrincipalIT,ManagedDisplayNamesIT -Dfailsafe.failIfNoSpecifiedTests=false:BUILD SUCCESS\n- 291 项单元测试、50 项集成测试通过,失败、错误和跳过均为 0;格式检查、编译、架构检查及后端打包通过\n- git diff --check 与暂存区差异检查通过,交接文档 10 个 JSON 示例解析有效\n- 未运行全部集成测试、性能对照、安全漏洞扫描或前端验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T02:02:27-07:00"},"CompareURL":"pengzhiyu/IAM/compare/main...63f1e0d5fd0dac58c74be467a927e4f5cab3ce06","Len":0}...
|
1792208460
|
Edit
Delete
|
|
38823
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"3ddc9da39 {"Commits":[{"Sha1":"3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f","Message":"feat(console): 隐藏没有权限进入的平台与应用入口\n\n只负责企业的管理员原先仍能在侧栏、切换弹窗和工作台看到上锁的“平台管理”“应用”入口及说明,容易分散注意力、引出“是否缺少权限”的疑问。统一改为“进不去的入口一律不显示”,让各角色只看到与自己职责相关的入口。\n\n实现内容:\n- 侧栏:分组按 visible 过滤,平台分组只对平台管理员、应用分组只对平台管理员与应用管理员显示;展开与收起形态一致,删除不再使用的锁定说明与 .side-group__note 样式\n- 切换弹窗:平台入口与“或进入企业”分隔只对 PLATFORM_ADMIN 显示;应用管理员与只负责企业的管理员直接从企业列表开始,初始焦点回退到弹窗内第一个可聚焦元素\n- 工作台:入口卡只渲染可进入的(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个),去掉锁定样式;入口数量写入 data-entrance-group 决定列数与入场顺延;单入口整行横排,600px 以下改回竖排;账号卡没有平台角色时不再显示“没有平台管理身份”\n- 测试:新增 context-switcher.test.tsx 3 项;sidebar.test.tsx 增加只负责企业的管理员展开/收起 2 项并改写应用管理员用例;home.test.tsx 按新规则改写 3 项\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 37 个文件 319 项、Vite 构建全部通过\n- 将侧栏、切换弹窗、工作台三个组件临时还原为修改前版本时,新增与改写的 7 项测试失败,能发现旧行为\n- 浏览器:在本机 Vite 开发服务器页面临时插入入口卡样例标记,检查 1280、800、375 宽度与暗色模式下单入口与双入口布局;375 宽度发现单入口对齐错误并已修正\n- 未运行:真实企业管理员、应用管理员账号的整页走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:32:27-07:00"}],"HeadCommit":{"Sha1":"3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f","Message":"feat(console): 隐藏没有权限进入的平台与应用入口\n\n只负责企业的管理员原先仍能在侧栏、切换弹窗和工作台看到上锁的“平台管理”“应用”入口及说明,容易分散注意力、引出“是否缺少权限”的疑问。统一改为“进不去的入口一律不显示”,让各角色只看到与自己职责相关的入口。\n\n实现内容:\n- 侧栏:分组按 visible 过滤,平台分组只对平台管理员、应用分组只对平台管理员与应用管理员显示;展开与收起形态一致,删除不再使用的锁定说明与 .side-group__note 样式\n- 切换弹窗:平台入口与“或进入企业”分隔只对 PLATFORM_ADMIN 显示;应用管理员与只负责企业的管理员直接从企业列表开始,初始焦点回退到弹窗内第一个可聚焦元素\n- 工作台:入口卡只渲染可进入的(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个),去掉锁定样式;入口数量写入 data-entrance-group 决定列数与入场顺延;单入口整行横排,600px 以下改回竖排;账号卡没有平台角色时不再显示“没有平台管理身份”\n- 测试:新增 context-switcher.test.tsx 3 项;sidebar.test.tsx 增加只负责企业的管理员展开/收起 2 项并改写应用管理员用例;home.test.tsx 按新规则改写 3 项\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 37 个文件 319 项、Vite 构建全部通过\n- 将侧栏、切换弹窗、工作台三个组件临时还原为修改前版本时,新增与改写的 7 项测试失败,能发现旧行为\n- 浏览器:在本机 Vite 开发服务器页面临时插入入口卡样例标记,检查 1280、800、375 宽度与暗色模式下单入口与双入口布局;375 宽度发现单入口对齐错误并已修正\n- 未运行:真实企业管理员、应用管理员账号的整页走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:32:27-07:00"},"CompareURL":"pengzhiyu/IAM/compare/28fda4f953efc9cdb31bad0fae81ae1b074efce4...3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f","Len":1}...
|
1792208469
|
Edit
Delete
|
|
38824
|
16
|
17
|
16
|
125
|
0
|
0
|
refs/heads/fix/display-name-reads
|
0
|
|
1792208480
|
Edit
Delete
|
|
39271
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"06daf4a65 {"Commits":[{"Sha1":"06daf4a651e1a490ace181ac708099def39e8de0","Message":"fix: 合并邀请页密码要求说明与激活错误反馈修复\n\n用户发现从邀请邮件进入接受邀请页时,设置过短的新密码只会看到\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。本次合入 feat/console-layout 上的前端修复,让用户能按提示修改后重新提交。\n\n实现内容:\n- 邀请页修复(765bf82):api.ts 导出 apiErrorFromResponse 供 /activate 失败时复用错误体解析;激活仍以 urlencoded 表单提交、只按状态码判定 HTML 成功响应;密码字段说明新账号须为 12—128 个字符,不对已有账号原密码做最短长度拦截;INVALID_PASSWORD 显示在密码字段下方并聚焦,INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT、401/403、429、网络异常与 5xx 分别给出固定安全文案\n\n验证:\n- 合并前确认分支基于 main 63544c6,main 在其后没有新提交;主目录未提交改动仅在 scripts/experience/、docs/handoff/demo-video-env-01.md 与 iam-demo-video/,与本次合并没有共同文件\n- 分支上 iam-admin-web 的 format:check、typecheck、lint 通过\n- 未运行:Vitest 单元测试、构建、后端测试、浏览器检查与真实邀请激活\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:53-07:00"},{"Sha1":"765bf820452bc4d64f63ed449b249fafcfc1f60d","Message":"fix(console): 邀请页说明新密码要求并按错误码反馈激活失败\n\n接受邀请页没有说明新账号密码须为 12—128 个字符;激活失败时直接构造不带错误码的 ApiError,INVALID_PASSWORD 等错误码丢失,页面只能显示\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。\n\n实现内容:\n- api.ts 将内部 toApiError 改名并导出为 apiErrorFromResponse,供成功时返回 HTML 的 /activate 在失败时复用错误体解析;request 的行为不变\n- 激活改由 submitActivation 提交:保持 urlencoded 表单,不设 Accept: application/json,只按状态码判定成功、不解析 HTML 正文;失败时保留 HTTP 状态、code、trace_id 与纯数字 Retry-After;401/403 丢弃缓存的 CSRF 令牌,供用户手动重新提交;不自动重试\n- 密码字段说明改为\"已有 IAM 账号请填写原密码;新账号请设置 12—128 个字符的密码\";因页面分不清新旧账号,不设 minLength、不在提交前拦截短密码,只拦截空密码\n- 新增 activationFailure 映射:INVALID_PASSWORD 显示在密码字段下方并在渲染后聚焦,不叠加顶部告警;INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT 使用固定文案,不判断账号是否存在;401/403 只说明未通过安全校验,不断言令牌失效;404/409 其他情况与未知错误码安全回退;429 使用有效的 Retry-After;网络异常与 5xx 显示\"提交结果未知\";获取安全令牌失败显示\"邀请尚未提交\"\n- 告警标题随反馈类型变化并显示追踪编号;找回密码、验证邮箱页继续使用原有 failureCopy 文案\n\n验证:\n- npm --prefix iam-admin-web run format:check:通过\n- npm --prefix iam-admin-web run typecheck:通过\n- npm --prefix iam-admin-web run lint:通过\n- 本地演示 IAM 上用 curl 以无效凭据 POST /activate:返回 400 JSON,含 code=INVALID_ACTIVATION、message、trace_id,确认失败响应可按错误码解析\n- 单元测试、浏览器检查与真实邀请激活:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:01-07:00"},{"Sha1":"63544c67bb5cd377f09d6696006f02363a77353a","Message":"fix(auth): 修复会话过期后刷新页面返回认证错误\n\n过期身份在页面路由执行前被统一返回 401 JSON,导致首次刷新无法进入登录页。\n\n实现内容:\n- 控制台页面清理失效会话后跳转登录页,携带过期提示和安全编码的返回地址\n- 公开页面和静态资源按匿名继续处理,API 保留原 401 JSON 响应\n- 协议授权 GET 请求恢复原匿名登录流程,保留其他协议端点的错误契约\n- 补充地址边界、空闲与绝对到期、账号失效及跨实例身份清理回归测试\n\n验证:\n- Java 25 下服务端 223 项及依赖模块 95 项单元测试通过\n- SessionPageIT、SessionLifecycleIT、LoginSelectionIT、ProtocolIT、PackagedConsoleIT、BrowserSecurityIT 共 69 项集成测试最终通过\n- 新增用例修正绝对跳转地址断言和双时钟测试准备后,重跑 SessionPageIT 17 项全部通过\n- Maven 编译、Spotless 格式检查及 git diff --check 通过\n- 未运行全部集成测试,未进行真实浏览器等待过期后的人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:32:14-07:00"}],"HeadCommit":{"Sha1":"06daf4a651e1a490ace181ac708099def39e8de0","Message":"fix: 合并邀请页密码要求说明与激活错误反馈修复\n\n用户发现从邀请邮件进入接受邀请页时,设置过短的新密码只会看到\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。本次合入 feat/console-layout 上的前端修复,让用户能按提示修改后重新提交。\n\n实现内容:\n- 邀请页修复(765bf82):api.ts 导出 apiErrorFromResponse 供 /activate 失败时复用错误体解析;激活仍以 urlencoded 表单提交、只按状态码判定 HTML 成功响应;密码字段说明新账号须为 12—128 个字符,不对已有账号原密码做最短长度拦截;INVALID_PASSWORD 显示在密码字段下方并聚焦,INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT、401/403、429、网络异常与 5xx 分别给出固定安全文案\n\n验证:\n- 合并前确认分支基于 main 63544c6,main 在其后没有新提交;主目录未提交改动仅在 scripts/experience/、docs/handoff/demo-video-env-01.md 与 iam-demo-video/,与本次合并没有共同文件\n- 分支上 iam-admin-web 的 format:check、typecheck、lint 通过\n- 未运行:Vitest 单元测试、构建、后端测试、浏览器检查与真实邀请激活\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:53-07:00"},"CompareURL":"pengzhiyu/IAM/compare/6ab56b752dc0439c6c33c0e9943e2ede21a3f5b7...06daf4a651e1a490ace181ac708099def39e8de0","Len":3}...
|
1792382356
|
Edit
Delete
|
|
39272
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"06daf4a65 {"Commits":[{"Sha1":"06daf4a651e1a490ace181ac708099def39e8de0","Message":"fix: 合并邀请页密码要求说明与激活错误反馈修复\n\n用户发现从邀请邮件进入接受邀请页时,设置过短的新密码只会看到\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。本次合入 feat/console-layout 上的前端修复,让用户能按提示修改后重新提交。\n\n实现内容:\n- 邀请页修复(765bf82):api.ts 导出 apiErrorFromResponse 供 /activate 失败时复用错误体解析;激活仍以 urlencoded 表单提交、只按状态码判定 HTML 成功响应;密码字段说明新账号须为 12—128 个字符,不对已有账号原密码做最短长度拦截;INVALID_PASSWORD 显示在密码字段下方并聚焦,INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT、401/403、429、网络异常与 5xx 分别给出固定安全文案\n\n验证:\n- 合并前确认分支基于 main 63544c6,main 在其后没有新提交;主目录未提交改动仅在 scripts/experience/、docs/handoff/demo-video-env-01.md 与 iam-demo-video/,与本次合并没有共同文件\n- 分支上 iam-admin-web 的 format:check、typecheck、lint 通过\n- 未运行:Vitest 单元测试、构建、后端测试、浏览器检查与真实邀请激活\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:53-07:00"},{"Sha1":"765bf820452bc4d64f63ed449b249fafcfc1f60d","Message":"fix(console): 邀请页说明新密码要求并按错误码反馈激活失败\n\n接受邀请页没有说明新账号密码须为 12—128 个字符;激活失败时直接构造不带错误码的 ApiError,INVALID_PASSWORD 等错误码丢失,页面只能显示\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。\n\n实现内容:\n- api.ts 将内部 toApiError 改名并导出为 apiErrorFromResponse,供成功时返回 HTML 的 /activate 在失败时复用错误体解析;request 的行为不变\n- 激活改由 submitActivation 提交:保持 urlencoded 表单,不设 Accept: application/json,只按状态码判定成功、不解析 HTML 正文;失败时保留 HTTP 状态、code、trace_id 与纯数字 Retry-After;401/403 丢弃缓存的 CSRF 令牌,供用户手动重新提交;不自动重试\n- 密码字段说明改为\"已有 IAM 账号请填写原密码;新账号请设置 12—128 个字符的密码\";因页面分不清新旧账号,不设 minLength、不在提交前拦截短密码,只拦截空密码\n- 新增 activationFailure 映射:INVALID_PASSWORD 显示在密码字段下方并在渲染后聚焦,不叠加顶部告警;INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT 使用固定文案,不判断账号是否存在;401/403 只说明未通过安全校验,不断言令牌失效;404/409 其他情况与未知错误码安全回退;429 使用有效的 Retry-After;网络异常与 5xx 显示\"提交结果未知\";获取安全令牌失败显示\"邀请尚未提交\"\n- 告警标题随反馈类型变化并显示追踪编号;找回密码、验证邮箱页继续使用原有 failureCopy 文案\n\n验证:\n- npm --prefix iam-admin-web run format:check:通过\n- npm --prefix iam-admin-web run typecheck:通过\n- npm --prefix iam-admin-web run lint:通过\n- 本地演示 IAM 上用 curl 以无效凭据 POST /activate:返回 400 JSON,含 code=INVALID_ACTIVATION、message、trace_id,确认失败响应可按错误码解析\n- 单元测试、浏览器检查与真实邀请激活:未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:01-07:00"},{"Sha1":"63544c67bb5cd377f09d6696006f02363a77353a","Message":"fix(auth): 修复会话过期后刷新页面返回认证错误\n\n过期身份在页面路由执行前被统一返回 401 JSON,导致首次刷新无法进入登录页。\n\n实现内容:\n- 控制台页面清理失效会话后跳转登录页,携带过期提示和安全编码的返回地址\n- 公开页面和静态资源按匿名继续处理,API 保留原 401 JSON 响应\n- 协议授权 GET 请求恢复原匿名登录流程,保留其他协议端点的错误契约\n- 补充地址边界、空闲与绝对到期、账号失效及跨实例身份清理回归测试\n\n验证:\n- Java 25 下服务端 223 项及依赖模块 95 项单元测试通过\n- SessionPageIT、SessionLifecycleIT、LoginSelectionIT、ProtocolIT、PackagedConsoleIT、BrowserSecurityIT 共 69 项集成测试最终通过\n- 新增用例修正绝对跳转地址断言和双时钟测试准备后,重跑 SessionPageIT 17 项全部通过\n- Maven 编译、Spotless 格式检查及 git diff --check 通过\n- 未运行全部集成测试,未进行真实浏览器等待过期后的人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:32:14-07:00"},{"Sha1":"6ab56b752dc0439c6c33c0e9943e2ede21a3f5b7","Message":"feat: 合并隐藏无权进入的平台与应用入口\n\n用户验收后提出,只负责企业的管理员不应看到平台管理与应用列表入口。按“进不去的入口一律不显示”的统一规则,合入 feat/console-layout 上的前端调整。\n\n实现内容:\n- 入口隐藏(3ddc9da):侧栏无权分组整组隐藏;切换弹窗的平台入口只对平台管理员显示;工作台入口卡只渲染可进入的入口(平台管理员 3 个、应用管理员 2 个、只负责企业的管理员 1 个,单入口整行横排);工作台账号卡不再显示“没有平台管理身份”\n\n验证:\n- 合并前确认分支基于 28fda4f,main 在其后只有合并提交 58745d8,与分支内容无冲突;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 37 个文件 319 项、构建)\n- 未运行:后端测试;真实企业管理员、应用管理员账号的整页走查与部署环境验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T20:38:26-07:00"},{"Sha1":"58745d8c25c809411e3c9cb00249b911ba89d5db","Message":"fix: 合并业务应用登录回跳与管理工作台门禁修复\n\n演示部署后发现两个问题:从业务应用登录并完成 MFA 后会先进入 IAM 控制台首页再回到业务应用;只能登录业务应用的普通员工也能进入管理工作台外壳。本次合入 feat/console-layout 上的前端修复与交接说明。\n\n实现内容:\n- MFA 回跳(a328b99):完成回执带受控续办地址时成功标记停留后直接整页跳回 /oidc/select,不刷新控制台身份,只有一次导航;refresh 增加 quiet 选项避免流程中页面重挂\n- 认证页文案(c7966f8):品牌字样改为“IAM 统一身份认证”,MFA 副标题由“进入控制台”改为“完成登录”\n- 管理工作台门禁(443dc01):平台角色或任一企业管理角色(逐页读完本人企业)才渲染管理工作台;没有管理身份只显示“IAM 账号中心”个人账号页,读取失败可重试且不放行\n- 交接说明(28fda4f):docs/handoff/login-return-and-console-gate.md,含给后端的部署与改进建议\n\n验证:\n- 合并前确认 main 为分支起点 0c74265,无分叉;主目录未提交改动仅在 scripts/experience/,与本次合并没有共同文件\n- 分支上 iam-admin-web npm run check 通过(格式、lint、类型检查、Vitest 36 个文件 314 项、构建)\n- 未运行:后端测试;真实账号 MFA、业务应用全链路与部署环境浏览器验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:44:05-07:00"}],"HeadCommit":{"Sha1":"06daf4a651e1a490ace181ac708099def39e8de0","Message":"fix: 合并邀请页密码要求说明与激活错误反馈修复\n\n用户发现从邀请邮件进入接受邀请页时,设置过短的新密码只会看到\"请求未完成,安全令牌失效时刷新页面重试\"的通用提示。本次合入 feat/console-layout 上的前端修复,让用户能按提示修改后重新提交。\n\n实现内容:\n- 邀请页修复(765bf82):api.ts 导出 apiErrorFromResponse 供 /activate 失败时复用错误体解析;激活仍以 urlencoded 表单提交、只按状态码判定 HTML 成功响应;密码字段说明新账号须为 12—128 个字符,不对已有账号原密码做最短长度拦截;INVALID_PASSWORD 显示在密码字段下方并聚焦,INVALID_ACTIVATION、INVITATION_NOT_APPLICABLE、CONFLICT、401/403、429、网络异常与 5xx 分别给出固定安全文案\n\n验证:\n- 合并前确认分支基于 main 63544c6,main 在其后没有新提交;主目录未提交改动仅在 scripts/experience/、docs/handoff/demo-video-env-01.md 与 iam-demo-video/,与本次合并没有共同文件\n- 分支上 iam-admin-web 的 format:check、typecheck、lint 通过\n- 未运行:Vitest 单元测试、构建、后端测试、浏览器检查与真实邀请激活\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-18T20:58:53-07:00"},"CompareURL":"pengzhiyu/IAM/compare/3ddc9da392e7b9a38e98ddb4e6b71fa6f8a0b48f...06daf4a651e1a490ace181ac708099def39e8de0","Len":5}...
|
1792382363
|
Edit
Delete
|
|
39315
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"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}...
|
1792393307
|
Edit
Delete
|
|
39316
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"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}...
|
1792393307
|
Edit
Delete
|
|
39386
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"68a0d5d09 {"Commits":[{"Sha1":"68a0d5d096ae12cb8cb23b6684467b0276dede4a","Message":"feat: 合并角色分配与用户组成员姓名显示的前端接入\n\n后端 b6c5512 已为业务角色分配、成员候选和用户组详情补齐姓名。合并 feat/console-layout 上对应的前端接入,让应用「角色分配」和用户组成员不再只显示成员代码。\n\n实现内容:\n- 合入 6f2d8cf:角色分配列表、分配候选、用户组成员清单与勾选器显示「姓名 + 成员代码」,姓名未确认时提示,搜索框改为可按姓名或成员代码搜索;用户组详情改用只读 members 数组,删除前 100 个候选反查\n- 合入 354be5b:用户组改名 403/404 测试改为等待错误块聚焦后再断言\n- 只修改 iam-admin-web;写入接口、UUID、版本与 CSRF 处理不变\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 339 项测试及格式、lint、类型检查、构建全部通过\n- 合并前核对 main 上 b6c5512 的交接文档与查询字段(subject_name、subject_name_set、display_name_set、members)与前端读取一致;b6c5512 未修改 iam-admin-web\n- 未与真实后端联调,相关验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T01:03:02-07:00"},{"Sha1":"b6c5512d570e29949a14257b436fc1de35d8e73b","Message":"fix(auth): 补齐委派授权与用户组成员姓名\n\n授权管理员需要通过姓名辨认分配对象,组详情也不能依赖前一页候选反查成员。\n\n实现内容:\n- 业务角色绑定及成员候选返回姓名和确认标记,支持姓名与成员代码搜索\n- 用户组详情增加完整只读 members 数组,与 memberships 共用查询结果\n- 保留原企业和应用权限、隐私边界及停用撤权规则\n- 补充权限、搜索、历史状态和完整成员回归测试,同步接口合同与前端交接文档\n\n验证:\n- Maven verify:319 项单元测试、51 项指定集成测试通过,失败、错误和跳过均为 0\n- verify 包含 Spotless 格式检查、编译、架构检查及后端打包;git diff --check 通过\n- 未执行全量集成测试、前端构建及浏览器验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:51:53-07:00"},{"Sha1":"6f2d8cf8392a3c27d5e1806729e2342ef040a621","Message":"feat(console): 角色分配与用户组成员显示姓名\n\n应用「角色分配」和用户组成员原先只能显示成员代码,管理员认不出分配对象。后端已按 docs/console/delegated-member-names-handoff.md 为业务角色分配、成员候选和用户组详情补齐姓名,前端随之接入。\n\n实现内容:\n- 角色分配列表与详情的成员显示姓名,副信息「成员 · 成员代码」,subject_name_set=false 时提示「姓名未确认」;用户组分配 subject_name 为 null,继续显示组名称\n- 分配角色的成员候选显示姓名与成员代码,搜索框改为「搜索姓名或成员代码」,用户组候选为「搜索用户组名称或代码」;CandidatePicker 新增 searchLabel,企业管理员候选同样使用成员文案;分配记录搜索框改为「搜索姓名、成员代码、用户组或角色」\n- 用户组详情直接使用只读 members 数组显示全部成员(含本人、第 101 人以后),删除先读前 100 个候选反查代码的逻辑;新加入的人用勾选器看到的候选信息显示;停用成员注明「成员已停用」\n- 用户组清单与勾选器显示「姓名 + 成员代码」,按钮无障碍名称为「移除成员 姓名(代码)」以区分同名成员;搜索框改为「搜索姓名或成员代码」\n- 写入保持不变:组成员全量替换仍只提交 {version,memberships},不发送 members,姓名不作为标识或写入值;后端不返回 members 或姓名时回退显示代码或标识缩写\n- 同步类型注释、单元测试,以及 acceptance-t02、acceptance-t04、acceptance-group-lifecycle 的搜索框名称与候选定位(改为按行内成员代码定位)\n\n验证:\n- npm run check:格式、lint、类型检查、38 个测试文件 339 项测试与构建全部通过\n- 新增或改写测试覆盖:业务分配姓名、组绑定名称、姓名未确认、两类候选搜索框;组详情 25 人全部显示姓名与代码、停用成员、打开勾选器前不请求候选;勾选器姓名显示及新加入成员的显示\n- 浏览器经本地模拟接口验证:角色分配列表与候选显示姓名、按姓名搜索出两名同名成员并以代码区分;用户组清单与勾选器显示姓名,勾选前后被点行位置与高度不变\n- 后端改动目前仍是主目录未提交改动,未与真实后端联调;三个验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:49:30-07:00"},{"Sha1":"354be5b9c9f80a7bb5d750274e0aaaa736016416","Message":"test(console): 等待用户组改名错误块聚焦后再断言\n\n用户组改名返回 403/404 的用例在错误文案出现后立即断言焦点,而错误块是在提交后的 effect 里才聚焦,多文件并行运行时偶发先断言、后聚焦而失败。\n\n实现内容:\n- group-lifecycle 的 403/404 用例改为 waitFor 等待焦点落到 .write-error 后再断言,界面行为不变\n\n验证:\n- 此前该用例在多文件并行运行中出现过 2 次失败;在修改前的 6bd108d 与当前代码上分别用同一组 5 个测试文件连续运行 8 轮,均未复现\n- 修改后 group-lifecycle、group-editor、display-name-reads、authorization-management 共 40 项测试通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:49:14-07:00"},{"Sha1":"130a9ed5ceca7be71baed1ddecd2c4b085bd7ea6","Message":"fix: 合并用户组成员布局改造\n\n用户组详情勾选候选成员时,上方「已选成员」列表随勾选变高,页面看起来一直在自己滚动。合并 feat/console-layout 上的前端修复,把成员清单与「添加成员」勾选器分开显示。\n\n实现内容:\n- 合入 9ca3197:成员清单与勾选器二选一显示,勾选时上方内容高度不变;待加入、待移除在清单原位标注并可撤销,新增「还原」\n- 只修改 iam-admin-web 下的页面、样式、单元测试与 acceptance-t02 选择器,不涉及后端与接口合同\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 337 项测试及格式、lint、类型检查、构建全部通过\n- 合并结果与 9ca3197 的文件树一致(合并前 main 即为该提交的父提交)\n- acceptance-t02 未运行;未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:39:13-07:00"}],"HeadCommit":{"Sha1":"68a0d5d096ae12cb8cb23b6684467b0276dede4a","Message":"feat: 合并角色分配与用户组成员姓名显示的前端接入\n\n后端 b6c5512 已为业务角色分配、成员候选和用户组详情补齐姓名。合并 feat/console-layout 上对应的前端接入,让应用「角色分配」和用户组成员不再只显示成员代码。\n\n实现内容:\n- 合入 6f2d8cf:角色分配列表、分配候选、用户组成员清单与勾选器显示「姓名 + 成员代码」,姓名未确认时提示,搜索框改为可按姓名或成员代码搜索;用户组详情改用只读 members 数组,删除前 100 个候选反查\n- 合入 354be5b:用户组改名 403/404 测试改为等待错误块聚焦后再断言\n- 只修改 iam-admin-web;写入接口、UUID、版本与 CSRF 处理不变\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 339 项测试及格式、lint、类型检查、构建全部通过\n- 合并前核对 main 上 b6c5512 的交接文档与查询字段(subject_name、subject_name_set、display_name_set、members)与前端读取一致;b6c5512 未修改 iam-admin-web\n- 未与真实后端联调,相关验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T01:03:02-07:00"},"CompareURL":"pengzhiyu/IAM/compare/6bd108ddfd20351569b88f276ed8cfa90e7f6f3b...68a0d5d096ae12cb8cb23b6684467b0276dede4a","Len":6}...
|
1792397097
|
Edit
Delete
|
|
39387
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"68a0d5d09 {"Commits":[{"Sha1":"68a0d5d096ae12cb8cb23b6684467b0276dede4a","Message":"feat: 合并角色分配与用户组成员姓名显示的前端接入\n\n后端 b6c5512 已为业务角色分配、成员候选和用户组详情补齐姓名。合并 feat/console-layout 上对应的前端接入,让应用「角色分配」和用户组成员不再只显示成员代码。\n\n实现内容:\n- 合入 6f2d8cf:角色分配列表、分配候选、用户组成员清单与勾选器显示「姓名 + 成员代码」,姓名未确认时提示,搜索框改为可按姓名或成员代码搜索;用户组详情改用只读 members 数组,删除前 100 个候选反查\n- 合入 354be5b:用户组改名 403/404 测试改为等待错误块聚焦后再断言\n- 只修改 iam-admin-web;写入接口、UUID、版本与 CSRF 处理不变\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 339 项测试及格式、lint、类型检查、构建全部通过\n- 合并前核对 main 上 b6c5512 的交接文档与查询字段(subject_name、subject_name_set、display_name_set、members)与前端读取一致;b6c5512 未修改 iam-admin-web\n- 未与真实后端联调,相关验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T01:03:02-07:00"},{"Sha1":"b6c5512d570e29949a14257b436fc1de35d8e73b","Message":"fix(auth): 补齐委派授权与用户组成员姓名\n\n授权管理员需要通过姓名辨认分配对象,组详情也不能依赖前一页候选反查成员。\n\n实现内容:\n- 业务角色绑定及成员候选返回姓名和确认标记,支持姓名与成员代码搜索\n- 用户组详情增加完整只读 members 数组,与 memberships 共用查询结果\n- 保留原企业和应用权限、隐私边界及停用撤权规则\n- 补充权限、搜索、历史状态和完整成员回归测试,同步接口合同与前端交接文档\n\n验证:\n- Maven verify:319 项单元测试、51 项指定集成测试通过,失败、错误和跳过均为 0\n- verify 包含 Spotless 格式检查、编译、架构检查及后端打包;git diff --check 通过\n- 未执行全量集成测试、前端构建及浏览器验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:51:53-07:00"},{"Sha1":"6f2d8cf8392a3c27d5e1806729e2342ef040a621","Message":"feat(console): 角色分配与用户组成员显示姓名\n\n应用「角色分配」和用户组成员原先只能显示成员代码,管理员认不出分配对象。后端已按 docs/console/delegated-member-names-handoff.md 为业务角色分配、成员候选和用户组详情补齐姓名,前端随之接入。\n\n实现内容:\n- 角色分配列表与详情的成员显示姓名,副信息「成员 · 成员代码」,subject_name_set=false 时提示「姓名未确认」;用户组分配 subject_name 为 null,继续显示组名称\n- 分配角色的成员候选显示姓名与成员代码,搜索框改为「搜索姓名或成员代码」,用户组候选为「搜索用户组名称或代码」;CandidatePicker 新增 searchLabel,企业管理员候选同样使用成员文案;分配记录搜索框改为「搜索姓名、成员代码、用户组或角色」\n- 用户组详情直接使用只读 members 数组显示全部成员(含本人、第 101 人以后),删除先读前 100 个候选反查代码的逻辑;新加入的人用勾选器看到的候选信息显示;停用成员注明「成员已停用」\n- 用户组清单与勾选器显示「姓名 + 成员代码」,按钮无障碍名称为「移除成员 姓名(代码)」以区分同名成员;搜索框改为「搜索姓名或成员代码」\n- 写入保持不变:组成员全量替换仍只提交 {version,memberships},不发送 members,姓名不作为标识或写入值;后端不返回 members 或姓名时回退显示代码或标识缩写\n- 同步类型注释、单元测试,以及 acceptance-t02、acceptance-t04、acceptance-group-lifecycle 的搜索框名称与候选定位(改为按行内成员代码定位)\n\n验证:\n- npm run check:格式、lint、类型检查、38 个测试文件 339 项测试与构建全部通过\n- 新增或改写测试覆盖:业务分配姓名、组绑定名称、姓名未确认、两类候选搜索框;组详情 25 人全部显示姓名与代码、停用成员、打开勾选器前不请求候选;勾选器姓名显示及新加入成员的显示\n- 浏览器经本地模拟接口验证:角色分配列表与候选显示姓名、按姓名搜索出两名同名成员并以代码区分;用户组清单与勾选器显示姓名,勾选前后被点行位置与高度不变\n- 后端改动目前仍是主目录未提交改动,未与真实后端联调;三个验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:49:30-07:00"},{"Sha1":"354be5b9c9f80a7bb5d750274e0aaaa736016416","Message":"test(console): 等待用户组改名错误块聚焦后再断言\n\n用户组改名返回 403/404 的用例在错误文案出现后立即断言焦点,而错误块是在提交后的 effect 里才聚焦,多文件并行运行时偶发先断言、后聚焦而失败。\n\n实现内容:\n- group-lifecycle 的 403/404 用例改为 waitFor 等待焦点落到 .write-error 后再断言,界面行为不变\n\n验证:\n- 此前该用例在多文件并行运行中出现过 2 次失败;在修改前的 6bd108d 与当前代码上分别用同一组 5 个测试文件连续运行 8 轮,均未复现\n- 修改后 group-lifecycle、group-editor、display-name-reads、authorization-management 共 40 项测试通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:49:14-07:00"},{"Sha1":"130a9ed5ceca7be71baed1ddecd2c4b085bd7ea6","Message":"fix: 合并用户组成员布局改造\n\n用户组详情勾选候选成员时,上方「已选成员」列表随勾选变高,页面看起来一直在自己滚动。合并 feat/console-layout 上的前端修复,把成员清单与「添加成员」勾选器分开显示。\n\n实现内容:\n- 合入 9ca3197:成员清单与勾选器二选一显示,勾选时上方内容高度不变;待加入、待移除在清单原位标注并可撤销,新增「还原」\n- 只修改 iam-admin-web 下的页面、样式、单元测试与 acceptance-t02 选择器,不涉及后端与接口合同\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 337 项测试及格式、lint、类型检查、构建全部通过\n- 合并结果与 9ca3197 的文件树一致(合并前 main 即为该提交的父提交)\n- acceptance-t02 未运行;未与真实后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T00:39:13-07:00"}],"HeadCommit":{"Sha1":"68a0d5d096ae12cb8cb23b6684467b0276dede4a","Message":"feat: 合并角色分配与用户组成员姓名显示的前端接入\n\n后端 b6c5512 已为业务角色分配、成员候选和用户组详情补齐姓名。合并 feat/console-layout 上对应的前端接入,让应用「角色分配」和用户组成员不再只显示成员代码。\n\n实现内容:\n- 合入 6f2d8cf:角色分配列表、分配候选、用户组成员清单与勾选器显示「姓名 + 成员代码」,姓名未确认时提示,搜索框改为可按姓名或成员代码搜索;用户组详情改用只读 members 数组,删除前 100 个候选反查\n- 合入 354be5b:用户组改名 403/404 测试改为等待错误块聚焦后再断言\n- 只修改 iam-admin-web;写入接口、UUID、版本与 CSRF 处理不变\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:38 个测试文件 339 项测试及格式、lint、类型检查、构建全部通过\n- 合并前核对 main 上 b6c5512 的交接文档与查询字段(subject_name、subject_name_set、display_name_set、members)与前端读取一致;b6c5512 未修改 iam-admin-web\n- 未与真实后端联调,相关验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T01:03:02-07:00"},"CompareURL":"pengzhiyu/IAM/compare/6bd108ddfd20351569b88f276ed8cfa90e7f6f3b...68a0d5d096ae12cb8cb23b6684467b0276dede4a","Len":6}...
|
1792397097
|
Edit
Delete
|
|
39671
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/feat/console-layout
|
0
|
{"Commits":[{"Sha1":"2986e411b {"Commits":[{"Sha1":"2986e411b9c9cdae18aab1a2529a2297f33420f6","Message":"feat: 合并业务应用接入免重启的前端接入\n\n后端 5a6b2c0(V37 通知在线登记)与 9409c5e(V38 应用级权限查询凭据)已支持接入新应用或新企业不重启。现合并 feat/console-layout 上对应的前端接入与选型记录更新。\n\n实现内容:\n- 合入 da944e5:客户端详情新增「通知地址」分区,可登记、修改、停用退出通知与权限变化通知(地址加固定 IP,可自动跟随开通企业或只发给指定企业),只有平台管理员读写;登录设置不再修改退出通知地址,保存时原样带回;权限查询接入先选查询范围,应用共享时提交不带 tenantId,空企业显示为所有已开通企业;启用应用时说明两种接入方式\n- 合入 bda169a:演示前端为 CALLER_CREDENTIAL_EXPIRED 提示联系管理员更新凭据\n- 合入 1c6f705:选型记录补记 Codex 的评估与实现结果及前端提交\n- 只修改 iam-admin-web、iam-demo-web 与 docs/app-onboarding-no-restart.md;未改动后端代码\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:iam-admin-web 39 个测试文件 349 项及格式、lint、类型检查、构建通过;iam-demo-web 3 个测试文件 31 项及构建通过\n- 合并前核对前端读取字段与交接文档 docs/handoff/app-onboarding-no-restart-frontend-01.md 及后端 NotificationRegistry 一致\n- 未与真实后端联调,未做浏览器走查,验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:04:02-07:00"},{"Sha1":"1c6f705b52f953bd1d12115a2de52e2b34a5d9d8","Message":"docs: 补记业务应用接入免重启的实现结果\n\n选型记录原先停在\"已转交 Codex、尚未回传\"。现在后端(5a6b2c0、9409c5e,A39)和前端接入均已完成,补记最终结论,方便以后查证。\n\n实现内容:\n- 状态改为后端已实现,并指向 A39\n- 2.5、3.5 节补充 Codex 的评估与实现结果:固定 IP 采用方案 (a)、部署边界不热加载、只有平台管理员可登记、目标数量上限,以及 tenantId 可空、按调用方×企业计算额度、重叠登记加热切换的轮换流程、演示应用调整与回退限制\n- 后续事项表更新为已完成,注明前端提交 da944e5、bda169a,以及未联调、未浏览器走查\n- 依据一节注明\"现状\"中的代码行号描述的是改造前的代码\n\n验证:\n- 核对文档引用的 A39 等文件存在,检查无行尾空白\n- 纯文档改动,未运行代码测试\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:34-07:00"},{"Sha1":"bda169adab261d90a8a87c87925667167acb5469","Message":"feat(iam-demo-web): 提示权限查询凭据已过期\n\nSDK 改用可热切换的凭据文件后,文件过期时业务接口返回 503 CALLER_CREDENTIAL_EXPIRED。演示前端原先按通用 503 提示稍后再试,但重试不会恢复,需要管理员更新凭据。\n\n实现内容:\n- errors.ts 为 CALLER_CREDENTIAL_EXPIRED 增加专门说明,提示联系管理员更新凭据\n- shared.test.tsx 增加对应用例,确认不再按服务暂时不可用提示\n\n验证:\n- npm --prefix iam-demo-web run check:格式、lint、类型检查通过,3 个测试文件 31 项通过,两个应用构建通过\n- 未与真实演示后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:15-07:00"},{"Sha1":"da944e55f7ca67d7b4d2076a0bd8148bfb2af6a8","Message":"feat(console): 接入通知地址在线登记与应用共享的权限查询登记\n\n后端已支持在控制台登记通知地址(V37)和不限企业的权限查询凭据(V38),接入新应用或新企业不再需要重启。控制台此前只能在登录设置里填写部署白名单内的退出通知地址,权限查询登记也只能选一家企业,现按新接口接入。\n\n实现内容:\n- 客户端详情新增「通知地址」分区(ClientNotifications.tsx),可登记、修改、停用退出通知和权限变化通知;必须同时填写地址和连接用的固定 IP,并说明证书仍按域名验证\n- 权限变化通知默认自动跟随开通企业、不提交企业名单,也可只发给指定企业(最多 1000 家);未在线登记时说明部署配置可能仍在生效\n- 只有平台管理员读写通知登记;应用管理员只看到当前退出通知地址,不请求平台专属接口\n- 登录设置去掉退出通知地址输入框,保存时原样带回 backchannel_uri;通知修改期间暂停登录设置与停用、归档,避免互相让客户端版本过期\n- 地址被拒、数量上限、退出通知已迁移导致的冲突及部署配置不再允许旧地址,分别给出说明\n- 权限查询接入先明确选择查询范围(所有开通企业或只限一家企业),应用共享时从平台应用中选择且提交不带 tenantId;tenant_id 为空显示为所有已开通企业,不去读取企业\n- 密钥更换与停用说明改为先登记新的一份、换好后再停用旧份;启用应用时说明共用接入与单独部署接入的区别\n- 新增 app-onboarding 组件测试 10 项,调整调用方登记与客户端名称的原有用例\n\n验证:\n- npm --prefix iam-admin-web run check:格式、lint、类型检查通过,39 个测试文件 349 项通过,构建通过\n- 未与真实后端联调,未做浏览器走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:04-07:00"},{"Sha1":"9409c5e622fe925b3974bed3ab8dd2742d5e12fe","Message":"feat(authorization): 支持应用级决策凭据与免重启轮换\n\n共享应用接入新企业时无需追加企业调用秘密或重启BFF,同时保留专属实例单企业范围。\n\n实现内容:\n- V38支持可空企业限定,保持历史凭据范围和主体当前开通、准入及生命周期复核\n- 调用预算按调用方与企业隔离,通知企业从当前开通关系计算\n- SDK兼容旧映射,支持应用凭据和私有文件热切换,坏文件保留旧值至原截止\n- 使用独立登记两份凭据完成重叠切换,缓存按调用秘密摘要隔离\n- 演示机器交付从机器配置与旧映射发现企业,并保留每轮32家处理上限\n- 补充通知退出边界、迁移回退、安全取舍、部署示例及前端交接\n\n验证:\n- Java25、Maven Wrapper定向verify与补充边界复验:110项不重复计数测试全部通过\n- 覆盖SDK文件安全/缓存/通知、固定IP与TLS、真实PG/Redis新企业授权与预算、管理HTTP、V36至V38非空迁移、演示业务\n- Spotless、编译打包与git diff --check通过\n- 未执行全仓库全部测试,未部署预览或生产;人员快照、默认部门和机器身份仍需独立配置\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T22:35:25-07:00"}],"HeadCommit":{"Sha1":"2986e411b9c9cdae18aab1a2529a2297f33420f6","Message":"feat: 合并业务应用接入免重启的前端接入\n\n后端 5a6b2c0(V37 通知在线登记)与 9409c5e(V38 应用级权限查询凭据)已支持接入新应用或新企业不重启。现合并 feat/console-layout 上对应的前端接入与选型记录更新。\n\n实现内容:\n- 合入 da944e5:客户端详情新增「通知地址」分区,可登记、修改、停用退出通知与权限变化通知(地址加固定 IP,可自动跟随开通企业或只发给指定企业),只有平台管理员读写;登录设置不再修改退出通知地址,保存时原样带回;权限查询接入先选查询范围,应用共享时提交不带 tenantId,空企业显示为所有已开通企业;启用应用时说明两种接入方式\n- 合入 bda169a:演示前端为 CALLER_CREDENTIAL_EXPIRED 提示联系管理员更新凭据\n- 合入 1c6f705:选型记录补记 Codex 的评估与实现结果及前端提交\n- 只修改 iam-admin-web、iam-demo-web 与 docs/app-onboarding-no-restart.md;未改动后端代码\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:iam-admin-web 39 个测试文件 349 项及格式、lint、类型检查、构建通过;iam-demo-web 3 个测试文件 31 项及构建通过\n- 合并前核对前端读取字段与交接文档 docs/handoff/app-onboarding-no-restart-frontend-01.md 及后端 NotificationRegistry 一致\n- 未与真实后端联调,未做浏览器走查,验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:04:02-07:00"},"CompareURL":"pengzhiyu/IAM/compare/68a0d5d096ae12cb8cb23b6684467b0276dede4a...2986e411b9c9cdae18aab1a2529a2297f33420f6","Len":7}...
|
1792476926
|
Edit
Delete
|
|
39672
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"2986e411b {"Commits":[{"Sha1":"2986e411b9c9cdae18aab1a2529a2297f33420f6","Message":"feat: 合并业务应用接入免重启的前端接入\n\n后端 5a6b2c0(V37 通知在线登记)与 9409c5e(V38 应用级权限查询凭据)已支持接入新应用或新企业不重启。现合并 feat/console-layout 上对应的前端接入与选型记录更新。\n\n实现内容:\n- 合入 da944e5:客户端详情新增「通知地址」分区,可登记、修改、停用退出通知与权限变化通知(地址加固定 IP,可自动跟随开通企业或只发给指定企业),只有平台管理员读写;登录设置不再修改退出通知地址,保存时原样带回;权限查询接入先选查询范围,应用共享时提交不带 tenantId,空企业显示为所有已开通企业;启用应用时说明两种接入方式\n- 合入 bda169a:演示前端为 CALLER_CREDENTIAL_EXPIRED 提示联系管理员更新凭据\n- 合入 1c6f705:选型记录补记 Codex 的评估与实现结果及前端提交\n- 只修改 iam-admin-web、iam-demo-web 与 docs/app-onboarding-no-restart.md;未改动后端代码\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:iam-admin-web 39 个测试文件 349 项及格式、lint、类型检查、构建通过;iam-demo-web 3 个测试文件 31 项及构建通过\n- 合并前核对前端读取字段与交接文档 docs/handoff/app-onboarding-no-restart-frontend-01.md 及后端 NotificationRegistry 一致\n- 未与真实后端联调,未做浏览器走查,验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:04:02-07:00"},{"Sha1":"1c6f705b52f953bd1d12115a2de52e2b34a5d9d8","Message":"docs: 补记业务应用接入免重启的实现结果\n\n选型记录原先停在\"已转交 Codex、尚未回传\"。现在后端(5a6b2c0、9409c5e,A39)和前端接入均已完成,补记最终结论,方便以后查证。\n\n实现内容:\n- 状态改为后端已实现,并指向 A39\n- 2.5、3.5 节补充 Codex 的评估与实现结果:固定 IP 采用方案 (a)、部署边界不热加载、只有平台管理员可登记、目标数量上限,以及 tenantId 可空、按调用方×企业计算额度、重叠登记加热切换的轮换流程、演示应用调整与回退限制\n- 后续事项表更新为已完成,注明前端提交 da944e5、bda169a,以及未联调、未浏览器走查\n- 依据一节注明\"现状\"中的代码行号描述的是改造前的代码\n\n验证:\n- 核对文档引用的 A39 等文件存在,检查无行尾空白\n- 纯文档改动,未运行代码测试\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:34-07:00"},{"Sha1":"bda169adab261d90a8a87c87925667167acb5469","Message":"feat(iam-demo-web): 提示权限查询凭据已过期\n\nSDK 改用可热切换的凭据文件后,文件过期时业务接口返回 503 CALLER_CREDENTIAL_EXPIRED。演示前端原先按通用 503 提示稍后再试,但重试不会恢复,需要管理员更新凭据。\n\n实现内容:\n- errors.ts 为 CALLER_CREDENTIAL_EXPIRED 增加专门说明,提示联系管理员更新凭据\n- shared.test.tsx 增加对应用例,确认不再按服务暂时不可用提示\n\n验证:\n- npm --prefix iam-demo-web run check:格式、lint、类型检查通过,3 个测试文件 31 项通过,两个应用构建通过\n- 未与真实演示后端联调\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:15-07:00"},{"Sha1":"da944e55f7ca67d7b4d2076a0bd8148bfb2af6a8","Message":"feat(console): 接入通知地址在线登记与应用共享的权限查询登记\n\n后端已支持在控制台登记通知地址(V37)和不限企业的权限查询凭据(V38),接入新应用或新企业不再需要重启。控制台此前只能在登录设置里填写部署白名单内的退出通知地址,权限查询登记也只能选一家企业,现按新接口接入。\n\n实现内容:\n- 客户端详情新增「通知地址」分区(ClientNotifications.tsx),可登记、修改、停用退出通知和权限变化通知;必须同时填写地址和连接用的固定 IP,并说明证书仍按域名验证\n- 权限变化通知默认自动跟随开通企业、不提交企业名单,也可只发给指定企业(最多 1000 家);未在线登记时说明部署配置可能仍在生效\n- 只有平台管理员读写通知登记;应用管理员只看到当前退出通知地址,不请求平台专属接口\n- 登录设置去掉退出通知地址输入框,保存时原样带回 backchannel_uri;通知修改期间暂停登录设置与停用、归档,避免互相让客户端版本过期\n- 地址被拒、数量上限、退出通知已迁移导致的冲突及部署配置不再允许旧地址,分别给出说明\n- 权限查询接入先明确选择查询范围(所有开通企业或只限一家企业),应用共享时从平台应用中选择且提交不带 tenantId;tenant_id 为空显示为所有已开通企业,不去读取企业\n- 密钥更换与停用说明改为先登记新的一份、换好后再停用旧份;启用应用时说明共用接入与单独部署接入的区别\n- 新增 app-onboarding 组件测试 10 项,调整调用方登记与客户端名称的原有用例\n\n验证:\n- npm --prefix iam-admin-web run check:格式、lint、类型检查通过,39 个测试文件 349 项通过,构建通过\n- 未与真实后端联调,未做浏览器走查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:02:04-07:00"},{"Sha1":"9409c5e622fe925b3974bed3ab8dd2742d5e12fe","Message":"feat(authorization): 支持应用级决策凭据与免重启轮换\n\n共享应用接入新企业时无需追加企业调用秘密或重启BFF,同时保留专属实例单企业范围。\n\n实现内容:\n- V38支持可空企业限定,保持历史凭据范围和主体当前开通、准入及生命周期复核\n- 调用预算按调用方与企业隔离,通知企业从当前开通关系计算\n- SDK兼容旧映射,支持应用凭据和私有文件热切换,坏文件保留旧值至原截止\n- 使用独立登记两份凭据完成重叠切换,缓存按调用秘密摘要隔离\n- 演示机器交付从机器配置与旧映射发现企业,并保留每轮32家处理上限\n- 补充通知退出边界、迁移回退、安全取舍、部署示例及前端交接\n\n验证:\n- Java25、Maven Wrapper定向verify与补充边界复验:110项不重复计数测试全部通过\n- 覆盖SDK文件安全/缓存/通知、固定IP与TLS、真实PG/Redis新企业授权与预算、管理HTTP、V36至V38非空迁移、演示业务\n- Spotless、编译打包与git diff --check通过\n- 未执行全仓库全部测试,未部署预览或生产;人员快照、默认部门和机器身份仍需独立配置\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T22:35:25-07:00"}],"HeadCommit":{"Sha1":"2986e411b9c9cdae18aab1a2529a2297f33420f6","Message":"feat: 合并业务应用接入免重启的前端接入\n\n后端 5a6b2c0(V37 通知在线登记)与 9409c5e(V38 应用级权限查询凭据)已支持接入新应用或新企业不重启。现合并 feat/console-layout 上对应的前端接入与选型记录更新。\n\n实现内容:\n- 合入 da944e5:客户端详情新增「通知地址」分区,可登记、修改、停用退出通知与权限变化通知(地址加固定 IP,可自动跟随开通企业或只发给指定企业),只有平台管理员读写;登录设置不再修改退出通知地址,保存时原样带回;权限查询接入先选查询范围,应用共享时提交不带 tenantId,空企业显示为所有已开通企业;启用应用时说明两种接入方式\n- 合入 bda169a:演示前端为 CALLER_CREDENTIAL_EXPIRED 提示联系管理员更新凭据\n- 合入 1c6f705:选型记录补记 Codex 的评估与实现结果及前端提交\n- 只修改 iam-admin-web、iam-demo-web 与 docs/app-onboarding-no-restart.md;未改动后端代码\n\n验证:\n- 合并前在 feat/console-layout 上运行 npm run check:iam-admin-web 39 个测试文件 349 项及格式、lint、类型检查、构建通过;iam-demo-web 3 个测试文件 31 项及构建通过\n- 合并前核对前端读取字段与交接文档 docs/handoff/app-onboarding-no-restart-frontend-01.md 及后端 NotificationRegistry 一致\n- 未与真实后端联调,未做浏览器走查,验收脚本未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-19T23:04:02-07:00"},"CompareURL":"pengzhiyu/IAM/compare/68a0d5d096ae12cb8cb23b6684467b0276dede4a...2986e411b9c9cdae18aab1a2529a2297f33420f6","Len":7}...
|
1792476926
|
Edit
Delete
|
|
40023
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"154f25a42 {"Commits":[{"Sha1":"154f25a42bccc6762747d810cb99510a7fce2c9b","Message":"docs: 记录 P12 冻结及冻结候选 2986e41 的未解决项\n\n开诊断云测单轮已回答真实到达下拒绝瞬间的持有者阶段、名额首次空出与重试到达三个诊断问题,用户按路线图决定 P12 冻结;两份任务文档需要记录冻结候选身份、主区状态、已证实结论与未解决项,供解冻时接续。本次把两份文档状态改为 FROZEN,追加软件优化文档第七十二步与归因设计文档第70节。\n\n实现内容:\n- 顶部状态改为 FROZEN:冻结候选 main HEAD 2986e41(JAR d94a9d62…7890、SDK 源码 ab34bba9…、工具 2c9c7738…90ed),P12 相关产品改动 32b6833/f8a1e54/5435f06 与容量工具 b892d79/dd8a73c 均已在主区并随 2986e41 推送;列出冻结时已证实结论与未解决项;解冻、再跑一轮与设计改动均须另行授权\n- 第七十二步记录候选身份与保留的材料包/结果包/私有记录、主区与推送状态、六项已证实结论、未解决项 U1–U10(正式样本 0、20,000 门槛未检查、AUTH_BUSY 未解决、起始 10 秒集中未归因、重试到达开销未拆分、守护器临时容器竞争未修、E2d 可回收数无新值、设计改动未评估、产品全量测试未重跑、请求诊断偶发丢 1 条、L1/L2/P13 与稳定性未验收)、解冻后建议顺序与边界\n- 第70节按第 3 节待验证项逐项汇总归因结论,记录一次短重试、有界等待准入、降低持有时长/客户端认证不占协议池连接、扩大名额或池、退出通知空轮询避锁、守护器缺陷六项设计问题的冻结状态与解冻评估顺序\n- 说明 docs/02-IAM开发计划.md 第 16 节的 P12 记录仍停在 2026-10-10,本次未改\n\n验证:\n- 纯文档改动,数字与提交号来自第七十步、第七十一步、结果包 README 及 git log;未运行代码检查\n- git diff --check 通过;新增相对链接指向的 release README 与任务文档均存在\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-20T19:27:31-07:00"},{"Sha1":"96769399cda4f51393de8e045b6d1f1edd64d2dd","Message":"docs: 记录 P12 开诊断云测单轮结果并收录脱敏结果交接\n\n开诊断云测唯一一轮 hmac-pg4-ledger1(候选 main HEAD 2986e41)已执行并提前停止:守护器读取失败使恢复预热在第 90/270 秒停止、正式样本 0,但取得真实到达下 81 次入口拒绝的完整台账证据。两份任务文档没有本轮结果、本地复验与归因的记录,脱敏的结果交接也未收入仓库。本次更新两份任务文档的顶部状态,追加软件优化文档第七十一步与归因设计文档第69节,并收录结果交接文档。\n\n实现内容:\n- 顶部状态改为开诊断云测唯一一轮已执行并提前停止:初始预热 9,450/9,450、恢复预热 90/270 秒 host_guard_failed、正式样本 0;81 次首次 503 全部关联台账,持有者阶段 CLIENT_AUTH 38.4%/LIFECYCLE_WAIT 13.4%/TRANSACTION_BEGIN 13.1%,首次空出中位 15.74ms、重试到达中位 +55.6ms、恢复 63/81(77.8%);建议进入 P12 冻结\n- 第七十一步记录执行时间线、46 份公开证据本地复验与报告重算、104 次 503 指标/台账/HTTP 三方对账与采集完整性、三个诊断问题在真实到达下的数据、与第六十九步及 E2d 的对照、守护器停测归因(services() 全量 docker ps 与一次性 docker inspect 之间基线外临时容器消失)、边界与下一步\n- 第69节只讨论本轮对第三节假设与第65–68节设计问题的含义:人为屏障下的 4+4 形态未重现、E2d 可回收 21–24/30 推算的前提不成立、设计改动预期收益应下修、再云测前守护器须改为逐容器读取\n- docs/handoff/P12-ledger-cloud-test-result-01.md:脱敏的结果与前端交接,含阶段结果、拒绝/恢复/会话存量、台账结论、验证与收尾状态、后续记录口径;本轮无接口变化,不产生前端任务\n\n验证:\n- 内容来自结果包 release/p12-cloud-ledger-20261020-2986e41 的 46 份公开证据(verify-transfer.py download 复验通过)与本地重算(recovery-report.json 逐字段一致、两份逐阶段台账报告除 generated_at 外逐字段一致、逐拒绝表逐字节一致);纯文档改动,未运行代码检查\n- git diff --check 通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-20T19:21:39-07:00"},{"Sha1":"f75a2485b0347e217d0ccaaa546436f109f797a3","Message":"docs: 记录 P12 开诊断云测材料准备并新增 Codex 云测交接\n\nP12 暂停后恢复推进,用户指定 main HEAD 2986e41 为云测候选;两份任务文档没有候选回归与开诊断云测材料的记录,Codex 也没有执行与回收本轮云测的交接说明。本次更新两份任务文档的顶部状态与日期,追加软件优化文档第七十步与归因设计文档第68节,并新增交接文档。\n\n实现内容:\n- 顶部状态改为台账与合同已随 main 推送、2026-10-20 以候选 2986e41 备好开诊断云测材料并交 Codex 执行、云端未执行;历史 19970/20000 与正式样本 0 保持\n- 第七十步记录候选定向回归(单测 59、集成 32、容量工具 70)、候选 JAR 构建与逐字节核对、材料包 release/p12-ledger-cloud-plan-20261020-2986e41 的执行覆盖与脚本、本地验证(覆盖后 98、材料包 16、唯一一次 prepare)、三次辅助失误、交付与边界\n- 第68节记录候选与 E2d 的产品差异、执行方式四处差异、新增门禁与工具(台账采集就绪门禁、permit_ledger_report 第 2 版、finish-ledger 混合格式台账重放)、预期与边界\n- docs/handoff/P12-ledger-cloud-test-01.md:以建议口吻交给 Codex 的云测执行与回收说明,含背景、已完成内容、执行顺序、所需测试数据(全部由工具合成)、需带回的结果文件与重点字段、验收标准、禁止事项与未解决问题\n\n验证:\n- 内容来自同日本地回归日志与材料包核对记录(local-regression/java-tests.json、tool-identity-check.json、delivery-check.json 等);纯文档改动,未运行代码检查\n- git diff --check 通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-20T08:27:22-07:00"}],"HeadCommit":{"Sha1":"154f25a42bccc6762747d810cb99510a7fce2c9b","Message":"docs: 记录 P12 冻结及冻结候选 2986e41 的未解决项\n\n开诊断云测单轮已回答真实到达下拒绝瞬间的持有者阶段、名额首次空出与重试到达三个诊断问题,用户按路线图决定 P12 冻结;两份任务文档需要记录冻结候选身份、主区状态、已证实结论与未解决项,供解冻时接续。本次把两份文档状态改为 FROZEN,追加软件优化文档第七十二步与归因设计文档第70节。\n\n实现内容:\n- 顶部状态改为 FROZEN:冻结候选 main HEAD 2986e41(JAR d94a9d62…7890、SDK 源码 ab34bba9…、工具 2c9c7738…90ed),P12 相关产品改动 32b6833/f8a1e54/5435f06 与容量工具 b892d79/dd8a73c 均已在主区并随 2986e41 推送;列出冻结时已证实结论与未解决项;解冻、再跑一轮与设计改动均须另行授权\n- 第七十二步记录候选身份与保留的材料包/结果包/私有记录、主区与推送状态、六项已证实结论、未解决项 U1–U10(正式样本 0、20,000 门槛未检查、AUTH_BUSY 未解决、起始 10 秒集中未归因、重试到达开销未拆分、守护器临时容器竞争未修、E2d 可回收数无新值、设计改动未评估、产品全量测试未重跑、请求诊断偶发丢 1 条、L1/L2/P13 与稳定性未验收)、解冻后建议顺序与边界\n- 第70节按第 3 节待验证项逐项汇总归因结论,记录一次短重试、有界等待准入、降低持有时长/客户端认证不占协议池连接、扩大名额或池、退出通知空轮询避锁、守护器缺陷六项设计问题的冻结状态与解冻评估顺序\n- 说明 docs/02-IAM开发计划.md 第 16 节的 P12 记录仍停在 2026-10-10,本次未改\n\n验证:\n- 纯文档改动,数字与提交号来自第七十步、第七十一步、结果包 README 及 git log;未运行代码检查\n- git diff --check 通过;新增相对链接指向的 release README 与任务文档均存在\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-20T19:27:31-07:00"},"CompareURL":"pengzhiyu/IAM/compare/2986e411b9c9cdae18aab1a2529a2297f33420f6...154f25a42bccc6762747d810cb99510a7fce2c9b","Len":3}...
|
1792549917
|
Edit
Delete
|
|
36528
|
5
|
1
|
5
|
126
|
0
|
0
|
|
1
|
|
1791724166
|
Edit
Delete
|
|
36536
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
1
|
|
1791724303
|
Edit
Delete
|
|
36537
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"cc385f7c2 {"Commits":[{"Sha1":"cc385f7c24a5053ae626333c54de8162543cbce2","Message":"feat(scripts): 建仓脚本自检与令牌归属核对;clone-all 副本去远端;层仓 head 同步\n\ngitea-bootstrap.sh\n- 自检(两种模式,不通过不调用 Gitea):git 可用、仓根就是该目录(防 core.worktree 指错)、要推送的仓有本地 main;head 与 workspace.json 不符只警告\n- APPLY 先 GET /user 核对令牌所属用户 = owner(建仓接口建在令牌用户名下);请求头临时文件 trap 退出即删\n- 自检写成函数:bash 3.2 解析 $( ) 里的 case 有缺陷\n- 用法改为 read -rs 输入令牌,避免进 shell 历史\nclone-all.sh\n- 副本(role 缺省 copy)克隆后移除 origin,与 AGENTS.md 规则 1 一致;infra 标 role=source 保留 origin\n- giteaInit=empty 的层仓在层目录已存在时只 init + 配 origin,不 fetch\nworkspace.json\n- 层仓 head 同步到各层 .gitignore 提交;04 原记 93d06240 有误(实为 93d0624b),一并更正;infra 加 role=source\n仓库结构-2026-10-11.md:同步上述规则与用法;layers[] → layerRepos[]\n\n测试(scratchpad 本地裸仓 + 本机模拟 /api/v1/user,未连 Gitea):自检 4 种失败/警告、令牌属他人与 401 两种停止路径(均未建仓、未加远端)、clone-all 新机器与层目录已存在两种场景。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:02:14-07:00"},{"Sha1":"075ae024f988291a706758db914ef04566cd83aa","Message":"docs: 企业智能OS 挖掘分析报告与 CHG-037 评审意见\n\n- 企业智能OS挖掘分析-2026-10-11-0450.md:逐层只读实测核对(副本远端、根仓 git、切换包风险、补丁、勘误表、建议动作);根 README 已有的「核对」链接自此可达\n- 工作区根迁移/评审意见-2026-10-11.md:对照 4973456 的 R1–R5(改写范围、撞名与层仓忽略、Docker 停起清单、验证与回滚、漏项)、037a 补丁核验、§4 三项待定的建议\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T05:52:04-07:00"},{"Sha1":"2546a88cc67d1afec70d0ce9af2a093942577d44","Message":"chore: 04 层仓 head → 93d0624\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01QJ59SfRQABmxkDBphp5WKZ\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"Luolao","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"Luolao","Timestamp":"2026-10-11T12:45:14Z"},{"Sha1":"49734564b65282de6af4c86a20ff39259c85e337","Message":"feat(CHG-037): 拆 037a(门禁读清单层目录,可先合)/ 037b(窗口);新根演练通过\n\n- simulate-newroot.sh:symlink 农场模拟企业智能OS 根,旧根/新根门禁结果逐字一致\n- rewrite-paths.py:路径字段里的裸目录名一并改写;退役记录 former_directory 保留(222 处)\n- workspace.next.json:新根清单草案(旧 schema 字段 + layerRepos/repoLayout)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01QJ59SfRQABmxkDBphp5WKZ\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"Luolao","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"Luolao","Timestamp":"2026-10-11T12:45:07Z"},{"Sha1":"1d41fd70a1b1cec732d1b2958d16e3cb505446d5","Message":"feat: CHG-037 工作区根迁移方案(决定 A);01/02 Gitea 先建空仓\n\n- 工作区根迁移/:方案(影响面实测:Catalog 239 处 / 代码字面量 96 行 / 绝对路径 1640 文件)、\n path-map.json、rewrite-paths.py(默认只统计,历史不改写)、scan-abs-paths.sh(排除 .secrets)\n- workspace.json:layers 数组改名 layerRepos,旧 schema 的 layers 键留给控制面/平台治理;01/02 giteaInit=empty\n- gitea-bootstrap.sh:empty 模式只建仓配 origin 不推送\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\nClaude-Session: https://claude.ai/code/session_01QJ59SfRQABmxkDBphp5WKZ\n","AuthorEmail":"luoguoguo@gmail.com","AuthorName":"Luolao","CommitterEmail":"luoguoguo@gmail.com","CommitterName":"Luolao","Timestamp":"2026-10-11T12:39:20Z"}],"HeadCommit":{"Sha1":"cc385f7c24a5053ae626333c54de8162543cbce2","Message":"feat(scripts): 建仓脚本自检与令牌归属核对;clone-all 副本去远端;层仓 head 同步\n\ngitea-bootstrap.sh\n- 自检(两种模式,不通过不调用 Gitea):git 可用、仓根就是该目录(防 core.worktree 指错)、要推送的仓有本地 main;head 与 workspace.json 不符只警告\n- APPLY 先 GET /user 核对令牌所属用户 = owner(建仓接口建在令牌用户名下);请求头临时文件 trap 退出即删\n- 自检写成函数:bash 3.2 解析 $( ) 里的 case 有缺陷\n- 用法改为 read -rs 输入令牌,避免进 shell 历史\nclone-all.sh\n- 副本(role 缺省 copy)克隆后移除 origin,与 AGENTS.md 规则 1 一致;infra 标 role=source 保留 origin\n- giteaInit=empty 的层仓在层目录已存在时只 init + 配 origin,不 fetch\nworkspace.json\n- 层仓 head 同步到各层 .gitignore 提交;04 原记 93d06240 有误(实为 93d0624b),一并更正;infra 加 role=source\n仓库结构-2026-10-11.md:同步上述规则与用法;layers[] → layerRepos[]\n\n测试(scratchpad 本地裸仓 + 本机模拟 /api/v1/user,未连 Gitea):自检 4 种失败/警告、令牌属他人与 401 两种停止路径(均未建仓、未加远端)、clone-all 新机器与层目录已存在两种场景。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:02:14-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/13126614daeb4f372582ac3d3c05ca8ae0aa5aa8...cc385f7c24a5053ae626333c54de8162543cbce2","Len":10}...
|
1791724303
|
Edit
Delete
|
|
36548
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"6be100621 {"Commits":[{"Sha1":"6be10062176f11ce30060e8187a709ca330bbf00","Message":"docs: 记录 Gitea 建仓完成——8 个私有仓,6 个已推送 main,01/02 为空仓\n\n- workspace.json / 工作区根迁移/workspace.next.json:infra upstreamStatus 待建 → 已建(2026-10-11 建仓并推送 main)\n- 仓库结构-2026-10-11.md:建仓状态与各仓推送提交号;建仓经网页(luoanwu 登录)完成,推送走 SSH\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:12:56-07:00"}],"HeadCommit":{"Sha1":"6be10062176f11ce30060e8187a709ca330bbf00","Message":"docs: 记录 Gitea 建仓完成——8 个私有仓,6 个已推送 main,01/02 为空仓\n\n- workspace.json / 工作区根迁移/workspace.next.json:infra upstreamStatus 待建 → 已建(2026-10-11 建仓并推送 main)\n- 仓库结构-2026-10-11.md:建仓状态与各仓推送提交号;建仓经网页(luoanwu 登录)完成,推送走 SSH\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:12:56-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/cc385f7c24a5053ae626333c54de8162543cbce2...6be10062176f11ce30060e8187a709ca330bbf00","Len":1}...
|
1791724380
|
Edit
Delete
|
|
36549
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"3946f89c3 {"Commits":[{"Sha1":"3946f89c397076f8d2c6e8b869a2bfaa3957bab6","Message":"docs(仓库结构): 建仓状态里的提交号注明是建仓时推送的\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:13:10-07:00"}],"HeadCommit":{"Sha1":"3946f89c397076f8d2c6e8b869a2bfaa3957bab6","Message":"docs(仓库结构): 建仓状态里的提交号注明是建仓时推送的\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:13:10-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/6be10062176f11ce30060e8187a709ca330bbf00...3946f89c397076f8d2c6e8b869a2bfaa3957bab6","Len":1}...
|
1791724394
|
Edit
Delete
|
|
36554
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
1
|
{"Commits":[{"Sha1":"443947bd8 {"Commits":[{"Sha1":"443947bd827c7433de9dd09b77492770b2eaaf28","Message":"chore: 01、02 层仓改为推送 main(不再是空仓)\n\n- 01 64e33d6c、02 ad620659 已推送到 Gitea,与本地一致\n- workspace.json / workspace.next.json:去掉 01、02 的 giteaInit=empty,emptyRepos 说明改记这次变更\n- 建仓脚本与 clone-all:注释不再点名 01、02;giteaInit=empty 机制保留,目前无层仓使用\n- 仓库结构-2026-10-11.md、工作区根迁移/README.md:同步状态与决定记录\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:16:38-07:00"}],"HeadCommit":{"Sha1":"443947bd827c7433de9dd09b77492770b2eaaf28","Message":"chore: 01、02 层仓改为推送 main(不再是空仓)\n\n- 01 64e33d6c、02 ad620659 已推送到 Gitea,与本地一致\n- workspace.json / workspace.next.json:去掉 01、02 的 giteaInit=empty,emptyRepos 说明改记这次变更\n- 建仓脚本与 clone-all:注释不再点名 01、02;giteaInit=empty 机制保留,目前无层仓使用\n- 仓库结构-2026-10-11.md、工作区根迁移/README.md:同步状态与决定记录\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:16:38-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/3946f89c397076f8d2c6e8b869a2bfaa3957bab6...443947bd827c7433de9dd09b77492770b2eaaf28","Len":1}...
|
1791724602
|
Edit
Delete
|
|
36556
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"cf75a55a2 {"Commits":[{"Sha1":"cf75a55a208915a3e2a7158cf745f8ae08d49ef3","Message":"docs(仓库结构): 8 个仓改为公开(Owner 2026-10-11;实例要求登录,对登录账号可见)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:25:44-07:00"}],"HeadCommit":{"Sha1":"cf75a55a208915a3e2a7158cf745f8ae08d49ef3","Message":"docs(仓库结构): 8 个仓改为公开(Owner 2026-10-11;实例要求登录,对登录账号可见)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:25:44-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/443947bd827c7433de9dd09b77492770b2eaaf28...cf75a55a208915a3e2a7158cf745f8ae08d49ef3","Len":1}...
|
1791725148
|
Edit
Delete
|
|
36557
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"374cc407f {"Commits":[{"Sha1":"374cc407ffff7bcd112a79d8f4b601829db3c5be","Message":"chore: 层仓 head 同步;更正 AGENTS.md 规则 2 与 README 的 infra 提交数\n\n- workspace.json:6 个层仓 head 同步到本次提交(00 87035f08、01 65c01b2a、02 ddd0368a、03 f65c5a71、04 adbe1d9f、05 01275070)\n- AGENTS.md 规则 2:拆仓后根仓只跟踪根目录文件、层仓忽略产品仓、补丁在层仓;登记「仓库结构」主题的唯一来源\n- README.md:infra 实为 183 个提交(stack/ 历史 174 + 拆出后 9),状态补「已推送 Gitea」\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:28:55-07:00"},{"Sha1":"8708a2b7e0b030b9458cfccec0a66cf0fb1e5aa8","Message":"docs: 职能边界、AGENTS.md 单一规则来源与文档唯一性检查\n\n- 职能边界-2026-10-11.md:00–05 各层拥有/不拥有/不得、主链 01→02→04→05 + 03 契约旁路、灰区归属、已定决定 D1–D3\n- AGENTS.md:全局规则唯一来源(含文档唯一来源表);CLAUDE.md 只导入它\n- 工具/check-docs.py:文档唯一性只读检查(AGENTS/CLAUDE 导入、边界不复述、D1–D3 只在边界文档定义、链接可达)\n- README.md:索引职能边界、01/02 开发计划、待决事项更新\n- 总对照-2026-10-11.md:标注为快照,已被职能边界取代的结论加【已取代】\n\n(另一会话于 05:11–05:20 写入,本次按原样提交)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:27:50-07:00"}],"HeadCommit":{"Sha1":"374cc407ffff7bcd112a79d8f4b601829db3c5be","Message":"chore: 层仓 head 同步;更正 AGENTS.md 规则 2 与 README 的 infra 提交数\n\n- workspace.json:6 个层仓 head 同步到本次提交(00 87035f08、01 65c01b2a、02 ddd0368a、03 f65c5a71、04 adbe1d9f、05 01275070)\n- AGENTS.md 规则 2:拆仓后根仓只跟踪根目录文件、层仓忽略产品仓、补丁在层仓;登记「仓库结构」主题的唯一来源\n- README.md:infra 实为 183 个提交(stack/ 历史 174 + 拆出后 9),状态补「已推送 Gitea」\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:28:55-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/cf75a55a208915a3e2a7158cf745f8ae08d49ef3...374cc407ffff7bcd112a79d8f4b601829db3c5be","Len":2}...
|
1791725337
|
Edit
Delete
|
|
36568
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"172bcfff6 {"Commits":[{"Sha1":"172bcfff67fc576e84368ad0c94ef841d6c35984","Message":"docs: AGENTS.md 规则 7 跨仓链接约定;分析报告引用已删文件改为 728c854 永久链接;层仓 head 同步\n\n- AGENTS.md 规则 7:层仓→根仓/他层仓用 Gitea 绝对链接;快照引用已删文件用写作时提交的永久链接;根仓→层仓暂为相对路径\n- 企业智能OS挖掘分析-2026-10-11-0450.md:5 处链接文字为 副本说明 / S2执行计划 但指向 README 的,改为 04:50 所核对的 728c854 中的原文件\n- workspace.json:6 个层仓 head 同步\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:52:17-07:00"},{"Sha1":"39efede62bc9e8caff6c50fc6032abc203efe6ec","Message":"docs: 文档整理——AGENTS.md 规则 11(原件只链接)、check-docs 10 项并兼容 Gitea 绝对链接、总对照就地勘误、快照文档加后续更新\n\n(会话「文档梳理和完善」于 06:30–06:49 整理,本次按原样提交;check-docs 53 份 10 项通过)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:50:23-07:00"}],"HeadCommit":{"Sha1":"172bcfff67fc576e84368ad0c94ef841d6c35984","Message":"docs: AGENTS.md 规则 7 跨仓链接约定;分析报告引用已删文件改为 728c854 永久链接;层仓 head 同步\n\n- AGENTS.md 规则 7:层仓→根仓/他层仓用 Gitea 绝对链接;快照引用已删文件用写作时提交的永久链接;根仓→层仓暂为相对路径\n- 企业智能OS挖掘分析-2026-10-11-0450.md:5 处链接文字为 副本说明 / S2执行计划 但指向 README 的,改为 04:50 所核对的 728c854 中的原文件\n- workspace.json:6 个层仓 head 同步\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:52:17-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/374cc407ffff7bcd112a79d8f4b601829db3c5be...172bcfff67fc576e84368ad0c94ef841d6c35984","Len":2}...
|
1791726741
|
Edit
Delete
|
|
36576
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"625207eb4 {"Commits":[{"Sha1":"625207eb45e0ec270e41d1e18d7c9ef65515ad31","Message":"docs: 根仓指向层仓的链接改为 Gitea 绝对链接\n\n根仓在 Gitea 上不含层目录,README 分层导航等指向层仓的相对链接会断。38 条改为 https://gitea.g-hi.com/luoanwu/\u003c层仓\u003e/src/branch/main/\u003c路径\u003e(README 19、0450 分析报告 15、AGENTS.md 2、总对照 2);指向产品副本与工作区的不变。AGENTS.md 规则 7:跨仓链接三个方向一律用绝对链接。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:54:57-07:00"}],"HeadCommit":{"Sha1":"625207eb45e0ec270e41d1e18d7c9ef65515ad31","Message":"docs: 根仓指向层仓的链接改为 Gitea 绝对链接\n\n根仓在 Gitea 上不含层目录,README 分层导航等指向层仓的相对链接会断。38 条改为 https://gitea.g-hi.com/luoanwu/\u003c层仓\u003e/src/branch/main/\u003c路径\u003e(README 19、0450 分析报告 15、AGENTS.md 2、总对照 2);指向产品副本与工作区的不变。AGENTS.md 规则 7:跨仓链接三个方向一律用绝对链接。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:54:57-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/172bcfff67fc576e84368ad0c94ef841d6c35984...625207eb45e0ec270e41d1e18d7c9ef65515ad31","Len":1}...
|
1791726899
|
Edit
Delete
|
|
36577
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"3516ab4a4 {"Commits":[{"Sha1":"3516ab4a474ad3436afba1ab9fb9c81c6e3c366e","Message":"feat(工具): check-docs 11 项——核对提交永久链接、拦截跨仓相对链接;0450 正文改为 728c854 永久链接\n\n- check-docs.py 第 5 项:Gitea 链接的仓名须在 workspace.json 登记;`src/commit/\u003c提交\u003e/\u003c路径\u003e` 用 git cat-file 核对提交与文件都存在\n- 新增第 11 项:根仓↔层仓、层仓↔层仓的相对链接一律报错(AGENTS.md 规则 7);层内产品副本与工作区链接除外\n- 负向自检:临时副本注入 5 种坏链接(文件不存在、提交不存在、未登记仓、根→层相对、层→根相对),全部报出\n- 企业智能OS挖掘分析-2026-10-11-0450.md:正文 11 条指向层仓 branch/main 的链接(8 条带行号)改为 04:50 所核对的 728c854 永久链接,行号对得上;文首「后续更新」仍指向现状\n- AGENTS.md 规则 7:永久链接也适用于改写过的文件;写明 check-docs 第 5、11 项各查什么\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:58:38-07:00"}],"HeadCommit":{"Sha1":"3516ab4a474ad3436afba1ab9fb9c81c6e3c366e","Message":"feat(工具): check-docs 11 项——核对提交永久链接、拦截跨仓相对链接;0450 正文改为 728c854 永久链接\n\n- check-docs.py 第 5 项:Gitea 链接的仓名须在 workspace.json 登记;`src/commit/\u003c提交\u003e/\u003c路径\u003e` 用 git cat-file 核对提交与文件都存在\n- 新增第 11 项:根仓↔层仓、层仓↔层仓的相对链接一律报错(AGENTS.md 规则 7);层内产品副本与工作区链接除外\n- 负向自检:临时副本注入 5 种坏链接(文件不存在、提交不存在、未登记仓、根→层相对、层→根相对),全部报出\n- 企业智能OS挖掘分析-2026-10-11-0450.md:正文 11 条指向层仓 branch/main 的链接(8 条带行号)改为 04:50 所核对的 728c854 永久链接,行号对得上;文首「后续更新」仍指向现状\n- AGENTS.md 规则 7:永久链接也适用于改写过的文件;写明 check-docs 第 5、11 项各查什么\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:58:38-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/625207eb45e0ec270e41d1e18d7c9ef65515ad31...3516ab4a474ad3436afba1ab9fb9c81c6e3c366e","Len":1}...
|
1791727122
|
Edit
Delete
|
|
36579
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"85ed4179f {"Commits":[{"Sha1":"85ed4179f9026a4b302d96907c76e3f1bdf1cfa9","Message":"chore: 层仓 head 同步(00 → 3bfa8a21)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:59:28-07:00"}],"HeadCommit":{"Sha1":"85ed4179f9026a4b302d96907c76e3f1bdf1cfa9","Message":"chore: 层仓 head 同步(00 → 3bfa8a21)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T06:59:28-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/3516ab4a474ad3436afba1ab9fb9c81c6e3c366e...85ed4179f9026a4b302d96907c76e3f1bdf1cfa9","Len":1}...
|
1791727221
|
Edit
Delete
|
|
36580
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"7ddebb1ef {"Commits":[{"Sha1":"7ddebb1efe48c9cb9ff3c3144eda94a92e2fbf9c","Message":"docs(AGENTS): 登记「各层挖掘分析快照」为通用主题——各层 README 目录索引即唯一来源\n\n01–05 各层会话在本层层仓写第二轮挖掘分析快照;按用户决定只在根表加一行通用登记,各层不再逐份改根仓。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T07:02:54-07:00"}],"HeadCommit":{"Sha1":"7ddebb1efe48c9cb9ff3c3144eda94a92e2fbf9c","Message":"docs(AGENTS): 登记「各层挖掘分析快照」为通用主题——各层 README 目录索引即唯一来源\n\n01–05 各层会话在本层层仓写第二轮挖掘分析快照;按用户决定只在根表加一行通用登记,各层不再逐份改根仓。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T07:02:54-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/85ed4179f9026a4b302d96907c76e3f1bdf1cfa9...7ddebb1efe48c9cb9ff3c3144eda94a92e2fbf9c","Len":1}...
|
1791727376
|
Edit
Delete
|
|
36583
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"4f2c49423 {"Commits":[{"Sha1":"4f2c49423f9fa998765359ed8cb67ad425804b59","Message":"chore: 层仓 head 同步(05 → 8dc495a9,infra → 8384d25);根 README infra 提交数 183 → 184\n\ninfra 8384d25 修复自有门禁 compose config 一步(本机 4/4 失败 → 通过);\n05 8dc495a9 新增基础设施层挖掘分析快照并按实测更正 3 处现状。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T07:03:28-07:00"}],"HeadCommit":{"Sha1":"4f2c49423f9fa998765359ed8cb67ad425804b59","Message":"chore: 层仓 head 同步(05 → 8dc495a9,infra → 8384d25);根 README infra 提交数 183 → 184\n\ninfra 8384d25 修复自有门禁 compose config 一步(本机 4/4 失败 → 通过);\n05 8dc495a9 新增基础设施层挖掘分析快照并按实测更正 3 处现状。\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T07:03:28-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/7ddebb1efe48c9cb9ff3c3144eda94a92e2fbf9c...4f2c49423f9fa998765359ed8cb67ad425804b59","Len":1}...
|
1791727412
|
Edit
Delete
|
|
36585
|
5
|
5
|
5
|
126
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"1b844e8aa {"Commits":[{"Sha1":"1b844e8aa019b262120d151bdec8354ad51e274b","Message":"chore: 层仓 head 同步(00 → 00d6ac58)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T07:05:29-07:00"}],"HeadCommit":{"Sha1":"1b844e8aa019b262120d151bdec8354ad51e274b","Message":"chore: 层仓 head 同步(00 → 00d6ac58)\n\nCo-Authored-By: Claude Opus 5.5 \u003cnoreply@anthropic.com\u003e\n","AuthorEmail":"hillao@juhailaoluodeMacBook-Pro.local","AuthorName":"juhailaoluo pro","CommitterEmail":"hillao@juhailaoluodeMacBook-Pro.local","CommitterName":"juhailaoluo pro","Timestamp":"2026-10-11T07:05:29-07:00"},"CompareURL":"luoanwu/enterprise-intelligence-os/compare/4f2c49423f9fa998765359ed8cb67ad425804b59...1b844e8aa019b262120d151bdec8354ad51e274b","Len":1}...
|
1791727533
|
Edit
Delete
|