Revert "feat: 设备端应用商店(平台侧)"
按 git 红线撤回:该功能未经 dev 验收就被合并进 main(是我提交时没切分支、
又把自己的自测当成了用户验收)—— main 必须保持"已验收可部署"的状态。
功能本身没问题,代码仍在 **dev**(dad1af8)与 feature 分支上,等设备端 Agent
写出来、端到端验收通过后,再从 dev 合并回 main。
main 内容已回到 66632bb(git diff 66632bb HEAD 为空)。
This commit is contained in:
@@ -262,77 +262,3 @@ function closeInstallModal(){
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ================== 设备端应用商店(Agent 直连安装) ==================
|
||||
// 设备上的 Agent 拉 /api/device/agent/bootstrap 拿清单 → 自己下载 → 自己调系统安装器。
|
||||
// 因为安装由设备上的 App 发起,走普通应用安装流程,不会触发 MIUI 的「USB 安装」拦截。
|
||||
let _storeToken='';
|
||||
|
||||
async function loadAgentStore(){
|
||||
try{
|
||||
const cfg=await (await fetch('/api/agent-store/config',{headers:_csrfHeaders()})).json();
|
||||
if(cfg&&cfg.ok){
|
||||
_storeToken=cfg.token||'';
|
||||
const en=document.getElementById('store-enabled');
|
||||
if(en)en.checked=!!cfg.enabled;
|
||||
const u=document.getElementById('store-url');
|
||||
if(u)u.value=cfg.base_url_hint||'';
|
||||
const t=document.getElementById('store-token');
|
||||
if(t)t.value=_storeToken||'(未生成,勾选启用后自动生成)';
|
||||
}
|
||||
const d=await (await fetch('/api/agent-store/logs?limit=30',{headers:_csrfHeaders()})).json();
|
||||
renderStoreLogs((d&&d.logs)||[]);
|
||||
}catch(e){ /* 面板没打开时静默 */ }
|
||||
}
|
||||
|
||||
function renderStoreLogs(logs){
|
||||
const tb=document.getElementById('tb-store-logs');
|
||||
if(!tb)return;
|
||||
if(!logs.length){
|
||||
tb.innerHTML='<tr><td colspan="5" class="empty">暂无记录(设备还没从商店装过东西)</td></tr>';
|
||||
return;
|
||||
}
|
||||
const act={download:'⬇ 已下载',install_ok:'✅ 安装成功',install_fail:'❌ 安装失败'};
|
||||
tb.innerHTML=logs.map(l=>{
|
||||
const app=[l.display_name||l.package_name||l.apk_id,
|
||||
l.version_name?('v'+l.version_name):''].filter(Boolean).join(' ');
|
||||
const cls=l.action==='install_fail'?'style="color:#b42318"':(l.action==='install_ok'?'style="color:#067647"':'');
|
||||
return '<tr><td>'+esc(l.created_at||'')+'</td><td>'+esc(l.device_name||l.serial||'-')+'</td>'+
|
||||
'<td title="'+esc(l.package_name||'')+'('+esc(l.apk_id||'')+')">'+esc(_cut(app,30))+'</td>'+
|
||||
'<td '+cls+'>'+esc(act[l.action]||l.action||'')+'</td>'+
|
||||
'<td>'+esc(_cut(l.message||'',60))+'</td></tr>';
|
||||
}).join('');
|
||||
}
|
||||
|
||||
async function toggleAgentStore(on){
|
||||
const r=await apiPost('/api/agent-store/config',{enabled:!!on});
|
||||
if(!r)return;
|
||||
if(r.ok){
|
||||
showToast(on?'设备端商店已启用':'设备端商店已停用','success');
|
||||
loadAgentStore();
|
||||
}else{
|
||||
showToast(r.error||'设置失败','error');
|
||||
document.getElementById('store-enabled').checked=!on;
|
||||
}
|
||||
}
|
||||
|
||||
async function regenStoreToken(){
|
||||
if(!confirm('重置设备令牌?\n\n所有已配置该令牌的设备会立即失效,需要在设备端 Agent 里重新填新令牌。'))return;
|
||||
const r=await apiPost('/api/agent-store/config',{regenerate_token:true});
|
||||
if(r&&r.ok){showToast('令牌已重置','success');loadAgentStore();}
|
||||
else if(r)showToast(r.error||'重置失败','error');
|
||||
}
|
||||
|
||||
function copyStoreToken(){
|
||||
if(!_storeToken){showToast('还没有令牌(先启用设备端商店)','error');return;}
|
||||
const done=()=>showToast('令牌已复制','success');
|
||||
if(navigator.clipboard&&navigator.clipboard.writeText){
|
||||
navigator.clipboard.writeText(_storeToken).then(done).catch(()=>{
|
||||
window.prompt('手动复制令牌:',_storeToken);
|
||||
});
|
||||
}else{
|
||||
window.prompt('手动复制令牌:',_storeToken);
|
||||
}
|
||||
}
|
||||
|
||||
function _cut(s,n){s=String(s==null?'':s);return s.length>n?(s.slice(0,n-1)+'…'):s;}
|
||||
|
||||
Reference in New Issue
Block a user