Spaces:
Sleeping
Sleeping
| <html lang="zh-CN" id="html-root"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, user-scalable=yes"> | |
| <meta name="theme-color" content="#059669"> | |
| <meta name="description" content="AIClient2API Management Console - Unified management of AI service providers" data-i18n="header.description"> | |
| <title data-i18n="header.title">AIClient2API - 管理控制台</title> | |
| <link rel="stylesheet" href="app/base.css"> | |
| <link rel="stylesheet" href="app/mobile.css"> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <!-- Header 将由组件加载器动态插入 --> | |
| <!-- Main Content --> | |
| <div class="main-content"> | |
| <!-- Sidebar 容器 --> | |
| <div id="sidebar-container"> | |
| <!-- Sidebar 将由组件加载器动态插入 --> | |
| </div> | |
| <!-- Content Area --> | |
| <main class="content" role="main" id="content-container"> | |
| <!-- 各个 Section 将由组件加载器动态插入 --> | |
| </main> | |
| </div> | |
| </div> | |
| <!-- Toast Notifications --> | |
| <div id="toastContainer" class="toast-container"></div> | |
| <!-- Scripts --> | |
| <script type="module" src="app/i18n.js"></script> | |
| <script type="module" src="app/language-switcher.js"></script> | |
| <script type="module" src="app/theme-switcher.js"></script> | |
| <script type="module" src="app/auth.js"></script> | |
| <script type="module" src="app/models-manager.js"></script> | |
| <script type="module"> | |
| // 导入组件加载器 | |
| import { initializeComponents } from './app/component-loader.js'; | |
| // 导入多语言、主题切换和认证函数 | |
| import { initI18n, t, setLanguage, getCurrentLanguage } from './app/i18n.js'; | |
| import { initLanguageSwitcher } from './app/language-switcher.js'; | |
| import { initThemeSwitcher, setTheme, getCurrentTheme } from './app/theme-switcher.js'; | |
| import { initAuth, logout } from './app/auth.js'; | |
| // 尽早应用保存的主题以避免闪烁(但不绑定按钮事件,因为按钮还不存在) | |
| setTheme(getCurrentTheme()); | |
| // 页面加载时检查登录状态并加载组件 | |
| (async function() { | |
| const isAuthenticated = await initAuth(); | |
| if (!isAuthenticated) { | |
| // 如果未认证,initAuth会自动重定向到登录页面 | |
| return; | |
| } | |
| // 认证成功,继续加载页面 | |
| console.log('用户已认证'); | |
| try { | |
| // 加载所有组件 | |
| await initializeComponents(); | |
| // 组件加载完成后初始化主题切换器(此时按钮已存在于DOM中) | |
| initThemeSwitcher(); | |
| // 组件加载完成后初始化多语言 | |
| initI18n(); | |
| // 初始化语言切换器 | |
| initLanguageSwitcher(); | |
| // 重新应用当前语言(因为组件是动态加载的) | |
| setLanguage(getCurrentLanguage()); | |
| // 显示登出按钮(如果配置了密码保护) | |
| const logoutBtn = document.getElementById('logoutBtn'); | |
| if (logoutBtn && localStorage.getItem('authToken')) { | |
| logoutBtn.style.display = 'inline-block'; | |
| logoutBtn.addEventListener('click', async () => { | |
| if (confirm(t('common.confirm') + ' ' + t('header.logout') + '?')) { | |
| await logout(); | |
| } | |
| }); | |
| } | |
| // 更新路径路由示例中的URL前缀 | |
| updateRoutingExamplesURLs(); | |
| } catch (error) { | |
| console.error('Failed to load components:', error); | |
| } | |
| })(); | |
| // 更新路径路由示例中的URL前缀 | |
| function updateRoutingExamplesURLs() { | |
| // 获取当前页面的基础URL(去掉index.html) | |
| const currentURL = window.location.href; | |
| const baseURL = currentURL.replace(/\/index\.html$/, ''); | |
| // 更新所有端点路径 | |
| const endpointPaths = document.querySelectorAll('.endpoint-path'); | |
| endpointPaths.forEach(element => { | |
| const originalPath = element.textContent; | |
| if (!originalPath.startsWith(baseURL)) { | |
| // 确保baseURL不以斜杠结尾,然后正确拼接路径 | |
| const cleanBaseURL = baseURL.replace(/\/$/, ''); | |
| const cleanPath = originalPath.startsWith('/') ? originalPath : '/' + originalPath; | |
| element.textContent = cleanBaseURL + cleanPath; | |
| } | |
| }); | |
| // 更新curl命令中的URL | |
| const curlCodes = document.querySelectorAll('.usage-example pre code'); | |
| curlCodes.forEach(element => { | |
| const curlCommand = element.textContent; | |
| // 替换curl命令中的http://localhost:3000部分 | |
| // 确保baseURL不以斜杠结尾,然后正确拼接路径 | |
| const cleanBaseURL = baseURL.replace(/\/$/, ''); | |
| const updatedCommand = curlCommand.replace(/curl http:\/\/localhost:3000/g, `curl ${cleanBaseURL}`); | |
| element.textContent = updatedCommand; | |
| }); | |
| } | |
| // 导出到 window 供其他脚本使用 | |
| window.initAuth = initAuth; | |
| window.logout = logout; | |
| </script> | |
| <script type="module" src="app/app.js"></script> | |
| </body> | |
| </html> | |