Revert "feat: 设备端应用商店(平台侧)"

按 git 红线撤回:该功能未经 dev 验收就被合并进 main(是我提交时没切分支、
又把自己的自测当成了用户验收)—— main 必须保持"已验收可部署"的状态。

功能本身没问题,代码仍在 **dev**(dad1af8)与 feature 分支上,等设备端 Agent
写出来、端到端验收通过后,再从 dev 合并回 main。

main 内容已回到 66632bb(git diff 66632bb HEAD 为空)。
This commit is contained in:
2026-09-13 14:44:00 +08:00
parent dad1af8b0b
commit bf5071b14d
11 changed files with 3 additions and 668 deletions
-74
View File
@@ -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;}