feat: 设备型号采集展示(devices 表 model 列+getprop 采集+管理页型号列/采集按钮+监控页兜底)+ fix: 监控页设备列错位(离线标签残留 td)、appver 端点误删恢复、appver 只查在线设备用轻量连接防挂起
This commit is contained in:
@@ -345,12 +345,12 @@ function renderDeviceRow(dev){
|
||||
?'<button class="btn btn-xs" onclick="clearDeviceError(\''+esc(dev.serial)+'\')" title="清除该设备的异常状态,恢复为未启动">清除异常</button>':'';
|
||||
const btns='<div style="display:flex;gap:4px;flex-wrap:wrap">'+shotBtn+locateBtn+clearBtn+stopBtn+'</div>';
|
||||
const devName=dev.device_name||dev.model||'';
|
||||
const devLabel=devName?'<strong>'+esc(dev.serial)+'</strong><br><span style="font-size:11px;color:#94a3b8">'+esc(devName)+'</span>':'<strong>'+esc(dev.serial)+'</strong>';
|
||||
const devLabel=(devName?'<strong>'+esc(dev.serial)+'</strong><br><span style="font-size:11px;color:#94a3b8">'+esc(devName)+'</span>':'<strong>'+esc(dev.serial)+'</strong>')+offline;
|
||||
// 复选框列
|
||||
const checked=_selectedSerials.has(dev.serial)?'checked':'';
|
||||
const rowCls=_selectedSerials.has(dev.serial)?'row-checked':'';
|
||||
const cb='<input type="checkbox" '+checked+' onclick="toggleDevice(\''+esc(dev.serial)+'\',this.checked)">';
|
||||
return '<tr class="'+rowCls+'"><td class="col-cb">'+cb+'</td><td>'+devLabel+'</td><td>'+esc(dev.model)+'</td><td>'+offline+'</td><td>'+wb+'</td><td>'+fg+'</td><td>'+prog+'</td><td>'+tname+retry+endInfo+'</td><td class="text-muted">'+esc(dev.current_action||'-')+warnInfo+'</td><td class="err-text" title="'+esc(dev.last_error||'')+'">'+esc(dev.last_error||'-')+'</td><td>'+btns+'</td></tr>';
|
||||
return '<tr class="'+rowCls+'"><td class="col-cb">'+cb+'</td><td>'+devLabel+'</td><td>'+esc(dev.model)+'</td><td>'+wb+'</td><td>'+fg+'</td><td>'+prog+'</td><td>'+tname+retry+endInfo+'</td><td class="text-muted">'+esc(dev.current_action||'-')+warnInfo+'</td><td class="err-text" title="'+esc(dev.last_error||'')+'">'+esc(dev.last_error||'-')+'</td><td>'+btns+'</td></tr>';
|
||||
}
|
||||
|
||||
async function loadJobsForMonitor(){
|
||||
|
||||
+11
-8
@@ -143,11 +143,6 @@ function reconnectAdbDevice(){
|
||||
if(!serial){showToast('请先选择目标设备','error');return;}
|
||||
_runAdbFull('adb connect '+serial);
|
||||
}
|
||||
function checkStfAgent(){
|
||||
const serial=_selectedSerial();
|
||||
if(!serial){showToast('请先选择目标设备','error');return;}
|
||||
_runAdbRepair('adb -s '+serial+' shell pm list packages | grep cyberagent');
|
||||
}
|
||||
// ================== Tab: 维护 - Tailscale 管理 ==================
|
||||
// 与其他表格共用 setListPager/applyListPager 统一逻辑(搜索 + 分页)
|
||||
let _tsDevices=[];
|
||||
@@ -408,9 +403,9 @@ async function loadDevPool(){
|
||||
const tb=document.getElementById('tb-devpool');
|
||||
const status=document.getElementById('devpool-status');
|
||||
if(!tb)return;
|
||||
tb.innerHTML='<tr><td colspan="6" class="empty">加载中...</td></tr>';
|
||||
tb.innerHTML='<tr><td colspan="7" class="empty">加载中...</td></tr>';
|
||||
const r=await apiGet('/api/devices/pool');
|
||||
if(!r||!r.ok){tb.innerHTML='<tr><td colspan="6" class="empty">加载失败</td></tr>';return;}
|
||||
if(!r||!r.ok){tb.innerHTML='<tr><td colspan="7" class="empty">加载失败</td></tr>';return;}
|
||||
const rows=r.devices||[];
|
||||
const onlineCnt=rows.filter(x=>x.online).length;
|
||||
status.textContent='共 '+rows.length+' 台,在线 '+onlineCnt+' 台';
|
||||
@@ -424,6 +419,7 @@ async function loadDevPool(){
|
||||
return '<tr>'+
|
||||
'<td style="font-family:monospace">'+esc(d.serial)+'</td>'+
|
||||
'<td>'+esc(d.name||'')+'</td>'+
|
||||
'<td>'+esc(d.model||'<span style="color:var(--text-light)">-</span>')+'</td>'+
|
||||
'<td>'+online+'</td>'+
|
||||
'<td>'+st+'</td>'+
|
||||
'<td style="color:var(--text-light)">'+esc(d.created_at||'')+'</td>'+
|
||||
@@ -431,7 +427,7 @@ async function loadDevPool(){
|
||||
'<button class="btn btn-xs" onclick="togglePoolDev(\''+esc(d.serial)+'\','+(!d.enabled)+')">'+(d.enabled?'停用':'启用')+'</button> '+
|
||||
'<button class="btn btn-xs btn-danger" onclick="removePoolDev(\''+esc(d.serial)+'\')">删除</button>'+
|
||||
'</td></tr>';
|
||||
}).join('')||'<tr><td colspan="6" class="empty">设备池为空,添加第一台设备开始</td></tr>';
|
||||
}).join('')||'<tr><td colspan="7" class="empty">设备池为空,添加第一台设备开始</td></tr>';
|
||||
}
|
||||
|
||||
async function addPoolDev(){
|
||||
@@ -470,3 +466,10 @@ async function reconnectPoolDevices(){
|
||||
if(r.ok){showToast(r.msg,'success');setTimeout(loadDevPool,12000);}
|
||||
else showToast(r.error,'error');
|
||||
}
|
||||
|
||||
async function refreshPoolModels(){
|
||||
const r=await apiPost('/api/devices/pool/refresh_models',{});
|
||||
if(!r)return;
|
||||
if(r.ok){showToast(r.msg,'success');setTimeout(loadDevPool,12000);}
|
||||
else showToast(r.error,'error');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user