v0.3.7: 恢复前端Vue源码 + 修复AdminDashboard 401根源
This commit is contained in:
15
source_clean/frontend.bak.old/admin/js/admin-boot.js
Normal file
15
source_clean/frontend.bak.old/admin/js/admin-boot.js
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
// Fetch app version
|
||||
fetch('/api/version').then(r => r.json()).then(d => {
|
||||
var el = document.getElementById('appVersion');
|
||||
if (el && d.version) el.textContent = 'v' + d.version;
|
||||
}).catch(function(){});
|
||||
|
||||
(function(){
|
||||
if(!TOKEN){
|
||||
document.getElementById('app').innerHTML = '<div class="login-wrap"><div id="content"></div></div>';
|
||||
page_login(document.getElementById('content'));
|
||||
} else {
|
||||
nav('dashboard');
|
||||
}
|
||||
})();
|
||||
155
source_clean/frontend.bak.old/admin/js/admin-cleanup.js
Normal file
155
source_clean/frontend.bak.old/admin/js/admin-cleanup.js
Normal file
@@ -0,0 +1,155 @@
|
||||
function page_cleanup(c){
|
||||
c.innerHTML = '<div id="cleanupRoot"><p style="text-align:center;padding:40px">Loading...</p></div>';
|
||||
loadCleanupPage();
|
||||
}
|
||||
|
||||
function loadCleanupPage(){
|
||||
Promise.all([
|
||||
api('/api/admin/cloud-configs').catch(function(){ return []; }),
|
||||
api('/api/admin/verify/status').catch(function(){ return {}; }),
|
||||
api('/api/admin/system-configs').catch(function(){ return {}; })
|
||||
]).then(function(res){
|
||||
var accounts = res[0] || [];
|
||||
var vStatus = res[1] || {};
|
||||
var configs = res[2] || {};
|
||||
renderCleanupPage(accounts, vStatus, configs);
|
||||
});
|
||||
}
|
||||
|
||||
function renderCleanupPage(accounts, vStatus, configs){
|
||||
var lastVerify = vStatus.last_run ? new Date(vStatus.last_run).toLocaleString() : 'never';
|
||||
var lastCleanup = configs.cleanup_last_run || 'never';
|
||||
var h = '';
|
||||
|
||||
h += '<div class="card"><div class="card-title">Storage Cleanup & Management</div>';
|
||||
h += '<p style="color:var(--sub);font-size:12px">Cloud verification, space refresh, scheduled cleanup</p></div>';
|
||||
|
||||
// Quick Actions
|
||||
h += '<div class="card"><div class="card-title">Quick Actions</div>';
|
||||
h += '<div style="display:flex;flex-wrap:wrap;gap:10px;margin-bottom:12px">';
|
||||
h += '<button class="btn btn-pri" onclick="runVerifyAll()">Verify All</button>';
|
||||
h += '<button class="btn btn-pri" onclick="runStorageRefresh()">Refresh All Space</button>';
|
||||
h += '<button class="btn btn-warn" onclick="runFullCleanup()">Full Cleanup</button>';
|
||||
h += '<button class="btn btn-outline" onclick="runEmptyTrash()">Empty Trash</button>';
|
||||
h += '</div>';
|
||||
h += '<div id="actionStatus" style="font-size:12px;color:var(--sub);margin-top:8px"></div>';
|
||||
h += '<div style="font-size:12px;color:var(--sub);margin-top:4px">Last verify: ' + lastVerify + ' | Last cleanup: ' + lastCleanup + '</div></div>';
|
||||
|
||||
// Account Table
|
||||
h += '<div class="card"><div class="card-title">Account Verification</div>';
|
||||
h += '<div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;font-size:13px">';
|
||||
h += '<thead><tr style="background:var(--bg);border-bottom:2px solid var(--border);text-align:left">';
|
||||
h += '<th style="padding:8px 10px">Type</th><th style="padding:8px 10px">Nickname</th>';
|
||||
h += '<th style="padding:8px 10px">Status</th><th style="padding:8px 10px">Space</th>';
|
||||
h += '<th style="padding:8px 10px">Action</th></tr></thead><tbody>';
|
||||
|
||||
accounts.forEach(function(cfg){
|
||||
var v = cfg.verification_status;
|
||||
var vIcon = v==='valid'?'OK':(v==='invalid'?'FAIL':'PENDING');
|
||||
var space = cfg.storage_used ? (cfg.storage_used + ' / ' + (cfg.storage_total||'?')) : '-';
|
||||
h += '<tr style="border-bottom:1px solid var(--border)">';
|
||||
h += '<td style="padding:8px 10px">' + (cfg.cloud_type||'?') + '</td>';
|
||||
h += '<td style="padding:8px 10px">' + (cfg.nickname||'-') + '</td>';
|
||||
h += '<td style="padding:8px 10px">' + vIcon + '</td>';
|
||||
h += '<td style="padding:8px 10px;font-size:12px;color:var(--sub)">' + space + '</td>';
|
||||
h += '<td style="padding:8px 10px"><button class="btn btn-sm btn-outline" onclick="runSingleVerify('+cfg.id+',this)">Verify</button></td></tr>';
|
||||
});
|
||||
|
||||
if(accounts.length===0){
|
||||
h += '<tr><td colspan="5" style="padding:20px;text-align:center;color:var(--sub)">No accounts found</td></tr>';
|
||||
}
|
||||
h += '</tbody></table></div></div>';
|
||||
|
||||
// Cleanup Config
|
||||
h += '<div class="card"><div class="card-title">Cleanup Config</div>';
|
||||
h += '<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;font-size:13px">';
|
||||
h += cfgRow('Cleanup Enabled', 'cleanup_enabled', configs, 'checkbox');
|
||||
h += cfgRow('File Retention (days)', 'cleanup_file_retention_days', configs, 'number', '7');
|
||||
h += cfgRow('Log Retention (days)', 'cleanup_log_retention_days', configs, 'number', '30');
|
||||
h += cfgRow('Empty Trash After', 'cleanup_empty_trash', configs, 'checkbox');
|
||||
h += cfgRow('Space Threshold Cleanup', 'cleanup_space_threshold_enabled', configs, 'checkbox');
|
||||
h += cfgRow('Threshold %', 'cleanup_space_threshold_percent', configs, 'number', '90');
|
||||
h += cfgRow('Delete %', 'cleanup_space_threshold_delete_percent', configs, 'number', '10');
|
||||
h += '</div>';
|
||||
h += '<button class="btn btn-pri" style="margin-top:12px" onclick="saveCleanupConfig()">Save Config</button></div>';
|
||||
|
||||
document.getElementById('cleanupRoot').innerHTML = h;
|
||||
}
|
||||
|
||||
function cfgRow(label, key, configs, type, placeholder){
|
||||
var val = configs[key] || '';
|
||||
if(type==='checkbox'){
|
||||
var chk = val==='true'?'checked':'';
|
||||
return '<div><label style="display:flex;align-items:center;gap:8px;cursor:pointer"><input type="checkbox" class="cleanupCfg" data-key="'+key+'" '+chk+'><span>'+label+'</span></label></div>';
|
||||
}
|
||||
return '<div><label style="font-size:12px;color:var(--sub)">'+label+'</label><input class="form-control cleanupCfg" data-key="'+key+'" value="'+val+'" placeholder="'+placeholder+'" style="max-width:120px"></div>';
|
||||
}
|
||||
|
||||
function runVerifyAll(){
|
||||
var el = document.getElementById('actionStatus');
|
||||
el.innerHTML = 'Verifying all accounts...';
|
||||
api('/api/admin/verify/run', {method:'POST'}).then(function(r){
|
||||
el.innerHTML = 'Done: '+(r.ok||0)+'/'+r.total+' OK, '+r.failed+' failed';
|
||||
setTimeout(loadCleanupPage, 2000);
|
||||
}).catch(function(e){
|
||||
el.innerHTML = 'Verify failed: '+(e.message||'network error');
|
||||
});
|
||||
}
|
||||
|
||||
function runSingleVerify(id, btn){
|
||||
btn.disabled = true; btn.textContent = '...';
|
||||
api('/api/admin/verify/single/'+id, {method:'POST'}).then(function(r){
|
||||
btn.textContent = r.success ? 'OK' : 'FAIL';
|
||||
}).catch(function(){ btn.textContent = 'ERR'; })
|
||||
.finally(function(){ setTimeout(loadCleanupPage, 1500); });
|
||||
}
|
||||
|
||||
function runStorageRefresh(){
|
||||
var el = document.getElementById('actionStatus');
|
||||
el.innerHTML = 'Refreshing space info...';
|
||||
api('/api/admin/storage/refresh', {method:'POST'}).then(function(){
|
||||
el.innerHTML = 'Space refreshed';
|
||||
setTimeout(loadCleanupPage, 2000);
|
||||
}).catch(function(e){
|
||||
el.innerHTML = 'Refresh failed: '+(e.message||'network error');
|
||||
});
|
||||
}
|
||||
|
||||
function runFullCleanup(){
|
||||
var el = document.getElementById('actionStatus');
|
||||
el.innerHTML = 'Running full cleanup...';
|
||||
api('/api/admin/cleanup/run', {method:'POST'}).then(function(r){
|
||||
el.innerHTML = (r.message||'Cleanup done');
|
||||
setTimeout(loadCleanupPage, 2000);
|
||||
}).catch(function(e){
|
||||
el.innerHTML = 'Cleanup failed: '+(e.message||'network error');
|
||||
});
|
||||
}
|
||||
|
||||
function runEmptyTrash(){
|
||||
var el = document.getElementById('actionStatus');
|
||||
if(!confirm('Empty all trash? This cannot be undone.')) return;
|
||||
el.innerHTML = 'Emptying trash...';
|
||||
api('/api/admin/cleanup/empty-trash', {method:'POST'}).then(function(r){
|
||||
el.innerHTML = r.emptied ? 'Trash emptied' : (r.message||'Done');
|
||||
}).catch(function(e){
|
||||
el.innerHTML = 'Failed: '+(e.message||'network error');
|
||||
});
|
||||
}
|
||||
|
||||
function saveCleanupConfig(){
|
||||
var entries = [];
|
||||
document.querySelectorAll('.cleanupCfg').forEach(function(el){
|
||||
var key = el.dataset.key;
|
||||
var val = el.type==='checkbox' ? (el.checked?'true':'false') : el.value.trim();
|
||||
entries.push({key:key, value:val});
|
||||
});
|
||||
api('/api/admin/system-configs', {
|
||||
method:'PUT', headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({entries:entries})
|
||||
}).then(function(){
|
||||
toast('Config saved');
|
||||
}).catch(function(e){
|
||||
toast('Save failed: '+(e.message||''));
|
||||
});
|
||||
}
|
||||
39
source_clean/frontend.bak.old/admin/js/admin-core.js
Normal file
39
source_clean/frontend.bak.old/admin/js/admin-core.js
Normal file
@@ -0,0 +1,39 @@
|
||||
var TOKEN = localStorage.getItem('admin_token') || '';
|
||||
var TITLES = {dashboard:'仪表盘','sys-site':'网站设置','sys-services':'外部服务','sys-manage':'服务管理','sys-strategy':'性能配置','sys-password':'修改密码','cloud-config':'网盘设置',cleanup:'存储清理'};
|
||||
|
||||
function api(path, opts){
|
||||
opts = opts || {};
|
||||
opts.headers = opts.headers || {};
|
||||
if(TOKEN) opts.headers['Authorization'] = 'Bearer ' + TOKEN;
|
||||
return fetch(path, opts).then(function(r){
|
||||
if(r.status === 401){ localStorage.removeItem('admin_token'); location.reload(); throw new Error('unauth'); }
|
||||
return r.json();
|
||||
});
|
||||
}
|
||||
|
||||
function toast(msg, type){
|
||||
type = type || 'success';
|
||||
var t = document.createElement('div'); t.className = 'toast toast-'+type; t.textContent = msg;
|
||||
document.body.appendChild(t);
|
||||
setTimeout(function(){ t.remove(); }, 2500);
|
||||
}
|
||||
|
||||
document.querySelectorAll('.nav-item').forEach(function(el){
|
||||
el.onclick = function(){ nav(this.dataset.page); };
|
||||
});
|
||||
|
||||
function nav(page){
|
||||
document.querySelectorAll('.nav-item').forEach(function(e){ e.classList.remove('active'); });
|
||||
var target = document.querySelector('[data-page="'+page+'"]');
|
||||
if(target) target.classList.add('active');
|
||||
document.getElementById('pageTitle').textContent = TITLES[page] || page;
|
||||
var c = document.getElementById('content');
|
||||
c.innerHTML = '<div class="loading">加载中...</div>';
|
||||
try{ window['page_'+page.replace(/-/g,'_')](c); }
|
||||
catch(e){ c.innerHTML = '<div class="card"><p>加载出错: '+e.message+'</p></div>'; }
|
||||
}
|
||||
|
||||
function logout(){
|
||||
localStorage.removeItem('admin_token');
|
||||
location.reload();
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
function page_dashboard(c){
|
||||
api('/api/admin/services').then(function(d){
|
||||
var h = '<div class="card"><div class="card-title">系统概览</div>'+
|
||||
'<div class="stats-grid">'+
|
||||
'<div class="stat-card"><div class="stat-value">'+(d.length||0)+'</div><div class="stat-label">服务数</div></div>'+
|
||||
'</div></div>';
|
||||
c.innerHTML = h;
|
||||
}).catch(function(){ c.innerHTML = '<div class="card">加载失败</div>'; });
|
||||
}
|
||||
1
source_clean/frontend.bak.old/admin/js/admin-helpers.js
Normal file
1
source_clean/frontend.bak.old/admin/js/admin-helpers.js
Normal file
@@ -0,0 +1 @@
|
||||
// Helper utilities
|
||||
14
source_clean/frontend.bak.old/admin/js/admin-login.js
Normal file
14
source_clean/frontend.bak.old/admin/js/admin-login.js
Normal file
@@ -0,0 +1,14 @@
|
||||
function page_login(c){
|
||||
c.innerHTML = '<div style="max-width:400px;margin:60px auto"><div class="card"><div class="card-title">管理后台登录</div>'+
|
||||
'<div class="form-group"><label>密码</label><input id="pwd" class="form-control" type="password" onkeydown="if(event.key===\'Enter\')doLogin()"></div>'+
|
||||
'<button class="btn btn-pri" onclick="doLogin()">登录</button></div></div>';
|
||||
}
|
||||
|
||||
function doLogin(){
|
||||
var pwd = document.getElementById('pwd').value;
|
||||
api('/api/admin/login', {method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:pwd})})
|
||||
.then(function(d){
|
||||
if(d.token){ localStorage.setItem('admin_token', d.token); TOKEN = d.token; nav('dashboard'); }
|
||||
else{ toast(d.error||'密码错误','error'); }
|
||||
});
|
||||
}
|
||||
13
source_clean/frontend.bak.old/admin/js/admin-password.js
Normal file
13
source_clean/frontend.bak.old/admin/js/admin-password.js
Normal file
@@ -0,0 +1,13 @@
|
||||
function page_sys_password(c){
|
||||
c.innerHTML = '<div class="card"><div class="card-title">修改密码</div>'+
|
||||
'<div class="form-group"><label>当前密码</label><input id="oldPwd" class="form-control" type="password"></div>'+
|
||||
'<div class="form-group"><label>新密码</label><input id="newPwd" class="form-control" type="password"></div>'+
|
||||
'<button class="btn btn-pri" onclick="changePwd()">修改</button></div>';
|
||||
}
|
||||
function changePwd(){
|
||||
api('/api/admin/change-password', {method:'POST',headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({old:document.getElementById('oldPwd').value,new:document.getElementById('newPwd').value})})
|
||||
.then(function(d){ toast(d.error||'密码修改成功', d.error?'error':'success'); });
|
||||
}
|
||||
function page_sys_manage(c){ page_sys_services(c); }
|
||||
function page_sys_strategy(c){ c.innerHTML = '<div class="card">性能配置页面</div>'; }
|
||||
10
source_clean/frontend.bak.old/admin/js/admin-services.js
Normal file
10
source_clean/frontend.bak.old/admin/js/admin-services.js
Normal file
@@ -0,0 +1,10 @@
|
||||
function page_sys_services(c){
|
||||
api('/api/admin/services').then(function(d){
|
||||
var h = '<div class="card"><div class="card-title">外部服务</div>';
|
||||
(d||[]).forEach(function(s){
|
||||
h += '<div class="service-card"><div class="service-info"><span class="name">'+s.name+'</span><span class="desc">'+s.url+'</span></div>'+
|
||||
'<div class="service-actions"><span class="status-dot '+(s.enabled?'status-running':'status-stopped')+'"></span>'+(s.enabled?'运行中':'已停止')+'</div></div>';
|
||||
});
|
||||
c.innerHTML = h+'</div>';
|
||||
});
|
||||
}
|
||||
14
source_clean/frontend.bak.old/admin/js/admin-site.js
Normal file
14
source_clean/frontend.bak.old/admin/js/admin-site.js
Normal file
@@ -0,0 +1,14 @@
|
||||
function page_sys_site(c){
|
||||
api('/api/admin/system-configs').then(function(d){
|
||||
var h = '<div class="card"><div class="card-title">网站设置</div>';
|
||||
h += '<div class="form-group"><label>网站名称</label><input id="site_name" class="form-control" value="'+(d.site_name||'')+'"></div>';
|
||||
h += '<button class="btn btn-pri" onclick="saveSite()">保存</button></div>';
|
||||
c.innerHTML = h;
|
||||
});
|
||||
}
|
||||
function saveSite(){
|
||||
var name = document.getElementById('site_name').value;
|
||||
api('/api/admin/system-configs', {method:'PUT',headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({entries:[{key:'site_name',value:name}]})})
|
||||
.then(function(d){ toast(d.error||'保存成功', d.error?'error':'success'); });
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
function togCloudType(type, cb){
|
||||
__cloudToggles[type] = cb.checked;
|
||||
api('/api/admin/system-configs', {
|
||||
method:'PUT', headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({entries:[{key:'cloud_type_'+type+'_enabled', value:cb.checked?'true':'false'}]})
|
||||
});
|
||||
}
|
||||
|
||||
function togCloudAcc(id, cb){
|
||||
api('/api/admin/cloud-configs/'+id, {method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({is_active:cb.checked})})
|
||||
.then(function(d){ if(d.error){ cb.checked=!cb.checked; toast(d.error,'error'); } });
|
||||
}
|
||||
function delCloudAcc(id){ var name = '账号#'+id;
|
||||
if(!confirm('确定删除 '+name+' 吗?')) return;
|
||||
api('/api/admin/cloud-configs/'+id, {method:'DELETE'}).then(function(d){
|
||||
toast(d.error?d.error:'已删除 '+name, d.error?'error':'success');
|
||||
nav('cloud-config');
|
||||
});
|
||||
}
|
||||
function doSaveAccount(){
|
||||
var body = {
|
||||
cloud_type: document.getElementById('dlg_type').value,
|
||||
// default off, will be set by manual toggle
|
||||
};
|
||||
var cookie = document.getElementById('dlg_cookie').value.trim();
|
||||
if(!cookie){ toast('请先输入或扫码获取 Cookie','error'); return; }
|
||||
body.cookie = cookie;
|
||||
body.promotion_account = document.getElementById('dlg_promo').value.trim() || '';
|
||||
body.nickname = document.getElementById('dlg_nick').value.trim() || '';
|
||||
body.storage_used = __qrStorageUsed || '';
|
||||
body.storage_total = __qrStorageTotal || '';
|
||||
toast('⏳ 正在保存...');
|
||||
api('/api/admin/cloud-configs', {
|
||||
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(body)
|
||||
}).then(function(d){
|
||||
if(d && d.error){ toast(d.error,'error'); return; }
|
||||
var savedId = d.id;
|
||||
toast('⏳ 正在验证 Cookie 并查询空间...');
|
||||
return api('/api/admin/cloud-configs/'+body.cloud_type+'/test', {
|
||||
method:'POST', headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({id: savedId})
|
||||
});
|
||||
}).then(function(r){
|
||||
if(r && r.success){
|
||||
toast('✅ 验证通过!空间: '+(r.storage_used||'?')+'/'+(r.storage_total||'?'));
|
||||
} else {
|
||||
toast('⚠️ 已保存但验证失败: '+(r?r.message:'未知错误'),'error');
|
||||
}
|
||||
closeDialog();
|
||||
nav('cloud-config');
|
||||
}).catch(function(e){
|
||||
toast('保存失败: '+(e.message||'网络错误'),'error');
|
||||
console.error('doSaveAccount error:', e);
|
||||
});
|
||||
}
|
||||
|
||||
function doSaveAccount_OLD(){
|
||||
var body = {
|
||||
cloud_type: document.getElementById('dlg_type').value,
|
||||
// default off, will be set by verification
|
||||
};
|
||||
var cookie = document.getElementById('dlg_cookie').value.trim();
|
||||
if(!cookie){ toast('请先输入或扫码获取 Cookie','error'); return; }
|
||||
body.cookie = cookie;
|
||||
console.log("SAVE promo raw:", document.getElementById("dlg_promo").value); body.promotion_account = document.getElementById('dlg_promo').value.trim() || '';
|
||||
body.nickname = document.getElementById('dlg_nick').value.trim() || '';
|
||||
body.storage_used = __qrStorageUsed || '';
|
||||
body.storage_total = __qrStorageTotal || '';
|
||||
api('/api/admin/cloud-configs', {
|
||||
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(body)
|
||||
}).then(function(d){
|
||||
if(d && d.error){ toast(d.error,'error'); return; }
|
||||
toast('✅ 网盘配置更新成功');
|
||||
closeDialog();
|
||||
nav('cloud-config');
|
||||
}).catch(function(e){
|
||||
toast('保存失败: '+(e.message||'网络错误'),'error');
|
||||
console.error('doSaveAccount error:', e);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
function togCloudType(type, cb){
|
||||
__cloudToggles[type] = cb.checked;
|
||||
api('/api/admin/system-configs', {
|
||||
method:'PUT', headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({entries:[{key:'cloud_type_'+type+'_enabled', value:cb.checked?'true':'false'}]})
|
||||
});
|
||||
}
|
||||
|
||||
function togCloudAcc(id, cb){
|
||||
api('/api/admin/cloud-configs/'+id, {method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({is_active:cb.checked})})
|
||||
.then(function(d){ if(d.error){ cb.checked=!cb.checked; toast(d.error,'error'); } });
|
||||
}
|
||||
function delCloudAcc(id){ var name = '账号#'+id;
|
||||
if(!confirm('确定删除 '+name+' 吗?')) return;
|
||||
api('/api/admin/cloud-configs/'+id, {method:'DELETE'}).then(function(d){
|
||||
toast(d.error?d.error:'已删除 '+name, d.error?'error':'success');
|
||||
nav('cloud-config');
|
||||
});
|
||||
}
|
||||
function doSaveAccount(){
|
||||
var body = {
|
||||
cloud_type: document.getElementById('dlg_type').value,
|
||||
is_active: true
|
||||
};
|
||||
var cookie = document.getElementById('dlg_cookie').value.trim();
|
||||
if(!cookie){ toast('请先输入或扫码获取 Cookie','error'); return; }
|
||||
body.cookie = cookie;
|
||||
console.log("SAVE promo raw:", document.getElementById("dlg_promo").value); body.promotion_account = document.getElementById('dlg_promo').value.trim() || '';
|
||||
body.nickname = document.getElementById('dlg_nick').value.trim() || '';
|
||||
body.storage_used = __qrStorageUsed || '';
|
||||
body.storage_total = __qrStorageTotal || '';
|
||||
api('/api/admin/cloud-configs', {
|
||||
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(body)
|
||||
}).then(function(d){
|
||||
if(d && d.error){ toast(d.error,'error'); return; }
|
||||
toast('✅ 网盘配置更新成功');
|
||||
closeDialog();
|
||||
nav('cloud-config');
|
||||
}).catch(function(e){
|
||||
toast('保存失败: '+(e.message||'网络错误'),'error');
|
||||
console.error('doSaveAccount error:', e);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
function togCloudType(type, cb){
|
||||
__cloudToggles[type] = cb.checked;
|
||||
api('/api/admin/system-configs', {
|
||||
method:'PUT', headers:{'Content-Type':'application/json'},
|
||||
body:JSON.stringify({entries:[{key:'cloud_type_'+type+'_enabled', value:cb.checked?'true':'false'}]})
|
||||
});
|
||||
}
|
||||
|
||||
function togCloudAcc(id, cb){
|
||||
api('/api/admin/cloud-configs/'+id, {method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({is_active:cb.checked})})
|
||||
.then(function(d){ if(d.error){ cb.checked=!cb.checked; toast(d.error,'error'); } });
|
||||
}
|
||||
function delCloudAcc(id){ var name = '账号#'+id;
|
||||
if(!confirm('确定删除 '+name+' 吗?')) return;
|
||||
api('/api/admin/cloud-configs/'+id, {method:'DELETE'}).then(function(d){
|
||||
toast(d.error?d.error:'已删除 '+name, d.error?'error':'success');
|
||||
nav('cloud-config');
|
||||
});
|
||||
}
|
||||
function doSaveAccount(){
|
||||
var body = {
|
||||
cloud_type: document.getElementById('dlg_type').value,
|
||||
// default off, will be set by verification
|
||||
};
|
||||
var cookie = document.getElementById('dlg_cookie').value.trim();
|
||||
if(!cookie){ toast('请先输入或扫码获取 Cookie','error'); return; }
|
||||
body.cookie = cookie;
|
||||
console.log("SAVE promo raw:", document.getElementById("dlg_promo").value); body.promotion_account = document.getElementById('dlg_promo').value.trim() || '';
|
||||
body.nickname = document.getElementById('dlg_nick').value.trim() || '';
|
||||
body.storage_used = __qrStorageUsed || '';
|
||||
body.storage_total = __qrStorageTotal || '';
|
||||
api('/api/admin/cloud-configs', {
|
||||
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(body)
|
||||
}).then(function(d){
|
||||
if(d && d.error){ toast(d.error,'error'); return; }
|
||||
toast('✅ 网盘配置更新成功');
|
||||
closeDialog();
|
||||
nav('cloud-config');
|
||||
}).catch(function(e){
|
||||
toast('保存失败: '+(e.message||'网络错误'),'error');
|
||||
console.error('doSaveAccount error:', e);
|
||||
});
|
||||
}
|
||||
38
source_clean/frontend.bak.old/admin/js/cloud/cloud-core.js
Normal file
38
source_clean/frontend.bak.old/admin/js/cloud/cloud-core.js
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
// --- Cloud Config ---
|
||||
var CLOUD_TYPES = [
|
||||
{type:'quark',label:'夸克网盘',icon:'/admin/icons/quark.png'},
|
||||
{type:'baidu',label:'百度网盘',icon:'/admin/icons/baidu.png'},
|
||||
{type:'aliyun',label:'阿里云盘',icon:'/admin/icons/aliyun.png'},
|
||||
{type:'115',label:'115网盘',icon:'/admin/icons/115.png'},
|
||||
{type:'tianyi',label:'天翼云盘',icon:'/admin/icons/tianyi.png'},
|
||||
{type:'123pan',label:'123云盘',icon:'/admin/icons/123pan.png'},
|
||||
{type:'uc',label:'UC网盘',icon:'/admin/icons/uc.png'},
|
||||
{type:'xunlei',label:'迅雷网盘',icon:'/admin/icons/xunlei.png'},
|
||||
{type:'pikpak',label:'PikPak',icon:'/admin/icons/pikpak.png'},
|
||||
{type:'magnet',label:'磁力链接',icon:'🧲'},
|
||||
{type:'ed2k',label:'电驴链接',icon:'🔗'},
|
||||
{type:'others',label:'其他',icon:'⬜'}
|
||||
];
|
||||
var QR_TYPES = ['quark','baidu'];
|
||||
var __cloudToggles = {};
|
||||
var __qrType = '', __qrSession = '', __qrCookie = '', __qrTimer = null;
|
||||
|
||||
function page_cloud_config(c){
|
||||
c.innerHTML = '<div class="loading">加载中...</div>';
|
||||
Promise.all([
|
||||
api('/api/admin/system-configs').catch(function(e){ console.error(e); return {}; }),
|
||||
api('/api/admin/cloud-configs').catch(function(e){ console.error(e); return []; })
|
||||
]).then(function(res){
|
||||
var d = res[0]||{}, accounts = res[1]||[];
|
||||
__cloudToggles = {};
|
||||
CLOUD_TYPES.forEach(function(ct){
|
||||
var v = d['cloud_type_'+ct.type+'_enabled'];
|
||||
__cloudToggles[ct.type] = v===undefined ? (ct.type!=='others') : (v==='true'||v==='1');
|
||||
});
|
||||
renderCloudPage(c, accounts);
|
||||
}).catch(function(e){
|
||||
c.innerHTML = '<div class="card"><p style="color:var(--danger)">加载失败: '+e.message+'</p></div>';
|
||||
});
|
||||
}
|
||||
|
||||
107
source_clean/frontend.bak.old/admin/js/cloud/cloud-dialog.js
Normal file
107
source_clean/frontend.bak.old/admin/js/cloud/cloud-dialog.js
Normal file
@@ -0,0 +1,107 @@
|
||||
var __qrSession = '';
|
||||
var __qrCookie = '';
|
||||
var __qrType = '';
|
||||
var __qrTimer = null;
|
||||
var __qrNickname = '';
|
||||
var __qrStorageUsed = '';
|
||||
var __qrStorageTotal = '';
|
||||
var QR_TYPES = ['quark','baidu'];
|
||||
|
||||
function openAddDialog(){
|
||||
document.getElementById('dlg_type').value = 'quark';
|
||||
document.getElementById('dlg_cookie').value = '';
|
||||
document.getElementById('dlg_promo').value = '';
|
||||
document.getElementById('dlg_nick').value = '';
|
||||
document.getElementById('dlg_storage_info').textContent = '扫码后自动获取';
|
||||
resetQR();
|
||||
onDlgTypeChange();
|
||||
document.getElementById('modalBg').style.display = 'flex';
|
||||
}
|
||||
|
||||
function closeDialog(){
|
||||
cancelQRPoll();
|
||||
document.getElementById('modalBg').style.display = 'none';
|
||||
}
|
||||
|
||||
function onDlgTypeChange(){
|
||||
var t = document.getElementById('dlg_type').value;
|
||||
document.getElementById('dlg_qr_section').style.display = (QR_TYPES.indexOf(t)!==-1) ? 'block' : 'none';
|
||||
}
|
||||
|
||||
function resetQR(){
|
||||
cancelQRPoll();
|
||||
__qrSession = ''; __qrCookie = ''; __qrNickname = ''; __qrStorageUsed = ''; __qrStorageTotal = '';
|
||||
document.getElementById('dlg_qr_status').textContent = '点击下方按钮生成扫码链接';
|
||||
document.getElementById('dlg_qr_btn').disabled = false;
|
||||
document.getElementById('dlg_qr_btn').textContent = '生成扫码链接';
|
||||
document.getElementById('dlg_qr_btn').style.display = '';
|
||||
document.getElementById('dlg_qr_hint').textContent = '';
|
||||
}
|
||||
|
||||
function doStartQR(){
|
||||
__qrType = document.getElementById('dlg_type').value;
|
||||
document.getElementById('dlg_qr_btn').disabled = true;
|
||||
document.getElementById('dlg_qr_btn').textContent = '生成中...';
|
||||
document.getElementById('dlg_qr_status').textContent = '正在生成二维码...';
|
||||
api('/api/admin/'+__qrType+'/qr-login/start', {method:'POST'}).then(function(d){
|
||||
if(d.error){
|
||||
document.getElementById('dlg_qr_status').innerHTML = '<span style="color:var(--danger)">❌ '+d.error+'</span>';
|
||||
document.getElementById('dlg_qr_btn').disabled=false;
|
||||
document.getElementById('dlg_qr_btn').textContent='重试';
|
||||
return;
|
||||
}
|
||||
__qrSession = d.sessionId;
|
||||
var url = d.qrUrl||d.url||'';
|
||||
if(url){
|
||||
var qrSrc = 'https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=' + encodeURIComponent(url);
|
||||
document.getElementById('dlg_qr_status').innerHTML = '<img src="'+qrSrc+'" style="max-width:200px;max-height:200px;border:1px solid var(--border);border-radius:4px;display:block;margin:0 auto"><p style="font-size:11px;color:var(--sub);margin-top:6px;text-align:center">用对应 App 扫码并在手机上确认登录</p>';
|
||||
}
|
||||
document.getElementById('dlg_qr_hint').textContent = '等待扫码确认...';
|
||||
document.getElementById('dlg_qr_btn').textContent = '重新生成';
|
||||
document.getElementById('dlg_qr_btn').disabled = false;
|
||||
pollQR();
|
||||
});
|
||||
}
|
||||
|
||||
function pollQR(){
|
||||
if(!__qrSession) return;
|
||||
__qrTimer = setTimeout(function(){
|
||||
api('/api/admin/'+__qrType+'/qr-login/'+__qrSession+'/status').then(function(d){
|
||||
if(d.status==='logged_in'){
|
||||
__qrCookie = d.cookie||'';
|
||||
__qrNickname = d.nickname||'';
|
||||
__qrStorageUsed = d.storage_used||'';
|
||||
__qrStorageTotal = d.storage_total||'';
|
||||
if(__qrNickname){ var n = document.getElementById('dlg_nick'); if(!n.value.trim()) n.value = __qrNickname; }
|
||||
if(d.promotion_account){ var p = document.getElementById('dlg_promo'); if(!p.value.trim()) p.value = d.promotion_account; }
|
||||
var si = document.getElementById('dlg_storage_info');
|
||||
if(__qrStorageTotal){
|
||||
si.textContent = '💾 ' + (__qrStorageUsed||'?') + ' / ' + __qrStorageTotal;
|
||||
si.style.color = 'var(--success)';
|
||||
} else { si.textContent = '空间信息未获取'; si.style.color = 'var(--sub)'; }
|
||||
if(d.autoUpdated){
|
||||
document.getElementById('dlg_qr_status').innerHTML = '<span style="color:var(--success);font-size:14px">✅ 扫码成功!已自动更新现有账号 #'+d.updatedConfigId+'</span>';
|
||||
cancelQRPoll();
|
||||
toast('✅ 已自动更新账号','success');
|
||||
setTimeout(function(){ closeDialog(); nav('cloud-config'); }, 1000);
|
||||
return;
|
||||
}
|
||||
document.getElementById('dlg_qr_hint').textContent = '✅ 登录成功!';
|
||||
document.getElementById('dlg_qr_status').innerHTML = '<span style="color:var(--success);font-size:14px">✅ 扫码成功!已自动填入</span>';
|
||||
document.getElementById('dlg_cookie').value = __qrCookie;
|
||||
document.getElementById('dlg_qr_btn').style.display = 'none';
|
||||
cancelQRPoll();
|
||||
}else if(d.status==='expired'){
|
||||
cancelQRPoll();
|
||||
setTimeout(function(){ doStartQR(); }, 500);
|
||||
}else{
|
||||
pollQR();
|
||||
}
|
||||
}).catch(function(){ pollQR(); });
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
function cancelQRPoll(){
|
||||
if(__qrTimer){ clearTimeout(__qrTimer); __qrTimer = null; }
|
||||
if(__qrSession){ api('/api/admin/'+__qrType+'/qr-login/'+__qrSession+'/cancel', {method:'POST'}).catch(function(){}); __qrSession=''; }
|
||||
}
|
||||
92
source_clean/frontend.bak.old/admin/js/cloud/cloud-render.js
Normal file
92
source_clean/frontend.bak.old/admin/js/cloud/cloud-render.js
Normal file
@@ -0,0 +1,92 @@
|
||||
function renderCloudPage(c, accounts){
|
||||
accounts = accounts || [];
|
||||
var h = '';
|
||||
|
||||
// Render icon: URL → <img>, emoji/text → plain text
|
||||
function iconHtml(icon, size){
|
||||
if(!icon) return '';
|
||||
if(icon.indexOf('/')===0 || icon.indexOf('http')===0){
|
||||
return '<img src="'+icon+'" style="width:'+size+'px;height:'+size+'px;vertical-align:middle;margin-right:4px" onerror="this.remove()">';
|
||||
}
|
||||
return '<span style="font-size:'+(size-2)+'px;vertical-align:middle;margin-right:4px">'+icon+'</span>';
|
||||
}
|
||||
|
||||
// Toggle grid
|
||||
h += '<div class="card"><div class="card-title">⚡ 搜索网盘类型控制</div>'+
|
||||
'<p style="color:var(--sub);font-size:12px;margin-bottom:14px">控制搜索引擎检索哪些网盘类型的资源</p>'+
|
||||
'<div class="stats-grid" style="grid-template-columns:repeat(auto-fill,minmax(170px,1fr))">';
|
||||
CLOUD_TYPES.forEach(function(ct){
|
||||
var on = __cloudToggles[ct.type];
|
||||
h += '<div class="stat-card" style="padding:8px 12px;display:flex;align-items:center;justify-content:space-between">'+
|
||||
'<span>'+iconHtml(ct.icon,20)+' <span style="font-size:12px">'+ct.label+'</span></span>'+
|
||||
'<label class="toggle"><input type="checkbox" '+(on?'checked':'')+' onchange="togCloudType(\''+ct.type+'\',this)"><span class="toggle-slider"></span></label>'+
|
||||
'</div>';
|
||||
});
|
||||
h += '</div></div>';
|
||||
|
||||
// Account list — table style
|
||||
if(accounts.length > 0){
|
||||
h += '<div class="card"><div class="card-title">📋 已有账号 ('+accounts.length+') <button class="btn btn-pri btn-sm" onclick="openAddDialog()" style="margin-left:12px">➕ 新增</button></div>';
|
||||
h += '<div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;font-size:13px">';
|
||||
h += '<thead><tr style="background:var(--bg);border-bottom:2px solid var(--border);text-align:left">'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">📱推广平台</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">推广平台账号</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">网盘昵称</th>'+'<th style="padding:10px 12px;white-space:nowrap">网盘UID</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">验证</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">空间</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">转存</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">操作</th>'+
|
||||
'</tr></thead><tbody>';
|
||||
accounts.forEach(function(cfg){
|
||||
var label = CLOUD_TYPES.find(function(ct){ return ct.type===cfg.cloud_type; });
|
||||
var icon = (label||{}).icon||'⬜';
|
||||
var active = cfg.is_active===1||cfg.is_active===true;
|
||||
var ck = cfg.verification_status==='valid'?'✅':(cfg.verification_status==='invalid'?'❌':'⏳');
|
||||
h += '<tr style="border-bottom:1px solid var(--border)">'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+iconHtml(icon,18)+(label||{}).label+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+(cfg.promotion_account||'—')+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+(cfg.nickname||cfg.cloud_type)+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap;font-size:12px;color:var(--sub)">'+(cfg.cookie_uid||cfg.cloud_type)+'</td>'+
|
||||
'<td style="padding:10px 12px">'+ck+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap;font-size:12px;color:var(--sub)">'+(cfg.storage_used||cfg.storage_total?'💾 '+(cfg.storage_used||'?')+'/'+(cfg.storage_total||'?'):'—')+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap;font-size:12px;color:var(--sub)">'+(cfg.total_saves?'转存'+cfg.total_saves+'次':'—')+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+
|
||||
'<label class="toggle"><input type="checkbox" '+(active?'checked':'')+' onchange="togCloudAcc('+cfg.id+',this)"><span class="toggle-slider"></span></label>'+
|
||||
'<button class="btn btn-danger btn-sm" onclick="delCloudAcc('+cfg.id+')" style="margin-left:8px">🗑</button>'+
|
||||
'</td>'+
|
||||
'</tr>';
|
||||
});
|
||||
h += '</tbody></table></div></div>';
|
||||
}
|
||||
// No accounts yet — show add button
|
||||
if(accounts.length === 0){
|
||||
h += '<div class="card"><div class="card-title">📋 已有账号 (0)</div><p style="color:var(--sub);font-size:13px;margin-bottom:12px">还没有添加任何网盘账号</p><button class="btn btn-pri" onclick="openAddDialog()">➕ 新增网盘</button></div>';
|
||||
}
|
||||
|
||||
// Modal dialog
|
||||
h += '<div id="modalBg" style="display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);z-index:100;align-items:center;justify-content:center" onclick="if(event.target===this)closeDialog()">'+
|
||||
'<div class="card" style="width:500px;max-width:95vw;max-height:90vh;overflow-y:auto" onclick="event.stopPropagation()">'+
|
||||
'<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">'+
|
||||
'<span style="font-weight:600;font-size:15px">新增网盘账号</span>'+
|
||||
'<button class="btn btn-outline btn-sm" onclick="closeDialog()">✕</button></div>'+
|
||||
'<div class="form-group"><label>网盘类型</label><select id="dlg_type" class="form-control" style="max-width:200px" onchange="onDlgTypeChange()">';
|
||||
CLOUD_TYPES.forEach(function(ct){ h+='<option value="'+ct.type+'">'+ct.label+'</option>'; });
|
||||
h+='</select></div>'+
|
||||
'<div class="form-group"><label>推广平台账号</label><input id="dlg_promo" class="form-control" placeholder="平台注册所用手机号" style="max-width:250px"></div>'+
|
||||
'<div class="form-group"><label>Cookie</label><textarea id="dlg_cookie" class="form-control wide" rows="5" placeholder="粘贴 Cookie 或通过下方扫码获取"></textarea></div>'+
|
||||
'<div class="form-group"><label>网盘昵称</label><input id="dlg_nick" class="form-control" placeholder="扫码后自动获取" style="max-width:250px;background:#f5f6fa" readonly></div>'+
|
||||
'<div class="form-group"><label>空间信息</label><span id="dlg_storage_info" style="font-size:13px;color:var(--sub);padding-top:6px">扫码后自动获取</span></div>'+
|
||||
'<div id="dlg_qr_section" style="margin-top:12px;padding:12px;background:#f9fafb;border-radius:8px">'+
|
||||
'<p style="font-size:12px;font-weight:600;margin-bottom:8px">📱 扫码获取 Cookie(仅夸克/百度)</p>'+
|
||||
'<div id="dlg_qr_status" style="font-size:12px;color:var(--sub);margin-bottom:8px">点击下方按钮生成扫码链接</div>'+
|
||||
''+
|
||||
'<div style="margin-top:8px;display:flex;gap:8px;align-items:center">'+
|
||||
'<button class="btn btn-pri btn-sm" id="dlg_qr_btn" onclick="doStartQR()">生成扫码链接</button>'+
|
||||
'<span id="dlg_qr_hint" style="font-size:11px;color:var(--sub)"></span></div></div>'+
|
||||
'<div style="margin-top:16px;display:flex;gap:8px">'+
|
||||
'<button class="btn btn-pri" onclick="doSaveAccount()">💾 保存账号</button>'+
|
||||
'<button class="btn btn-outline" onclick="closeDialog()">取消</button></div></div></div>';
|
||||
|
||||
c.innerHTML = h;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
function renderCloudPage(c, accounts){
|
||||
accounts = accounts || [];
|
||||
var h = '';
|
||||
|
||||
// Render icon: URL → <img>, emoji/text → plain text
|
||||
function iconHtml(icon, size){
|
||||
if(!icon) return '';
|
||||
if(icon.indexOf('/')===0 || icon.indexOf('http')===0){
|
||||
return '<img src="'+icon+'" style="width:'+size+'px;height:'+size+'px;vertical-align:middle;margin-right:4px" onerror="this.remove()">';
|
||||
}
|
||||
return '<span style="font-size:'+(size-2)+'px;vertical-align:middle;margin-right:4px">'+icon+'</span>';
|
||||
}
|
||||
|
||||
// Toggle grid
|
||||
h += '<div class="card"><div class="card-title">⚡ 搜索网盘类型控制</div>'+
|
||||
'<p style="color:var(--sub);font-size:12px;margin-bottom:14px">控制搜索引擎检索哪些网盘类型的资源</p>'+
|
||||
'<div class="stats-grid" style="grid-template-columns:repeat(auto-fill,minmax(170px,1fr))">';
|
||||
CLOUD_TYPES.forEach(function(ct){
|
||||
var on = __cloudToggles[ct.type];
|
||||
h += '<div class="stat-card" style="padding:8px 12px;display:flex;align-items:center;justify-content:space-between">'+
|
||||
'<span>'+iconHtml(ct.icon,20)+' <span style="font-size:12px">'+ct.label+'</span></span>'+
|
||||
'<label class="toggle"><input type="checkbox" '+(on?'checked':'')+' onchange="togCloudType(\''+ct.type+'\',this)"><span class="toggle-slider"></span></label>'+
|
||||
'</div>';
|
||||
});
|
||||
h += '</div></div>';
|
||||
|
||||
// Account list — table style
|
||||
if(accounts.length > 0){
|
||||
h += '<div class="card"><div class="card-title">📋 已有账号 ('+accounts.length+') <button class="btn btn-pri btn-sm" onclick="openAddDialog()" style="margin-left:12px">➕ 新增</button></div>';
|
||||
h += '<div style="overflow-x:auto"><table style="width:100%;border-collapse:collapse;font-size:13px">';
|
||||
h += '<thead><tr style="background:var(--bg);border-bottom:2px solid var(--border);text-align:left">'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">📱推广平台</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">推广平台账号</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">网盘昵称</th>'+'<th style="padding:10px 12px;white-space:nowrap">网盘UID</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">验证</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">空间</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">转存</th>'+
|
||||
'<th style="padding:10px 12px;white-space:nowrap">操作</th>'+
|
||||
'</tr></thead><tbody>';
|
||||
accounts.forEach(function(cfg){
|
||||
var label = CLOUD_TYPES.find(function(ct){ return ct.type===cfg.cloud_type; });
|
||||
var icon = (label||{}).icon||'⬜';
|
||||
var active = cfg.is_active===1||cfg.is_active===true;
|
||||
var ck = cfg.verification_status==='valid'?'✅':(cfg.verification_status==='invalid'?'❌':'—');
|
||||
h += '<tr style="border-bottom:1px solid var(--border)">'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+iconHtml(icon,18)+(label||{}).label+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+(cfg.promotion_account||'—')+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+(cfg.nickname||cfg.cloud_type)+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap;font-size:12px;color:var(--sub)">'+(cfg.cookie_uid||cfg.cloud_type)+'</td>'+
|
||||
'<td style="padding:10px 12px">'+ck+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap;font-size:12px;color:var(--sub)">'+(cfg.storage_used||cfg.storage_total?'💾 '+(cfg.storage_used||'?')+'/'+(cfg.storage_total||'?'):'—')+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap;font-size:12px;color:var(--sub)">'+(cfg.total_saves?'转存'+cfg.total_saves+'次':'—')+'</td>'+
|
||||
'<td style="padding:10px 12px;white-space:nowrap">'+
|
||||
'<label class="toggle"><input type="checkbox" '+(active?'checked':'')+' onchange="togCloudAcc('+cfg.id+',this)"><span class="toggle-slider"></span></label>'+
|
||||
'<button class="btn btn-danger btn-sm" onclick="delCloudAcc('+cfg.id+')" style="margin-left:8px">🗑</button>'+
|
||||
'</td>'+
|
||||
'</tr>';
|
||||
});
|
||||
h += '</tbody></table></div></div>';
|
||||
}
|
||||
// No accounts yet — show add button
|
||||
if(accounts.length === 0){
|
||||
h += '<div class="card"><div class="card-title">📋 已有账号 (0)</div><p style="color:var(--sub);font-size:13px;margin-bottom:12px">还没有添加任何网盘账号</p><button class="btn btn-pri" onclick="openAddDialog()">➕ 新增网盘</button></div>';
|
||||
}
|
||||
|
||||
// Modal dialog
|
||||
h += '<div id="modalBg" style="display:none;position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.4);z-index:100;align-items:center;justify-content:center" onclick="if(event.target===this)closeDialog()">'+
|
||||
'<div class="card" style="width:500px;max-width:95vw;max-height:90vh;overflow-y:auto" onclick="event.stopPropagation()">'+
|
||||
'<div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:12px">'+
|
||||
'<span style="font-weight:600;font-size:15px">新增网盘账号</span>'+
|
||||
'<button class="btn btn-outline btn-sm" onclick="closeDialog()">✕</button></div>'+
|
||||
'<div class="form-group"><label>网盘类型</label><select id="dlg_type" class="form-control" style="max-width:200px" onchange="onDlgTypeChange()">';
|
||||
CLOUD_TYPES.forEach(function(ct){ h+='<option value="'+ct.type+'">'+ct.label+'</option>'; });
|
||||
h+='</select></div>'+
|
||||
'<div class="form-group"><label>推广平台账号</label><input id="dlg_promo" class="form-control" placeholder="平台注册所用手机号" style="max-width:250px"></div>'+
|
||||
'<div class="form-group"><label>Cookie</label><textarea id="dlg_cookie" class="form-control wide" rows="5" placeholder="粘贴 Cookie 或通过下方扫码获取"></textarea></div>'+
|
||||
'<div class="form-group"><label>网盘昵称</label><input id="dlg_nick" class="form-control" placeholder="扫码后自动获取" style="max-width:250px;background:#f5f6fa" readonly></div>'+
|
||||
'<div class="form-group"><label>空间信息</label><span id="dlg_storage_info" style="font-size:13px;color:var(--sub);padding-top:6px">扫码后自动获取</span></div>'+
|
||||
'<div id="dlg_qr_section" style="margin-top:12px;padding:12px;background:#f9fafb;border-radius:8px">'+
|
||||
'<p style="font-size:12px;font-weight:600;margin-bottom:8px">📱 扫码获取 Cookie(仅夸克/百度)</p>'+
|
||||
'<div id="dlg_qr_status" style="font-size:12px;color:var(--sub);margin-bottom:8px">点击下方按钮生成扫码链接</div>'+
|
||||
''+
|
||||
'<div style="margin-top:8px;display:flex;gap:8px;align-items:center">'+
|
||||
'<button class="btn btn-pri btn-sm" id="dlg_qr_btn" onclick="doStartQR()">生成扫码链接</button>'+
|
||||
'<span id="dlg_qr_hint" style="font-size:11px;color:var(--sub)"></span></div></div>'+
|
||||
'<div style="margin-top:16px;display:flex;gap:8px">'+
|
||||
'<button class="btn btn-pri" onclick="doSaveAccount()">💾 保存账号</button>'+
|
||||
'<button class="btn btn-outline" onclick="closeDialog()">取消</button></div></div></div>';
|
||||
|
||||
c.innerHTML = h;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user