更新: 97 个文件 - 2026-03-17 02:30:01
这个提交包含在:
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `26`
|
||||
- 最近渲染时间: `2026-03-17T09:03:00+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:00+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:02:59+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:47+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `14`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `12`
|
||||
- 最近渲染时间: `2026-03-17T09:03:01+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:00+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:49+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `1`
|
||||
- 待人工/缺浏览器证据: `36`
|
||||
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:04+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:53+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
- 已实证(synthetic): `0`
|
||||
- 阻塞数: `0`
|
||||
- 待人工/缺浏览器证据: `0`
|
||||
- 最近渲染时间: `2026-03-17T09:03:02+00:00`
|
||||
- 最近渲染时间: `2026-03-17T09:29:50+00:00`
|
||||
|
||||
## 目标约束
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-03-17T09:03:14+00:00",
|
||||
"generated_at": "2026-03-17T09:27:20+00:00",
|
||||
"title": "\u5f53\u524d\u67b6\u6784\u5e93",
|
||||
"summary": "\u5de5\u4f5c\u53f0\u3001\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u3001\u6388\u6743\u8fb9\u754c\u4e0e\u7cfb\u7edf\u8986\u76d6\u7684\u5f53\u524d\u771f\u503c\u89c6\u56fe\u3002",
|
||||
"sections": [
|
||||
@@ -49,29 +49,29 @@
|
||||
},
|
||||
{
|
||||
"label": "\u751f\u6210\u65f6\u95f4",
|
||||
"value": "2026-03-17T09:03:14+00:00"
|
||||
"value": "2026-03-17T09:27:20+00:00"
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"label": "\u6b63\u5f0f\u5de5\u4f5c\u53f0",
|
||||
"href": "./index.html",
|
||||
"description": "\u672c\u5730\u5316\u4e3b UI\uff0c\u9ed8\u8ba4\u5165\u53e3\u3002"
|
||||
"label": "\u603b\u89c8\u9996\u9875",
|
||||
"href": "/overview/index.html",
|
||||
"description": "\u5de5\u4f5c\u53f0\u603b\u89c8\u3001\u6700\u65b0\u8fd0\u884c\u548c\u5168\u5c40\u6458\u8981\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u65e7\u7248\u5de5\u4f5c\u53f0",
|
||||
"href": "./legacy/index.html",
|
||||
"description": "\u4fdd\u7559\u7684 legacy \u56de\u9000\u5165\u53e3\u3002"
|
||||
"label": "\u8fd0\u884c\u4e2d\u5fc3",
|
||||
"href": "/runs/index.html",
|
||||
"description": "\u8fd0\u884c\u961f\u5217\u3001\u8be6\u60c5\u3001\u8bc1\u636e\u548c\u65e5\u5fd7\u5165\u53e3\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u9879\u76ee\u529f\u80fd\u6587\u6863",
|
||||
"href": "./docs/project-features.html",
|
||||
"description": "\u9879\u76ee\u80fd\u529b\u3001\u76ee\u5f55\u7ed3\u6784\u4e0e\u81ea\u52a8\u5316\u94fe\u8def\u603b\u89c8\u3002"
|
||||
"label": "\u7cfb\u7edf\u5206\u7ec4",
|
||||
"href": "/systems/index.html",
|
||||
"description": "\u6309\u7cfb\u7edf\u548c\u5206\u7c7b\u6d4f\u89c8\u8986\u76d6\u60c5\u51b5\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u524d\u7aef\u8bbe\u8ba1\u6587\u6863",
|
||||
"href": "./docs/frontend-dashboard-design.html",
|
||||
"description": "\u5f53\u524d\u672c\u5730\u5de5\u4f5c\u53f0\u7684\u4ea4\u4e92\u4e0e\u89c6\u89c9\u89c4\u8303\u3002"
|
||||
"label": "\u67b6\u6784\u5e93",
|
||||
"href": "/architecture/index.html",
|
||||
"description": "\u67e5\u770b\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u548c\u6388\u6743\u8fb9\u754c\u3002"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -199,93 +199,118 @@
|
||||
"open": false,
|
||||
"links": [
|
||||
{
|
||||
"label": "\u6b63\u5f0f\u5de5\u4f5c\u53f0",
|
||||
"href": "./index.html",
|
||||
"description": "\u672c\u5730\u5316\u4e3b UI\uff0c\u9ed8\u8ba4\u5165\u53e3\u3002"
|
||||
"label": "\u603b\u89c8\u9996\u9875",
|
||||
"href": "/overview/index.html",
|
||||
"description": "\u5de5\u4f5c\u53f0\u603b\u89c8\u3001\u6700\u65b0\u8fd0\u884c\u548c\u5168\u5c40\u6458\u8981\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u8fd0\u884c\u4e2d\u5fc3",
|
||||
"href": "/runs/index.html",
|
||||
"description": "\u8fd0\u884c\u961f\u5217\u3001\u8be6\u60c5\u3001\u8bc1\u636e\u548c\u65e5\u5fd7\u5165\u53e3\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u7cfb\u7edf\u5206\u7ec4",
|
||||
"href": "/systems/index.html",
|
||||
"description": "\u6309\u7cfb\u7edf\u548c\u5206\u7c7b\u6d4f\u89c8\u8986\u76d6\u60c5\u51b5\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u67b6\u6784\u5e93",
|
||||
"href": "/architecture/index.html",
|
||||
"description": "\u67e5\u770b\u63a7\u5236\u9762\u3001\u6570\u636e\u5c42\u548c\u6388\u6743\u8fb9\u754c\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u6587\u6863\u4e2d\u5fc3",
|
||||
"href": "/docs/index.html",
|
||||
"description": "\u96c6\u4e2d\u67e5\u770b\u9879\u76ee\u6587\u6863\u3001\u672c\u5730\u955c\u50cf\u548c\u8bf4\u660e\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u6570\u636e\u4e2d\u5fc3",
|
||||
"href": "/data/index.html",
|
||||
"description": "\u67e5\u770b summary\u3001runs\u3001systems \u7b49 JSON \u5165\u53e3\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u65e7\u7248\u5de5\u4f5c\u53f0",
|
||||
"href": "./legacy/index.html",
|
||||
"href": "/legacy/index.html",
|
||||
"description": "\u4fdd\u7559\u7684 legacy \u56de\u9000\u5165\u53e3\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u9879\u76ee\u529f\u80fd\u6587\u6863",
|
||||
"href": "./docs/project-features.html",
|
||||
"href": "/docs/project-features.html",
|
||||
"description": "\u9879\u76ee\u80fd\u529b\u3001\u76ee\u5f55\u7ed3\u6784\u4e0e\u81ea\u52a8\u5316\u94fe\u8def\u603b\u89c8\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u524d\u7aef\u8bbe\u8ba1\u6587\u6863",
|
||||
"href": "./docs/frontend-dashboard-design.html",
|
||||
"href": "/docs/frontend-dashboard-design.html",
|
||||
"description": "\u5f53\u524d\u672c\u5730\u5de5\u4f5c\u53f0\u7684\u4ea4\u4e92\u4e0e\u89c6\u89c9\u89c4\u8303\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u5b89\u5168\u7f16\u7801\u7d22\u5f15",
|
||||
"href": "./docs/secure-code-index.html",
|
||||
"href": "/docs/secure-code-index.html",
|
||||
"description": "secure-code \u4fee\u590d\u5e93\u672c\u5730\u955c\u50cf\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u4ed3\u5e93\u5165\u53e3\u955c\u50cf",
|
||||
"href": "./docs/root-readme.html",
|
||||
"href": "/docs/root-readme.html",
|
||||
"description": "\u4ed3\u5e93\u6839 README \u7684\u672c\u5730\u955c\u50cf\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u6388\u6743\u6a21\u578b",
|
||||
"href": "./docs/authorization-model.html",
|
||||
"href": "/docs/authorization-model.html",
|
||||
"description": "\u5141\u8bb8\u76ee\u6807\u8303\u56f4\u3001\u5168\u5c40\u539f\u5219\u4e0e\u8bb0\u5f55\u8981\u6c42\u3002"
|
||||
},
|
||||
{
|
||||
"label": "source-map \u771f\u503c",
|
||||
"href": "./docs/source-map.html",
|
||||
"href": "/docs/source-map.html",
|
||||
"description": "\u7cfb\u7edf\u8986\u76d6\u3001\u6765\u6e90\u548c\u8f93\u51fa\u76ee\u5f55\u771f\u503c\u3002"
|
||||
},
|
||||
{
|
||||
"label": "repro-map \u771f\u503c",
|
||||
"href": "./docs/repro-map.html",
|
||||
"href": "/docs/repro-map.html",
|
||||
"description": "\u590d\u73b0\u65cf\u8def\u7531\u3001\u6d4f\u89c8\u5668\u8981\u6c42\u548c\u65e5\u5fd7\u7b56\u7565\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u8986\u76d6\u77e9\u9635",
|
||||
"href": "./docs/coverage-matrix.html",
|
||||
"href": "/docs/coverage-matrix.html",
|
||||
"description": "\u81ea\u52a8\u751f\u6210\u8986\u76d6\u6458\u8981\u7684\u672c\u5730\u955c\u50cf\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u8bbe\u8ba1\u6765\u6e90\u6e05\u5355",
|
||||
"href": "./docs/design-source.html",
|
||||
"href": "/docs/design-source.html",
|
||||
"description": "Lovart \u6a21\u677f\u672c\u5730 vendor manifest\u3002"
|
||||
},
|
||||
{
|
||||
"label": "\u67b6\u6784\u5e93\u955c\u50cf",
|
||||
"href": "./docs/architecture-library.html",
|
||||
"href": "/docs/architecture-library.html",
|
||||
"description": "\u5f53\u524d\u67b6\u6784\u5e93\u7684\u7ed3\u6784\u5316\u955c\u50cf\u9875\u3002"
|
||||
},
|
||||
{
|
||||
"label": "summary.json",
|
||||
"href": "./summary.json",
|
||||
"href": "/summary.json",
|
||||
"description": "\u5168\u5c40\u6458\u8981\u3001\u72b6\u6001\u5206\u5e03\u548c\u6700\u8fd1\u5931\u8d25\u3002"
|
||||
},
|
||||
{
|
||||
"label": "runs.json",
|
||||
"href": "./runs.json",
|
||||
"href": "/runs.json",
|
||||
"description": "\u6700\u8fd1 run \u7684\u7ed3\u6784\u5316\u8be6\u60c5\u3002"
|
||||
},
|
||||
{
|
||||
"label": "systems.json",
|
||||
"href": "./systems.json",
|
||||
"href": "/systems.json",
|
||||
"description": "\u7cfb\u7edf\u7ea7\u8986\u76d6\u4e0e\u6d4f\u89c8\u5668\u8bc1\u636e\u6458\u8981\u3002"
|
||||
},
|
||||
{
|
||||
"label": "advisories.json",
|
||||
"href": "./advisories.json",
|
||||
"description": "advisory \u5143\u6570\u636e\u4e0e\u6765\u6e90\u3002"
|
||||
"href": "/advisories.json",
|
||||
"description": "\u6f0f\u6d1e\u6761\u76ee\u5143\u6570\u636e\u4e0e\u6765\u6e90\u3002"
|
||||
},
|
||||
{
|
||||
"label": "profiles.json",
|
||||
"href": "./profiles.json",
|
||||
"description": "repro profile \u5143\u6570\u636e\u3002"
|
||||
"href": "/profiles.json",
|
||||
"description": "\u590d\u73b0\u6863\u6848\u5143\u6570\u636e\u3002"
|
||||
},
|
||||
{
|
||||
"label": "architecture.json",
|
||||
"href": "./architecture.json",
|
||||
"href": "/architecture.json",
|
||||
"description": "\u5f53\u524d\u67b6\u6784\u5e93\u7ed3\u6784\u5316 JSON\u3002"
|
||||
}
|
||||
],
|
||||
@@ -299,9 +324,33 @@
|
||||
"value": "06-case-studies/generated-runs/<run-id>/"
|
||||
},
|
||||
{
|
||||
"label": "\u5de5\u4f5c\u53f0\u5165\u53e3",
|
||||
"label": "\u9ed8\u8ba4\u5165\u53e3",
|
||||
"value": "/index.html"
|
||||
},
|
||||
{
|
||||
"label": "\u603b\u89c8\u5165\u53e3",
|
||||
"value": "/overview/index.html"
|
||||
},
|
||||
{
|
||||
"label": "\u8fd0\u884c\u5165\u53e3",
|
||||
"value": "/runs/index.html"
|
||||
},
|
||||
{
|
||||
"label": "\u7cfb\u7edf\u5165\u53e3",
|
||||
"value": "/systems/index.html"
|
||||
},
|
||||
{
|
||||
"label": "\u67b6\u6784\u5165\u53e3",
|
||||
"value": "/architecture/index.html"
|
||||
},
|
||||
{
|
||||
"label": "\u6587\u6863\u5165\u53e3",
|
||||
"value": "/docs/index.html"
|
||||
},
|
||||
{
|
||||
"label": "\u6570\u636e\u5165\u53e3",
|
||||
"value": "/data/index.html"
|
||||
},
|
||||
{
|
||||
"label": "\u65e7\u7248\u5165\u53e3",
|
||||
"value": "/legacy/index.html"
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
<div class="dashboard-shell">
|
||||
<header class="hero">
|
||||
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
|
||||
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
|
||||
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
<p>
|
||||
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
|
||||
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
<span class="toggle-label">自动刷新</span>
|
||||
<span class="toggle-switch">
|
||||
<input id="autoRefresh" type="checkbox" checked>
|
||||
<span class="toggle-slider"></span>
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
文件差异内容过多而无法显示
加载差异
@@ -289,6 +289,157 @@ select {
|
||||
margin-top: 22px;
|
||||
}
|
||||
|
||||
.section-nav,
|
||||
.top-menus {
|
||||
position: relative;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
.section-nav {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.nav-pill {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
padding: 14px 16px;
|
||||
border-radius: 18px;
|
||||
border: 1px solid var(--border-color);
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
}
|
||||
|
||||
.nav-pill:hover,
|
||||
.nav-pill.is-active {
|
||||
transform: translateY(-1px);
|
||||
border-color: rgba(77, 141, 255, 0.42);
|
||||
background: rgba(77, 141, 255, 0.1);
|
||||
}
|
||||
|
||||
.nav-pill-top {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.nav-pill-top strong {
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.nav-pill-copy {
|
||||
color: var(--text-secondary);
|
||||
font-size: 0.82rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.top-menus {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.route-note,
|
||||
.menu-row,
|
||||
.hub-card,
|
||||
.hub-card-static {
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 16px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
}
|
||||
|
||||
.route-note,
|
||||
.menu-row {
|
||||
padding: 14px 16px;
|
||||
}
|
||||
|
||||
.route-note {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.route-note strong {
|
||||
display: block;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.route-note span {
|
||||
display: block;
|
||||
margin-top: 6px;
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.menu-row {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.menu-row-compact {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.menu-row-head {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
color: var(--text-secondary);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
font-size: 0.74rem;
|
||||
}
|
||||
|
||||
.chip-strip {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
overflow-x: auto;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
.chip-strip::-webkit-scrollbar {
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
.chip-strip::-webkit-scrollbar-thumb {
|
||||
background: rgba(148, 163, 184, 0.3);
|
||||
border-radius: 999px;
|
||||
}
|
||||
|
||||
.menu-chip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
min-height: 34px;
|
||||
padding: 8px 14px;
|
||||
border-radius: 999px;
|
||||
border: 1px solid var(--border-color);
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
color: var(--text-primary);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
}
|
||||
|
||||
.menu-chip:hover,
|
||||
.menu-chip.is-active,
|
||||
.menu-chip-link:hover {
|
||||
transform: translateY(-1px);
|
||||
border-color: rgba(77, 141, 255, 0.42);
|
||||
background: rgba(77, 141, 255, 0.1);
|
||||
}
|
||||
|
||||
.menu-chip-muted {
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.menu-chip-link {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.metric-card {
|
||||
position: relative;
|
||||
padding: 16px 18px;
|
||||
@@ -502,6 +653,10 @@ select {
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
.run-list-compact {
|
||||
max-height: 560px;
|
||||
}
|
||||
|
||||
.run-card {
|
||||
cursor: pointer;
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
@@ -582,6 +737,35 @@ select {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.workspace-stack,
|
||||
.system-grid,
|
||||
.hub-grid {
|
||||
display: grid;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.system-grid {
|
||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||
}
|
||||
|
||||
.hub-grid {
|
||||
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||
}
|
||||
|
||||
.hub-card,
|
||||
.hub-card-static {
|
||||
display: grid;
|
||||
gap: 10px;
|
||||
padding: 14px 16px;
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
}
|
||||
|
||||
.hub-card:hover {
|
||||
transform: translateY(-1px);
|
||||
border-color: rgba(77, 141, 255, 0.42);
|
||||
background: rgba(77, 141, 255, 0.08);
|
||||
}
|
||||
|
||||
.workspace-empty {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
@@ -619,6 +803,12 @@ select {
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
.button-small {
|
||||
min-height: 36px;
|
||||
padding: 8px 12px;
|
||||
font-size: 0.84rem;
|
||||
}
|
||||
|
||||
.detail-stat-grid,
|
||||
.plan-grid,
|
||||
.raw-json-grid {
|
||||
@@ -918,6 +1108,10 @@ select {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.system-card-compact .detail-actions {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.viewer-frame {
|
||||
min-height: 320px;
|
||||
border: 1px solid rgba(148, 163, 184, 0.16);
|
||||
@@ -1181,6 +1375,7 @@ select {
|
||||
@media (max-width: 1320px) {
|
||||
.hero-top,
|
||||
.main-container,
|
||||
.section-nav,
|
||||
.detail-stat-grid,
|
||||
.plan-grid,
|
||||
.raw-json-grid {
|
||||
@@ -1211,6 +1406,7 @@ select {
|
||||
}
|
||||
|
||||
.hero-links,
|
||||
.route-note,
|
||||
.detail-actions,
|
||||
.tag-row,
|
||||
.panel-meta,
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
<div class="dashboard-shell">
|
||||
<header class="hero">
|
||||
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
|
||||
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
|
||||
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
<p>
|
||||
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
|
||||
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
<span class="toggle-label">自动刷新</span>
|
||||
<span class="toggle-switch">
|
||||
<input id="autoRefresh" type="checkbox" checked>
|
||||
<span class="toggle-slider"></span>
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -82,12 +82,12 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>当前架构库镜像</h1>
|
||||
<div class="meta">工作台内置镜像页:当前架构库结构化数据镜像。</div>
|
||||
<pre>{
|
||||
"generated_at": "2026-03-17T09:03:14+00:00",
|
||||
"generated_at": "2026-03-17T09:27:20+00:00",
|
||||
"title": "当前架构库",
|
||||
"summary": "工作台、控制面、数据层、授权边界与系统覆盖的当前真值视图。",
|
||||
"sections": [
|
||||
@@ -137,29 +137,29 @@
|
||||
},
|
||||
{
|
||||
"label": "生成时间",
|
||||
"value": "2026-03-17T09:03:14+00:00"
|
||||
"value": "2026-03-17T09:27:20+00:00"
|
||||
}
|
||||
],
|
||||
"links": [
|
||||
{
|
||||
"label": "正式工作台",
|
||||
"href": "./index.html",
|
||||
"description": "本地化主 UI,默认入口。"
|
||||
"label": "总览首页",
|
||||
"href": "/overview/index.html",
|
||||
"description": "工作台总览、最新运行和全局摘要。"
|
||||
},
|
||||
{
|
||||
"label": "旧版工作台",
|
||||
"href": "./legacy/index.html",
|
||||
"description": "保留的 legacy 回退入口。"
|
||||
"label": "运行中心",
|
||||
"href": "/runs/index.html",
|
||||
"description": "运行队列、详情、证据和日志入口。"
|
||||
},
|
||||
{
|
||||
"label": "项目功能文档",
|
||||
"href": "./docs/project-features.html",
|
||||
"description": "项目能力、目录结构与自动化链路总览。"
|
||||
"label": "系统分组",
|
||||
"href": "/systems/index.html",
|
||||
"description": "按系统和分类浏览覆盖情况。"
|
||||
},
|
||||
{
|
||||
"label": "前端设计文档",
|
||||
"href": "./docs/frontend-dashboard-design.html",
|
||||
"description": "当前本地工作台的交互与视觉规范。"
|
||||
"label": "架构库",
|
||||
"href": "/architecture/index.html",
|
||||
"description": "查看控制面、数据层和授权边界。"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -287,93 +287,118 @@
|
||||
"open": false,
|
||||
"links": [
|
||||
{
|
||||
"label": "正式工作台",
|
||||
"href": "./index.html",
|
||||
"description": "本地化主 UI,默认入口。"
|
||||
"label": "总览首页",
|
||||
"href": "/overview/index.html",
|
||||
"description": "工作台总览、最新运行和全局摘要。"
|
||||
},
|
||||
{
|
||||
"label": "运行中心",
|
||||
"href": "/runs/index.html",
|
||||
"description": "运行队列、详情、证据和日志入口。"
|
||||
},
|
||||
{
|
||||
"label": "系统分组",
|
||||
"href": "/systems/index.html",
|
||||
"description": "按系统和分类浏览覆盖情况。"
|
||||
},
|
||||
{
|
||||
"label": "架构库",
|
||||
"href": "/architecture/index.html",
|
||||
"description": "查看控制面、数据层和授权边界。"
|
||||
},
|
||||
{
|
||||
"label": "文档中心",
|
||||
"href": "/docs/index.html",
|
||||
"description": "集中查看项目文档、本地镜像和说明。"
|
||||
},
|
||||
{
|
||||
"label": "数据中心",
|
||||
"href": "/data/index.html",
|
||||
"description": "查看 summary、runs、systems 等 JSON 入口。"
|
||||
},
|
||||
{
|
||||
"label": "旧版工作台",
|
||||
"href": "./legacy/index.html",
|
||||
"href": "/legacy/index.html",
|
||||
"description": "保留的 legacy 回退入口。"
|
||||
},
|
||||
{
|
||||
"label": "项目功能文档",
|
||||
"href": "./docs/project-features.html",
|
||||
"href": "/docs/project-features.html",
|
||||
"description": "项目能力、目录结构与自动化链路总览。"
|
||||
},
|
||||
{
|
||||
"label": "前端设计文档",
|
||||
"href": "./docs/frontend-dashboard-design.html",
|
||||
"href": "/docs/frontend-dashboard-design.html",
|
||||
"description": "当前本地工作台的交互与视觉规范。"
|
||||
},
|
||||
{
|
||||
"label": "安全编码索引",
|
||||
"href": "./docs/secure-code-index.html",
|
||||
"href": "/docs/secure-code-index.html",
|
||||
"description": "secure-code 修复库本地镜像。"
|
||||
},
|
||||
{
|
||||
"label": "仓库入口镜像",
|
||||
"href": "./docs/root-readme.html",
|
||||
"href": "/docs/root-readme.html",
|
||||
"description": "仓库根 README 的本地镜像。"
|
||||
},
|
||||
{
|
||||
"label": "授权模型",
|
||||
"href": "./docs/authorization-model.html",
|
||||
"href": "/docs/authorization-model.html",
|
||||
"description": "允许目标范围、全局原则与记录要求。"
|
||||
},
|
||||
{
|
||||
"label": "source-map 真值",
|
||||
"href": "./docs/source-map.html",
|
||||
"href": "/docs/source-map.html",
|
||||
"description": "系统覆盖、来源和输出目录真值。"
|
||||
},
|
||||
{
|
||||
"label": "repro-map 真值",
|
||||
"href": "./docs/repro-map.html",
|
||||
"href": "/docs/repro-map.html",
|
||||
"description": "复现族路由、浏览器要求和日志策略。"
|
||||
},
|
||||
{
|
||||
"label": "覆盖矩阵",
|
||||
"href": "./docs/coverage-matrix.html",
|
||||
"href": "/docs/coverage-matrix.html",
|
||||
"description": "自动生成覆盖摘要的本地镜像。"
|
||||
},
|
||||
{
|
||||
"label": "设计来源清单",
|
||||
"href": "./docs/design-source.html",
|
||||
"href": "/docs/design-source.html",
|
||||
"description": "Lovart 模板本地 vendor manifest。"
|
||||
},
|
||||
{
|
||||
"label": "架构库镜像",
|
||||
"href": "./docs/architecture-library.html",
|
||||
"href": "/docs/architecture-library.html",
|
||||
"description": "当前架构库的结构化镜像页。"
|
||||
},
|
||||
{
|
||||
"label": "summary.json",
|
||||
"href": "./summary.json",
|
||||
"href": "/summary.json",
|
||||
"description": "全局摘要、状态分布和最近失败。"
|
||||
},
|
||||
{
|
||||
"label": "runs.json",
|
||||
"href": "./runs.json",
|
||||
"href": "/runs.json",
|
||||
"description": "最近 run 的结构化详情。"
|
||||
},
|
||||
{
|
||||
"label": "systems.json",
|
||||
"href": "./systems.json",
|
||||
"href": "/systems.json",
|
||||
"description": "系统级覆盖与浏览器证据摘要。"
|
||||
},
|
||||
{
|
||||
"label": "advisories.json",
|
||||
"href": "./advisories.json",
|
||||
"description": "advisory 元数据与来源。"
|
||||
"href": "/advisories.json",
|
||||
"description": "漏洞条目元数据与来源。"
|
||||
},
|
||||
{
|
||||
"label": "profiles.json",
|
||||
"href": "./profiles.json",
|
||||
"description": "repro profile 元数据。"
|
||||
"href": "/profiles.json",
|
||||
"description": "复现档案元数据。"
|
||||
},
|
||||
{
|
||||
"label": "architecture.json",
|
||||
"href": "./architecture.json",
|
||||
"href": "/architecture.json",
|
||||
"description": "当前架构库结构化 JSON。"
|
||||
}
|
||||
],
|
||||
@@ -387,9 +412,33 @@
|
||||
"value": "06-case-studies/generated-runs/<run-id>/"
|
||||
},
|
||||
{
|
||||
"label": "工作台入口",
|
||||
"label": "默认入口",
|
||||
"value": "/index.html"
|
||||
},
|
||||
{
|
||||
"label": "总览入口",
|
||||
"value": "/overview/index.html"
|
||||
},
|
||||
{
|
||||
"label": "运行入口",
|
||||
"value": "/runs/index.html"
|
||||
},
|
||||
{
|
||||
"label": "系统入口",
|
||||
"value": "/systems/index.html"
|
||||
},
|
||||
{
|
||||
"label": "架构入口",
|
||||
"value": "/architecture/index.html"
|
||||
},
|
||||
{
|
||||
"label": "文档入口",
|
||||
"value": "/docs/index.html"
|
||||
},
|
||||
{
|
||||
"label": "数据入口",
|
||||
"value": "/data/index.html"
|
||||
},
|
||||
{
|
||||
"label": "旧版入口",
|
||||
"value": "/legacy/index.html"
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>授权模型镜像</h1>
|
||||
<div class="meta">工作台内置镜像页:目标范围、授权模型、最小化验证建议和记录要求。</div>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>覆盖矩阵镜像</h1>
|
||||
<div class="meta">工作台内置镜像页:当前覆盖矩阵生成结果。</div>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>Lovart 设计来源与本地化清单</h1>
|
||||
<div class="meta">工作台内置镜像页:Lovart 来源文件、本地 vendor 路径和本地化说明。</div>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>本地前端工作台设计文档</h1>
|
||||
<div class="meta">工作台内置镜像页:前端交互、展示结构和视觉规范。</div>
|
||||
@@ -108,7 +108,7 @@
|
||||
|
||||
### 2.1 页面名称
|
||||
|
||||
- 页面名称:`Authorized Lab Dashboard`
|
||||
- 页面名称:`授权攻防实验工作台`
|
||||
- 页面语境:本地静态前端 + 本地文件 JSON 数据源
|
||||
- 非目标:在线 SaaS、多用户后端、生产管理台
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
- 信息密度高,但必须可折叠、可筛选、可逐层展开
|
||||
- 日志与原始 JSON 必须能直接预览
|
||||
- 页面视觉应更生动,但不能牺牲扫描效率
|
||||
- 默认路由采用正式新 UI,同时保留 `legacy` 回退入口
|
||||
- 默认路由采用分板块 URL,同时保留 `legacy` 回退入口
|
||||
- 运行期不得依赖外部 HTML、字体 CDN 或图标 CDN
|
||||
|
||||
## 3. 信息架构
|
||||
@@ -127,7 +127,8 @@
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["Hero + Global Status"] --> B["Sidebar Filters"]
|
||||
A --> C["Run Queue List"]
|
||||
A --> B1["Top Section Nav"]
|
||||
B1 --> C["Overview / Runs / Systems / Architecture / Docs / Data"]
|
||||
C --> D["Run Detail Hero"]
|
||||
D --> E["Progress Timeline"]
|
||||
D --> F["Attack Plan & Reasoning"]
|
||||
@@ -150,6 +151,8 @@ flowchart LR
|
||||
- 自动刷新开关
|
||||
- 当前同步状态
|
||||
- 核心 metric cards
|
||||
- 顶部板块菜单
|
||||
- 顶部 chips 分类筛选
|
||||
|
||||
视觉要求:
|
||||
|
||||
@@ -159,24 +162,22 @@ flowchart LR
|
||||
|
||||
### 4.2 左侧侧栏
|
||||
|
||||
包含四块:
|
||||
改为按板块变化,不再固定使用长下拉:
|
||||
|
||||
- Filters
|
||||
- Overview
|
||||
- 搜索
|
||||
- system filter
|
||||
- status filter
|
||||
- profile filter
|
||||
- 最近失败
|
||||
- 最新运行
|
||||
- 系统概览
|
||||
- Runs
|
||||
- 搜索
|
||||
- 最近失败
|
||||
- 运行队列
|
||||
- Systems
|
||||
- 系统覆盖度
|
||||
- browser evidence 覆盖
|
||||
- latest update
|
||||
- Recent Failures
|
||||
- 最近 blocker
|
||||
- status
|
||||
- 原因摘要
|
||||
- Run Queue View
|
||||
- 最近 run 卡片列表
|
||||
- 可选中并切换到 detail panel
|
||||
- 搜索
|
||||
- 系统目录
|
||||
- Architecture / Docs / Data
|
||||
- 对应目录、入口或结构列表
|
||||
|
||||
### 4.3 右侧 Detail Workspace
|
||||
|
||||
@@ -241,7 +242,7 @@ flowchart LR
|
||||
|
||||
- 点击左侧 run card 后,右侧 detail panel 即时刷新
|
||||
- 当前选中项要有强视觉区别
|
||||
- URL hash 应保留 `#run=<id>`,方便直接打开特定 run
|
||||
- URL 应按板块进入不同入口,并通过 query 参数保留筛选与 `run=<id>`
|
||||
|
||||
### 5.3 Artifact 预览
|
||||
|
||||
@@ -387,7 +388,19 @@ flowchart LR
|
||||
## 10. 路由与文档地址
|
||||
|
||||
- `/index.html`
|
||||
- 默认正式入口,使用本地化 Lovart UI 外壳
|
||||
- 根入口别名
|
||||
- `/overview/index.html`
|
||||
- 总览入口
|
||||
- `/runs/index.html`
|
||||
- 运行中心
|
||||
- `/systems/index.html`
|
||||
- 系统中心
|
||||
- `/architecture/index.html`
|
||||
- 架构中心
|
||||
- `/docs/index.html`
|
||||
- 文档中心
|
||||
- `/data/index.html`
|
||||
- 数据中心
|
||||
- `/legacy/index.html`
|
||||
- 旧版 dashboard 回退入口
|
||||
- `/docs/project-features.html`
|
||||
@@ -415,7 +428,8 @@ flowchart LR
|
||||
- 能折叠与展开各信息区
|
||||
- 能打开并预览 JSON / text / image / html artifact
|
||||
- 能看到失败原因、思路、来源、修复主题
|
||||
- 能筛选 system / status / profile
|
||||
- 能通过顶部 chips 筛选状态 / 板块 / 漏洞家族
|
||||
- 能通过分板块 URL 直接打开 overview / runs / systems / architecture / docs / data
|
||||
- 能在自动刷新开启时重新载入 dashboard 数据
|
||||
- 页面视觉比“普通表格页”更生动,但仍适合高密度阅读
|
||||
</pre>
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
<div class="dashboard-shell">
|
||||
<header class="hero">
|
||||
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
|
||||
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
|
||||
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
<p>
|
||||
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
|
||||
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
<span class="toggle-label">自动刷新</span>
|
||||
<span class="toggle-switch">
|
||||
<input id="autoRefresh" type="checkbox" checked>
|
||||
<span class="toggle-slider"></span>
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>项目功能与特性总览</h1>
|
||||
<div class="meta">工作台内置镜像页:仓库功能、目录和自动化链路说明。</div>
|
||||
@@ -149,7 +149,8 @@
|
||||
- `report.md`, `report.html`, `timeline.mmd`, `assets/`, `logs/`
|
||||
- `08-threat-intel/generated/dashboard/`
|
||||
- 静态前端工作台
|
||||
- `/index.html` 为本地化 Lovart 正式 UI
|
||||
- `/index.html` 为根入口别名
|
||||
- `/overview/index.html`, `/runs/index.html`, `/systems/index.html`, `/architecture/index.html`, `/docs/index.html`, `/data/index.html` 为分类入口
|
||||
- `/legacy/index.html` 为旧版工作台回退入口
|
||||
- `/docs/*.html` 为本地可访问的说明、真值配置与设计镜像页
|
||||
- `architecture.json` 为当前架构库结构化真值
|
||||
@@ -244,6 +245,8 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
|
||||
前端不只是“一个结果页”,而是本地实验控制台与证据阅读器。它需要:
|
||||
|
||||
- 快速定位系统 / advisory / repro profile
|
||||
- 通过顶部板块菜单切换总览、运行、系统、架构、文档和数据中心
|
||||
- 使用顶部 chips 做状态 / 板块 / 漏洞家族筛选,不再依赖过长下拉
|
||||
- 折叠与展开 timeline、evidence、sources、raw JSON
|
||||
- 折叠与展开“当前架构库”,查看控制面、数据层、地址入口、授权边界和系统分组
|
||||
- 直接查看 compose、JSON、日志、截图、报告
|
||||
@@ -257,7 +260,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
|
||||
当前地址布局固定为:
|
||||
|
||||
- `/index.html`
|
||||
- 默认新 UI,基于本地化 Lovart 视觉壳层,绑定真实 dashboard JSON
|
||||
- 根入口别名,默认进入概览
|
||||
- `/overview/index.html`
|
||||
- 总览入口
|
||||
- `/runs/index.html`
|
||||
- 运行中心
|
||||
- `/systems/index.html`
|
||||
- 系统中心
|
||||
- `/architecture/index.html`
|
||||
- 架构中心
|
||||
- `/docs/index.html`
|
||||
- 文档中心
|
||||
- `/data/index.html`
|
||||
- 数据中心
|
||||
- `/legacy/index.html`
|
||||
- 旧版工作台显式保留,用于快速回退和对照
|
||||
- `/docs/design-source.html`
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>repro-map 真值镜像</h1>
|
||||
<div class="meta">工作台内置镜像页:默认漏洞家族、浏览器要求和日志策略真值。</div>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>仓库入口镜像</h1>
|
||||
<div class="meta">工作台内置镜像页:仓库定位、能力矩阵、入口和自动化入口。</div>
|
||||
@@ -163,7 +163,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
|
||||
本地 dashboard 路由:
|
||||
|
||||
- `/index.html`
|
||||
- 默认正式 UI,使用本地化 Lovart 视觉壳层
|
||||
- 根入口别名,默认进入概览视图
|
||||
- `/overview/index.html`
|
||||
- 总览入口,显示全局指标、最新运行、系统摘要与架构预览
|
||||
- `/runs/index.html`
|
||||
- 运行中心,显示运行队列、详情、证据、日志与原始 JSON
|
||||
- `/systems/index.html`
|
||||
- 系统中心,按板块查看系统覆盖并跳转到对应运行
|
||||
- `/architecture/index.html`
|
||||
- 架构中心,折叠查看控制面、数据层、授权边界与本地入口
|
||||
- `/docs/index.html`
|
||||
- 文档中心,集中访问功能文档、设计文档和镜像页
|
||||
- `/data/index.html`
|
||||
- 数据中心,集中访问 summary、runs、systems、profiles 等 JSON
|
||||
- `/legacy/index.html`
|
||||
- 旧版工作台回退入口
|
||||
- `/docs/design-source.html`
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>安全编码修复库索引</h1>
|
||||
<div class="meta">工作台内置镜像页:secure-code 修复主题索引。</div>
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
<main>
|
||||
<div class="panel">
|
||||
<div class="actions">
|
||||
<a class="chip" href="../index.html">返回工作台</a>
|
||||
<a class="chip" href="/overview/index.html">返回工作台</a>
|
||||
</div>
|
||||
<h1>source-map 真值镜像</h1>
|
||||
<div class="meta">工作台内置镜像页:系统覆盖、来源、输出目录和 secure-code 主题真值。</div>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="./assets/styles.css">
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
@@ -16,7 +16,7 @@
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="./assets/icons.svg#spark"></use></svg>
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="./assets/icons.svg#refresh"></use></svg>
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
@@ -39,27 +39,27 @@
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="./assets/icons.svg#sync"></use></svg>
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="./docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#docs"></use></svg>
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="./docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#playbook"></use></svg>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="./docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="./legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#legacy"></use></svg>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
@@ -67,85 +67,16 @@
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside class="sidebar">
|
||||
<section class="sidebar-section">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#filter"></use></svg>
|
||||
筛选器
|
||||
</span>
|
||||
<span id="runCount" class="section-badge">0 条</span>
|
||||
</div>
|
||||
|
||||
<div class="filter-group">
|
||||
<label class="field">
|
||||
<span>搜索</span>
|
||||
<div class="search-box">
|
||||
<svg class="icon"><use href="./assets/icons.svg#search"></use></svg>
|
||||
<input id="searchInput" type="text" placeholder="搜索 run id、advisory、标题、概要">
|
||||
</div>
|
||||
</label>
|
||||
|
||||
<label class="field">
|
||||
<span>系统</span>
|
||||
<select id="systemFilter" class="filter-select">
|
||||
<option value="">全部系统</option>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label class="field">
|
||||
<span>状态</span>
|
||||
<select id="statusFilter" class="filter-select">
|
||||
<option value="">全部状态</option>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label class="field">
|
||||
<span>Profile</span>
|
||||
<select id="profileFilter" class="filter-select">
|
||||
<option value="">全部复现档案</option>
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sidebar-section">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
|
||||
系统概览
|
||||
</span>
|
||||
</div>
|
||||
<div id="systemStats" class="system-stats"></div>
|
||||
</section>
|
||||
|
||||
<section class="sidebar-section">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#failure"></use></svg>
|
||||
最近失败
|
||||
</span>
|
||||
</div>
|
||||
<div id="recentFailures" class="failure-list"></div>
|
||||
</section>
|
||||
|
||||
<section class="sidebar-section sidebar-section-fill">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#queue"></use></svg>
|
||||
运行队列
|
||||
</span>
|
||||
</div>
|
||||
<div id="runQueue" class="run-list"></div>
|
||||
</section>
|
||||
</aside>
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="./assets/icons.svg#shield"></use></svg>
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
@@ -155,19 +86,19 @@
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="./assets/icons.svg#source"></use></svg>
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="./docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="./assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="./architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="./summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="./assets/app.js"></script>
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
<div class="dashboard-shell">
|
||||
<header class="hero">
|
||||
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
|
||||
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
|
||||
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
<p>
|
||||
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
|
||||
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
<span class="toggle-label">自动刷新</span>
|
||||
<span class="toggle-switch">
|
||||
<input id="autoRefresh" type="checkbox" checked>
|
||||
<span class="toggle-slider"></span>
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -94,10 +94,10 @@
|
||||
"timeline": "/Users/x/websafe/06-case-studies/generated-runs/gitea-livecheck-20260316/timeline.mmd"
|
||||
},
|
||||
"dashboard_refs": {
|
||||
"report_html": "./runs/gitea-livecheck-20260316/report.html",
|
||||
"report_md": "./runs/gitea-livecheck-20260316/report.md",
|
||||
"timeline": "./runs/gitea-livecheck-20260316/timeline.mmd",
|
||||
"bundle": "./runs/gitea-livecheck-20260316/run.json"
|
||||
"report_html": "/runs/gitea-livecheck-20260316/report.html",
|
||||
"report_md": "/runs/gitea-livecheck-20260316/report.md",
|
||||
"timeline": "/runs/gitea-livecheck-20260316/timeline.mmd",
|
||||
"bundle": "/runs/gitea-livecheck-20260316/run.json"
|
||||
},
|
||||
"browser_links": [],
|
||||
"container_links": [],
|
||||
@@ -201,22 +201,22 @@
|
||||
"count": 4,
|
||||
"items": [
|
||||
{
|
||||
"href": "./runs/gitea-livecheck-20260316/report.html",
|
||||
"href": "/runs/gitea-livecheck-20260316/report.html",
|
||||
"label": "report.html",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/gitea-livecheck-20260316/report.md",
|
||||
"href": "/runs/gitea-livecheck-20260316/report.md",
|
||||
"label": "report.md",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/gitea-livecheck-20260316/timeline.mmd",
|
||||
"href": "/runs/gitea-livecheck-20260316/timeline.mmd",
|
||||
"label": "timeline.mmd",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/gitea-livecheck-20260316/run.json",
|
||||
"href": "/runs/gitea-livecheck-20260316/run.json",
|
||||
"label": "run.json",
|
||||
"kind": "text"
|
||||
}
|
||||
@@ -228,7 +228,7 @@
|
||||
"count": 1,
|
||||
"items": [
|
||||
{
|
||||
"href": "./runs/gitea-livecheck-20260316/compose/compose.yaml",
|
||||
"href": "/runs/gitea-livecheck-20260316/compose/compose.yaml",
|
||||
"label": "compose.yaml",
|
||||
"kind": "text"
|
||||
}
|
||||
@@ -267,10 +267,10 @@
|
||||
"timeline": "/Users/x/websafe/06-case-studies/generated-runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd"
|
||||
},
|
||||
"dashboard_refs": {
|
||||
"report_html": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
|
||||
"report_md": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
|
||||
"timeline": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
|
||||
"bundle": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json"
|
||||
"report_html": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
|
||||
"report_md": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
|
||||
"timeline": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
|
||||
"bundle": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json"
|
||||
},
|
||||
"browser_evidence": {
|
||||
"required": false,
|
||||
@@ -280,8 +280,8 @@
|
||||
"browser_links": [],
|
||||
"container_links": [],
|
||||
"request_links": [
|
||||
"./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
|
||||
"./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json"
|
||||
"/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
|
||||
"/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json"
|
||||
],
|
||||
"advisory_meta": {
|
||||
"canonical_id": "gitea--CVE-2025-68939",
|
||||
@@ -382,22 +382,22 @@
|
||||
"count": 4,
|
||||
"items": [
|
||||
{
|
||||
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
|
||||
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.html",
|
||||
"label": "report.html",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
|
||||
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/report.md",
|
||||
"label": "report.md",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
|
||||
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/timeline.mmd",
|
||||
"label": "timeline.mmd",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json",
|
||||
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/run.json",
|
||||
"label": "run.json",
|
||||
"kind": "text"
|
||||
}
|
||||
@@ -409,12 +409,12 @@
|
||||
"count": 2,
|
||||
"items": [
|
||||
{
|
||||
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
|
||||
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/attack.json",
|
||||
"label": "attack.json",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json",
|
||||
"href": "/runs/gitea-gitea--CVE-2025-68939-20260317063330/logs/baseline.json",
|
||||
"label": "baseline.json",
|
||||
"kind": "text"
|
||||
}
|
||||
@@ -462,10 +462,10 @@
|
||||
"timeline": "/Users/x/websafe/06-case-studies/generated-runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd"
|
||||
},
|
||||
"dashboard_refs": {
|
||||
"report_html": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
|
||||
"report_md": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
|
||||
"timeline": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
|
||||
"bundle": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json"
|
||||
"report_html": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
|
||||
"report_md": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
|
||||
"timeline": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
|
||||
"bundle": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json"
|
||||
},
|
||||
"browser_evidence": {
|
||||
"required": false,
|
||||
@@ -475,8 +475,8 @@
|
||||
"browser_links": [],
|
||||
"container_links": [],
|
||||
"request_links": [
|
||||
"./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
|
||||
"./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json"
|
||||
"/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
|
||||
"/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json"
|
||||
],
|
||||
"advisory_meta": {
|
||||
"canonical_id": "nextjs--CVE-2025-29927",
|
||||
@@ -580,22 +580,22 @@
|
||||
"count": 4,
|
||||
"items": [
|
||||
{
|
||||
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
|
||||
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.html",
|
||||
"label": "report.html",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
|
||||
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/report.md",
|
||||
"label": "report.md",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
|
||||
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/timeline.mmd",
|
||||
"label": "timeline.mmd",
|
||||
"kind": "text"
|
||||
},
|
||||
{
|
||||
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json",
|
||||
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/run.json",
|
||||
"label": "run.json",
|
||||
"kind": "text"
|
||||
}
|
||||
@@ -607,7 +607,7 @@
|
||||
"count": 1,
|
||||
"items": [
|
||||
{
|
||||
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json",
|
||||
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/baseline.json",
|
||||
"label": "baseline.json",
|
||||
"kind": "text"
|
||||
}
|
||||
@@ -619,7 +619,7 @@
|
||||
"count": 1,
|
||||
"items": [
|
||||
{
|
||||
"href": "./runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
|
||||
"href": "/runs/nextjs-nextjs--CVE-2025-29927-20260317063047/logs/attack.json",
|
||||
"label": "attack.json",
|
||||
"kind": "text"
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
../../../../06-case-studies/generated-runs/gitea-gitea--CVE-2025-68939-20260317063330
|
||||
@@ -1 +0,0 @@
|
||||
../../../../06-case-studies/generated-runs/gitea-livecheck-20260316
|
||||
@@ -0,0 +1,104 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
<div class="dashboard-shell">
|
||||
<header class="hero">
|
||||
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
|
||||
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
|
||||
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
<p>
|
||||
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
|
||||
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
<span class="toggle-label">自动刷新</span>
|
||||
<span class="toggle-switch">
|
||||
<input id="autoRefresh" type="checkbox" checked>
|
||||
<span class="toggle-slider"></span>
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1 +0,0 @@
|
||||
../../../../06-case-studies/generated-runs/nextjs-nextjs--CVE-2025-29927-20260317063047
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-03-17T09:03:14+00:00",
|
||||
"generated_at": "2026-03-17T09:27:20+00:00",
|
||||
"advisory_count": 89,
|
||||
"run_count": 3,
|
||||
"statuses": {
|
||||
@@ -40,7 +40,10 @@
|
||||
"manual": 36,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-03-03T04:57:57.697708Z"
|
||||
"latest_update": "2026-03-03T04:57:57.697708Z",
|
||||
"category": "platforms",
|
||||
"tier": "rolling-24m",
|
||||
"output_dir": "07-framework-security/platforms/gitea"
|
||||
},
|
||||
{
|
||||
"system_id": "nextjs",
|
||||
@@ -52,7 +55,10 @@
|
||||
"manual": 26,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-03-13T22:14:13.665535Z"
|
||||
"latest_update": "2026-03-13T22:14:13.665535Z",
|
||||
"category": "frameworks",
|
||||
"tier": "history-full",
|
||||
"output_dir": "07-framework-security/frameworks/nextjs"
|
||||
},
|
||||
{
|
||||
"system_id": "undici",
|
||||
@@ -64,7 +70,10 @@
|
||||
"manual": 14,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-03-14T09:19:54.772219Z"
|
||||
"latest_update": "2026-03-14T09:19:54.772219Z",
|
||||
"category": "frameworks",
|
||||
"tier": "rolling-24m",
|
||||
"output_dir": "07-framework-security/frameworks/undici"
|
||||
},
|
||||
{
|
||||
"system_id": "vite",
|
||||
@@ -76,7 +85,10 @@
|
||||
"manual": 12,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-02-04T04:37:24.129476Z"
|
||||
"latest_update": "2026-02-04T04:37:24.129476Z",
|
||||
"category": "frameworks",
|
||||
"tier": "history-full",
|
||||
"output_dir": "07-framework-security/frameworks/vite"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -9,7 +9,10 @@
|
||||
"manual": 36,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-03-03T04:57:57.697708Z"
|
||||
"latest_update": "2026-03-03T04:57:57.697708Z",
|
||||
"category": "platforms",
|
||||
"tier": "rolling-24m",
|
||||
"output_dir": "07-framework-security/platforms/gitea"
|
||||
},
|
||||
{
|
||||
"system_id": "nextjs",
|
||||
@@ -21,7 +24,10 @@
|
||||
"manual": 26,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-03-13T22:14:13.665535Z"
|
||||
"latest_update": "2026-03-13T22:14:13.665535Z",
|
||||
"category": "frameworks",
|
||||
"tier": "history-full",
|
||||
"output_dir": "07-framework-security/frameworks/nextjs"
|
||||
},
|
||||
{
|
||||
"system_id": "undici",
|
||||
@@ -33,7 +39,10 @@
|
||||
"manual": 14,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-03-14T09:19:54.772219Z"
|
||||
"latest_update": "2026-03-14T09:19:54.772219Z",
|
||||
"category": "frameworks",
|
||||
"tier": "rolling-24m",
|
||||
"output_dir": "07-framework-security/frameworks/undici"
|
||||
},
|
||||
{
|
||||
"system_id": "vite",
|
||||
@@ -45,6 +54,9 @@
|
||||
"manual": 12,
|
||||
"browser_required": 0,
|
||||
"browser_present": 0,
|
||||
"latest_update": "2026-02-04T04:37:24.129476Z"
|
||||
"latest_update": "2026-02-04T04:37:24.129476Z",
|
||||
"category": "frameworks",
|
||||
"tier": "history-full",
|
||||
"output_dir": "07-framework-security/frameworks/vite"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
<!doctype html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
<div class="dashboard-shell">
|
||||
<header class="hero">
|
||||
<div class="hero-glow hero-glow-left" aria-hidden="true"></div>
|
||||
<div class="hero-glow hero-glow-right" aria-hidden="true"></div>
|
||||
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
<p>
|
||||
Lovart 设计外壳已本地化并接入真实 run bundle 数据。页面只面向授权实验资产,
|
||||
聚合漏洞条目、时间线、证据、日志、来源、原始 JSON、当前架构库与失败原因。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
<span class="toggle-label">自动刷新</span>
|
||||
<span class="toggle-switch">
|
||||
<input id="autoRefresh" type="checkbox" checked>
|
||||
<span class="toggle-slider"></span>
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,6 +1,6 @@
|
||||
# 最新同步摘要
|
||||
|
||||
- 渲染时间: `2026-03-17T09:03:14+00:00`
|
||||
- 渲染时间: `2026-03-17T09:27:20+00:00`
|
||||
- 系统数量: `62`
|
||||
- Advisory 数量: `89`
|
||||
- 重点 Markdown 数量: `89`
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated_at": "2026-03-17T09:03:14+00:00",
|
||||
"generated_at": "2026-03-17T09:27:20+00:00",
|
||||
"system_count": 62,
|
||||
"advisory_count": 89,
|
||||
"markdown_count": 89,
|
||||
|
||||
14
README.md
14
README.md
@@ -75,7 +75,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
|
||||
本地 dashboard 路由:
|
||||
|
||||
- `/index.html`
|
||||
- 默认正式 UI,使用本地化 Lovart 视觉壳层
|
||||
- 根入口别名,默认进入概览视图
|
||||
- `/overview/index.html`
|
||||
- 总览入口,显示全局指标、最新运行、系统摘要与架构预览
|
||||
- `/runs/index.html`
|
||||
- 运行中心,显示运行队列、详情、证据、日志与原始 JSON
|
||||
- `/systems/index.html`
|
||||
- 系统中心,按板块查看系统覆盖并跳转到对应运行
|
||||
- `/architecture/index.html`
|
||||
- 架构中心,折叠查看控制面、数据层、授权边界与本地入口
|
||||
- `/docs/index.html`
|
||||
- 文档中心,集中访问功能文档、设计文档和镜像页
|
||||
- `/data/index.html`
|
||||
- 数据中心,集中访问 summary、runs、systems、profiles 等 JSON
|
||||
- `/legacy/index.html`
|
||||
- 旧版工作台回退入口
|
||||
- `/docs/design-source.html`
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
### 2.1 页面名称
|
||||
|
||||
- 页面名称:`Authorized Lab Dashboard`
|
||||
- 页面名称:`授权攻防实验工作台`
|
||||
- 页面语境:本地静态前端 + 本地文件 JSON 数据源
|
||||
- 非目标:在线 SaaS、多用户后端、生产管理台
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
- 信息密度高,但必须可折叠、可筛选、可逐层展开
|
||||
- 日志与原始 JSON 必须能直接预览
|
||||
- 页面视觉应更生动,但不能牺牲扫描效率
|
||||
- 默认路由采用正式新 UI,同时保留 `legacy` 回退入口
|
||||
- 默认路由采用分板块 URL,同时保留 `legacy` 回退入口
|
||||
- 运行期不得依赖外部 HTML、字体 CDN 或图标 CDN
|
||||
|
||||
## 3. 信息架构
|
||||
@@ -39,7 +39,8 @@
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A["Hero + Global Status"] --> B["Sidebar Filters"]
|
||||
A --> C["Run Queue List"]
|
||||
A --> B1["Top Section Nav"]
|
||||
B1 --> C["Overview / Runs / Systems / Architecture / Docs / Data"]
|
||||
C --> D["Run Detail Hero"]
|
||||
D --> E["Progress Timeline"]
|
||||
D --> F["Attack Plan & Reasoning"]
|
||||
@@ -62,6 +63,8 @@ flowchart LR
|
||||
- 自动刷新开关
|
||||
- 当前同步状态
|
||||
- 核心 metric cards
|
||||
- 顶部板块菜单
|
||||
- 顶部 chips 分类筛选
|
||||
|
||||
视觉要求:
|
||||
|
||||
@@ -71,24 +74,22 @@ flowchart LR
|
||||
|
||||
### 4.2 左侧侧栏
|
||||
|
||||
包含四块:
|
||||
改为按板块变化,不再固定使用长下拉:
|
||||
|
||||
- Filters
|
||||
- Overview
|
||||
- 搜索
|
||||
- system filter
|
||||
- status filter
|
||||
- profile filter
|
||||
- 最近失败
|
||||
- 最新运行
|
||||
- 系统概览
|
||||
- Runs
|
||||
- 搜索
|
||||
- 最近失败
|
||||
- 运行队列
|
||||
- Systems
|
||||
- 系统覆盖度
|
||||
- browser evidence 覆盖
|
||||
- latest update
|
||||
- Recent Failures
|
||||
- 最近 blocker
|
||||
- status
|
||||
- 原因摘要
|
||||
- Run Queue View
|
||||
- 最近 run 卡片列表
|
||||
- 可选中并切换到 detail panel
|
||||
- 搜索
|
||||
- 系统目录
|
||||
- Architecture / Docs / Data
|
||||
- 对应目录、入口或结构列表
|
||||
|
||||
### 4.3 右侧 Detail Workspace
|
||||
|
||||
@@ -153,7 +154,7 @@ flowchart LR
|
||||
|
||||
- 点击左侧 run card 后,右侧 detail panel 即时刷新
|
||||
- 当前选中项要有强视觉区别
|
||||
- URL hash 应保留 `#run=<id>`,方便直接打开特定 run
|
||||
- URL 应按板块进入不同入口,并通过 query 参数保留筛选与 `run=<id>`
|
||||
|
||||
### 5.3 Artifact 预览
|
||||
|
||||
@@ -299,7 +300,19 @@ flowchart LR
|
||||
## 10. 路由与文档地址
|
||||
|
||||
- `/index.html`
|
||||
- 默认正式入口,使用本地化 Lovart UI 外壳
|
||||
- 根入口别名
|
||||
- `/overview/index.html`
|
||||
- 总览入口
|
||||
- `/runs/index.html`
|
||||
- 运行中心
|
||||
- `/systems/index.html`
|
||||
- 系统中心
|
||||
- `/architecture/index.html`
|
||||
- 架构中心
|
||||
- `/docs/index.html`
|
||||
- 文档中心
|
||||
- `/data/index.html`
|
||||
- 数据中心
|
||||
- `/legacy/index.html`
|
||||
- 旧版 dashboard 回退入口
|
||||
- `/docs/project-features.html`
|
||||
@@ -327,6 +340,7 @@ flowchart LR
|
||||
- 能折叠与展开各信息区
|
||||
- 能打开并预览 JSON / text / image / html artifact
|
||||
- 能看到失败原因、思路、来源、修复主题
|
||||
- 能筛选 system / status / profile
|
||||
- 能通过顶部 chips 筛选状态 / 板块 / 漏洞家族
|
||||
- 能通过分板块 URL 直接打开 overview / runs / systems / architecture / docs / data
|
||||
- 能在自动刷新开启时重新载入 dashboard 数据
|
||||
- 页面视觉比“普通表格页”更生动,但仍适合高密度阅读
|
||||
|
||||
@@ -61,7 +61,8 @@
|
||||
- `report.md`, `report.html`, `timeline.mmd`, `assets/`, `logs/`
|
||||
- `08-threat-intel/generated/dashboard/`
|
||||
- 静态前端工作台
|
||||
- `/index.html` 为本地化 Lovart 正式 UI
|
||||
- `/index.html` 为根入口别名
|
||||
- `/overview/index.html`, `/runs/index.html`, `/systems/index.html`, `/architecture/index.html`, `/docs/index.html`, `/data/index.html` 为分类入口
|
||||
- `/legacy/index.html` 为旧版工作台回退入口
|
||||
- `/docs/*.html` 为本地可访问的说明、真值配置与设计镜像页
|
||||
- `architecture.json` 为当前架构库结构化真值
|
||||
@@ -156,6 +157,8 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
|
||||
前端不只是“一个结果页”,而是本地实验控制台与证据阅读器。它需要:
|
||||
|
||||
- 快速定位系统 / advisory / repro profile
|
||||
- 通过顶部板块菜单切换总览、运行、系统、架构、文档和数据中心
|
||||
- 使用顶部 chips 做状态 / 板块 / 漏洞家族筛选,不再依赖过长下拉
|
||||
- 折叠与展开 timeline、evidence、sources、raw JSON
|
||||
- 折叠与展开“当前架构库”,查看控制面、数据层、地址入口、授权边界和系统分组
|
||||
- 直接查看 compose、JSON、日志、截图、报告
|
||||
@@ -169,7 +172,19 @@ python3 /Users/x/websafe/scripts/lab/main.py serve-dashboard --port 8734
|
||||
当前地址布局固定为:
|
||||
|
||||
- `/index.html`
|
||||
- 默认新 UI,基于本地化 Lovart 视觉壳层,绑定真实 dashboard JSON
|
||||
- 根入口别名,默认进入概览
|
||||
- `/overview/index.html`
|
||||
- 总览入口
|
||||
- `/runs/index.html`
|
||||
- 运行中心
|
||||
- `/systems/index.html`
|
||||
- 系统中心
|
||||
- `/architecture/index.html`
|
||||
- 架构中心
|
||||
- `/docs/index.html`
|
||||
- 文档中心
|
||||
- `/data/index.html`
|
||||
- 数据中心
|
||||
- `/legacy/index.html`
|
||||
- 旧版工作台显式保留,用于快速回退和对照
|
||||
- `/docs/design-source.html`
|
||||
|
||||
文件差异内容过多而无法显示
加载差异
@@ -289,6 +289,157 @@ select {
|
||||
margin-top: 22px;
|
||||
}
|
||||
|
||||
.section-nav,
|
||||
.top-menus {
|
||||
position: relative;
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
.section-nav {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(6, minmax(0, 1fr));
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.nav-pill {
|
||||
display: grid;
|
||||
gap: 8px;
|
||||
padding: 14px 16px;
|
||||
border-radius: 18px;
|
||||
border: 1px solid var(--border-color);
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
}
|
||||
|
||||
.nav-pill:hover,
|
||||
.nav-pill.is-active {
|
||||
transform: translateY(-1px);
|
||||
border-color: rgba(77, 141, 255, 0.42);
|
||||
background: rgba(77, 141, 255, 0.1);
|
||||
}
|
||||
|
||||
.nav-pill-top {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.nav-pill-top strong {
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
|
||||
.nav-pill-copy {
|
||||
color: var(--text-secondary);
|
||||
font-size: 0.82rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.top-menus {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.route-note,
|
||||
.menu-row,
|
||||
.hub-card,
|
||||
.hub-card-static {
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 16px;
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
}
|
||||
|
||||
.route-note,
|
||||
.menu-row {
|
||||
padding: 14px 16px;
|
||||
}
|
||||
|
||||
.route-note {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 16px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.route-note strong {
|
||||
display: block;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.route-note span {
|
||||
display: block;
|
||||
margin-top: 6px;
|
||||
color: var(--text-secondary);
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.menu-row {
|
||||
display: grid;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
.menu-row-compact {
|
||||
padding-top: 12px;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
|
||||
.menu-row-head {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: 12px;
|
||||
color: var(--text-secondary);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
font-size: 0.74rem;
|
||||
}
|
||||
|
||||
.chip-strip {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
overflow-x: auto;
|
||||
padding-bottom: 4px;
|
||||
}
|
||||
|
||||
.chip-strip::-webkit-scrollbar {
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
.chip-strip::-webkit-scrollbar-thumb {
|
||||
background: rgba(148, 163, 184, 0.3);
|
||||
border-radius: 999px;
|
||||
}
|
||||
|
||||
.menu-chip {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 8px;
|
||||
min-height: 34px;
|
||||
padding: 8px 14px;
|
||||
border-radius: 999px;
|
||||
border: 1px solid var(--border-color);
|
||||
background: rgba(255, 255, 255, 0.04);
|
||||
color: var(--text-primary);
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
}
|
||||
|
||||
.menu-chip:hover,
|
||||
.menu-chip.is-active,
|
||||
.menu-chip-link:hover {
|
||||
transform: translateY(-1px);
|
||||
border-color: rgba(77, 141, 255, 0.42);
|
||||
background: rgba(77, 141, 255, 0.1);
|
||||
}
|
||||
|
||||
.menu-chip-muted {
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.menu-chip-link {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.metric-card {
|
||||
position: relative;
|
||||
padding: 16px 18px;
|
||||
@@ -502,6 +653,10 @@ select {
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
.run-list-compact {
|
||||
max-height: 560px;
|
||||
}
|
||||
|
||||
.run-card {
|
||||
cursor: pointer;
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
@@ -582,6 +737,35 @@ select {
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.workspace-stack,
|
||||
.system-grid,
|
||||
.hub-grid {
|
||||
display: grid;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.system-grid {
|
||||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||||
}
|
||||
|
||||
.hub-grid {
|
||||
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
||||
}
|
||||
|
||||
.hub-card,
|
||||
.hub-card-static {
|
||||
display: grid;
|
||||
gap: 10px;
|
||||
padding: 14px 16px;
|
||||
transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease;
|
||||
}
|
||||
|
||||
.hub-card:hover {
|
||||
transform: translateY(-1px);
|
||||
border-color: rgba(77, 141, 255, 0.42);
|
||||
background: rgba(77, 141, 255, 0.08);
|
||||
}
|
||||
|
||||
.workspace-empty {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
@@ -619,6 +803,12 @@ select {
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
.button-small {
|
||||
min-height: 36px;
|
||||
padding: 8px 12px;
|
||||
font-size: 0.84rem;
|
||||
}
|
||||
|
||||
.detail-stat-grid,
|
||||
.plan-grid,
|
||||
.raw-json-grid {
|
||||
@@ -918,6 +1108,10 @@ select {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.system-card-compact .detail-actions {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.viewer-frame {
|
||||
min-height: 320px;
|
||||
border: 1px solid rgba(148, 163, 184, 0.16);
|
||||
@@ -1181,6 +1375,7 @@ select {
|
||||
@media (max-width: 1320px) {
|
||||
.hero-top,
|
||||
.main-container,
|
||||
.section-nav,
|
||||
.detail-stat-grid,
|
||||
.plan-grid,
|
||||
.raw-json-grid {
|
||||
@@ -1211,6 +1406,7 @@ select {
|
||||
}
|
||||
|
||||
.hero-links,
|
||||
.route-note,
|
||||
.detail-actions,
|
||||
.tag-row,
|
||||
.panel-meta,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>授权攻防实验工作台</title>
|
||||
<link rel="stylesheet" href="./assets/styles.css">
|
||||
<link rel="stylesheet" href="/assets/styles.css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="grid-bg" aria-hidden="true"></div>
|
||||
@@ -16,7 +16,7 @@
|
||||
<div class="hero-top">
|
||||
<div class="hero-copy">
|
||||
<div class="hero-eyebrow">
|
||||
<svg class="icon"><use href="./assets/icons.svg#spark"></use></svg>
|
||||
<svg class="icon"><use href="/assets/icons.svg#spark"></use></svg>
|
||||
<span>授权攻防实验工作台</span>
|
||||
</div>
|
||||
<h1>本地攻防实证工作台</h1>
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
<div class="hero-actions">
|
||||
<button id="refreshDashboard" class="button button-primary" type="button">
|
||||
<svg class="icon"><use href="./assets/icons.svg#refresh"></use></svg>
|
||||
<svg class="icon"><use href="/assets/icons.svg#refresh"></use></svg>
|
||||
<span>立即刷新</span>
|
||||
</button>
|
||||
<label class="toggle-card">
|
||||
@@ -39,27 +39,27 @@
|
||||
</span>
|
||||
</label>
|
||||
<div id="syncState" class="sync-state">
|
||||
<svg class="icon icon-sync"><use href="./assets/icons.svg#sync"></use></svg>
|
||||
<svg class="icon icon-sync"><use href="/assets/icons.svg#sync"></use></svg>
|
||||
<div>
|
||||
<strong>启动中</strong>
|
||||
<span>正在载入本地生成数据</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-links">
|
||||
<a class="button button-secondary" href="./docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#docs"></use></svg>
|
||||
<a class="button button-secondary" href="/docs/project-features.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#docs"></use></svg>
|
||||
<span>功能文档</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="./docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#playbook"></use></svg>
|
||||
<a class="button button-secondary" href="/docs/frontend-dashboard-design.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#playbook"></use></svg>
|
||||
<span>前端设计</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="./docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
|
||||
<a class="button button-secondary" href="/docs/architecture-library.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#systems"></use></svg>
|
||||
<span>架构镜像</span>
|
||||
</a>
|
||||
<a class="button button-secondary" href="./legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="./assets/icons.svg#legacy"></use></svg>
|
||||
<a class="button button-secondary" href="/legacy/index.html" target="_blank" rel="noreferrer">
|
||||
<svg class="icon"><use href="/assets/icons.svg#legacy"></use></svg>
|
||||
<span>旧版工作台</span>
|
||||
</a>
|
||||
</div>
|
||||
@@ -67,85 +67,16 @@
|
||||
</div>
|
||||
|
||||
<div id="metricCards" class="metrics-row"></div>
|
||||
<nav id="sectionNav" class="section-nav" aria-label="工作台板块导航"></nav>
|
||||
<div id="topMenus" class="top-menus" aria-label="顶部筛选与分类菜单"></div>
|
||||
</header>
|
||||
|
||||
<main class="main-container">
|
||||
<aside class="sidebar">
|
||||
<section class="sidebar-section">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#filter"></use></svg>
|
||||
筛选器
|
||||
</span>
|
||||
<span id="runCount" class="section-badge">0 条</span>
|
||||
</div>
|
||||
|
||||
<div class="filter-group">
|
||||
<label class="field">
|
||||
<span>搜索</span>
|
||||
<div class="search-box">
|
||||
<svg class="icon"><use href="./assets/icons.svg#search"></use></svg>
|
||||
<input id="searchInput" type="text" placeholder="搜索 run id、advisory、标题、概要">
|
||||
</div>
|
||||
</label>
|
||||
|
||||
<label class="field">
|
||||
<span>系统</span>
|
||||
<select id="systemFilter" class="filter-select">
|
||||
<option value="">全部系统</option>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label class="field">
|
||||
<span>状态</span>
|
||||
<select id="statusFilter" class="filter-select">
|
||||
<option value="">全部状态</option>
|
||||
</select>
|
||||
</label>
|
||||
|
||||
<label class="field">
|
||||
<span>Profile</span>
|
||||
<select id="profileFilter" class="filter-select">
|
||||
<option value="">全部复现档案</option>
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sidebar-section">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#systems"></use></svg>
|
||||
系统概览
|
||||
</span>
|
||||
</div>
|
||||
<div id="systemStats" class="system-stats"></div>
|
||||
</section>
|
||||
|
||||
<section class="sidebar-section">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#failure"></use></svg>
|
||||
最近失败
|
||||
</span>
|
||||
</div>
|
||||
<div id="recentFailures" class="failure-list"></div>
|
||||
</section>
|
||||
|
||||
<section class="sidebar-section sidebar-section-fill">
|
||||
<div class="section-header">
|
||||
<span>
|
||||
<svg class="icon"><use href="./assets/icons.svg#queue"></use></svg>
|
||||
运行队列
|
||||
</span>
|
||||
</div>
|
||||
<div id="runQueue" class="run-list"></div>
|
||||
</section>
|
||||
</aside>
|
||||
<aside id="sidebar" class="sidebar"></aside>
|
||||
|
||||
<section id="detailWorkspace" class="workspace">
|
||||
<div class="workspace-empty">
|
||||
<svg class="icon icon-xl"><use href="./assets/icons.svg#shield"></use></svg>
|
||||
<svg class="icon icon-xl"><use href="/assets/icons.svg#shield"></use></svg>
|
||||
<h2>选择一个运行</h2>
|
||||
<p>从左侧队列选择 run,即可查看时间线、证据、日志、来源、原始 JSON 和当前架构库。</p>
|
||||
</div>
|
||||
@@ -155,19 +86,19 @@
|
||||
<footer class="dashboard-footer">
|
||||
<div class="footer-left">
|
||||
<span class="footer-note">
|
||||
<svg class="icon"><use href="./assets/icons.svg#source"></use></svg>
|
||||
<svg class="icon"><use href="/assets/icons.svg#source"></use></svg>
|
||||
当前 UI 壳层来自本地化 Lovart 模板副本,运行期不依赖任何远端 HTML、字体或图标 CDN。
|
||||
</span>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="./docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="./assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="./architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="./summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
<a href="/docs/design-source.html" target="_blank" rel="noreferrer">设计来源</a>
|
||||
<a href="/assets/design-source.json" target="_blank" rel="noreferrer">Manifest JSON</a>
|
||||
<a href="/architecture.json" target="_blank" rel="noreferrer">架构 JSON</a>
|
||||
<a href="/summary.json" target="_blank" rel="noreferrer">摘要 JSON</a>
|
||||
</div>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<script src="./assets/app.js"></script>
|
||||
<script src="/assets/app.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -779,6 +779,14 @@ def _render_section_dashboard_shells() -> None:
|
||||
source_index = LOVART_TEMPLATE_DIR / "index.html"
|
||||
for section in SECTION_ROUTE_DIRS:
|
||||
section_dir = DASHBOARD_DIR / section
|
||||
if section == "runs":
|
||||
# Preserve existing /runs/<run-id>/ bundles; only refresh the section shell.
|
||||
ensure_dir(section_dir)
|
||||
index_path = section_dir / "index.html"
|
||||
if index_path.exists():
|
||||
index_path.unlink()
|
||||
shutil.copy2(source_index, index_path)
|
||||
continue
|
||||
_remove_path(section_dir)
|
||||
ensure_dir(section_dir)
|
||||
shutil.copy2(source_index, section_dir / "index.html")
|
||||
|
||||
在新工单中引用
屏蔽一个用户