diff --git a/README.md b/README.md index f404c07..3889e15 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ - *接入*:把 UptimeRobot 已有的监控结果当数据源拉进来,与自建探测并列展示(异地视角),状态、延迟、90 天可用率、心率图全部映射自 UR 官方数据;UR 读取失败时保留上次数据,绝不把服务误判为离线 - *输出*:提供 `/api/v2/getMonitors`,字段与状态码编码对齐 UptimeRobot v2,既有脚本/看板可直接消费 - **滥用防护与信息泄露控制**:刷新接口仅内网/回环可触发、按来源冷却(429 + Retry-After)、可整体关闭;支持 `hideTargets` / `redactDetails` 与 `local.monitors.json` 私有配置分层,公开配置里可以只有服务名 —— 详见 [docs/SECURITY.md](docs/SECURITY.md) -- **主题:砂狼白子**(默认启用,可一键切回默认主题):她的官方立绘与头像、青色光环(含"外圈先亮、内圈后亮"的呼吸动画)、天蓝围巾飘带顶栏、倒十字发饰、公路车轮加载态。素材来源与版权说明见 [主题](#主题砂狼白子) +- **主题:砂狼白子**(默认启用,可一键切回默认主题):简约风插画形象(右下角立绘 + 头像 logo/favicon,宽屏不遮挡表格)、青色光环水印、天蓝围巾飘带顶栏、倒十字发饰、公路车轮加载态。素材来源见 [主题](#主题砂狼白子) - **三种数据源自动解析**:边缘 API(实时)→ 静态快照 → 浏览器直连,也可用 `?source=` 强制指定 ## 快速开始(本地) @@ -63,8 +63,8 @@ shiroko-monitor/ │ └── assets/ │ ├── style.css # 基础样式(浅色 + 暗色自适应) │ ├── theme-shiroko.css # 砂狼白子主题(仅在 body[data-theme=shiroko] 下生效) -│ ├── shiroko-portrait.webp # 立绘(SchaleDB 素材,见「主题」章节的版权说明) -│ ├── shiroko-icon.webp # 方形头像(同上) +│ ├── shiroko-figure.webp # 简约风立绘(AI 生成后抠底,见「主题」章节) +│ ├── shiroko-icon.webp # 简约风半身头像(同上) │ ├── favicon-shiroko.png # 白子主题图标(由头像生成) │ ├── deco-scarf.svg # 自绘:天蓝围巾飘带 │ ├── deco-bicycle.svg # 自绘:公路车 @@ -295,37 +295,40 @@ UptimeRobot 的探测来自其多个节点,适合作为**异地视角**与自 ## 主题(砂狼白子) -面板名称叫 shiroko-monitor,主题自然取了《蔚蓝档案》的**砂狼白子**:她的光环、围巾、狼耳与配色都被做进了界面。 +面板名称叫 shiroko-monitor,主题自然取了《蔚蓝档案》的**砂狼白子**:她的光环、围巾、狼耳与配色都被做进了界面。人物形象用的是**简约风插画**(扁平配色、无阴影,见下),不是官方立绘。 ### 主题里的元素 | 位置 | 元素 | 取自设定 | | --- | --- | --- | -| 左上 logo / 浏览器图标 | **她的头像**(真实素材)+ 青色光环环(呼吸式外扩动画) | 头像为白子的官方方形头像素材 | -| 右下角 | **她的官方立绘**(透明底,约 56vh,顶部渐隐;宽屏下表格会自动让位,不遮挡数据) | 白子原版(阿拜多斯校服)立绘 | +| 左上 logo / 浏览器图标 | **简约风半身头像**(光环 + 狼耳 + 围巾)+ 青色光环环(呼吸式外扩动画) | 生成插画的半身裁切 | +| 右下角 | **简约风全身立绘**(透明底,约 44vh,窄身设计:实测 1280 / 1440 / 1920 下都不遮挡表格,页面也无横向滚动) | 生成插画 | | 顶栏底边 | **天蓝色围巾飘带**:波浪形状 + 5 处褶皱纹路(自绘) | 天蓝色围巾是星野送给她的信物 | -| 背景 | 天蓝渐变 + 斜向细排线 + 右下**光环水印**(自绘:倾斜椭圆环 + 四方位带圆头的短杆) | 白子的光环是倾斜的椭圆环,四个方位各有一条带圆头的短杆,整体形似全息瞄准镜准星 | +| 页脚下方 | **光环水印**(自绘:倾斜椭圆环 + 四方位带圆头的短杆) | 白子的光环是倾斜的椭圆环,四个方位各有一条带圆头的短杆,整体形似全息瞄准镜准星 | | 状态点 | **迷你光环**(外圈 + 中心点,在线时缓慢脉冲外扩) | 光环是基沃托斯学生的标志 | | 分组标题 | **青色倒十字发饰**(旋转 45°,自绘) | 她左侧刘海上别的青色十字发夹 | | 刷新按钮加载态 | **公路车轮**(轮圈 + 辐条 + 花鼓)旋转 | 她最爱的公路车(Bianchi ARIA 原型) | | 左下角 | 公路车侧影(自绘) | 同上 | | 配色 | 天蓝 / 青 + 藏蓝 + 灰白;「正常」色改为青绿(`#12b0a2`) | 阿拜多斯藏蓝校服 + 天蓝围巾 + 灰白发色 | -### 素材来源与版权 +左下公路车、页脚光环、右下立绘构成页脚下方的一条装饰带,三者互不遮挡。 + +### 素材来源 | 类别 | 内容 | 来源 | | --- | --- | --- | -| **第三方素材**(真实立绘/头像) | `public/assets/shiroko-portrait.webp`(540×1024 原图缩至 460 宽)、`shiroko-icon.webp`(120×120)、`favicon-shiroko.png`(64×64) | [SchaleDB](https://schaledb.com)(社区数据库):`images/student/portrait/10010.webp`、`images/student/icon/10010.webp`;学生 Id `10010` = 砂狼白子(校服原版) | +| **插画(人物形象)** | `shiroko-figure.webp`(249×560)、`shiroko-icon.webp`(180×180)、`favicon-shiroko.png`(64×64) | **AI 生成**:按白子的设定要素(灰发狼耳 / 倾斜椭圆光环 / 天蓝围巾 / 藏蓝校服 / 简约扁平风)描述生成,再用 Pillow 抠掉白底转为透明。**不是**官方美术素材,可自由替换或商用自行判断 | +| 自绘装饰(SVG/CSS) | 围巾飘带 `deco-scarf.svg`、公路车 `deco-bicycle.svg`、光环水印、迷你光环状态点、倒十字图标、车轮加载图标 | 本仓库原创,按公开设定还原 | | 设定资料(光环形状、发饰、围巾、配色、车型) | 设计依据 | [萌娘百科 · 砂狼白子](https://mzh.moegirl.org.cn/%E7%A0%82%E7%8B%BC%E7%99%BD%E5%AD%90)、[Blue Archive Wiki](https://bluearchive.fandom.com/zh/wiki/%E7%A0%82%E7%8B%BC%E7%99%BD%E5%AD%90)、[百度百科](https://baike.baidu.com/item/%E7%A0%82%E7%8B%BC%E7%99%BD%E5%AD%90/62839164) | -| 自绘装饰(SVG/CSS) | 围巾飘带 `deco-scarf.svg`、公路车 `deco-bicycle.svg`、光环水印、迷你光环状态点、倒十字图标、车轮加载图标 | 本仓库原创,按上述公开设定还原 | +| 曾用素材(已移除) | 最早一版用过官方立绘与头像,为改成简约形象已从仓库删除 | [SchaleDB](https://schaledb.com):`images/student/portrait/10010.webp`、`images/student/icon/10010.webp`(Id `10010` = 砂狼白子),版权归 NEXON Games / Yostar;想换回官方图可再从该地址取 | -> ⚠️ **版权提示**:立绘与头像素材版权归 **NEXON Games / Yostar(《蔚蓝档案》)** 所有,此处仅作个人自用面板的风格美化。如果要把本仓库或 GitHub Pages **公开发布**,建议删除 `public/assets/shiroko-portrait.webp`、`shiroko-icon.webp`、`favicon-shiroko.png` 并在配置里清空 `artwork`,或替换为你自己的图片(其余装饰均为自绘,可保留)。 +蔚蓝档案 / Blue Archive © NEXON Games · Yostar —— 角色与设定版权归原作者所有,本主题是个人自用面板的风格致敬。 ### 切换与配置 ```jsonc "theme": "shiroko", // shiroko | default(默认主题);也可用地址栏 ?theme=default 临时覆盖 -"artwork": "assets/shiroko-portrait.webp" // 立绘图片路径(相对 public/),留空则不显示 +"artwork": "assets/shiroko-figure.webp" // 立绘图片路径(相对 public/),留空则不显示 ``` 优先级:`?theme=` → 浏览器上次选择(localStorage)→ `settings.theme`。顶栏右侧的光环图标按钮可一键切换。切回默认主题后,立绘、光环、斜纹、围巾飘带、公路车全部消失,回到最初的简洁样式。 @@ -436,6 +439,12 @@ UptimeRobot 的探测来自其多个节点,适合作为**异地视角**与自 - [x] 页脚改为展示「数据更新于 … + 下次检查 Ns」,tooltip 内含服务端更新节奏与快照生成时间 - [x] `scripts/verify.cjs` 适配纯外部数据源部署(自动跳过不适用的探测类断言),并新增「倒计时对齐服务端」断言 +### v0.8.0 已实现 + +- [x] **形象换成简约风插画**(AI 生成 + 抠底,非官方美术素材):右下角全身立绘、logo 与 favicon 用同款半身像;官方立绘/头像已从仓库移除 +- [x] **修复:桌面端表格需要横向拖动** —— 上一版为避让立绘给内容区加了 240px 右内边距,而 `.grid` 是 `max-width: 1200px`,内边距在 1200 内部吃掉宽度,导致 1200px 以上的屏幕也必然溢出。改为「立绘收窄 + 置于内容之下」,实测 1280 / 1440 / 1920 三种宽度下页面与表格均 **0 溢出、0 重叠** +- [x] **修复:立绘遮挡光环水印** —— 光环水印移到页脚下方空带,与左下公路车、右下立绘形成一条装饰带,互不遮挡 + ### v0.7.0 已实现 - [x] **砂狼白子主题**(默认启用):官方立绘(右下角,宽屏自动为它让位)+ 头像 logo/favicon(光环环呼吸动画)+ 天蓝围巾飘带顶栏 + 倒十字发饰分组标识 + 公路车轮加载态 + 按官方造型还原的倾斜椭圆光环水印;配套青绿主色调 diff --git a/docs/screenshot-demo.png b/docs/screenshot-demo.png index e04e659..45c1ade 100644 Binary files a/docs/screenshot-demo.png and b/docs/screenshot-demo.png differ diff --git a/docs/screenshot-desktop.png b/docs/screenshot-desktop.png index 694a3c5..4c92132 100644 Binary files a/docs/screenshot-desktop.png and b/docs/screenshot-desktop.png differ diff --git a/docs/screenshot-mobile.png b/docs/screenshot-mobile.png index 33cfeba..47ee08e 100644 Binary files a/docs/screenshot-mobile.png and b/docs/screenshot-mobile.png differ diff --git a/docs/screenshot-shiroko.png b/docs/screenshot-shiroko.png index 01a9127..25d0016 100644 Binary files a/docs/screenshot-shiroko.png and b/docs/screenshot-shiroko.png differ diff --git a/docs/screenshot-theme-default.png b/docs/screenshot-theme-default.png index e0d45f7..91f67f6 100644 Binary files a/docs/screenshot-theme-default.png and b/docs/screenshot-theme-default.png differ diff --git a/docs/screenshot-view-cards.png b/docs/screenshot-view-cards.png index c7607a6..9e21e61 100644 Binary files a/docs/screenshot-view-cards.png and b/docs/screenshot-view-cards.png differ diff --git a/docs/screenshot-view-table.png b/docs/screenshot-view-table.png index 39f12ea..1bfeb3f 100644 Binary files a/docs/screenshot-view-table.png and b/docs/screenshot-view-table.png differ diff --git a/edge/cloudflare/worker.js b/edge/cloudflare/worker.js index c4dfa7a..5e21f9c 100644 --- a/edge/cloudflare/worker.js +++ b/edge/cloudflare/worker.js @@ -11,7 +11,7 @@ import { connect } from 'cloudflare:sockets'; -const VERSION = '0.7.0'; +const VERSION = '0.8.0'; const HISTORY_LIMIT = 48; const UPTIME_DAYS = 90; const USER_AGENT = 'shiroko-monitor/0.3 (lightweight uptime panel)'; diff --git a/prober/node/index.js b/prober/node/index.js index daee621..841e8e6 100644 --- a/prober/node/index.js +++ b/prober/node/index.js @@ -35,7 +35,7 @@ const CONCURRENCY = 8; const WRITE_DEBOUNCE_MS = 300; const DEFAULT_INTERVAL_SEC = 60; const PORT = Number(process.env.PORT || 8787); -const VERSION = '0.7.0'; +const VERSION = '0.8.0'; const UR_DEFAULT_POLL_SEC = 300; const UR_MIN_REFRESH_GAP_MS = 60000; diff --git a/public/assets/app.js b/public/assets/app.js index 6a66d09..a98cf71 100644 --- a/public/assets/app.js +++ b/public/assets/app.js @@ -1,4 +1,4 @@ -const VERSION = '0.7.0'; +const VERSION = '0.8.0'; const HB_LIMIT = 48; const UPTIME_DAYS = 90; const BROWSER_CONCURRENCY = 6; diff --git a/public/assets/favicon-shiroko.png b/public/assets/favicon-shiroko.png index bdf131c..68af4e6 100644 Binary files a/public/assets/favicon-shiroko.png and b/public/assets/favicon-shiroko.png differ diff --git a/public/assets/shiroko-figure.webp b/public/assets/shiroko-figure.webp new file mode 100644 index 0000000..9c6a1bc Binary files /dev/null and b/public/assets/shiroko-figure.webp differ diff --git a/public/assets/shiroko-icon.webp b/public/assets/shiroko-icon.webp index 5b70be7..82c774b 100644 Binary files a/public/assets/shiroko-icon.webp and b/public/assets/shiroko-icon.webp differ diff --git a/public/assets/shiroko-portrait.webp b/public/assets/shiroko-portrait.webp deleted file mode 100644 index 93915e0..0000000 Binary files a/public/assets/shiroko-portrait.webp and /dev/null differ diff --git a/public/assets/theme-shiroko.css b/public/assets/theme-shiroko.css index baa75ce..a8f3b70 100644 --- a/public/assets/theme-shiroko.css +++ b/public/assets/theme-shiroko.css @@ -62,17 +62,18 @@ body[data-theme="shiroko"] { background-attachment: fixed; } -/* 右下角:按官方造型还原的光环水印(倾斜椭圆环 + 四方位圆头短杆) */ +/* 页脚下方空带:按官方造型还原的光环水印(倾斜椭圆环 + 四方位圆头短杆), + 与左下角公路车、右下角立绘形成一条装饰带,互不遮挡 */ body[data-theme="shiroko"]::after { content: ""; position: fixed; - right: -70px; - bottom: 40px; - width: 460px; - height: 260px; + left: 44%; + bottom: 0; + width: 330px; + height: 180px; pointer-events: none; z-index: 0; - opacity: 0.55; + opacity: 0.5; background-repeat: no-repeat; background-size: contain; background-image: url("data:image/svg+xml;utf8,"); @@ -202,28 +203,23 @@ body[data-theme="shiroko"] .uptime-cell.lv-none { body[data-theme="shiroko"] #refresh-btn .wheel { animation: wheel-spin 0.9s linear infinite; } @keyframes wheel-spin { to { transform: rotate(360deg); } } -/* ---------- 角色立绘(settings.artwork,默认指向内置立绘) ---------- */ +/* ---------- 简约风立绘(settings.artwork,默认指向内置形象) ---------- */ body[data-theme="shiroko"] .artwork { position: fixed; - right: 8px; + right: 10px; bottom: 0; width: auto; - height: min(56vh, 520px); + height: min(44vh, 380px); z-index: 0; pointer-events: none; user-select: none; - filter: drop-shadow(0 8px 24px rgb(23 60 100 / 18%)); - mask-image: linear-gradient(180deg, transparent 0, #000 14%, #000 100%); - -webkit-mask-image: linear-gradient(180deg, transparent 0, #000 14%, #000 100%); + filter: drop-shadow(0 6px 18px rgb(23 60 100 / 15%)); } -@media (max-width: 900px) { +@media (max-width: 1100px) { body[data-theme="shiroko"] .artwork { display: none; } } -/* 宽屏时为立绘留出空间,避免遮住表格右侧的可用率列 */ -@media (min-width: 1100px) { - body[data-theme="shiroko"] .grid, - body[data-theme="shiroko"] .footer { padding-right: 240px; } -} +/* 卡片视图行数多、卡片更靠右下,立绘再收一档,尽量让它落在卡片之外的角落 */ +body[data-theme="shiroko"][data-view="cards"] .artwork { height: min(34vh, 300px); } /* 内容层置于装饰之上 */ body[data-theme="shiroko"] .grid, diff --git a/public/index.html b/public/index.html index b65d1d4..7c6a68b 100644 --- a/public/index.html +++ b/public/index.html @@ -52,7 +52,7 @@ – – - shiroko-monitor v0.7.0 + shiroko-monitor v0.8.0 diff --git a/public/monitors.json b/public/monitors.json index 54d3d58..3bd20bd 100644 --- a/public/monitors.json +++ b/public/monitors.json @@ -4,7 +4,7 @@ "description": "轻量级服务监控面板", "view": "table", "theme": "shiroko", - "artwork": "assets/shiroko-portrait.webp", + "artwork": "assets/shiroko-figure.webp", "dataFilter": "uptimerobot", "refreshInterval": 300, "dataSource": "auto", diff --git a/public/status.json b/public/status.json index 2c89ff0..5efc85f 100644 --- a/public/status.json +++ b/public/status.json @@ -1,8 +1,8 @@ { "prober": "shiroko-monitor-node/0.7.0", "demo": false, - "generatedAt": "2026-10-13T11:28:45.030Z", - "dataUpdatedAt": "2026-10-13T11:28:05.807Z", + "generatedAt": "2026-10-13T11:56:34.148Z", + "dataUpdatedAt": "2026-10-13T11:55:48.247Z", "updateIntervalSec": 300, "dataFilter": "uptimerobot", "stats": { @@ -10,12 +10,12 @@ "up": 5, "down": 1, "pending": 0, - "avgLatency": 777, + "avgLatency": 818, "avgUptime90": 83.3, "memory": { - "rssMB": 49.2, - "heapUsedMB": 11.7, - "heapTotalMB": 15.2 + "rssMB": 66.8, + "heapUsedMB": 12.9, + "heapTotalMB": 14.2 } }, "sources": { @@ -23,200 +23,200 @@ "enabled": true, "ok": true, "error": null, - "lastSyncAt": "2026-10-13T11:26:54.076Z", + "lastSyncAt": "2026-10-13T11:51:45.159Z", "count": 6, "syncing": false, - "lastSyncMs": 1791890812494 + "lastSyncMs": 1791892303862 } }, "monitors": { "ur-792059439": { "status": "up", - "latency": 419, + "latency": 291, "code": null, "detail": "UptimeRobot:运行正常", - "lastCheck": "2026-10-13T11:26:00.000Z", + "lastCheck": "2026-10-13T11:47:00.000Z", "history": [ { - "t": "2026-10-12T12:30:00.000Z", + "t": "2026-10-12T13:00:00.000Z", "ok": true, - "ms": 235 + "ms": 277 }, { - "t": "2026-10-12T13:10:00.000Z", + "t": "2026-10-12T13:40:00.000Z", "ok": true, - "ms": 225 + "ms": 482 }, { - "t": "2026-10-12T13:50:00.000Z", + "t": "2026-10-12T14:20:00.000Z", "ok": true, - "ms": 732 + "ms": 698 }, { - "t": "2026-10-12T14:30:00.000Z", + "t": "2026-10-12T15:00:00.000Z", "ok": true, - "ms": 663 + "ms": 312 }, { - "t": "2026-10-12T15:10:00.000Z", + "t": "2026-10-12T15:40:00.000Z", "ok": true, - "ms": 433 + "ms": 336 }, { - "t": "2026-10-12T15:50:00.000Z", + "t": "2026-10-12T16:20:00.000Z", "ok": true, - "ms": 355 + "ms": 275 }, { - "t": "2026-10-12T16:30:00.000Z", + "t": "2026-10-12T17:00:00.000Z", "ok": true, - "ms": 293 + "ms": 255 }, { - "t": "2026-10-12T17:10:00.000Z", + "t": "2026-10-12T17:40:00.000Z", "ok": true, - "ms": 220 + "ms": 304 }, { - "t": "2026-10-12T17:55:00.000Z", + "t": "2026-10-12T18:20:00.000Z", "ok": true, - "ms": 321 + "ms": 323 }, { - "t": "2026-10-12T18:35:00.000Z", + "t": "2026-10-12T19:00:00.000Z", "ok": true, - "ms": 295 + "ms": 328 }, { - "t": "2026-10-12T19:15:00.000Z", + "t": "2026-10-12T19:40:00.000Z", "ok": true, - "ms": 310 + "ms": 304 }, { - "t": "2026-10-12T19:55:00.000Z", + "t": "2026-10-12T20:20:00.000Z", "ok": true, - "ms": 256 + "ms": 265 }, { - "t": "2026-10-12T20:35:00.000Z", + "t": "2026-10-12T21:00:00.000Z", "ok": true, - "ms": 185 + "ms": 294 }, { - "t": "2026-10-12T21:15:00.000Z", + "t": "2026-10-12T21:40:00.000Z", "ok": true, - "ms": 293 + "ms": 379 }, { - "t": "2026-10-12T21:55:00.000Z", + "t": "2026-10-12T22:20:00.000Z", + "ok": true, + "ms": 176 + }, + { + "t": "2026-10-12T23:00:00.000Z", + "ok": true, + "ms": 325 + }, + { + "t": "2026-10-12T23:40:00.000Z", + "ok": true, + "ms": 192 + }, + { + "t": "2026-10-13T00:20:00.000Z", + "ok": true, + "ms": 342 + }, + { + "t": "2026-10-13T01:00:00.000Z", + "ok": true, + "ms": 252 + }, + { + "t": "2026-10-13T01:40:00.000Z", + "ok": true, + "ms": 164 + }, + { + "t": "2026-10-13T02:20:00.000Z", + "ok": true, + "ms": 199 + }, + { + "t": "2026-10-13T03:00:00.000Z", + "ok": true, + "ms": 216 + }, + { + "t": "2026-10-13T03:40:00.000Z", + "ok": true, + "ms": 160 + }, + { + "t": "2026-10-13T04:20:00.000Z", + "ok": true, + "ms": 435 + }, + { + "t": "2026-10-13T05:00:00.000Z", + "ok": true, + "ms": 281 + }, + { + "t": "2026-10-13T05:40:00.000Z", + "ok": true, + "ms": 285 + }, + { + "t": "2026-10-13T06:20:00.000Z", "ok": true, "ms": 270 }, { - "t": "2026-10-12T22:35:00.000Z", + "t": "2026-10-13T07:00:00.000Z", "ok": true, - "ms": 181 + "ms": 235 }, { - "t": "2026-10-12T23:15:00.000Z", + "t": "2026-10-13T07:40:00.000Z", "ok": true, - "ms": 225 + "ms": 271 }, { - "t": "2026-10-12T23:55:00.000Z", + "t": "2026-10-13T08:20:00.000Z", "ok": true, - "ms": 387 + "ms": 417 }, { - "t": "2026-10-13T00:35:00.000Z", + "t": "2026-10-13T09:00:00.000Z", "ok": true, - "ms": 288 + "ms": 396 }, { - "t": "2026-10-13T01:15:00.000Z", + "t": "2026-10-13T09:40:00.000Z", "ok": true, - "ms": 167 + "ms": 296 }, { - "t": "2026-10-13T01:55:00.000Z", + "t": "2026-10-13T10:20:00.000Z", "ok": true, - "ms": 157 + "ms": 183 }, { - "t": "2026-10-13T02:35:00.000Z", + "t": "2026-10-13T11:11:00.000Z", "ok": true, - "ms": 228 + "ms": 389 }, { - "t": "2026-10-13T03:15:00.000Z", + "t": "2026-10-13T11:47:00.000Z", "ok": true, - "ms": 225 - }, - { - "t": "2026-10-13T03:55:00.000Z", - "ok": true, - "ms": 99 - }, - { - "t": "2026-10-13T04:40:00.000Z", - "ok": true, - "ms": 471 - }, - { - "t": "2026-10-13T05:20:00.000Z", - "ok": true, - "ms": 305 - }, - { - "t": "2026-10-13T06:00:00.000Z", - "ok": true, - "ms": 314 - }, - { - "t": "2026-10-13T06:40:00.000Z", - "ok": true, - "ms": 245 - }, - { - "t": "2026-10-13T07:20:00.000Z", - "ok": true, - "ms": 295 - }, - { - "t": "2026-10-13T08:00:00.000Z", - "ok": true, - "ms": 262 - }, - { - "t": "2026-10-13T08:40:00.000Z", - "ok": true, - "ms": 440 - }, - { - "t": "2026-10-13T09:20:00.000Z", - "ok": true, - "ms": 302 - }, - { - "t": "2026-10-13T10:10:00.000Z", - "ok": true, - "ms": 106 - }, - { - "t": "2026-10-13T10:46:00.000Z", - "ok": true, - "ms": 250 - }, - { - "t": "2026-10-13T11:26:00.000Z", - "ok": true, - "ms": 419 + "ms": 291 } ], "daily": { "2026-10-13": { - "total": 12, - "up": 12 + "total": 4, + "up": 4 } }, "meta": { @@ -243,10 +243,10 @@ }, "ur-795497022": { "status": "up", - "latency": 747, + "latency": 698, "code": null, "detail": "UptimeRobot:运行正常", - "lastCheck": "2026-10-13T11:26:00.000Z", + "lastCheck": "2026-10-13T11:47:00.000Z", "history": [ { "t": "2026-10-12T12:35:00.000Z", @@ -409,20 +409,25 @@ "ms": 749 }, { - "t": "2026-10-13T10:49:00.000Z", + "t": "2026-10-13T10:33:00.000Z", "ok": true, - "ms": 714 + "ms": 609 }, { - "t": "2026-10-13T11:26:00.000Z", + "t": "2026-10-13T11:10:00.000Z", "ok": true, - "ms": 747 + "ms": 770 + }, + { + "t": "2026-10-13T11:47:00.000Z", + "ok": true, + "ms": 698 } ], "daily": { "2026-10-13": { - "total": 12, - "up": 12 + "total": 4, + "up": 4 } }, "meta": { @@ -449,196 +454,191 @@ }, "ur-795556828": { "status": "up", - "latency": 334, + "latency": 380, "code": null, "detail": "UptimeRobot:运行正常", - "lastCheck": "2026-10-13T11:21:00.000Z", + "lastCheck": "2026-10-13T11:47:00.000Z", "history": [ { - "t": "2026-10-12T12:05:00.000Z", + "t": "2026-10-12T12:50:00.000Z", "ok": true, - "ms": 368 + "ms": 401 }, { - "t": "2026-10-12T12:45:00.000Z", + "t": "2026-10-12T13:30:00.000Z", "ok": true, - "ms": 419 + "ms": 690 }, { - "t": "2026-10-12T13:25:00.000Z", + "t": "2026-10-12T14:10:00.000Z", "ok": true, - "ms": 647 + "ms": 356 }, { - "t": "2026-10-12T14:05:00.000Z", + "t": "2026-10-12T14:50:00.000Z", "ok": true, - "ms": 346 + "ms": 204 }, { - "t": "2026-10-12T14:45:00.000Z", + "t": "2026-10-12T15:30:00.000Z", "ok": true, - "ms": 236 + "ms": 314 }, { - "t": "2026-10-12T15:25:00.000Z", + "t": "2026-10-12T16:10:00.000Z", "ok": true, - "ms": 321 + "ms": 498 }, { - "t": "2026-10-12T16:05:00.000Z", + "t": "2026-10-12T16:50:00.000Z", "ok": true, - "ms": 484 + "ms": 203 }, { - "t": "2026-10-12T16:45:00.000Z", + "t": "2026-10-12T17:35:00.000Z", "ok": true, - "ms": 184 + "ms": 334 }, { - "t": "2026-10-12T17:25:00.000Z", + "t": "2026-10-12T18:15:00.000Z", "ok": true, - "ms": 436 + "ms": 282 }, { - "t": "2026-10-12T18:05:00.000Z", + "t": "2026-10-12T18:55:00.000Z", "ok": true, - "ms": 293 + "ms": 309 }, { - "t": "2026-10-12T18:45:00.000Z", + "t": "2026-10-12T19:35:00.000Z", "ok": true, - "ms": 274 + "ms": 403 }, { - "t": "2026-10-12T19:25:00.000Z", - "ok": true, - "ms": 389 - }, - { - "t": "2026-10-12T20:05:00.000Z", - "ok": true, - "ms": 385 - }, - { - "t": "2026-10-12T20:45:00.000Z", - "ok": true, - "ms": 241 - }, - { - "t": "2026-10-12T21:25:00.000Z", - "ok": true, - "ms": 260 - }, - { - "t": "2026-10-12T22:05:00.000Z", - "ok": true, - "ms": 185 - }, - { - "t": "2026-10-12T22:45:00.000Z", - "ok": true, - "ms": 82 - }, - { - "t": "2026-10-12T23:25:00.000Z", - "ok": true, - "ms": 247 - }, - { - "t": "2026-10-13T00:05:00.000Z", - "ok": true, - "ms": 177 - }, - { - "t": "2026-10-13T00:45:00.000Z", - "ok": true, - "ms": 165 - }, - { - "t": "2026-10-13T01:25:00.000Z", - "ok": true, - "ms": 131 - }, - { - "t": "2026-10-13T02:05:00.000Z", - "ok": true, - "ms": 127 - }, - { - "t": "2026-10-13T02:45:00.000Z", - "ok": true, - "ms": 404 - }, - { - "t": "2026-10-13T03:25:00.000Z", - "ok": true, - "ms": 154 - }, - { - "t": "2026-10-13T04:05:00.000Z", - "ok": true, - "ms": 139 - }, - { - "t": "2026-10-13T04:45:00.000Z", - "ok": true, - "ms": 192 - }, - { - "t": "2026-10-13T05:25:00.000Z", - "ok": true, - "ms": 242 - }, - { - "t": "2026-10-13T06:05:00.000Z", - "ok": true, - "ms": 187 - }, - { - "t": "2026-10-13T06:45:00.000Z", + "t": "2026-10-12T20:15:00.000Z", "ok": true, "ms": 315 }, { - "t": "2026-10-13T07:25:00.000Z", + "t": "2026-10-12T20:55:00.000Z", "ok": true, - "ms": 483 + "ms": 243 }, { - "t": "2026-10-13T08:05:00.000Z", + "t": "2026-10-12T21:35:00.000Z", "ok": true, - "ms": 251 + "ms": 206 }, { - "t": "2026-10-13T08:45:00.000Z", + "t": "2026-10-12T22:15:00.000Z", "ok": true, - "ms": 252 + "ms": 237 }, { - "t": "2026-10-13T09:25:00.000Z", + "t": "2026-10-12T23:00:00.000Z", "ok": true, - "ms": 218 + "ms": 237 }, { - "t": "2026-10-13T10:05:00.000Z", + "t": "2026-10-12T23:40:00.000Z", "ok": true, - "ms": 110 + "ms": 231 }, { - "t": "2026-10-13T10:41:00.000Z", + "t": "2026-10-13T00:20:00.000Z", "ok": true, - "ms": 434 + "ms": 249 }, { - "t": "2026-10-13T11:21:00.000Z", + "t": "2026-10-13T01:00:00.000Z", "ok": true, - "ms": 334 + "ms": 133 + }, + { + "t": "2026-10-13T01:40:00.000Z", + "ok": true, + "ms": 143 + }, + { + "t": "2026-10-13T02:20:00.000Z", + "ok": true, + "ms": 179 + }, + { + "t": "2026-10-13T03:00:00.000Z", + "ok": true, + "ms": 409 + }, + { + "t": "2026-10-13T03:40:00.000Z", + "ok": true, + "ms": 231 + }, + { + "t": "2026-10-13T04:20:00.000Z", + "ok": true, + "ms": 250 + }, + { + "t": "2026-10-13T05:00:00.000Z", + "ok": true, + "ms": 134 + }, + { + "t": "2026-10-13T05:40:00.000Z", + "ok": true, + "ms": 193 + }, + { + "t": "2026-10-13T06:20:00.000Z", + "ok": true, + "ms": 260 + }, + { + "t": "2026-10-13T07:00:00.000Z", + "ok": true, + "ms": 254 + }, + { + "t": "2026-10-13T07:40:00.000Z", + "ok": true, + "ms": 559 + }, + { + "t": "2026-10-13T08:20:00.000Z", + "ok": true, + "ms": 205 + }, + { + "t": "2026-10-13T09:00:00.000Z", + "ok": true, + "ms": 264 + }, + { + "t": "2026-10-13T09:40:00.000Z", + "ok": true, + "ms": 305 + }, + { + "t": "2026-10-13T10:20:00.000Z", + "ok": true, + "ms": 420 + }, + { + "t": "2026-10-13T11:11:00.000Z", + "ok": true, + "ms": 198 + }, + { + "t": "2026-10-13T11:47:00.000Z", + "ok": true, + "ms": 380 } ], "daily": { "2026-10-13": { - "total": 12, - "up": 12 + "total": 4, + "up": 4 } }, "meta": { @@ -665,10 +665,10 @@ }, "ur-792059414": { "status": "up", - "latency": 1960, + "latency": 1562, "code": null, "detail": "UptimeRobot:运行正常", - "lastCheck": "2026-10-13T11:23:00.000Z", + "lastCheck": "2026-10-13T11:45:00.000Z", "history": [ { "t": "2026-10-12T12:45:00.000Z", @@ -711,130 +711,135 @@ "ms": 2291 }, { - "t": "2026-10-12T18:35:00.000Z", + "t": "2026-10-12T18:40:00.000Z", "ok": true, - "ms": 2370 + "ms": 2251 }, { - "t": "2026-10-12T19:15:00.000Z", + "t": "2026-10-12T19:25:00.000Z", "ok": true, - "ms": 2255 + "ms": 2178 }, { - "t": "2026-10-12T19:55:00.000Z", + "t": "2026-10-12T20:10:00.000Z", "ok": true, - "ms": 2597 + "ms": 2123 }, { - "t": "2026-10-12T20:35:00.000Z", + "t": "2026-10-12T20:55:00.000Z", "ok": true, - "ms": 1788 + "ms": 2087 }, { - "t": "2026-10-12T21:15:00.000Z", + "t": "2026-10-12T21:40:00.000Z", "ok": true, - "ms": 1938 + "ms": 1870 }, { - "t": "2026-10-12T21:55:00.000Z", + "t": "2026-10-12T22:20:00.000Z", "ok": true, - "ms": 2084 + "ms": 1662 }, { - "t": "2026-10-12T22:35:00.000Z", + "t": "2026-10-12T23:00:00.000Z", "ok": true, - "ms": 1905 + "ms": 1859 }, { - "t": "2026-10-12T23:20:00.000Z", + "t": "2026-10-12T23:40:00.000Z", "ok": true, - "ms": 2483 + "ms": 3138 }, { - "t": "2026-10-13T00:05:00.000Z", + "t": "2026-10-13T00:20:00.000Z", "ok": true, - "ms": 2264 + "ms": 1681 }, { - "t": "2026-10-13T00:50:00.000Z", + "t": "2026-10-13T01:00:00.000Z", "ok": true, - "ms": 2069 + "ms": 2312 }, { - "t": "2026-10-13T01:35:00.000Z", + "t": "2026-10-13T01:40:00.000Z", "ok": true, - "ms": 2910 + "ms": 2200 }, { - "t": "2026-10-13T02:20:00.000Z", + "t": "2026-10-13T02:25:00.000Z", "ok": true, - "ms": 2355 + "ms": 1924 }, { - "t": "2026-10-13T03:05:00.000Z", + "t": "2026-10-13T03:10:00.000Z", "ok": true, - "ms": 1421 + "ms": 1144 }, { - "t": "2026-10-13T03:50:00.000Z", + "t": "2026-10-13T03:55:00.000Z", "ok": true, - "ms": 2074 + "ms": 2124 }, { - "t": "2026-10-13T04:35:00.000Z", + "t": "2026-10-13T04:40:00.000Z", "ok": true, - "ms": 2552 + "ms": 2623 }, { - "t": "2026-10-13T05:20:00.000Z", + "t": "2026-10-13T05:25:00.000Z", "ok": true, - "ms": 2318 + "ms": 2562 }, { - "t": "2026-10-13T06:05:00.000Z", + "t": "2026-10-13T06:10:00.000Z", "ok": true, - "ms": 2713 + "ms": 2625 }, { - "t": "2026-10-13T06:45:00.000Z", + "t": "2026-10-13T06:55:00.000Z", "ok": true, - "ms": 2675 + "ms": 2226 }, { - "t": "2026-10-13T07:25:00.000Z", + "t": "2026-10-13T07:40:00.000Z", "ok": true, - "ms": 2161 + "ms": 1715 }, { - "t": "2026-10-13T08:05:00.000Z", + "t": "2026-10-13T08:20:00.000Z", "ok": true, - "ms": 1825 + "ms": 1620 }, { - "t": "2026-10-13T08:45:00.000Z", + "t": "2026-10-13T09:00:00.000Z", "ok": true, - "ms": 1615 + "ms": 1898 }, { - "t": "2026-10-13T09:25:00.000Z", + "t": "2026-10-13T09:40:00.000Z", "ok": true, - "ms": 1887 + "ms": 1576 }, { - "t": "2026-10-13T10:44:00.000Z", + "t": "2026-10-13T10:20:00.000Z", "ok": true, - "ms": 2845 + "ms": 1742 }, { - "t": "2026-10-13T11:23:00.000Z", + "t": "2026-10-13T11:06:00.000Z", "ok": true, - "ms": 1960 + "ms": 2132 + }, + { + "t": "2026-10-13T11:45:00.000Z", + "ok": true, + "ms": 1562 } ], "daily": { "2026-10-13": { - "total": 12, - "up": 12 + "total": 4, + "up": 4 } }, "meta": { @@ -861,191 +866,191 @@ }, "ur-798788113": { "status": "up", - "latency": 424, + "latency": 1161, "code": null, "detail": "UptimeRobot:运行正常", - "lastCheck": "2026-10-13T11:22:00.000Z", + "lastCheck": "2026-10-13T11:48:00.000Z", "history": [ { - "t": "2026-10-12T12:05:00.000Z", + "t": "2026-10-12T12:55:00.000Z", "ok": true, - "ms": 611 + "ms": 738 }, { - "t": "2026-10-12T12:45:00.000Z", + "t": "2026-10-12T13:35:00.000Z", "ok": true, - "ms": 533 + "ms": 412 }, { - "t": "2026-10-12T13:25:00.000Z", + "t": "2026-10-12T14:15:00.000Z", "ok": true, - "ms": 421 + "ms": 401 }, { - "t": "2026-10-12T14:05:00.000Z", + "t": "2026-10-12T14:55:00.000Z", "ok": true, - "ms": 415 + "ms": 321 }, { - "t": "2026-10-12T14:45:00.000Z", + "t": "2026-10-12T15:35:00.000Z", "ok": true, - "ms": 335 + "ms": 517 }, { - "t": "2026-10-12T15:25:00.000Z", + "t": "2026-10-12T16:15:00.000Z", "ok": true, - "ms": 458 + "ms": 324 }, { - "t": "2026-10-12T16:05:00.000Z", + "t": "2026-10-12T16:55:00.000Z", "ok": true, - "ms": 440 + "ms": 452 }, { - "t": "2026-10-12T16:45:00.000Z", - "ok": true, - "ms": 388 - }, - { - "t": "2026-10-12T17:25:00.000Z", - "ok": true, - "ms": 272 - }, - { - "t": "2026-10-12T18:05:00.000Z", + "t": "2026-10-12T17:35:00.000Z", "ok": true, "ms": 346 }, { - "t": "2026-10-12T18:45:00.000Z", - "ok": true, - "ms": 326 - }, - { - "t": "2026-10-12T19:25:00.000Z", - "ok": true, - "ms": 439 - }, - { - "t": "2026-10-12T20:05:00.000Z", - "ok": true, - "ms": 291 - }, - { - "t": "2026-10-12T20:45:00.000Z", - "ok": true, - "ms": 450 - }, - { - "t": "2026-10-12T21:25:00.000Z", + "t": "2026-10-12T18:15:00.000Z", "ok": true, "ms": 386 }, { - "t": "2026-10-12T22:05:00.000Z", + "t": "2026-10-12T18:55:00.000Z", "ok": true, - "ms": 451 + "ms": 357 }, { - "t": "2026-10-12T22:45:00.000Z", + "t": "2026-10-12T19:35:00.000Z", "ok": true, - "ms": 226 + "ms": 423 }, { - "t": "2026-10-12T23:25:00.000Z", + "t": "2026-10-12T20:15:00.000Z", "ok": true, - "ms": 249 + "ms": 303 }, { - "t": "2026-10-13T00:05:00.000Z", + "t": "2026-10-12T20:55:00.000Z", "ok": true, - "ms": 270 + "ms": 524 }, { - "t": "2026-10-13T00:45:00.000Z", + "t": "2026-10-12T21:35:00.000Z", "ok": true, - "ms": 220 + "ms": 330 }, { - "t": "2026-10-13T01:25:00.000Z", + "t": "2026-10-12T22:15:00.000Z", "ok": true, - "ms": 429 + "ms": 441 }, { - "t": "2026-10-13T02:05:00.000Z", + "t": "2026-10-12T23:00:00.000Z", "ok": true, - "ms": 411 + "ms": 215 }, { - "t": "2026-10-13T02:45:00.000Z", + "t": "2026-10-12T23:40:00.000Z", "ok": true, - "ms": 295 + "ms": 239 }, { - "t": "2026-10-13T03:25:00.000Z", + "t": "2026-10-13T00:20:00.000Z", "ok": true, - "ms": 446 + "ms": 273 }, { - "t": "2026-10-13T04:05:00.000Z", + "t": "2026-10-13T01:00:00.000Z", "ok": true, - "ms": 445 + "ms": 273 }, { - "t": "2026-10-13T04:45:00.000Z", + "t": "2026-10-13T01:40:00.000Z", "ok": true, - "ms": 456 + "ms": 347 }, { - "t": "2026-10-13T05:25:00.000Z", + "t": "2026-10-13T02:20:00.000Z", "ok": true, - "ms": 370 + "ms": 505 }, { - "t": "2026-10-13T06:05:00.000Z", + "t": "2026-10-13T03:00:00.000Z", "ok": true, - "ms": 342 + "ms": 412 }, { - "t": "2026-10-13T06:45:00.000Z", + "t": "2026-10-13T03:40:00.000Z", "ok": true, - "ms": 277 + "ms": 332 }, { - "t": "2026-10-13T07:25:00.000Z", + "t": "2026-10-13T04:20:00.000Z", "ok": true, - "ms": 411 + "ms": 396 }, { - "t": "2026-10-13T08:05:00.000Z", + "t": "2026-10-13T05:00:00.000Z", "ok": true, - "ms": 355 + "ms": 537 }, { - "t": "2026-10-13T08:45:00.000Z", + "t": "2026-10-13T05:40:00.000Z", "ok": true, - "ms": 424 + "ms": 332 }, { - "t": "2026-10-13T09:25:00.000Z", + "t": "2026-10-13T06:20:00.000Z", "ok": true, - "ms": 300 + "ms": 426 }, { - "t": "2026-10-13T10:42:00.000Z", + "t": "2026-10-13T07:00:00.000Z", "ok": true, - "ms": 436 + "ms": 344 }, { - "t": "2026-10-13T11:22:00.000Z", + "t": "2026-10-13T07:40:00.000Z", "ok": true, - "ms": 424 + "ms": 334 + }, + { + "t": "2026-10-13T08:20:00.000Z", + "ok": true, + "ms": 341 + }, + { + "t": "2026-10-13T09:00:00.000Z", + "ok": true, + "ms": 447 + }, + { + "t": "2026-10-13T09:40:00.000Z", + "ok": true, + "ms": 581 + }, + { + "t": "2026-10-13T10:20:00.000Z", + "ok": true, + "ms": 455 + }, + { + "t": "2026-10-13T11:12:00.000Z", + "ok": true, + "ms": 341 + }, + { + "t": "2026-10-13T11:48:00.000Z", + "ok": true, + "ms": 1161 } ], "daily": { "2026-10-13": { - "total": 12, - "up": 12 + "total": 4, + "up": 4 } }, "meta": { @@ -1085,7 +1090,7 @@ ], "daily": { "2026-10-13": { - "total": 12, + "total": 4, "up": 0 } }, diff --git a/scripts/verify-views.cjs b/scripts/verify-views.cjs index 50b381e..7f34c68 100644 --- a/scripts/verify-views.cjs +++ b/scripts/verify-views.cjs @@ -48,8 +48,33 @@ async function main() { bodyView: document.body.dataset.view, count: document.querySelectorAll(sel).length, activeBtn: document.querySelector('.view-btn.active')?.textContent ?? '', + // 页面与表格都不应出现横向溢出(历史上立绘避让的 padding 曾导致桌面端需要横向拖动) + overflowPage: document.documentElement.scrollWidth - document.documentElement.clientWidth, + overflowTable: (() => { + const w = document.querySelector('.table-wrap'); + return w ? Math.round(w.scrollWidth - w.clientWidth) : 0; + })(), }), SELECTOR[view]); check(`${view} 视图渲染 ${shown} 个条目`, info.count === shown, `count=${info.count}, 切换器=${info.activeBtn}`); + check(`${view} 视图无横向溢出(无需拖动)`, info.overflowPage <= 0 && info.overflowTable <= 0, `页面溢出 ${info.overflowPage}px,表格溢出 ${info.overflowTable}px`); + // 立绘若存在:要么不与内容重叠,要么确实位于不透明面板之下(立绘 z-index 低于内容,不应影响阅读) + const artOverlap = await page.evaluate(() => { + const art = document.querySelector('.artwork'); + if (!art || getComputedStyle(art).display === 'none') return null; + const a = art.getBoundingClientRect(); + const opaque = (bg) => { + const m = bg.match(/rgba?\(([^)]+)\)/); + if (!m) return false; + const parts = m[1].split(',').map(Number); + return parts.length < 4 || parts[3] === 1; + }; + const hits = [...document.querySelectorAll('table.monitor-table tbody tr, .card')] + .map((el) => ({ r: el.getBoundingClientRect(), el })) + .filter(({ r }) => r.right > a.left + 8 && r.bottom > a.top && r.top < a.bottom) + .map(({ el }) => opaque(getComputedStyle(el).backgroundColor) || opaque(getComputedStyle(el.closest('.table-wrap, .grid') ?? el).backgroundColor)); + return { count: hits.length, allOpaque: hits.every(Boolean) }; + }); + if (artOverlap) check(`${view} 视图立绘不影响阅读(不重叠或位于面板之下)`, artOverlap.count === 0 || artOverlap.allOpaque, `重叠 ${artOverlap.count} 个,均在面板之下=${artOverlap.allOpaque}`); await page.screenshot({ path: path.join(__dirname, '..', 'docs', `screenshot-view-${view}.png`), fullPage: true }); }