feat(authz): 重写权限模板分配与班级授权边界
拆分能力、分配范围和业务关系,固定管理员能力并收紧组织级写入口。 补齐内容、课表、设备会话和实时通道授权,兼容旧库分配及历史快照。 重写权限分配预览,按实际可操作范围展示维护入口,合并学生入口并独立学年升级页。 增加授权攻击矩阵及静态门禁,更新隔离回归与开发契约。 验证:授权矩阵 23 段通过,Node 24 下 Web 63/63,类型检查、lint 与文档严格构建通过。
This commit is contained in:
1 parent
682818dd4a
commit
66be3a63b1
115 files changed
+4463
-2747
No files matched your search
@@ -110,6 +110,7 @@ const timeout = setTimeout(() => {
|
||||
|
||||
child.on('exit', async (code) => {
|
||||
clearTimeout(timeout);
|
||||
let cleanupFailed = false;
|
||||
if (probe) {
|
||||
try {
|
||||
const removed = await cleanupInClassProbe(probe, { notificationTitle: urgentTitle });
|
||||
@@ -119,14 +120,15 @@ child.on('exit', async (code) => {
|
||||
: '[ui-smoke] 探针清理完成(无残留数据)',
|
||||
);
|
||||
} catch (error) {
|
||||
cleanupFailed = true;
|
||||
console.error(`[ui-smoke] 探针清理失败(请手动检查演示数据):${error?.message ?? error}`);
|
||||
}
|
||||
}
|
||||
|
||||
await context.cleanup();
|
||||
console.log(`[ui-smoke] 后台验收总耗时:${((Date.now() - startedAt) / 1000).toFixed(1)} 秒`);
|
||||
if (code === 0) {
|
||||
if (code === 0 && !cleanupFailed) {
|
||||
console.log(`[ui-smoke] 全部通过,结果文件:${resultFile}`);
|
||||
}
|
||||
process.exit(code ?? 1);
|
||||
process.exit(code === 0 && cleanupFailed ? 1 : (code ?? 1));
|
||||
});
|
||||
Reference in new issue
Block a user