From 58324a57aa9c18eddbddb64024123bcd0cdb2ed8 Mon Sep 17 00:00:00 2001 From: xiaoou Date: Fri, 10 Jul 2026 13:17:42 +0800 Subject: [PATCH] =?UTF-8?q?Welcome:=20=E5=B7=B2=E6=9C=89=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E2=86=92=E7=99=BB=E5=BD=95,=20=E6=97=A0=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E2=86=92=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- welcome.html | 71 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/welcome.html b/welcome.html index 8bac03a..3410465 100644 --- a/welcome.html +++ b/welcome.html @@ -58,7 +58,16 @@ input:focus { border-color: #FF6B8A; }
- + +
+

管理员账户已存在,请登录

+ + + +
+
+ +
系统状态 @@ -109,12 +118,13 @@ async function init() { if (!r.ok) { show('step-loading'); document.querySelector('#step-loading .msg').textContent = '系统未就绪,请稍后刷新'; return; } var steps = await r.json(); var allDone = steps.every(function(s) { return s.done; }); - if (allDone) { - // 已有用户,需要登录 — 但 trusted_networks 不可用 - // 暂时降级:引导重新创建 + var userDone = steps.some(function(s) { return s.step === 'user' && s.done; }); + if (!userDone) { show('step-create'); + } else if (!allDone) { + show('step-login'); } else { - show('step-create'); + show('step-login'); } } catch(e) { show('step-loading'); @@ -122,6 +132,57 @@ async function init() { } } +async function loginUser() { + var p = document.getElementById('login-password').value; + var msg = document.getElementById('login-msg'); + if (!p) { msg.className = 'msg error'; msg.textContent = '请输入密码'; return; } + + msg.className = 'msg'; msg.textContent = '正在登录...'; + var btn = document.querySelector('#step-login .btn'); + btn.disabled = true; + + try { + // 通过 login_flow 认证 + var flow = await fetch(API + '/auth/login_flow', { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({client_id: window.location.origin + '/', redirect_uri: window.location.origin + '/', handler: ['homeassistant', null]}) + }); + var fid = (await flow.json()).flow_id; + + var step = await fetch(API + '/auth/login_flow/' + fid, { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({client_id: window.location.origin + '/', username: 'admin', password: p}) + }); + var code = (await step.json()).result; + + var tokenResp = await fetch(API + '/auth/token', { + method: 'POST', + headers: {'Content-Type': 'application/x-www-form-urlencoded'}, + body: 'grant_type=authorization_code&code=' + code + '&client_id=' + window.location.origin + '/' + }); + token = (await tokenResp.json()).access_token; + localStorage.setItem('pxh_token', token); + + // 完成剩余 onboarding steps + var ond = await fetch(API + '/api/onboarding'); + var steps = await ond.json(); + for (var s of steps) { + if (!s.done && s.step !== 'user') { + await api('POST', '/api/onboarding/' + s.step, {}); + } + } + + show('step-dashboard'); + loadDevices(); + } catch(e) { + msg.className = 'msg error'; + msg.textContent = '登录失败: ' + e.message; + btn.disabled = false; + } +} + async function createUser() { var u = document.getElementById('username').value.trim(); var p = document.getElementById('password').value;