Files
SenSu/static/web_panel/pages/plugins.js
T
qinglong 4a989bf50f feat: WS实时推送、网速双线图、按钮MD3修复、页面加载器修复 (v0.6.0)
后端:
- 新增 /api/system/ws WebSocket端点 替代HTTP轮询 (每2s推送系统+框架数据)
- 修复 uptime始终为0 (sm.start_time时间戳)
- 网络采集新增TX上行+实时网速(delta法)
- 进程内存采集 (/proc/self/status VmRSS)
- 抑制aiohttp内部WS帧日志防刷爆日志文件

前端:
- 仪表盘: HTTP轮询→WS连接+指数退避自动重连
- 实时日志: 修复onclose重连bug+批量渲染30fps+500行上限防卡死
- 网速卡片: DualLineChart双线图(下行实线/上行虚线)
- Y轴零点偏移-5% 防止零网速贴底
- 所有按钮修复MD3组合类(btn+btn-tonal+btn-sm)
- 页面加载器: 改动态script元素执行 修复onclick全局作用域问题
- emoji图标→Material Design SVG图标
- CSS去残留</style>+新增.nav-item svg约束
- 登录页输入框+标签左对齐+按钮MD3样式
- 多个版本号显示修复(去双重v前缀)
- chart.js/app.js/HTML页面统一加版本号防浏览器缓存
- .gitignore新增docs/目录

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 16:23:31 +08:00

37 lines
1.8 KiB
JavaScript

window.PluginsModule = {
init: () => window.PluginsModule.refresh(),
refresh: async () => {
const list = document.getElementById('plugin-list');
if(!list) return;
list.innerHTML = '加载中...';
try {
const res = await fetch('./api/plugins', {credentials:'include'});
const data = await res.json();
if(!data.plugins?.length) { list.innerHTML = '<div style="color:var(--text-dim)">暂无已加载插件</div>'; return; }
list.innerHTML = data.plugins.map(p => `
<div class="plugin-card">
<div class="plugin-info">
<h4>${p.name} <span class="badge ${p.running?'badge-run':'badge-stop'}">${p.running?'RUNNING':'STOPPED'}</span></h4>
<p>v${p.version||'1.0.0'} | ${p.enabled?'已启用':'已禁用'}</p>
</div>
<div class="plugin-act">
${p.running
? `<button class="btn btn-sm btn-tonal" onclick="window.PluginsModule.act('${p.name}','disable')">停用</button>`
: `<button class="btn btn-sm btn-tonal" onclick="window.PluginsModule.act('${p.name}','enable')">启用</button>`
}
<button class="btn btn-sm btn-outlined" onclick="window.PluginsModule.act('${p.name}','reload')">重载</button>
</div>
</div>
`).join('');
} catch(e) { list.innerHTML = '加载失败'; }
},
act: async (name, action) => {
try {
await fetch(`./api/plugins/${name}/${action}`, {method:'POST', credentials:'include'});
setTimeout(window.PluginsModule.refresh, 500);
} catch(e) { alert('操作失败'); }
},
destroy: () => {}
};