diff --git a/XNSimHtml/components/auth-component.js b/XNSimHtml/components/auth-component.js index 1083e14..33659ca 100644 --- a/XNSimHtml/components/auth-component.js +++ b/XNSimHtml/components/auth-component.js @@ -434,6 +434,27 @@ class AuthComponent extends HTMLElement { })); }); } + + reset() { + // 重置表单 + const loginForm = this.shadowRoot.getElementById('loginFormElement'); + const registerForm = this.shadowRoot.getElementById('registerFormElement'); + if (loginForm) loginForm.reset(); + if (registerForm) registerForm.reset(); + + // 切换到登录表单 + const loginToggle = this.shadowRoot.getElementById('loginToggle'); + const registerToggle = this.shadowRoot.getElementById('registerToggle'); + const loginFormPanel = this.shadowRoot.getElementById('loginForm'); + const registerFormPanel = this.shadowRoot.getElementById('registerForm'); + + if (loginToggle && registerToggle && loginFormPanel && registerFormPanel) { + loginToggle.classList.add('active'); + registerToggle.classList.remove('active'); + loginFormPanel.classList.add('active'); + registerFormPanel.classList.remove('active'); + } + } } customElements.define('auth-component', AuthComponent); \ No newline at end of file diff --git a/XNSimHtml/components/user-info.js b/XNSimHtml/components/user-info.js index e9b1073..b0f2500 100644 --- a/XNSimHtml/components/user-info.js +++ b/XNSimHtml/components/user-info.js @@ -328,8 +328,29 @@ class UserInfo extends HTMLElement { logout() { localStorage.removeItem('userInfo'); - document.getElementById('authContainer').style.display = 'block'; - document.getElementById('mainContainer').style.display = 'none'; + localStorage.removeItem('authToken'); + + // 获取认证容器和主容器 + const authContainer = document.getElementById('authContainer'); + const mainContainer = document.getElementById('mainContainer'); + + // 先隐藏主容器 + mainContainer.classList.remove('visible'); + // 等待过渡效果完成 + setTimeout(() => { + mainContainer.style.display = 'none'; + // 显示认证容器 + authContainer.style.display = 'block'; + // 等待一帧以确保display:block生效 + requestAnimationFrame(() => { + authContainer.classList.add('visible'); + // 重置认证组件 + const authComponent = document.querySelector('auth-component'); + if (authComponent) { + authComponent.reset(); + } + }); + }, 300); } } diff --git a/XNSimHtml/main.html b/XNSimHtml/main.html index 2509b56..26da294 100644 --- a/XNSimHtml/main.html +++ b/XNSimHtml/main.html @@ -6,7 +6,6 @@ XNSim - 主页面 - @@ -112,9 +111,27 @@ /* 主容器样式 */ .main-container { + display: none; width: 100%; height: 100vh; overflow: hidden; + opacity: 0; + transition: opacity 0.3s ease; + } + .main-container.visible { + display: block !important; + opacity: 1; + } + + /* 认证容器样式 */ + #authContainer { + display: none; + opacity: 0; + transition: opacity 0.3s ease; + } + #authContainer.visible { + display: block !important; + opacity: 1; } /* 内容头部样式 */ @@ -203,13 +220,6 @@ .toast.show { opacity: 1; } - - #authContainer, #mainContainer { - display: none; - } - #authContainer.visible, #mainContainer.visible { - display: block; - } @@ -266,10 +276,18 @@ const checkAuth = () => { const userInfo = localStorage.getItem('userInfo'); if (userInfo) { + // 先初始化主页面 + initializeMainPage(); + authContainer.classList.remove('visible'); mainContainer.classList.add('visible'); - // 初始化主页面 - initializeMainPage(); + + // 触发一个自定义事件,通知其他组件登录成功 + const loginSuccessEvent = new CustomEvent('login-success', { + detail: { user: JSON.parse(userInfo) } + }); + document.dispatchEvent(loginSuccessEvent); + } else { authContainer.classList.add('visible'); mainContainer.classList.remove('visible'); @@ -277,8 +295,30 @@ }; // 初始化主页面 - function initializeMainPage() { + async function initializeMainPage() { + // 确保所有组件都已经加载 + const components = [ + 'main-toolbar', + 'sub-toolbar', + 'tabs-container', + 'content-area' + ]; + + // 等待所有组件加载完成 + await Promise.all(components.map(component => { + return new Promise(resolve => { + if (customElements.get(component)) { + resolve(); + } else { + customElements.whenDefined(component).then(resolve); + } + }); + })); + // 初始化时创建概览标签页并加载概览内容 + const tabsContainer = document.querySelector('tabs-container'); + const contentArea = document.querySelector('content-area'); + tabsContainer.createTab('overview', '概览', 'dashboard', '主页', 'home'); contentArea.loadContent('overview'); @@ -355,8 +395,24 @@ tabsContainer.clearAllTabs(); // 显示退出成功提示 showToast('已安全退出登录'); - // 重新检查认证状态,这会触发返回登录页面 - checkAuth(); + + // 先隐藏主容器 + mainContainer.classList.remove('visible'); + // 等待过渡效果完成 + setTimeout(() => { + mainContainer.style.display = 'none'; + // 显示认证容器 + authContainer.style.display = 'block'; + // 等待一帧以确保display:block生效 + requestAnimationFrame(() => { + authContainer.classList.add('visible'); + // 重置认证组件 + const authComponent = document.querySelector('auth-component'); + if (authComponent) { + authComponent.reset(); + } + }); + }, 300); break; } } @@ -581,10 +637,37 @@ if (result.success) { localStorage.setItem('userInfo', JSON.stringify(result.user)); showToast(`欢迎回来,${result.user.username}!`); - authContainer.classList.remove('visible'); + + // 先显示主容器 + mainContainer.style.display = 'block'; + // 等待一帧以确保display:block生效 + await new Promise(resolve => requestAnimationFrame(resolve)); + // 添加visible类触发过渡效果 mainContainer.classList.add('visible'); + + // 等待过渡效果完成 + await new Promise(resolve => setTimeout(resolve, 300)); + + // 隐藏认证容器 + authContainer.classList.remove('visible'); + // 等待过渡效果完成 + await new Promise(resolve => setTimeout(resolve, 300)); + authContainer.style.display = 'none'; + // 初始化主页面 - initializeMainPage(); + await initializeMainPage(); + + // 更新用户信息组件 + const userInfo = document.querySelector('user-info'); + if (userInfo) { + userInfo.updateUserInfo(result.user); + } + + // 触发登录成功事件 + const loginSuccessEvent = new CustomEvent('login-success', { + detail: { user: result.user } + }); + document.dispatchEvent(loginSuccessEvent); } else { showToast(result.message || '登录失败,请检查用户名和密码'); } diff --git a/XNSimHtml/server.js b/XNSimHtml/server.js index de8a1b3..89ec056 100644 --- a/XNSimHtml/server.js +++ b/XNSimHtml/server.js @@ -38,14 +38,14 @@ if (!xnCorePath) { app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); +// 静态文件服务 - 放在根路径处理之前 +app.use(express.static(__dirname)); + // 根路径直接返回main.html app.get('/', (req, res) => { res.sendFile(path.join(__dirname, 'main.html')); }); -// 静态文件服务 - 放在根路径处理之后 -app.use(express.static(__dirname)); - // 监听进程退出事件 process.on('exit', performCleanup); process.on('SIGINT', () => {