()
| 831 | // 登录相关函数 |
| 832 | // ===================================================================== |
| 833 | async function login() { |
| 834 | const password = document.getElementById('loginPassword').value; |
| 835 | |
| 836 | if (!password) { |
| 837 | showStatus('请输入密码', 'error'); |
| 838 | return; |
| 839 | } |
| 840 | |
| 841 | try { |
| 842 | const response = await fetch('./auth/login', { |
| 843 | method: 'POST', |
| 844 | headers: { 'Content-Type': 'application/json' }, |
| 845 | body: JSON.stringify({ password }) |
| 846 | }); |
| 847 | |
| 848 | const data = await response.json(); |
| 849 | |
| 850 | if (response.ok) { |
| 851 | AppState.authToken = data.token; |
| 852 | localStorage.setItem('gcli2api_auth_token', AppState.authToken); |
| 853 | document.getElementById('loginSection').classList.add('hidden'); |
| 854 | document.getElementById('mainSection').classList.remove('hidden'); |
| 855 | showStatus('登录成功', 'success'); |
| 856 | // 显示面板后初始化滑块 |
| 857 | requestAnimationFrame(() => initTabSlider()); |
| 858 | } else { |
| 859 | showStatus(`登录失败: ${data.detail || data.error || '未知错误'}`, 'error'); |
| 860 | } |
| 861 | } catch (error) { |
| 862 | showStatus(`网络错误: ${error.message}`, 'error'); |
| 863 | } |
| 864 | } |
| 865 | |
| 866 | async function autoLogin() { |
| 867 | const savedToken = localStorage.getItem('gcli2api_auth_token'); |
no test coverage detected