server: 平台抽象层+bilibili、服务端加密凭据库、角色中间件;web: 精简页面/路由、macOS 客户端(Swift)与多份方案文档;移除误入库的编译产物

This commit is contained in:
Qiufeng
2026-08-21 10:53:32 +08:00
parent 0daa9782c9
commit 3585c39bab
103 changed files with 5842 additions and 3197 deletions
+28 -15
View File
@@ -13,6 +13,7 @@ document.querySelectorAll('.tab').forEach((tab) => {
// ---- 状态页 ----
let currentServer = '';
let currentWeb = 'http://127.0.0.1:3003';
async function refreshStatus() {
try {
const s = await window.api.status();
@@ -33,7 +34,7 @@ setInterval(refreshStatus, 3000);
refreshStatus();
$('btn-open-web').addEventListener('click', () => {
const url = currentServer || 'http://127.0.0.1:8090';
const url = currentWeb || currentServer || 'http://127.0.0.1:3003';
window.api.openWeb(url);
});
$('btn-open-data').addEventListener('click', () => window.api.openDataDir());
@@ -66,35 +67,42 @@ $('btn-pair').addEventListener('click', async () => {
// ---- 挑战页 ----
let selectedChallenge = null;
let pollTimer = null;
let knownChallengeIds = new Set();
const KIND_LABEL = { qr: '扫码', sms: '短信验证码', confirm: 'APP 确认', captcha: '图形验证码', pending: '等待设备' };
async function refreshChallenges() {
try {
const r = await window.api.challenges();
const list = (r && r.list) || [];
const fresh = list.filter((ch) => ch.challengeId && !knownChallengeIds.has(ch.challengeId));
if (fresh.length && knownChallengeIds.size > 0 && window.api.notify) {
window.api.notify('EveryPublish 需要处理挑战', fresh.map((ch) => ch.platform || '平台').join('、') + ' 有新的扫码或验证码任务');
}
knownChallengeIds = new Set(list.map((ch) => ch.challengeId).filter(Boolean));
const badge = $('ch-badge');
if (list.length > 0) { badge.textContent = list.length; badge.classList.remove('hidden'); }
else badge.classList.add('hidden');
const box = $('ch-list');
box.innerHTML = '';
box.replaceChildren();
list.forEach((ch) => {
const div = document.createElement('div');
div.className = 'item' + (selectedChallenge && selectedChallenge.challengeId === ch.challengeId ? ' selected' : '');
const inner = [
'<span><b>',
ch.platform || '?',
'</b> · ',
KIND_LABEL[ch.kind] || ch.kind,
'</span><span class="p">',
ch.prompt || '',
'</span>',
].join('');
div.innerHTML = inner;
const label = document.createElement('span');
const platform = document.createElement('b');
platform.textContent = ch.platform || '?';
label.append(platform, document.createTextNode(' · ' + (KIND_LABEL[ch.kind] || ch.kind)));
const prompt = document.createElement('span');
prompt.className = 'p';
prompt.textContent = ch.prompt || '';
div.append(label, prompt);
div.addEventListener('click', () => selectChallenge(ch));
box.appendChild(div);
});
if (!list.length) {
box.innerHTML = '<p class="hint">暂无待处理挑战</p>';
const empty = document.createElement('p');
empty.className = 'hint';
empty.textContent = '暂无待处理挑战';
box.appendChild(empty);
}
} catch (e) { /* 忽略 */ }
}
@@ -149,7 +157,9 @@ startPolling();
async function loadSettings() {
try {
const cfg = await window.api.getConfig();
$('set-server').value = (cfg && cfg.server) || '';
$('set-server').value = (cfg && cfg.server) || 'http://127.0.0.1:8090';
$('set-web').value = (cfg && cfg.webUrl) || 'http://127.0.0.1:3003';
currentWeb = $('set-web').value;
$('set-fake').checked = !!(cfg && cfg.fakeAll);
$('set-autostart').checked = await window.api.getAutoStart();
} catch (e) { /* 忽略 */ }
@@ -158,12 +168,15 @@ loadSettings();
$('btn-save').addEventListener('click', async () => {
const server = $('set-server').value.trim();
const webUrl = $('set-web').value.trim();
const res = $('set-result');
if (!server) { res.textContent = '请填写服务器地址(内网部署填 http://服务器IP:8090)'; res.className = 'msg err'; return; }
const cfg = { server: server, fakeAll: $('set-fake').checked };
if (!webUrl) { res.textContent = '请填写网站地址'; res.className = 'msg err'; return; }
const cfg = { server: server, webUrl: webUrl, fakeAll: $('set-fake').checked };
await window.api.saveConfig(cfg);
await window.api.setAutoStart($('set-autostart').checked);
currentServer = server;
currentWeb = webUrl;
res.textContent = '已保存,核心进程已重启';
res.className = 'msg ok';
});