Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
af0187a
Update config.json
podcctv May 5, 2026
f0bf83d
Delete public/config.json
podcctv May 5, 2026
cd3d409
Update NodeCard.tsx
podcctv May 5, 2026
e80e913
Update NodeDetail.tsx
podcctv May 5, 2026
9eec5ca
Update global.css
podcctv May 5, 2026
44c518d
Update NodeDetail.tsx
podcctv May 5, 2026
7b9ba3b
Update NodeCard.tsx
podcctv May 5, 2026
2c37d04
Enhance hover effects on NodeCard component
podcctv May 5, 2026
77ca136
Update global.css
podcctv May 5, 2026
e98254c
Update NodeCard.tsx
podcctv May 5, 2026
2806f86
Update global.css
podcctv May 5, 2026
ab7ea49
Update NodeCard.tsx
podcctv May 5, 2026
3a988bd
Update global.css
podcctv May 5, 2026
2e85b79
Update cn.ts
podcctv May 5, 2026
e90d74b
Update NodeCard.tsx
podcctv May 5, 2026
c836ed9
Update types.ts
podcctv May 5, 2026
bf6ed2e
Update cn.ts
podcctv May 5, 2026
11f5ab1
优化状态卡片密度并修复资源占用填充
podcctv May 6, 2026
cb4dd58
Merge pull request #1 from podcctv/codex/fix-card-width-and-add-gradient
podcctv May 6, 2026
9be79e9
Fix usage bars updates and refresh card/latency visuals
podcctv May 6, 2026
3435956
Merge pull request #2 from podcctv/codex/fix-occupancy-info-update-an…
podcctv May 6, 2026
a76495c
feat: enhance cyber card gloss and disable offline selection
podcctv May 6, 2026
fd409e3
Merge pull request #3 from podcctv/codex/add-reflective-effect-to-cards
podcctv May 6, 2026
7e4bf34
Fix TCP latency parsing and refine detail panel UX
podcctv May 6, 2026
27783c8
Merge pull request #4 from podcctv/codex/tcpbug
podcctv May 6, 2026
c463d24
Revamp status panel and improve TCP latency parsing
podcctv May 6, 2026
0b1b426
Merge pull request #5 from podcctv/codex/redesign-online-status-display
podcctv May 6, 2026
761baff
Fix node identity collisions and detail latency data
podcctv May 6, 2026
1a457ac
Merge pull request #6 from podcctv/codex/fix-resource-usage-card-layout
podcctv May 6, 2026
f250393
Refine cyber cards and fix TCP ping display
May 6, 2026
8d91662
Merge pull request #7 from podcctv/codex/cyber-cards-tcp-ping
podcctv May 6, 2026
f06938c
Fix detail latency data display
May 6, 2026
4f51268
Merge pull request #8 from podcctv/codex/fix-detail-latency-empty-state
podcctv May 6, 2026
8fac0b1
Add live latency probe fallback
May 6, 2026
e9d6f5a
Merge pull request #9 from podcctv/codex/live-latency-probe-and-card-…
podcctv May 6, 2026
fcc07b1
Use supported latency permission mode
May 6, 2026
992ab0b
Merge pull request #10 from podcctv/codex/use-supported-latency-mode
podcctv May 6, 2026
4ca5a2a
Simplify card status indicator
May 6, 2026
6e26237
Merge pull request #11 from podcctv/codex/simplify-card-status-indicator
podcctv May 6, 2026
6bf7ba4
Unify latency panels and add fleet TCP ping
May 6, 2026
a17ea04
Merge pull request #12 from podcctv/codex/unify-latency-panels-and-fl…
podcctv May 6, 2026
2e94b0c
Embed TCP ping in node cards
May 6, 2026
d011931
Merge pull request #13 from podcctv/codex/embed-tcp-ping-in-node-cards
podcctv May 6, 2026
4682900
Smooth card ping refresh
May 6, 2026
a3d294b
Merge pull request #14 from podcctv/codex/smooth-card-ping-refresh
podcctv May 6, 2026
2c35a83
Refine detail status and card ping
May 6, 2026
9921c69
Merge pull request #15 from podcctv/codex/refine-detail-status-and-ca…
podcctv May 6, 2026
b521aca
Style TCPing as segmented card
May 6, 2026
f85f92a
Merge pull request #16 from podcctv/codex/retro-segmented-tcping-card
podcctv May 6, 2026
6b1e85a
feat: 赛博风格TCPing延迟热力图 + 卡片等高修复
May 6, 2026
57bad9c
merge: 赛博风格TCPing延迟热力图 + 卡片等高修复
May 6, 2026
f1f9f76
fix: 修复卡片TCPing无数据问题 — 增加无type过滤的fallback查询+客户端过滤
May 6, 2026
fca843e
fix: 重构fleet TCPing查询 — 改为全局批量查询+客户端过滤, 避免N个per-node请求压垮后端
May 6, 2026
b5b8bfb
style: 老派赛博朋克风格全面改版
May 6, 2026
4dc4601
fix: 恢复传统配色+ping数据延迟加载提速
May 6, 2026
87efc75
feat: 完善卡片细节与性能优化
May 6, 2026
38bf1ee
fix: 调整在线率计算逻辑,偶尔丢包不算掉线
May 6, 2026
b6e0b90
fix: 修复TCPing历史消失及离线卡片色调
May 6, 2026
d918ce5
fix: 修复 TCPing 历史因全局查询数量受限而消失的问题
May 6, 2026
32b0ba1
fix: 调整拉取逻辑为完全按顺序(并发1),并增加单节点回退数量保证快速ping记录完整
May 6, 2026
706cf4b
fix: 调整拉取体验为请求一个显示一个,并提升高频检测备用上限至15000
May 6, 2026
88afad9
feat: 增加 IndexedDB 本地缓存,实现刷新秒开
May 6, 2026
062fe52
style: 适配 NodeCard 和 TCPing 组件的亮色模式
May 6, 2026
07ffa76
style: 重构系统资源卡片进度条,优化高负载显示质感
May 6, 2026
83b4ea9
style: 提升白色主题背景下的对比度和可读性
May 6, 2026
9031d99
docs: 更新 README,添加近期性能与 UI 优化详情
May 6, 2026
e37e9d7
Update footer Flanker link
May 6, 2026
d74b2fb
merge: sync fork with upstream/main — adopt echarts WorldMap rewrite,…
May 8, 2026
773da1a
merge: sync with upstream v1.4.3 — adopt theme/config split, download…
May 14, 2026
9ada804
fix: App.tsx config null crash — add optional chaining on user_prefer…
May 14, 2026
87d235b
merge: sync upstream world map and config types
Jun 4, 2026
182ff15
Add local mock dashboard mode
Jun 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,25 @@ SITE_2=name="master-2",backend_url="wss://m2.example.com",token="xyz789"
一个 `SITE_n` 都没设的话脚本啥也不干 直接用仓库里那份 `config.json` 本地 `npm run dev` 走的是 vite 直接起 也不会触发这个脚本

可以只有一个 `SITE` 不强制 `SITE_2` `SITE_3` 之类的

# 🎉 近期核心更新与深度优化

近期针对性能、高频检测支持以及 UI 质感进行了大刀阔斧的重构,带来“秒开”与“仪表盘级别”的监控体验:

### 🚀 极致的性能与加载体验
- ** IndexedDB 刷新秒开**:突破了传统的 `localStorage` 容量限制,引入原生 IndexedDB 持久化存储全量 24h 历史 TCPing 数据。现在每次刷新页面或重新打开浏览器,无需任何请求等待,**历史监控图表瞬间“秒开”铺满**。
- **无缝增量渲染**:在界面秒开的基础上,后台以“请求一个、渲染一个”的瀑布流方式静默拉取缺失的数据段并无缝拼合,彻底告别旧版漫长的干等白屏。
- **高并发节点保护**:重写数据拉取逻辑为按顺序单节点并发查询(Concurrency=1),有效避免几十台节点瞬间发起几百个 Websocket 请求导致后端卡死或触发限流。
- **支持 20 秒高频检测**:将单节点 TCPing 拉取上限扩容至 `15000` 条。即使节点每 20 秒执行一次 Ping 检测(一日上万条记录),也能轻松拉满 24 小时的完整热力图,彻底解决右侧数据缺失或只有几小时记录的 Bug。

### 🎨 仪表盘级别的赛博质感
- **细粒度网格进度条**:废弃了传统的单一直线进度条,CPU / 内存 / 磁盘的使用率现在采用 **20 格分离式点阵风格**(类似 TCPing 热力图),极具赛博科幻仪表盘质感。
- **动态健康阈值色彩**:
- `< 70%` 正常状态:黑夜模式为纯白,白天模式为纯黑,带来极简的高对比度。
- `70% - 100%` 高负载:平滑的琥珀色到橙色警告渐变。
- `> 100%` 超频爆表:当 CPU 使用率破表时,激发 **专属高亮鲜红 + 红色光晕扩散特效**,监控一眼可见。
- **全局日夜间双主题适配**:
- 白天模式(Light):去除了深色模式下的朦胧透明感,全面启用 `slate-50` 纯净白灰底色及高对比度石板灰字体,界面锐利、通透明亮。
- 黑夜模式(Dark):保持深邃暗黑的极客赛博风格。
- **24h 在线率前置**:无需点进详情页,在首页卡片上直接渲染 24h 历史存活状态长条。
- **精准掉线计算**:优化在线率统计算法,仅对“完全掉线(100% 丢包)”的时段进行离线惩罚,间歇性的偶发丢包不再会导致服务器被误判为离线并标红,更贴合实际生产环境。
4 changes: 2 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@
}
} catch (_) {}
</script>
<link rel="stylesheet" href="./custom.css" />
<link rel="stylesheet" href="/custom.css" />
</head>

<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
<script src="./custom.js" defer></script>
<script type="module" src="/custom.js"></script>
</body>
</html>
10 changes: 5 additions & 5 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"build": "vite build",
"postbuild": "node scripts/build-template-config.mjs && node scripts/build-filelist.mjs && node scripts/build-zip.mjs && node scripts/build-config.mjs",
"preview": "vite preview",
"deploy:cf": "npm run build && npx wrangler deploy",
"typecheck": "tsc -p tsconfig.json"
},
"dependencies": {
Expand Down
202 changes: 202 additions & 0 deletions public/linux-logo-icon/download.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
<!DOCTYPE html>
<html lang="en">

<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NodeGet Theme Downloader</title>
<link rel="icon" type="image/png" href="./logo.png" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"
integrity="sha512-XMVd28F1oH/O71fzwBnV7HucLxVwtxf26XV8P4wPk26EDxuGZ91N8bsOttmnomcCD3CS5ZMRL50H0GgOHvegtg=="
crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<style>
body {
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: #f9fafb;
color: #111827;
margin: 0;
padding: 0;
}

header {
background: #fff;
padding: 1rem 2rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
display: flex;
justify-content: space-between;
align-items: center;
}

header h1 {
margin: 0;
font-size: 1.25rem;
}

header a {
text-decoration: none;
color: #3b82f6;
font-weight: 500;
}

main {
max-width: 600px;
margin: 2rem auto;
padding: 0 1rem;
}

button {
background: #3b82f6;
color: white;
border: none;
padding: 0.5rem 1rem;
border-radius: 0.375rem;
cursor: pointer;
font-weight: 500;
}

button:disabled {
background: #a5b4fc;
cursor: not-allowed;
}

.file-list {
margin-top: 1rem;
border-radius: 0.5rem;
overflow: hidden;
background: #fff;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}

.file-item {
padding: 0.5rem 1rem;
border-bottom: 1px solid #e5e7eb;
display: flex;
justify-content: space-between;
font-size: 0.875rem;
}

.file-item:last-child {
border-bottom: none;
}

.progress-bar {
height: 4px;
background: #3b82f6;
width: 0%;
transition: width 0.2s;
border-radius: 2px;
}

.progress-container {
background: #e5e7eb;
border-radius: 2px;
overflow: hidden;
margin-top: 0.25rem;
}

.error {
color: #ef4444;
font-size: 0.8rem;
}
</style>
</head>

<body>
<header>
<h1>NodeGet Theme Downloader</h1>
<a href="/" id="home-link">Home</a>
</header>
<main>
<p style="margin-top: 200px;">
这是一个通用的下载器,用于提取当前网站所实用的 NodeGet 主题,下载后修改 nodeget-theme.json 即可将压缩包部署到任意静态储存服务。
</p>
<button id="start-btn" style="margin: 20px auto 20px;display: block;">开始下载</button>
<div id="overall-progress" class="progress-container" style="display:none;">
<div class="progress-bar" id="overall-bar"></div>
</div>
<div class="file-list" id="file-list"></div>
</main>

<script type="module">

const startBtn = document.getElementById('start-btn')
const fileListEl = document.getElementById('file-list')
const overallProgress = document.getElementById('overall-progress')
const overallBar = document.getElementById('overall-bar')
const getRandStr = () => Date.now() + '-' + crypto.randomUUID().replaceAll(/-/g, "").slice(10)

let fileEntries = []

startBtn.addEventListener('click', async () => {
startBtn.disabled = true
fileListEl.innerHTML = ''
overallProgress.style.display = 'block'

try {
const res = await fetch('nodeget-theme-files.json' + '?_=' + getRandStr())
fileEntries = await res.json() // 假设是扁平数组 ["assets/index.js","images/logo.png",...]
} catch (err) {
startBtn.disabled = false
return
}

const zip = new JSZip()
let completed = 0

for (const path of fileEntries) {
let fileItemEl = document.createElement('div')
fileItemEl.className = 'file-item'
fileItemEl.textContent = path
const statusEl = document.createElement('span')
statusEl.textContent = '等待'
fileItemEl.appendChild(statusEl)
fileListEl.appendChild(fileItemEl)

await downloadFileWithRetry(path, 3, zip, statusEl, () => {
completed++
overallBar.style.width = ((completed / fileEntries.length) * 100).toFixed(2) + '%'
})
}

// 生成 zip 并下载
const blob = await zip.generateAsync({ type: 'blob' })
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = 'nodeget-theme.zip'
a.click()
URL.revokeObjectURL(url)
startBtn.disabled = false
})

// 下载文件带重试
async function downloadFileWithRetry(path, retries, zip, statusEl, progressCallback) {
for (let i = 0; i < retries; i++) {
try {
statusEl.textContent = '下载中...'
const res = await fetch(path + '?_=' + getRandStr())
if (!res.ok) throw new Error(`HTTP ${res.status}`)
const blob = await res.blob()
zip.file(path, blob)
statusEl.textContent = '完成'
progressCallback()
return
} catch (err) {
console.error(err)
statusEl.textContent = `错误,重试中 (${i + 1})`
await new Promise(r => setTimeout(r, 1000))
}
}
statusEl.textContent = '下载失败'
statusEl.classList.add('error')
progressCallback()
}

document.getElementById('home-link').addEventListener('click', (e) => {
e.preventDefault()
window.scrollTo({ top: 0, behavior: 'smooth' })
})
</script>
</body>

</html>
Loading