0
0

Welcome: 已有用户→登录, 无用户→创建

This commit is contained in:
xiaoou
2026-07-10 13:17:42 +08:00
parent a3eadc7e3a
commit 58324a57aa

View File

@ -58,7 +58,16 @@ input:focus { border-color: #FF6B8A; }
<div id="create-msg" class="msg"></div>
</div>
<!-- Step 3: Dashboard -->
<!-- Step 3: 登录 -->
<div id="step-login" class="step">
<p style="text-align:center;color:#666;font-size:14px;margin-bottom:16px;">管理员账户已存在,请登录</p>
<label>密码</label>
<input type="password" id="login-password" placeholder="输入管理员密码">
<button class="btn" onclick="loginUser()">登录</button>
<div id="login-msg" class="msg"></div>
</div>
<!-- Step 4: Dashboard -->
<div id="step-dashboard" class="step">
<div class="stat">
<span class="stat-label">系统状态</span>
@ -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;