|
29528
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"5b78f9e3c {"Commits":[{"Sha1":"5b78f9e3c5417f825e78550f5d2934295466f032","Message":"fix(electron): 修复 TV 截图编号解析对异常缩进的兼容\n\n- 兼容显示设备属性行缺少缩进,避免提前结束解析\n- 保留区段边界检查,防止误用后续区段的显示屏编号\n- 补充异常缩进及区段隔离回归测试\n\n验证:\n- 85 项相关测试通过\n- npm run typecheck 通过\n- 设备原始输出解析通过,用户确认 TV 截图测试通过\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-14T16:05:32+08:00"}],"HeadCommit":{"Sha1":"5b78f9e3c5417f825e78550f5d2934295466f032","Message":"fix(electron): 修复 TV 截图编号解析对异常缩进的兼容\n\n- 兼容显示设备属性行缺少缩进,避免提前结束解析\n- 保留区段边界检查,防止误用后续区段的显示屏编号\n- 补充异常缩进及区段隔离回归测试\n\n验证:\n- 85 项相关测试通过\n- npm run typecheck 通过\n- 设备原始输出解析通过,用户确认 TV 截图测试通过\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-14T16:05:32+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/924047d2d278a6e3d3088febe2edf7c733788d3b...5b78f9e3c5417f825e78550f5d2934295466f032","Len":1}...
|
1789373228
|
Edit
Delete
|
|
29884
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"c6fbf67a9 {"Commits":[{"Sha1":"c6fbf67a98ba850b052b6d6585e7354718024ebc","Message":"fix(devices): 修复遗漏平台配置导致预览方向错误\n\n- 在约定 INI 目录补读 platform.ini,保留目录和手动键优先级\n- 补充平台方向、手动覆盖及空值回退测试,更新设备说明\n\n验证:\n- 74 项相关测试及 npm run typecheck 通过\n- npm run check:knowledge 通过\n- 用户确认设备实时预览验收通过\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-15T11:06:26+08:00"}],"HeadCommit":{"Sha1":"c6fbf67a98ba850b052b6d6585e7354718024ebc","Message":"fix(devices): 修复遗漏平台配置导致预览方向错误\n\n- 在约定 INI 目录补读 platform.ini,保留目录和手动键优先级\n- 补充平台方向、手动覆盖及空值回退测试,更新设备说明\n\n验证:\n- 74 项相关测试及 npm run typecheck 通过\n- npm run check:knowledge 通过\n- 用户确认设备实时预览验收通过\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-15T11:06:26+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/5b78f9e3c5417f825e78550f5d2934295466f032...c6fbf67a98ba850b052b6d6585e7354718024ebc","Len":1}...
|
1789441667
|
Edit
Delete
|
|
30883
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"4bb59f1fa {"Commits":[{"Sha1":"4bb59f1faa6737e1d679f5715a0c213b46e020a8","Message":"fix(logs): 优化双击选中并稳定查找框布局\n\n- 参考 VS Code 的文本边界规则,支持连续中文和中英数字整段双击选中\n- 跨查找高亮节点建立原生选区,保留复制、选区查找和横向滚动定位\n- 按查找框宽度预留计数区域,避免加载提示及匹配数量切换挤动按钮\n- 补充选词对照测试、离屏交互与逐帧布局回归,并更新日志帮助文档\n\n验证:\n- npm run typecheck\n- npx vitest run src/features/logs/logWordSelection.test.ts(5 项通过)\n- npm run check:knowledge\n- node scripts/test-log-viewer-browser.mjs --selection\n- node scripts/test-log-viewer-browser.mjs --find\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T14:59:03+08:00"},{"Sha1":"6ffe247b3198442b9a270c16b88e866f7560deb6","Message":"fix(logs): 支持查找框调宽并取消匹配总量截断\n\n- 移除查找栏左侧收缩图标,增加左右拖拽调宽、边界限制及双击复原\n- 自动续查到全文结束,支持同一行从原始列继续搜索,不丢失两万项之后的命中\n- 使用分块数字坐标保存结果,仅为可见行生成高亮,避免每页复制全部结果\n- 优先定位当前阅读位置附近的命中,支持文件底部查找与完整首尾循环\n- 同步帮助文档及回归夹具\n\n验证:\n- npm run build(包含 typecheck)\n- 77 项日志相关测试\n- 查找栏离屏测试:拖拽、24050 项全文计数、底部定位与首尾循环\n- 原有日志滚动离屏回归\n- npm run check:knowledge\n- git diff --check\n\n实际操作台视觉和拖拽手感保留人工验收。\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T13:41:38+08:00"},{"Sha1":"931d1e3cd2263189b2c0eb592436c8b69ad455d0","Message":"feat(logs): 对齐 VS Code 查找栏并移除文件列表搜索\n\n- 删除日志文件列表搜索框及其过滤状态,保留快速打开和全局搜索\n- 按参考图实现正文右上角紧凑查找栏,支持大小写、全字、正则、选区与键盘导航\n- 自动续查并按具体出现次数计数和定位,限制缓存并明确展示未完整计数\n- 隔离正则线程并支持超时取消,限制长行摘要大小,同步使用说明\n\n验证:\n- npm run typecheck\n- npm run build\n- 73 项日志相关测试\n- 查找栏与原有日志滚动离屏夹具通过\n- npm run check:knowledge\n- git diff --check\n\n实际操作台视觉与交互保留人工验收。\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T13:27:49+08:00"},{"Sha1":"d94c0aa3b7d46e66054a2a7da708b46e7f69e597","Message":"perf(logs): 增加双向预读与视口缓存\n\n减少定位日志末尾后反向滚动时的短暂加载占位:\n- 围绕可见原行号提前读取上下缓冲,优先滚动方向和可见缺块\n- 按原行号合并重叠正文,按距离淘汰并限制缓存行数及正文大小\n- 后台预读独立于前台读取,不触发全局忙碌状态或修改滚动位置\n- 切换文件和前台跳转取消旧预读,忽略迟到响应\n- 补充长行小块、反向滚动和迟到响应隔离的回归测试与验收说明\n\n验证:\n- 20 项相关单元测试通过\n- 7 组 Electron 离屏合成场景通过,120 毫秒延迟下逐帧检查反向滚动无加载闪烁和位置跳动\n- npm run typecheck、npm run build 通过\n- 未启动正式操作台或连接设备,实际日志体验仍需人工复测\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T12:22:20+08:00"},{"Sha1":"dfa031600cf28cd8993766c88159a013c5bec41a","Message":"fix(logs): 修复正文布局并恢复连续滚动\n\n修复新增导航条抢占正文高度,以及后台读取块变成界面行数限制的问题:\n- 日志正文使用纵向弹性布局,警告和导航按内容占高,小文件贴顶显示\n- 普通查看按文件总行数连续虚拟滚动,缺失正文按需读取并缓存最近四块\n- 保留过滤结果分页和阅读位置,防止未加载范围被静默复制为残缺内容\n- 增加 24 MiB 样本、缓存边界及独立 Electron 离屏组件回归测试\n\n验证:\n- 14 项相关单元测试通过\n- 离屏测试覆盖三行文件、窄窗口、跨 2000 行、末尾、功能及文件切换、过滤切换\n- npm run typecheck、npm run build、npm run check:knowledge 通过\n- 使用合成数据验证,未连接设备或启动正式操作台\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T12:00:12+08:00"}],"HeadCommit":{"Sha1":"4bb59f1faa6737e1d679f5715a0c213b46e020a8","Message":"fix(logs): 优化双击选中并稳定查找框布局\n\n- 参考 VS Code 的文本边界规则,支持连续中文和中英数字整段双击选中\n- 跨查找高亮节点建立原生选区,保留复制、选区查找和横向滚动定位\n- 按查找框宽度预留计数区域,避免加载提示及匹配数量切换挤动按钮\n- 补充选词对照测试、离屏交互与逐帧布局回归,并更新日志帮助文档\n\n验证:\n- npm run typecheck\n- npx vitest run src/features/logs/logWordSelection.test.ts(5 项通过)\n- npm run check:knowledge\n- node scripts/test-log-viewer-browser.mjs --selection\n- node scripts/test-log-viewer-browser.mjs --find\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T14:59:03+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/c6fbf67a98ba850b052b6d6585e7354718024ebc...4bb59f1faa6737e1d679f5715a0c213b46e020a8","Len":8}...
|
1789716533
|
Edit
Delete
|
|
31255
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"1eecf5d00 {"Commits":[{"Sha1":"1eecf5d0083e203962f44259da0fc663ac35aafd","Message":"fix(devices): 修复手动屏幕方向跨目录优先级\n\n优先在全部约定目录中查找非空的是否竖屏_手动,缺失时再回退普通方向,避免外部平台默认值遮蔽私有目录的手动配置。\n\n实现内容:\n- 修复设备概览、截图和实时预览共用的方向解析\n- 补充跨目录覆盖、手动零值、空值回退和扫描脚本回归测试\n- 同步配置注释与设备知识库说明\n\n验证:\n- 6 个相关测试文件共 128 项测试通过\n- npm run typecheck\n- npm run check:knowledge\n- git diff --cached --check\n- 实机画面人工验收结果尚未记录\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T23:15:25+08:00"},{"Sha1":"18cf5164777a2de8b80a3748719274deb164d62b","Message":"feat(renderer): 优先展示快速连接并恢复上次主页功能\n\n实现内容:\n- 将快速连接排在导航首位,个人设备入口紧随其后\n- 在本机保存最后使用的主页功能,启动时恢复该入口\n- 首次使用、过期入口或存储不可用时回退到快速连接,不恢复设备会话\n\n验证:\n- npm run typecheck 通过\n- 主页偏好与终端页面状态相关 11 项测试通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-19T22:38:22+08:00"},{"Sha1":"915907b7d1f55dc14ca910b96aab8340d107e41e","Message":"feat(renderer): 优化快速连接布局与连接状态反馈\n\n将快速入口和最近连接整理为可扫描的操作面板,并在同一目标连接期间防止重复操作。\n\n实现内容:\n- 重排连接输入、认证选项、最近记录和保存设备对话框,适配浅色、深色及窄窗口\n- 展示公网目标的门店与包厢信息,防抖查询并隔离迟到响应\n- 修复图标与输入框的重复边框,增加密码显隐及本机私钥选择\n- 连接、校验、打开操作台及指纹确认期间禁用同目标入口和回车提交,保留取消与其他目标连接\n- 使用提供的单色 SVG 替换最近记录设备图标,通过主题颜色着色并调整窄窗口对齐\n\n验证:\n- npm run typecheck 和 npm run build 通过\n- 快速连接及账号客户端相关 5 个测试文件、65 项测试通过\n- 用户已人工验证快速连接界面、设备自动命名与连接中按钮保护\n- 本次 SVG 替换已通过构建检查,未进行自动桌面交互测试\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-19T22:32:53+08:00"},{"Sha1":"641a614a33411567e47e69da2b24616bb882c07a","Message":"feat(devices): 实现公网设备门店查询与快速记录自动命名\n\n输入公网设备 ID 后复用服务端后台认证查询门店与包厢,减少快速连接记录的人工命名。\n\n实现内容:\n- 增加只读查询接口,严格取首条结果并校验会话与设备权限\n- 通过主页 IPC 暴露裁剪后的信息,合并并行请求并丢弃过期会话响应\n- 按“门店名称 - 包厢名称”命名快速记录,保留正式档案和用户自定义名称\n- 查询失败或无结果时保留原有连接流程,查询不申请设备锁或远程端口\n\n验证:\n- npm run typecheck 和 npm run build 通过\n- 快速连接存储、账号客户端和目标解析相关测试通过\n- 服务端 go test -race ./... 通过\n- 已完成服务端部署、健康检查及真实后台只读查询验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-19T22:32:15+08:00"},{"Sha1":"564dd95a6839b7659aabbc1377f22f03975010ff","Message":"feat(devices): 实现免建档快速连接与最近记录\n\n为减少连接前创建设备档案和重复填写认证的步骤,新增快速连接入口。\n\n实现内容:\n- 支持输入局域网 IP 或公网设备 ID,打开独立操作台或主页 SSH、SFTP 标签\n- 按账号隔离默认认证与最近成功记录,密码使用安全存储\n- 复用已有设备并支持原位保存为正式设备,保留会话和日志、INI 数据\n- 补充连接生命周期测试、功能说明和知识库导航覆盖\n\n验证:\n- npm run typecheck\n- npm test:166 个测试文件、1488 项测试通过\n- 最终调整后快速连接相关 20 项测试通过\n- npm run build(使用本地 Go 缓存并关闭依赖下载)\n- npm run check:knowledge\n- 用户反馈人工测试通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-19T20:39:58+08:00"}],"HeadCommit":{"Sha1":"1eecf5d0083e203962f44259da0fc663ac35aafd","Message":"fix(devices): 修复手动屏幕方向跨目录优先级\n\n优先在全部约定目录中查找非空的是否竖屏_手动,缺失时再回退普通方向,避免外部平台默认值遮蔽私有目录的手动配置。\n\n实现内容:\n- 修复设备概览、截图和实时预览共用的方向解析\n- 补充跨目录覆盖、手动零值、空值回退和扫描脚本回归测试\n- 同步配置注释与设备知识库说明\n\n验证:\n- 6 个相关测试文件共 128 项测试通过\n- npm run typecheck\n- npm run check:knowledge\n- git diff --cached --check\n- 实机画面人工验收结果尚未记录\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T23:15:25+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/4bb59f1faa6737e1d679f5715a0c213b46e020a8...1eecf5d0083e203962f44259da0fc663ac35aafd","Len":10}...
|
1789829267
|
Edit
Delete
|
|
31261
|
16
|
9
|
16
|
86
|
0
|
0
|
refs/tags/v0.2.0
|
0
|
{"Commits":null,"HeadCommit":{" {"Commits":null,"HeadCommit":{"Sha1":"1eecf5d0083e203962f44259da0fc663ac35aafd","Message":"fix(devices): 修复手动屏幕方向跨目录优先级\n\n优先在全部约定目录中查找非空的是否竖屏_手动,缺失时再回退普通方向,避免外部平台默认值遮蔽私有目录的手动配置。\n\n实现内容:\n- 修复设备概览、截图和实时预览共用的方向解析\n- 补充跨目录覆盖、手动零值、空值回退和扫描脚本回归测试\n- 同步配置注释与设备知识库说明\n\n验证:\n- 6 个相关测试文件共 128 项测试通过\n- npm run typecheck\n- npm run check:knowledge\n- git diff --cached --check\n- 实机画面人工验收结果尚未记录\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-18T23:15:25+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/0000000000000000000000000000000000000000...1eecf5d0083e203962f44259da0fc663ac35aafd","Len":0}...
|
1789830872
|
Edit
Delete
|
|
31262
|
16
|
24
|
16
|
86
|
0
|
0
|
refs/tags/v0.2.0
|
0
|
Juhai OpsDesk v0.2.0 · 快速连接、设备分组与日志体验升级
|
1789830872
|
Edit
Delete
|
|
31771
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"83529861a {"Commits":[{"Sha1":"83529861ab1a7994b1677520ea5b6b07d9e02e0e","Message":"fix(knowledge): 修复 0.2.0 产品知识版本匹配并完善发布流程\n\n- 将应用版本与 106 篇产品知识及评估同步到 0.2.0\n- 补齐快速连接、个人分组、日志和 INI 等功能说明及复现用例\n- 增加当前应用版本覆盖校验,避免升级后无适用资料\n- 增加保留旧版资料的候选发布、逐条核验和受控回退脚本\n- 记录版本差异、云端发布及新旧客户端验证结果\n\n验证:\n- npm run typecheck\n- npm run build\n- npm run check:knowledge\n- Python 发布脚本语法检查及 git diff --check\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-21T22:16:03+08:00"},{"Sha1":"57d1cec0b41de34c5cbdc89e1ecd954d1bf5ccc3","Message":"fix(devices): 修复公网 SSH 失效端口重试与分配保护\n\n- 增加每轮一次的换端口重试及冷却倒计时,保留锁清理后的失败状态\n- 持久化服务端设备冷却并限制遗留端口数量,防止跨客户端重复分配\n- 先保留新端口再原子切换关联,失败保留原记录并维持安全回收\n- 增加数据库结构版本 3、客户端及服务端回归测试和操作说明\n\n验证:\n- npm run typecheck 与 npm run build\n- 客户端相关测试 84 项通过\n- go test -race ./...\n- PostgreSQL 9 项回归及生产副本升级演练通过\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-21T22:10:52+08:00"}],"HeadCommit":{"Sha1":"83529861ab1a7994b1677520ea5b6b07d9e02e0e","Message":"fix(knowledge): 修复 0.2.0 产品知识版本匹配并完善发布流程\n\n- 将应用版本与 106 篇产品知识及评估同步到 0.2.0\n- 补齐快速连接、个人分组、日志和 INI 等功能说明及复现用例\n- 增加当前应用版本覆盖校验,避免升级后无适用资料\n- 增加保留旧版资料的候选发布、逐条核验和受控回退脚本\n- 记录版本差异、云端发布及新旧客户端验证结果\n\n验证:\n- npm run typecheck\n- npm run build\n- npm run check:knowledge\n- Python 发布脚本语法检查及 git diff --check\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-21T22:16:03+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/1eecf5d0083e203962f44259da0fc663ac35aafd...83529861ab1a7994b1677520ea5b6b07d9e02e0e","Len":2}...
|
1790041746
|
Edit
Delete
|
|
33026
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"2bbb343f0 {"Commits":[{"Sha1":"2bbb343f0083144435b1dd0e1ed972e4ba663629","Message":"Merge branch 'main' of https://gamebyte.cn/gitea/root/juhai-opsdesk\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-27T13:40:06+08:00"},{"Sha1":"0106cb210639617d6d60af269be5bf9b4ef8eb0f","Message":"fix(devices): 修复 MCP 无法发现快速连接设备\n\n未加入个人设备列表的快速连接已有稳定身份,但 MCP 仅枚举正式档案,导致无法按设备 ID 定位。\n\n实现内容:\n- 合并正式档案、快速连接成功历史和活动记录,支持按来源筛选\n- 按界面设备 ID 检索并返回 profileId,保留同设备的不同连接身份\n- 按内部 ID 去重,隔离账号读取,避免重新暴露已清除历史的闲置记录\n- 补充设备发现、来源筛选、身份转换及 MCP 协议回归测试\n\n验证:\n- npm test -- electron/quickConnectStore.test.ts electron/agent:124 项通过\n- npm run typecheck:通过\n- GOCACHE=/private/tmp/juhai-opsdesk-go-build-cache GOPROXY=off npm run build:通过;使用临时缓存目录避免沙箱写入默认 Go 缓存失败\n- 用户反馈人工测试通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-26T21:27:23+08:00"},{"Sha1":"7923d133692886489f02ce82a50e96dd5a6caa87","Message":"fix(renderer): 统一路线选择样式并隐藏预览节点域名\n\n实现内容:\n- 实时预览与日志采集统一使用路线文案,国内与海外选择保持不变\n- 提取现有预览工具栏下拉样式供两页共用,统一箭头、焦点和禁用状态\n- 移除预览候选节点域名及悬浮提示,保留实际连接方式说明\n- 同步路线验收说明\n\n验证:\n- npm run typecheck\n- 预览工作区测试 23 项通过\n- git diff --check\n- 界面交互与主题外观待人工验证\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-26T20:52:37+08:00"},{"Sha1":"00a1740211b4bd4dd73dfd6470af225a0d4fde2e","Message":"feat(app): 增加设备国内与海外中继选择并取消国家探测\n\n实现内容:\n- 默认使用国内中继,按账号和设备记住选择,日志与预览页面共享线路控件及海外提示\n- 旧自动设置迁移为国内,保留海外设置;新操作读取固定线路,不再查询国家或探测候选节点\n- 线路切换不打断活动会话,保留直连、普通 SFTP、国内小尾部快速路径和原有认证校验\n- 更新业务说明和人工验收步骤,撤下未证实有效的提前探测实验\n\n验证:\n- 8 个针对性测试文件共 206 项通过,覆盖偏好隔离、并发保存、配置迁移、线路切换和采集回归\n- npm run typecheck 通过\n- GOCACHE=/private/tmp/juhai-log-optimization-go-cache GOPROXY=off GOSUMDB=off npm run build 通过\n- 未自动操控应用或连接真实设备验证本次功能,真机耗时和界面交互待人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-26T20:18:03+08:00"},{"Sha1":"05fc234aec9d1c9689a12abbbcac50eecdd05256","Message":"fix(logs): 完善采集准备缓存、取消清理和耗时诊断\n\n实现内容:\n- 将同连接 Agent 校验缓存延长至五分钟,DNS 独立保留六十秒且命中不续期\n- 保留顺序建链及分步上传启动,补齐隧道取消、迟到资源清理和共享连接保护\n- 记录隧道各阶段、SSH 握手和逐文件耗时,将界面计数明确为 SSH 命令次数\n- 清理实验回退后的测试残留,同步业务流程与验收文档\n\n验证:\n- 日志、启动器、选路及连接生命周期回归:7 个测试文件、230 项通过\n- 本机回环 SSH 集成测试:9 项通过\n- npm run build 通过,包含三套 TypeScript 类型检查\n- 用户同设备五文件各一万行复测:首次 5.888 秒,约二十二秒后再次采集 1.947 秒;仅作为基线,不宣称冷启动进一步提速\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-26T14:08:55+08:00"}],"HeadCommit":{"Sha1":"2bbb343f0083144435b1dd0e1ed972e4ba663629","Message":"Merge branch 'main' of https://gamebyte.cn/gitea/root/juhai-opsdesk\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-09-27T13:40:06+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/83529861ab1a7994b1677520ea5b6b07d9e02e0e...2bbb343f0083144435b1dd0e1ed972e4ba663629","Len":12}...
|
1790559633
|
Edit
Delete
|
|
33027
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[],"HeadCommit":{"S {"Commits":[],"HeadCommit":{"Sha1":"0106cb210639617d6d60af269be5bf9b4ef8eb0f","Message":"fix(devices): 修复 MCP 无法发现快速连接设备\n\n未加入个人设备列表的快速连接已有稳定身份,但 MCP 仅枚举正式档案,导致无法按设备 ID 定位。\n\n实现内容:\n- 合并正式档案、快速连接成功历史和活动记录,支持按来源筛选\n- 按界面设备 ID 检索并返回 profileId,保留同设备的不同连接身份\n- 按内部 ID 去重,隔离账号读取,避免重新暴露已清除历史的闲置记录\n- 补充设备发现、来源筛选、身份转换及 MCP 协议回归测试\n\n验证:\n- npm test -- electron/quickConnectStore.test.ts electron/agent:124 项通过\n- npm run typecheck:通过\n- GOCACHE=/private/tmp/juhai-opsdesk-go-build-cache GOPROXY=off npm run build:通过;使用临时缓存目录避免沙箱写入默认 Go 缓存失败\n- 用户反馈人工测试通过\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-09-26T21:27:23+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/2bbb343f0083144435b1dd0e1ed972e4ba663629...0106cb210639617d6d60af269be5bf9b4ef8eb0f","Len":0}...
|
1790560657
|
Edit
Delete
|
|
35132
|
16
|
1
|
16
|
125
|
0
|
0
|
|
0
|
|
1791450264
|
Edit
Delete
|
|
35930
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
|
1791611083
|
Edit
Delete
|
|
35931
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"958ef4eaa {"Commits":[{"Sha1":"958ef4eaa9c5c873973a94474f7ffb6ab9c16cd2","Message":"fix(mfa): 限制初始管理员凭据并原子完成首次开通\n\n初始管理员密码原先没有有效期,首次绑定后仍可作为长期密码使用。增加固定开通期限并要求绑定时设置正式密码,保留现有 MFA 安全机制。\n\n实现内容:\n- V24 增加初始凭据截止和完成标记,固定 24 小时有效,受限会话仍最多 300 秒且不能越过开户期限\n- 正式密码替换、TOTP 消费、因素绑定、恢复码生成及审计原子提交,撤销旧身份并创建新会话\n- 处理并发开通的浏览器会话清理,仅续办当前浏览器的有效 OIDC 交易且不延长交易期限\n- 增加离线重新签发命令和私密交付流程,禁止用于已绑定账号;前端仍要求确认保存恢复码\n- 补充开通、迁移、并发、事务回滚、前端和交付脚本测试,同步账号与 MFA 合同\n\n验证:\n- Maven 定向 verify:BootstrapEnrollmentIT 10 项、AccountsIT 15 项、MfaIT 34 项、TotpTest 3 项通过\n- AttackProtectionIT 12 项、SessionLifecycleIT 26 项、AuthorizationIT 26 项、BrowserSecurityIT 5 项通过\n- 初始凭据及三类 MFA 迁移测试各 1 项通过;AuthorizationMigrationIT 修正旧版本断言后 3 项通过\n- npm run check:21 个文件 173 项测试以及格式、lint、类型检查、构建通过\n- python3 deploy/lab/test-bootstrap.py:3 项通过\n- Maven console profile package 通过,最终 JAR 的前端资源和 V24 迁移与工作区一致\n- 后端全量测试及本阶段真实浏览器验收未运行\n\nBREAKING CHANGE: 需执行 V24 并同步升级前后端;历史未绑定初始管理员必须离线重新签发,初始开通确认接口新增必填 new_password,旧实例不能混跑\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-09T18:38:18+08:00"},{"Sha1":"f59b781e837c7cc0afc4916f4e7ace4d5e37f760","Message":"fix(mfa): 修复受限会话恢复并增加递增冷却\n\n修复受限 MFA 会话过期后的页面恢复,并区分挑战终态与临时限流,防止用户等待后继续提交已失效的挑战。\n\n实现内容:\n- 全局 401 覆盖 PENDING/RECOVERY,补充 MFA 路由保护和明确退出导航\n- 挑战及绑定截止不晚于基础会话期限,终态要求重新开始,临时限流按 Retry-After 等待且不自动提交\n- V23 增加账号共享失败累计,每五次无效证明按 30/60/120/300 秒递增冷却,并原子记录审计与 Outbox\n- 保留 TOTP 防重放、恢复码单次消费、管理员禁止停用及独立二次验证授权\n- 补充集成、迁移、前端与浏览器验收测试,同步接口合同\n\n验证:\n- Maven 定向 verify:TotpTest 3 项、AttackProtectionIT 12 项、BrowserSecurityIT 5 项及三类 MFA 迁移测试各 1 项通过\n- MfaIT 首轮两项测试夹具异常已修复,定向 verify 重跑 34 项全部通过\n- npm run check:21 个文件共 171 项测试通过,格式、lint、类型及构建通过;最终脚本补测后格式与 lint 再次通过\n- Maven console profile package 成功,最终 JAR 浏览器 S01—S07 完整通过,S08 正式登录路由单独补测通过\n- 后端全量测试及原 P11 浏览器全套未运行\n\nBREAKING CHANGE: 挑战耗尽由 429 改为 400,新增 MFA_CHALLENGE_CONSUMED 和 MFA_COOLDOWN;需执行 V23、同步升级前后端并协调停止旧实例\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-09T18:13:57+08:00"},{"Sha1":"c0aca8ed9cb6c24340ab9a6cf3c22ff42d68c59b","Message":"fix(mfa): 为敏感因素操作增加独立二次验证授权\n\n登录验证不再授权认证器重绑、恢复码再生成或停用 MFA,敏感操作必须完成新的 TOTP 验证。\n\n实现内容:\n- 新增 V22 授权表,绑定用户、会话、因素代际与操作类型,五分钟有效并在业务事务内原子消费\n- 保持首次绑定与恢复码受限重绑、管理员禁用限制及普通管理会话强度语义\n- 前端按具体操作弹出验证,身份变化、取消或过期终止,成功后最多续办一次并使用轮换后的 CSRF\n- 补充迁移、授权边界、前端续办测试以及接口文档和浏览器验收脚本\n\n验证:\n- MfaIT 23、AttackProtectionIT 12、TotpTest 3、BrowserSecurityIT 5、MfaMigrationIT 1、MfaStepUpMigrationIT 1 均通过\n- npm run check 通过:20 个文件共 157 项测试,格式、静态检查、类型检查与构建通过\n- 最后调整验收脚本后 npm run format:check 通过;console 制品打包通过\n- 最终制品的真实浏览器 12 个场景分两轮覆盖通过;完整单轮受账号限流影响,脚本已加入窗口等待\n- git diff --check 通过;后端全量测试未运行\n\nBREAKING CHANGE: 敏感因素操作需在挑战中指定 operation 并携带 X-MFA-Step-Up 授权。上线须执行 V22 并同步升级前后端,旧实例不可混跑;升级会清除未完成的绑定候选。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-09T17:17:07+08:00"},{"Sha1":"7f8cdc4698e73b2af30f932250521b0d12198f06","Message":"chore(evidence): 外置验收截图并记录历史清理映射\n\n批量浏览器截图占据仓库主要体积,改为独立归档并保留证据追溯方式。\n\n实现内容:\n- 排除 docs/evidence 下批量图片再次进入版本控制,保留其他文档图片\n- 增加 3473 张截图的归档校验清单及 146 个历史提交的新旧映射\n- 将 534 处截图链接指向归档说明并保留原路径,补充恢复及后续证据规则\n\n验证:\n- 146 个历史提交的非截图文件及父提交关系逐一核对通过\n- 3473 张归档图片逐一核对 SHA-256,通过归档完整性检查\n- 全部归档图片被忽略,其他文档图片未被误排除\n- 534 处改写链接目标校验及 git diff --check 通过\n- 未运行业务测试,本次没有修改业务代码或测试断言\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-09T15:37:26+08:00"},{"Sha1":"7da2727c1fa0b56e93f3c0bf68882dedc18dc46d","Message":"docs(capacity): 归档生命周期锁优化与两小时故障复验\n\n记录共享生命周期读锁候选的同条件短测、正式稳定性及故障复验,保留失败与修正,并按原预算维持未通过裁决。\n\n实现内容:\n- 归档原始样本、源码摘要、曲线、认证方案评审及复算脚本\n- 同步开发计划和容量任务,区分历史、诊断、正式结果及目标缺口\n- 固定派生CSV使用LF,核对220份证据摘要与Git暂存内容一致\n- 保留耗尽探针首次失败及补测,记录7个独立环境与私有材料清理\n\n验证:\n- 冻结候选 ./mvnw -B -ntp clean verify -Pconsole:491个唯一测试通过,零失败、零跳过,AOSP及冻结前端构建通过\n- Python统计合同11项通过;最终故障工具javac及AOSP通过\n- 正式7200秒:815729成功、31错误、零漏发和429;刷新P95 303.72ms仍超过200ms预算\n- 10类低档隔离探针及9类持续背景故障最终通过,初次失败与预热错误保留\n- 归档JSON/Python语法、摘要与git diff --cached --check通过\n- L1自身目标仍未满足,限定试运行依据不足,P12未通过;未进入P13、未推送\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-08T20:21:54+08:00"}],"HeadCommit":{"Sha1":"958ef4eaa9c5c873973a94474f7ffb6ab9c16cd2","Message":"fix(mfa): 限制初始管理员凭据并原子完成首次开通\n\n初始管理员密码原先没有有效期,首次绑定后仍可作为长期密码使用。增加固定开通期限并要求绑定时设置正式密码,保留现有 MFA 安全机制。\n\n实现内容:\n- V24 增加初始凭据截止和完成标记,固定 24 小时有效,受限会话仍最多 300 秒且不能越过开户期限\n- 正式密码替换、TOTP 消费、因素绑定、恢复码生成及审计原子提交,撤销旧身份并创建新会话\n- 处理并发开通的浏览器会话清理,仅续办当前浏览器的有效 OIDC 交易且不延长交易期限\n- 增加离线重新签发命令和私密交付流程,禁止用于已绑定账号;前端仍要求确认保存恢复码\n- 补充开通、迁移、并发、事务回滚、前端和交付脚本测试,同步账号与 MFA 合同\n\n验证:\n- Maven 定向 verify:BootstrapEnrollmentIT 10 项、AccountsIT 15 项、MfaIT 34 项、TotpTest 3 项通过\n- AttackProtectionIT 12 项、SessionLifecycleIT 26 项、AuthorizationIT 26 项、BrowserSecurityIT 5 项通过\n- 初始凭据及三类 MFA 迁移测试各 1 项通过;AuthorizationMigrationIT 修正旧版本断言后 3 项通过\n- npm run check:21 个文件 173 项测试以及格式、lint、类型检查、构建通过\n- python3 deploy/lab/test-bootstrap.py:3 项通过\n- Maven console profile package 通过,最终 JAR 的前端资源和 V24 迁移与工作区一致\n- 后端全量测试及本阶段真实浏览器验收未运行\n\nBREAKING CHANGE: 需执行 V24 并同步升级前后端;历史未绑定初始管理员必须离线重新签发,初始开通确认接口新增必填 new_password,旧实例不能混跑\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-09T18:38:18+08:00"},"CompareURL":"pengzhiyu/IAM/compare/bff0faf3451547b455191b02c7cf7ca2a1c1ee80...958ef4eaa9c5c873973a94474f7ffb6ab9c16cd2","Len":10}...
|
1791611083
|
Edit
Delete
|
|
36291
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"06556f73e {"Commits":[{"Sha1":"06556f73ea74b431979b8b819de8e85358843b49","Message":"perf: 优化客户端凭据校验与授权查询并补充容量观测\n\nP12 L1 尚未通过,先实现客户端校验、授权查询与观测工具的第一批调整,供另一台 JDK 25 设备编译回归后形成云端测试候选;本提交不代表性能验收通过。\n\n实现内容:\n- 新客户端秘密采用用途独立的版本化 HMAC-SHA256,兼容历史 BCrypt12;通过 V25 显式激活密钥权威并守卫凭据写入\n- 增加普通客户端秘密轮换及认证换代复核,补充协议、密钥策略、部署辅助工具与测试源码\n- 通过 V26 缩小目标企业资格查询,批量计算组织范围,将本地缓存调整为有界 LRU\n- 增加认证、锁、缓存及连接池指标,补充 legacy/hmac/mixed 容量模式、Linux 临时路径与候选摘要核对\n- 更新部署说明和 P12 交接,明确另一设备先完成构建回归,随后再进行云端隔离性能测试\n\n验证:\n- google-java-format 1.35.0 --aosp --dry-run --set-exit-if-changed:51 个新增或修改 Java 文件通过\n- Python AST 解析:11 个新增或修改 Python 文件通过,仅语法检查,未导入或执行脚本\n- git diff --check:通过;新增文档相对文件链接检查通过\n- 当前默认 Java 21,按用户安排未运行 Maven/Spotless 全工程门禁、编译、测试、数据库迁移、容器或压测;须在 JDK 25 设备继续验收\n\nBREAKING CHANGE: 启动前必须准备 IAM_CLIENT_SECRET_KEY_RING_FILE 并以迁移身份显式激活权威集合;写入 HMAC 凭据后不支持直接回退旧二进制\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-10T17:56:32+08:00"}],"HeadCommit":{"Sha1":"06556f73ea74b431979b8b819de8e85358843b49","Message":"perf: 优化客户端凭据校验与授权查询并补充容量观测\n\nP12 L1 尚未通过,先实现客户端校验、授权查询与观测工具的第一批调整,供另一台 JDK 25 设备编译回归后形成云端测试候选;本提交不代表性能验收通过。\n\n实现内容:\n- 新客户端秘密采用用途独立的版本化 HMAC-SHA256,兼容历史 BCrypt12;通过 V25 显式激活密钥权威并守卫凭据写入\n- 增加普通客户端秘密轮换及认证换代复核,补充协议、密钥策略、部署辅助工具与测试源码\n- 通过 V26 缩小目标企业资格查询,批量计算组织范围,将本地缓存调整为有界 LRU\n- 增加认证、锁、缓存及连接池指标,补充 legacy/hmac/mixed 容量模式、Linux 临时路径与候选摘要核对\n- 更新部署说明和 P12 交接,明确另一设备先完成构建回归,随后再进行云端隔离性能测试\n\n验证:\n- google-java-format 1.35.0 --aosp --dry-run --set-exit-if-changed:51 个新增或修改 Java 文件通过\n- Python AST 解析:11 个新增或修改 Python 文件通过,仅语法检查,未导入或执行脚本\n- git diff --check:通过;新增文档相对文件链接检查通过\n- 当前默认 Java 21,按用户安排未运行 Maven/Spotless 全工程门禁、编译、测试、数据库迁移、容器或压测;须在 JDK 25 设备继续验收\n\nBREAKING CHANGE: 启动前必须准备 IAM_CLIENT_SECRET_KEY_RING_FILE 并以迁移身份显式激活权威集合;写入 HMAC 凭据后不支持直接回退旧二进制\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-10T17:56:32+08:00"},"CompareURL":"pengzhiyu/IAM/compare/958ef4eaa9c5c873973a94474f7ffb6ab9c16cd2...06556f73ea74b431979b8b819de8e85358843b49","Len":1}...
|
1791626275
|
Edit
Delete
|
|
36654
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"4bda2cc02 {"Commits":[{"Sha1":"4bda2cc02706e1c64d5cd23c233673a0b32d0a72","Message":"test: 修复集成测试应用的关闭顺序\n\n测试类的临时数据库和 Redis 会先于缓存中的应用回收,后台任务可能继续访问已回收资源。\n\n实现内容:\n- 为 BaselineIT 和 AccountsIT 声明 AFTER_CLASS 关闭并接入测试探针\n- 在容器仍存活时核对连接池、Redis、调度任务及所属执行器结束状态\n- 增加正常、异常回调及未关闭资源反例,保留原故障恢复和安全断言\n- 记录本地归因、首次失败、最终定向结果与完整检查的启动阻塞\n\n验证:\n- Java 25 离线 test-compile(含 Spotless)通过\n- 最终定向 29 项及 Baseline 独立最后应用 7 项通过\n- 完整 clean verify:169 项单测通过;集成 422 项通过、1 项启动错误、74 项跳过\n- ProtocolConsistencyIT 第二个应用因端口绑定失败启动不成功,占用者尚未确证;完整门禁未通过,未重跑\n- F0 36 场景全部拒绝,消费、新凭据和刷新成功事件为零\n- git diff --check 和 37 个文档相对链接/锚点检查通过\n\n仅修改测试及任务文档;不改变产品合同,不作为候选冻结或性能验收通过的证明。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-11T08:50:19-07:00"},{"Sha1":"b69ba6c8145d3b5bc8e67e37a9d2f26e8723222b","Message":"feat(console): 合并控制台面向普通用户的文案改写\n\n控制台原先大量使用标识、版本、协议术语和后端状态原值,普通管理员难以理解。合并 feat/console-polish-next 分支,完成三个概览页重设计、导航改名,以及全部管理页面、个人中心、工作台与切换器的文案改写。\n\n实现内容:\n- 重新设计平台、企业、应用三个概览页,侧边栏模块按日常说法改名,并在 docs/console/design-system.md 记录新旧名称对照\n- 各管理页面改用日常说法,状态和角色显示中文,标识、版本、追踪编号收进默认收起的\"技术细节\"\n- 时间输入改用本地日期时间选择器,提交时仍为带时区的 ISO 时间;操作记录显示中文操作名称,并支持下拉筛选\n- \"秘密\"统一称\"密钥\",\"机器客户端/服务主体\"称\"程序客户端/程序身份\",\"IAM 会话\"称\"登录记录\"\n- 同步更新单元测试与验收脚本中的文案和定位,列表行增加 data-record-id 供脚本定位\n\n验证:\n- 分支上每批提交前运行 npm run check:format:check、lint、typecheck、build 通过,最后一次测试 203/203 通过\n- 各页面在浏览器中核对;程序接入详情、程序身份详情与启用新应用弹窗因演示环境缺数据或登录过期未核对\n- 验收脚本仅执行 node --check,未实际运行\n- 合并无冲突,main 上未单独重新运行检查\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-11T08:34:48-07:00"},{"Sha1":"9339f14f94e988b7a3d898f11daa506446d75c44","Message":"feat(console): 改写工作台与企业切换器文案\n\n工作台和顶部切换器仍使用\"管理上下文\"\"平台总入口仅限平台管理员\"\"全员准入\"\"企业已启用/应用正常\"双徽标等说法,工作台还直接展示账号标识。改为日常说法,并与应用开通页的\"使用情况\"保持一致。\n\n实现内容:\n- 工作台说明改为说明顶部一直显示正在管理的企业和应用;平台入口锁定提示改为\"只有平台管理员可以进入\",应用管理员入口改为\"进入应用接入\"\n- 右侧卡片改为\"我的账号\",显示名字、平台管理身份、登录方式与\"这台电脑保存了什么\",账号标识收进技术细节\n- 切换器标题改为\"切换企业或应用\"并改写说明;企业列表去掉恒为真的\"企业正常\"徽标,非正常状态显示中文状态\n- 应用列表改为\"应用(可选)\",用 appUsage 的单个\"使用情况\"徽标替代企业关系与全局状态两个徽标,可进入的应用显示\"所有成员可用/仅指定成员可用\";空状态、无权限与停用说明改写\n- 顶部路径的\"未选择管理上下文\"改为\"未选择企业\",相关 aria-label 同步改写\n- 平台与应用无法进入时的说明改为日常说法,应用停用原因复用 appUsage\n- 删除已无引用的 relationLabel、applicationStatusLabel、accessPolicyLabel\n- 同步更新 acceptance.mjs 中切换器标题、应用分组、停用说明与无权限提示的定位\n\n验证:\n- npm run check:format:check、lint、typecheck、build 通过,测试 203/203 通过\n- 浏览器核对工作台与切换器(选择企业后未进入)\n- 验收脚本仅执行 node --check,未实际运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-11T08:27:50-07:00"},{"Sha1":"74debf18dda59db91112b09eb5a93214a0e18c52","Message":"feat(console): 改写个人中心文案并把会话称为登录记录\n\n个人中心原先使用\"IAM 会话\"\"最近协议活动\"\"绝对截止\"\"期限类别\"\"管理上下文\"等术语,每条会话都重复一段说明并直接展示编号。改为\"登录记录\"等日常说法,编号收进技术细节。\n\n实现内容:\n- \"IAM 登录会话\"改为\"登录记录\",状态改为登录中/已过期/已退出/已失效;时间字段改为登录时间、最近使用、一直不用时自动退出于、最晚退出时间、登录有效期\n- 每条记录重复的说明合并到卡片说明中;登录编号收进技术细节;按钮改为\"退出当前登录\"\"退出这次登录\"\"确认退出\"\"刷新登录记录\"\n- 退出确认与成功提示改为\"登录\"说法,冲突与无权提示改写\n- \"我的身份\"改为\"我的账号\",显示名字与平台管理身份,账号标识收进技术细节;\"我的企业\"去掉恒为真的\"企业正常/有效成员\"徽标与成员标识,改为\"你的身份:所有者/普通成员\",按钮改为\"切换企业\"\n- 底部说明改为\"切换企业与退出登录有什么区别\"\n- 邮箱卡片中\"无法恢复丢失的全部 MFA 因素\"改为日常说明\n- 操作记录中的\"两步验证\"统一为与多因素验证页面一致的\"多因素验证\"\n- 同步更新 personal 测试与 acceptance-t05、acceptance-p11-t04/t05/t07 的按钮与标题定位(示例应用自身的\"退出当前 IAM 会话\"按钮未改)\n\n验证:\n- npm run check:format:check、lint、typecheck、build 通过,测试 203/203 通过\n- 浏览器核对个人中心各卡片与登录记录(未执行退出)\n- 验收脚本仅执行 node --check,未实际运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-11T08:25:43-07:00"},{"Sha1":"546f7184ef08dfa32fbd7610c8152fa6856d9ee4","Message":"style(console): 格式化程序身份验收脚本中的负责人失效断言\n\n上一提交在运行 Prettier 之后又修改了 acceptance-p10-t01.mjs 的一行断言,导致该文件不符合 npm run format:check。\n\n实现内容:\n- 按 Prettier 规则折行负责人失效断言,不改变断言内容\n\n验证:\n- npx prettier --check scripts/acceptance-p10-t01.mjs:通过\n- node --check scripts/acceptance-p10-t01.mjs:通过;脚本未实际运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-11T08:24:05-07:00"}],"HeadCommit":{"Sha1":"4bda2cc02706e1c64d5cd23c233673a0b32d0a72","Message":"test: 修复集成测试应用的关闭顺序\n\n测试类的临时数据库和 Redis 会先于缓存中的应用回收,后台任务可能继续访问已回收资源。\n\n实现内容:\n- 为 BaselineIT 和 AccountsIT 声明 AFTER_CLASS 关闭并接入测试探针\n- 在容器仍存活时核对连接池、Redis、调度任务及所属执行器结束状态\n- 增加正常、异常回调及未关闭资源反例,保留原故障恢复和安全断言\n- 记录本地归因、首次失败、最终定向结果与完整检查的启动阻塞\n\n验证:\n- Java 25 离线 test-compile(含 Spotless)通过\n- 最终定向 29 项及 Baseline 独立最后应用 7 项通过\n- 完整 clean verify:169 项单测通过;集成 422 项通过、1 项启动错误、74 项跳过\n- ProtocolConsistencyIT 第二个应用因端口绑定失败启动不成功,占用者尚未确证;完整门禁未通过,未重跑\n- F0 36 场景全部拒绝,消费、新凭据和刷新成功事件为零\n- git diff --check 和 37 个文档相对链接/锚点检查通过\n\n仅修改测试及任务文档;不改变产品合同,不作为候选冻结或性能验收通过的证明。\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-11T08:50:19-07:00"},"CompareURL":"pengzhiyu/IAM/compare/06556f73ea74b431979b8b819de8e85358843b49...4bda2cc02706e1c64d5cd23c233673a0b32d0a72","Len":43}...
|
1791733915
|
Edit
Delete
|
|
36783
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"629bde5b6 {"Commits":[{"Sha1":"629bde5b6dbae87108816cd5a18339073b2e41de","Message":"feat(renderer): 实现实时预览后台保活\n\n切换操作台功能标签后保持预览会话,返回实时预览页继续查看画面。\n\n- 保留媒体视图挂载,将标签可见性与会话生命周期分离\n- 允许启动和故障回退在后台完成,切页时取消触摸输入并关闭远程操作\n- 保留停止、功能关闭、操作台卸载和断开连接时的资源清理\n- 补充生命周期回归测试,并同步预览知识库说明\n\n验证:\n- 109 项预览相关测试通过\n- npm run typecheck\n- npm exec electron-vite build\n- npm run check:knowledge\n- git diff --check\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-09T17:30:17+08:00"}],"HeadCommit":{"Sha1":"629bde5b6dbae87108816cd5a18339073b2e41de","Message":"feat(renderer): 实现实时预览后台保活\n\n切换操作台功能标签后保持预览会话,返回实时预览页继续查看画面。\n\n- 保留媒体视图挂载,将标签可见性与会话生命周期分离\n- 允许启动和故障回退在后台完成,切页时取消触摸输入并关闭远程操作\n- 保留停止、功能关闭、操作台卸载和断开连接时的资源清理\n- 补充生命周期回归测试,并同步预览知识库说明\n\n验证:\n- 109 项预览相关测试通过\n- npm run typecheck\n- npm exec electron-vite build\n- npm run check:knowledge\n- git diff --check\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-09T17:30:17+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/0106cb210639617d6d60af269be5bf9b4ef8eb0f...629bde5b6dbae87108816cd5a18339073b2e41de","Len":1}...
|
1791781818
|
Edit
Delete
|
|
36913
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"faac5481c {"Commits":[{"Sha1":"faac5481c1cca66e4708222686b6588a43938150","Message":"feat(console): 合并控制台逐页布局与样式改造\n\n控制台各页面原先列表用「查看详情」按钮、详情是整张表单、弹窗操作区与空状态各不相同,常用信息和危险操作混在一起。合并 feat/console-layout 分支,按统一的列表、抽屉与弹窗约定逐页重排企业内、平台侧与应用内的管理页面。\n\n实现内容:\n- 列表统一为整行可点(OpenableRow 或同交互的专用行),名称为链接或按钮、末列右箭头,需要处理的状态用 cell-note 提示;空状态改为带图标、说明与操作的公共 EmptyList,无数据时不显示分页\n- 详情抽屉按「基本信息 / 业务分区 / 危险区」分区,修改就地展开且同一时间只进行一项;危险操作默认收起,展开后用单选卡片或确认勾选\n- 企业、应用接入改为带分区标签的详情页;新增只读组织架构图;成员、部门、用户组、所有账号、企业与平台管理员、应用开通、操作记录、权限清单、角色、角色分配、程序接入(密钥管理内嵌抽屉)与程序身份完成改造\n- 弹窗底部统一使用 FormActions「取消 + 主操作」,多步弹窗提供「重新选择」;权限统一以名称为主、代码为辅显示,勾选清单统一为带边框的列表\n- 同步更新各页面单元测试与相关验收脚本中的文案和定位\n\n验证:\n- 分支上每次提交前运行 npm run check:format:check、lint、typecheck、test、build 通过,最后一次 Vitest 26 个文件 223 项全部通过\n- 各页面在浏览器 1280 宽、375 窄屏及亮/暗色下核对;程序接入、程序身份等演示环境缺数据的页面以页面内临时改写接口响应检查,未提交写操作\n- 验收脚本仅执行 node --check,未实际运行\n- 合并无冲突,main 上未单独重新运行检查;平台权限查询接入、个人中心尚未改造\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T08:07:51-07:00"},{"Sha1":"3cf111b21a47760e5c71fc6b2fba96d882dbd3f1","Message":"feat(console): 把程序身份详情改为分区抽屉并列出使用它的程序客户端\n\n程序身份详情是一张整体表单,改名、更换负责人和停用都要勾选确认并一起提交;负责人失效时改名会直接被后端拒绝,界面却没有提示;列表每行放「查看详情」按钮,页面顶部还有单独的说明框。按已定的列表与抽屉约定重排。\n\n实现内容:\n- 页面说明并入卡片描述;列表改为整行可点,负责人失效时在负责人下用 cell-note 提示;空列表使用「还没有程序身份」定制空状态\n- 详情抽屉分「基本信息 / 负责人 / 程序客户端 / 停用或恢复」:改名与更换负责人就地展开,不需要影响确认;停用或恢复在危险区展开并须确认;同一时间只进行一项修改,每项修改都带上其余字段的当前值提交到原有整体保存接口\n- 正常状态下负责人失效时禁用「修改名称」并提示先更换负责人,状态说明改为程序暂时不能获取令牌;已停用且负责人失效时恢复按钮不可用\n- 新增「程序客户端」分区:按身份代码搜索程序客户端后再按身份标识过滤(最多 100 个),链接到程序接入详情;没有客户端时给出前往程序接入的链接\n- 新建改为独立弹窗:名称、代码与平铺的负责人选择,底部使用 FormActions;负责人选择改为「选择 成员代码」按钮\n- 保存后焦点留在抽屉内;重写程序身份单元测试(更换负责人、停用确认、未知结果重试、冲突重读),同步 acceptance-p10-t01 中的详情等待、新建、状态变更、负责人失效、冲突重读与深链接步骤\n\n验证:\n- npm run check(format:check、lint、typecheck、test、build):通过,Vitest 26 个文件 223 项全部通过\n- node --check 检查 acceptance-p10-t01:通过\n- 演示环境没有程序身份,浏览器中以页面内临时改写接口响应的方式检查列表、详情四区、更换负责人、停用确认、负责人失效与新建弹窗(1280 宽、375 窄屏及亮/暗色),未提交写操作\n- 验收脚本 acceptance-p10-t01:未运行,需要独立隔离环境\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T08:05:50-07:00"},{"Sha1":"ba844f0abb4b7b64a50d2a5b617e87e33aac5a14","Message":"feat(console): 把程序接入详情改为分区抽屉并内嵌密钥管理\n\n程序接入页顶部有一大段说明,列表每行放「查看详情」按钮;详情是一张整体表单,管理密钥要切换到另一个子视图,新建时在弹窗里同时套着两张选择卡片。按已定的列表与抽屉约定重排。\n\n实现内容:\n- 页头补「应用」徽标,原顶部说明并入页头与卡片描述,授权方式名称移到详情技术细节\n- 列表改为整行可点(客户端 ID 为按钮、程序身份与可调用操作为灰色说明),状态正常但暂时不能获取令牌时在状态下提示;空列表使用「还没有程序客户端」定制空状态\n- 详情抽屉分「基本信息 / 可调用的操作 / 密钥 / 停用或归档」:调整操作就地展开,无改动不能保存,改动后须确认;平台已不再批准的操作照常列出并注明不生效,取消勾选后不能再选回\n- 密钥改为抽屉内的常驻分区:逐份显示状态与时间,撤销确认在该行下方展开,成功后以提示条告知并重读记录;更换密钥仍显示一次性回执\n- 调整操作、密钥操作与状态变更互相锁定,写入结果不明或冲突时不能切换到其他修改;保存或撤销后焦点留在抽屉内\n- 新建改为两步:先选程序身份,再选服务并勾选操作,底部「重新选择程序身份 / 创建程序客户端」,不再要求影响确认\n- ScopeChoices 改为与权限勾选一致的边框清单,新增 unavailable、legendHidden、hint;平台「程序可调用的操作」弹窗使用平台场景的说明\n- 同步程序接入与密钥单元测试,以及 acceptance-p10-t02、t03、t04 中的详情等待、新建步骤、调整操作、密钥分区与空状态文案\n\n验证:\n- npm run check(format:check、lint、typecheck、test、build):通过,Vitest 26 个文件 222 项全部通过;构建时 Vite 提示打包文件体积偏大,未核实是否为既有提示\n- node --check 检查 acceptance-p10-t02、t03、t04:通过\n- 演示环境没有程序客户端、可访问服务与程序身份,浏览器中以页面内临时改写接口响应的方式检查列表、详情四区、撤销与更换密钥表单、调整操作、新建两步与已归档只读状态(1280 宽、375 窄屏及亮/暗色),未提交写操作;平台「程序可调用的操作」弹窗打开查看未保存\n- 验收脚本 acceptance-p10-t02、t03、t04:未运行,需要独立隔离环境\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T07:57:52-07:00"},{"Sha1":"91e187c7bfa1c897d22cd3fb7e5d30d7368a586d","Message":"feat(console): 在角色分配中显示角色包含的权限并改用卡片选择分配对象\n\n角色分配页已随企业管理员改为分区抽屉,但业务模式下仍看不出一条分配实际给了哪些权限,分配对象名称下显示的是无意义的标识缩写,新建时用下拉框选择成员或用户组,页头徽标也与其他应用内页面不一致。\n\n实现内容:\n- 页头徽标改为「应用」,与权限清单、角色页一致\n- 分配对象说明:有与名称不同的成员代码或用户组代码时显示「类型 · 代码」,名称即代码时只显示类型,两者都没有才回退标识缩写;用户组不是正常状态时在名称下提示\n- 详情基本信息为角色补充灰色代码,新增「角色包含的权限」(按应用权限清单显示名称)\n- 分配弹窗第一步「分配给」改为横排的「成员 / 用户组」单选卡片;第二步选中角色后显示该角色包含的权限预览,读取失败不影响分配\n- BindingRecord 类型补充 group_code;同步 acceptance-t04 中选择分配对象类型的步骤\n\n验证:\n- npm run check(format:check、lint、typecheck、test、build):通过,Vitest 26 个文件 222 项全部通过;首次运行时 group-lifecycle 中一项焦点断言偶发失败,单独重跑 3 次及全量重跑均通过,与本次改动无关\n- node --check 检查 acceptance-t04:通过\n- 浏览器 1280 宽、375 窄屏及亮/暗色检查列表、详情抽屉与分配弹窗两步(切换成员/用户组、选择成员与角色、权限预览),未提交写操作;演示数据没有分给用户组的记录,用户组代码与归档提示未在页面上实际看到\n- 验收脚本 acceptance-t04:未运行,需要独立隔离环境\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T07:45:50-07:00"},{"Sha1":"4a92a91f122f15d9c26a0ff0fc321e14b589777e","Message":"feat(console): 把角色详情改为分区抽屉并重排权限清单\n\n角色详情原先是一张整体表单,改名、调整权限和停用归档混在一起,任何修改都要勾选影响确认;列表每行放「查看 X」按钮,权限清单页也没有筛选。按已定的列表与抽屉约定重排两页。\n\n实现内容:\n- 权限清单拆为独立组件:卡片说明给出权限总数与可放进角色的数量,加入本地名称/代码搜索与状态筛选、「去组合角色」链接,不能放进角色的原因用灰字说明,空清单使用公共空状态\n- 角色列表改用 OpenableRow 整行可点,并提供「还没有角色」定制空状态\n- 角色详情抽屉分「基本信息 / 包含的权限 / 停用或归档」三区:改名与调整权限就地展开,状态变更用单选卡片;同一时间只进行一项修改,每项修改都带上其余字段的当前值提交到原有整体保存接口\n- 改名不再要求影响确认;有分配记录时调整权限、以及任何状态变更仍须确认,草稿改动后确认失效;归档仍同时提交 revokeBindings\n- 基本信息显示分配记录数并提供「前往角色分配」链接;已归档角色只读,不提供修改入口\n- 新建角色改为独立弹窗,底部使用 FormActions「取消 / 创建角色」\n- 公共 PermissionPicker 改为带边框的勾选清单,显示「已选 N 项」,只在不可选的行注明原因,新增 legendHidden;企业管理员中「可分配的权限」随之生效\n- 重写角色相关单元测试(状态归档、改名、调整权限确认、归档只读、新建),同步 acceptance-t04 中的角色详情入口、状态变更与冲突复核步骤\n\n验证:\n- npm run check(format:check、lint、typecheck、test、build):通过,Vitest 26 个文件 222 项全部通过\n- node --check 检查 acceptance-t04:通过\n- 浏览器 1280 宽、375 窄屏及亮/暗色检查权限清单、角色列表、详情三区、新建弹窗与企业管理员可分配权限;已停用权限、需按数据范围分配的权限与已归档角色通过页面内临时改写响应查看,未做写操作\n- 验收脚本 acceptance-t04:未运行,需要独立隔离环境\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T07:39:38-07:00"}],"HeadCommit":{"Sha1":"faac5481c1cca66e4708222686b6588a43938150","Message":"feat(console): 合并控制台逐页布局与样式改造\n\n控制台各页面原先列表用「查看详情」按钮、详情是整张表单、弹窗操作区与空状态各不相同,常用信息和危险操作混在一起。合并 feat/console-layout 分支,按统一的列表、抽屉与弹窗约定逐页重排企业内、平台侧与应用内的管理页面。\n\n实现内容:\n- 列表统一为整行可点(OpenableRow 或同交互的专用行),名称为链接或按钮、末列右箭头,需要处理的状态用 cell-note 提示;空状态改为带图标、说明与操作的公共 EmptyList,无数据时不显示分页\n- 详情抽屉按「基本信息 / 业务分区 / 危险区」分区,修改就地展开且同一时间只进行一项;危险操作默认收起,展开后用单选卡片或确认勾选\n- 企业、应用接入改为带分区标签的详情页;新增只读组织架构图;成员、部门、用户组、所有账号、企业与平台管理员、应用开通、操作记录、权限清单、角色、角色分配、程序接入(密钥管理内嵌抽屉)与程序身份完成改造\n- 弹窗底部统一使用 FormActions「取消 + 主操作」,多步弹窗提供「重新选择」;权限统一以名称为主、代码为辅显示,勾选清单统一为带边框的列表\n- 同步更新各页面单元测试与相关验收脚本中的文案和定位\n\n验证:\n- 分支上每次提交前运行 npm run check:format:check、lint、typecheck、test、build 通过,最后一次 Vitest 26 个文件 223 项全部通过\n- 各页面在浏览器 1280 宽、375 窄屏及亮/暗色下核对;程序接入、程序身份等演示环境缺数据的页面以页面内临时改写接口响应检查,未提交写操作\n- 验收脚本仅执行 node --check,未实际运行\n- 合并无冲突,main 上未单独重新运行检查;平台权限查询接入、个人中心尚未改造\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T08:07:51-07:00"},"CompareURL":"pengzhiyu/IAM/compare/4bda2cc02706e1c64d5cd23c233673a0b32d0a72...faac5481c1cca66e4708222686b6588a43938150","Len":20}...
|
1791818107
|
Edit
Delete
|
|
37428
|
16
|
5
|
16
|
125
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"85e2c17b4 {"Commits":[{"Sha1":"85e2c17b4829f451e34f938ca6c11354a0b17f30","Message":"docs: 记录 P12 云测归因与 E2a 验证结果\n\n归档原两份任务文档中累计的候选验证、单轮云测、持有成本分析和 E2a 实施记录,保持历史失败及授权边界可追溯。\n\n实现内容:\n- 记录 50 次入口拒绝的真实关联证据与尚未验收的容量目标\n- 记录三个期限检查点计时的实现、首例测试修正和独立提交\n- 区分历史完整检查、共享报告覆盖与当前组合的定向复验\n- 更新当前状态并说明下一步隔离候选验证建议\n\n验证:\n- 文件摘要、独立执行日志和实际提交内容核对通过\n- 当前组合定向 28 项单测、18 项集成及 26 项 Python 测试通过\n- 文档差异、相对文件链接和 git diff --check 检查通过\n- 本次不新增完整构建、候选冻结或云测结果\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T08:42:04-07:00"},{"Sha1":"536e36cfae600b8bbdc378012e723ffbbd34a491","Message":"feat(protocol): 增加刷新期限检查点诊断计时\n\n现有粗阶段无法区分三次期限复核的耗时,为后续容量归因补齐固定观测。\n\n实现内容:\n- 在原 P0/P1/P2 检查处分别计时,保留 SQL、事务、期限及回滚顺序\n- 同步诊断读取白名单,保留旧记录的阶段缺失语义\n- 覆盖嵌套计时、导出大小、检查短路、迟到期回滚和旧记录兼容\n\n验证:\n- Java 25 离线 Maven 定向 verify:AuthRequestDiagnosticsTest、RefreshExpiryGuardTest、CapacityDiagnosticsTest、AuthDiagnosticsTestProbeTest 共 28 项单测及 RefreshExpiryLifecycleIT 18 项集成全部通过\n- python3 -m unittest discover -s scripts/capacity -p 'test_*.py':26 项通过\n- Spotless、编译、打包及 git diff --check 通过\n- 本次提交前未重跑完整后端或控制台检查,不将此前完整结果当作当前全部组合的重新验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T08:40:04-07:00"},{"Sha1":"a435000ebba0784762f27ae3f1a04e1159cf0617","Message":"feat: 增加权限说明与审计操作对象快照\n\n为控制台权限清单提供使用说明,并让操作记录在对象改名或归档后仍能识别操作对象。\n\n实现内容:\n- 新增 V29 迁移及可空权限说明,支持完整替换、输入校验和新旧清单摘要兼容\n- 平台与企业目录返回说明,保持本人有效权限代码集合不变\n- 在业务事务内保存受控对象代码快照,审计列表和详情增加类型、名称和展示摘要\n- 校验事件与对象类型匹配,保留旧摘要、安全投影和企业访问边界\n- 补充迁移、接口和审计安全测试,同步接口合同、数据字典与前端接入说明\n\n验证:\n- Java 25 下执行 ./mvnw -B -ntp -pl iam-server -am -Dit.test=PermissionDescriptionIT,AuditReadIT,AuthorizationIT,GroupLifecycleIT,MigrationIT,FoundationIT -Dfailsafe.failIfNoSpecifiedTests=false verify:通过\n- Java 25 下执行 ./mvnw -B -ntp -pl iam-server -am -Dit.test=AuditReadIT,AuthorizationMigrationIT,ApplicationLifecycleUpgradeIT,MachineCredentialUpgradeIT,AuditRetentionIT -Dfailsafe.failIfNoSpecifiedTests=false verify:通过\n- Java 25 下执行 ./mvnw -B -ntp -pl iam-server -am -Dit.test=AuditReadIT,GroupLifecycleIT -Dfailsafe.failIfNoSpecifiedTests=false verify:通过\n- 三轮去重共 180 个单元测试、83 个集成测试通过,格式检查、编译和打包通过\n- 权限清单 JSON Schema 语法校验及 git diff --check 通过\n- 未执行前端浏览器接入验证,未重启演示环境\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T08:36:49-07:00"}],"HeadCommit":{"Sha1":"85e2c17b4829f451e34f938ca6c11354a0b17f30","Message":"docs: 记录 P12 云测归因与 E2a 验证结果\n\n归档原两份任务文档中累计的候选验证、单轮云测、持有成本分析和 E2a 实施记录,保持历史失败及授权边界可追溯。\n\n实现内容:\n- 记录 50 次入口拒绝的真实关联证据与尚未验收的容量目标\n- 记录三个期限检查点计时的实现、首例测试修正和独立提交\n- 区分历史完整检查、共享报告覆盖与当前组合的定向复验\n- 更新当前状态并说明下一步隔离候选验证建议\n\n验证:\n- 文件摘要、独立执行日志和实际提交内容核对通过\n- 当前组合定向 28 项单测、18 项集成及 26 项 Python 测试通过\n- 文档差异、相对文件链接和 git diff --check 检查通过\n- 本次不新增完整构建、候选冻结或云测结果\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-12T08:42:04-07:00"},"CompareURL":"pengzhiyu/IAM/compare/faac5481c1cca66e4708222686b6588a43938150...85e2c17b4829f451e34f938ca6c11354a0b17f30","Len":3}...
|
1791852703
|
Edit
Delete
|
|
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
|
|
38655
|
16
|
9
|
16
|
86
|
0
|
0
|
refs/tags/v0.2.1
|
0
|
{"Commits":null,"HeadCommit":{" {"Commits":null,"HeadCommit":{"Sha1":"629bde5b6dbae87108816cd5a18339073b2e41de","Message":"feat(renderer): 实现实时预览后台保活\n\n切换操作台功能标签后保持预览会话,返回实时预览页继续查看画面。\n\n- 保留媒体视图挂载,将标签可见性与会话生命周期分离\n- 允许启动和故障回退在后台完成,切页时取消触摸输入并关闭远程操作\n- 保留停止、功能关闭、操作台卸载和断开连接时的资源清理\n- 补充生命周期回归测试,并同步预览知识库说明\n\n验证:\n- 109 项预览相关测试通过\n- npm run typecheck\n- npm exec electron-vite build\n- npm run check:knowledge\n- git diff --check\n","AuthorEmail":"228834386@qq.com","AuthorName":"starry","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-09T17:30:17+08:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/0000000000000000000000000000000000000000...629bde5b6dbae87108816cd5a18339073b2e41de","Len":0}...
|
1792142026
|
Edit
Delete
|
|
38656
|
16
|
24
|
16
|
86
|
0
|
0
|
refs/tags/v0.2.1
|
0
|
Juhai OpsDesk v0.2.1 · 日志采集与实时预览优化
|
1792142026
|
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
|
|
39165
|
16
|
5
|
16
|
86
|
0
|
0
|
refs/heads/main
|
0
|
{"Commits":[{"Sha1":"b997e4920 {"Commits":[{"Sha1":"b997e4920cd56dcad7895b11b9b44670a8610a6e","Message":"feat(renderer): 优化团队管理与改密弹窗\n\n实现内容:重整团队创建、邀请、成员和设备共享界面;为改密表单增加密码显示开关、字节长度与规则实时反馈,并补充改密规则测试。\n\n验证:npm test(190 个测试文件、1739 项测试通过);npm run build(含 TypeScript 类型检查)通过。\n","AuthorEmail":"contributor-1@users.noreply.invalid","AuthorName":"Contributor 1","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-18T07:54:07-07:00"},{"Sha1":"04550f8728f80bf07b8c3336a9794409d2917b06","Message":"feat(audit): 优化操作记录窗口与活动概览\n\n实现内容:增加近 14 天活动走势、结果统计、对象筛选和记录耗时展示;调整记录列表与详情布局,并补充日期分桶和耗时测试。\n\n验证:npm test(190 个测试文件、1739 项测试通过);npm run build(含 TypeScript 类型检查)通过。\n","AuthorEmail":"contributor-1@users.noreply.invalid","AuthorName":"Contributor 1","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-18T07:53:44-07:00"},{"Sha1":"30e758b96550aad4b09052f8ccb4235f36079f52","Message":"feat(renderer): 优化主页配置弹窗交互\n\n实现内容:重整设备分组、密钥、快捷指令和快速连接保存弹窗;支持弹窗挂到页面顶层,补充分组命名、公钥展示与脚本统计逻辑及测试,并统一主页弹窗样式。\n\n验证:npm test(189 个测试文件、1733 项测试通过);npm run build(含 TypeScript 类型检查)通过。\n","AuthorEmail":"contributor-1@users.noreply.invalid","AuthorName":"Contributor 1","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-18T07:24:39-07:00"},{"Sha1":"1a5c065052ad496448fa50192658f55b75fc7b0c","Message":"feat(udp): 优化抓包监控与报文浏览\n\n实现内容:重整 UDP 抓包状态、端口输入、流量走势、筛选和报文详情界面;抽出端口解析与流量统计逻辑,并补充对应测试。\n\n验证:npm test(188 个测试文件、1727 项测试通过);npm run build(含 TypeScript 类型检查)通过。\n","AuthorEmail":"contributor-1@users.noreply.invalid","AuthorName":"Contributor 1","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-18T06:51:51-07:00"},{"Sha1":"bd98c7a638421c569af90e4e37bd684849ce6ab2","Message":"test(devices): 覆盖不同公网主机的快速连接迁移\n\n实现内容:\n- 使用与当前构建地址不同的示例主机模拟旧连接记录\n- 保留历史迁移与损坏记录的验证范围\n\n验证:\n- npm run typecheck\n- vitest run electron/quickConnectStore.test.ts(23 项通过)\n","AuthorEmail":"contributor-1@users.noreply.invalid","AuthorName":"Contributor 1","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-18T06:11:53-07:00"}],"HeadCommit":{"Sha1":"b997e4920cd56dcad7895b11b9b44670a8610a6e","Message":"feat(renderer): 优化团队管理与改密弹窗\n\n实现内容:重整团队创建、邀请、成员和设备共享界面;为改密表单增加密码显示开关、字节长度与规则实时反馈,并补充改密规则测试。\n\n验证:npm test(190 个测试文件、1739 项测试通过);npm run build(含 TypeScript 类型检查)通过。\n","AuthorEmail":"contributor-1@users.noreply.invalid","AuthorName":"Contributor 1","CommitterEmail":"228834386@qq.com","CommitterName":"starry","Timestamp":"2026-10-18T07:54:07-07:00"},"CompareURL":"pengzhiyu/JuhaiOpsDesk/compare/629bde5b6dbae87108816cd5a18339073b2e41de...b997e4920cd56dcad7895b11b9b44670a8610a6e","Len":25}...
|
1792376740
|
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
|