/* v20 part1: header */ (function () { 'use strict'; if (window.__mobV20) return; window.__mobV20 = true; function $(id) { return document.getElementById(id); } var API = 'https://api-gateway.duoweiying.cn'; function hideLogin() { var c = $('login-form-container'); if (c) c.style.display = 'none'; } function showLoginV20() { var c = $('login-form-container'); if (c) { c.style.display = 'flex'; showSec('login'); } } function showSec(which) { var m = { login: 'login-form-section', reg: 'register-form-section', fp: 'forgot-password-section' }; Object.keys(m).forEach(function (k) { var el = $(m[k]); if (el) el.style.display = (k === which ? 'block' : 'none'); }); } function setSession(token, user) { try { localStorage.setItem('user_token', token || ''); localStorage.setItem('user_info', JSON.stringify(user || {})); if (user && user.id) localStorage.setItem('user_id', user.id); } catch (e) {} } /* guest preview */ function guestMode() { try { localStorage.setItem('v20_guest', '1'); hideLogin(); guestBar(); } catch (e) {} } function guestBar() { try { if ($('v20GuestBar')) return; var d = document.createElement('div'); d.id = 'v20GuestBar'; d.style.cssText = 'position:fixed;top:0;left:0;right:0;z-index:30000;background:#eef2f7;color:#475569;font-size:12px;padding:6px 10px;display:flex;align-items:center;gap:8px;'; d.innerHTML = '👀 游客预览模式(只读体验,登录后可保存数据)登录'; document.body.appendChild(d); var hd = document.querySelector('.mobile-header'); if (hd) hd.style.marginTop = '30px'; } catch (e) {} } window.__mobV20Login = function () { try { localStorage.removeItem('v20_guest'); } catch (e) {} showLoginV20(); }; window.__mobV20Guest = guestMode; /* v20 part2: submit & tabs */ function doLogin(ev) { if (ev && ev.preventDefault) ev.preventDefault(); var u = ($('login-username') || {}).value || ''; var p = ($('login-password') || {}).value || ''; if (!u || !p) { alert('请输入用户名和密码'); return; } fetch(API + '/api/auth/login', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: u, password: p }) }) .then(function (r) { return r.json(); }) .then(function (d) { /* WR-550: 后端可能只回 access_token / data.token, 统一取值, 否则登录成功却不落 user_token */ var _tk = (d && (d.token || d.access_token)) || (d && d.data && (d.data.token || d.data.access_token)) || ''; var _us = (d && (d.user || d.data)) || { id: u, username: u }; if (_tk) { setSession(_tk, _us); hideLogin(); setTimeout(function () { location.reload(); }, 200); } else { alert('登录失败:' + ((d && (d.message || d.detail || d.msg)) || '用户名或密码错误')); } }).catch(function () { alert('网络错误,请稍后重试'); }); } function doRegister(ev) { if (ev && ev.preventDefault) ev.preventDefault(); var u = ($('register-username') || {}).value || ''; var e = ($('register-email') || {}).value || ''; var p = ($('register-password') || {}).value || ''; var p2 = ($('register-confirm-password') || {}).value || ''; if (!u || !p) { alert('请填写用户名与密码'); return; } if (p !== p2) { alert('两次密码不一致'); return; } if (!($('v11AgreeReg') || {}).checked) { alert('请先勾选同意《用户协议与隐私政策》'); return; } fetch(API + '/api/auth/register', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: u, email: e || u + '@dw.cn', password: p }) }) .then(function (r) { return r.json(); }) .then(function (d) { var _us = (d && (d.user || d.data)) || {}; var _tk = (d && (d.token || d.access_token)) || (d && d.data && (d.data.token || d.data.access_token)) || ''; if (_us && _us.id) { setSession(_tk, _us); hideLogin(); setTimeout(function () { location.reload(); }, 200); } else { alert('注册失败:' + ((d && (d.message || d.detail || d.msg)) || '请重试')); } }).catch(function () { alert('网络错误,请稍后重试'); }); } function bindTabs() { var showReg = $('show-register'); if (showReg) showReg.onclick = function () { showSec('reg'); }; var showLogin2 = $('show-login-from-register'); if (showLogin2) showLogin2.onclick = function () { showSec('login'); }; var showFp = $('show-forgot-password'); if (showFp) showFp.onclick = function () { alert('请联系在线客服重置密码(或使用“注册”新账号)'); }; var showLg3 = $('show-login-from-forgot'); if (showLg3) showLg3.onclick = function () { showSec('login'); }; } /* v20 part3: boot & injection */ function bindSubmit() { var lf = $('login-form'); if (lf) { lf.addEventListener('submit', doLogin); var lb = lf.querySelector('button[type="submit"]'); if (lb) lb.onclick = doLogin; } var rf = $('register-form'); if (rf) { rf.addEventListener('submit', doRegister); var rb = rf.querySelector('button[type="submit"]'); if (rb) rb.onclick = doRegister; } } function injectGuestBtn() { try { var section = $('login-form-container'); if (!section) return; var card = section.querySelector('.form-section'); if (!card || $('v20GuestBtn')) return; var g = document.createElement('button'); g.id = 'v20GuestBtn'; g.type = 'button'; g.style.cssText = 'display:block;width:100%;margin-top:10px;padding:10px;border:1px solid #e2e8f0;border-radius:9px;background:#fff;color:#64748b;font-size:13px;cursor:pointer;'; g.textContent = '👀 游客预览(只读体验界面)'; g.onclick = function () { guestMode(); }; card.appendChild(g); } catch (e) {} } function boot() { injectGuestBtn(); bindSubmit(); bindTabs(); var hasTok = !!localStorage.getItem('user_token'); if (hasTok) { hideLogin(); } if (localStorage.getItem('v20_guest') === '1') { hideLogin(); guestBar(); } } if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot); else boot(); setTimeout(boot, 700); setTimeout(boot, 2200); })();