| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>ChatGPT-like Clone</title>
- <link rel="stylesheet" href="/static/styles.css">
- </head>
- <body>
- <div id="auth-view" class="auth-view">
- <div class="auth-card">
- <h1>欢迎使用i满意聊天系统</h1>
- <p class="auth-hint">系统分为管理员与普通用户,默认管理员:admin / Admin@123</p>
- <form id="login-form" class="auth-form">
- <label>用户名
- <input type="text" name="username" required autocomplete="username">
- </label>
- <label>密码
- <input type="password" name="password" required autocomplete="current-password">
- </label>
- <button type="submit" class="primary-button">登录</button>
- </form>
- <form id="register-form" class="auth-form hidden">
- <label>用户名
- <input type="text" name="username" required autocomplete="username">
- </label>
- <label>密码
- <input type="password" name="password" required autocomplete="new-password">
- </label>
- <button type="submit" class="primary-button">注册并登录</button>
- </form>
- <div class="auth-switch">
- <button type="button" class="secondary-button" data-auth-mode="login">已有账号?去登录</button>
- <button type="button" class="secondary-button" data-auth-mode="register">没有账号?去注册</button>
- </div>
- </div>
- </div>
- <div class="app-shell hidden" id="app-shell">
- <aside class="sidebar">
- <div class="sidebar-scroll">
- <section class="sidebar-section">
- <label for="model-select" class="sidebar-label">选择模型</label>
- <select id="model-select" class="sidebar-input"></select>
- </section>
- <section class="sidebar-section">
- <label for="output-mode" class="sidebar-label">选择输出模式</label>
- <select id="output-mode" class="sidebar-input"></select>
- </section>
- <section class="sidebar-section">
- <label for="search-input" class="sidebar-label">搜索当前对话内容</label>
- <input id="search-input" type="text" class="sidebar-input" placeholder="输入关键字...">
- <div id="search-feedback" class="sidebar-help">无匹配。</div>
- </section>
- <section class="sidebar-section">
- <label for="history-range" class="sidebar-label" id="history-range-label">选择使用的历史消息数量</label>
- <input id="history-range" type="range" min="0" max="0" value="0" class="sidebar-range">
- <div id="history-range-value" class="sidebar-help">您选择的历史消息数量是: 0</div>
- </section>
- <section class="sidebar-section sidebar-actions">
- <button id="new-chat-btn" class="primary-button">New Chat</button>
- </section>
- </div>
- <div class="sidebar-history" aria-label="历史聊天记录">
- <div class="sidebar-history-header">
- <h3 class="sidebar-heading">历史聊天记录</h3>
- <span id="history-count" class="history-count" aria-live="polite"></span>
- </div>
- <div id="history-list" class="history-list" role="list"></div>
- <div class="history-pagination">
- <button id="history-prev" class="secondary-button">上一页</button>
- <button id="history-next" class="secondary-button">下一页</button>
- </div>
- </div>
- </aside>
- <main class="main-panel">
- <header class="app-header">
- <div class="header-title">
- <h1>ChatGPT-like Clone</h1>
- <span id="session-indicator" class="session-indicator hidden"></span>
- </div>
- <div class="header-actions">
- <div id="admin-role-indicator" class="admin-role-indicator hidden" title="管理员">
- <svg viewBox="0 0 24 24" aria-hidden="true" focusable="false">
- <path d="M12 2 4 6v6c0 5.25 3.4 10.74 8 12 4.6-1.26 8-6.75 8-12V6l-8-4zm0 2.18L18 7v4.99c0 4.38-2.84 8.98-6 10.1-3.16-1.12-6-5.72-6-10.1V7l6-2.82z" fill="currentColor"/>
- <path d="M12 7a4 4 0 1 0 0 8 4 4 0 0 0 0-8zm0 2a2 2 0 1 1 0 4 2 2 0 0 1 0-4z" fill="currentColor"/>
- </svg>
- </div>
- <span id="user-badge" class="user-badge"></span>
- <div id="user-menu" class="user-menu hidden">
- <button type="button" id="user-menu-toggle" class="avatar-button" aria-haspopup="true" aria-expanded="false">
- <span id="user-avatar-initials" class="avatar-initials">A</span>
- <svg class="avatar-caret" viewBox="0 0 24 24" aria-hidden="true">
- <path d="M6 9l6 6 6-6" stroke="currentColor" stroke-width="2" fill="none" stroke-linecap="round"/>
- </svg>
- </button>
- <div id="user-menu-dropdown" class="user-menu-dropdown hidden" role="menu" aria-label="用户菜单">
- <button id="export-btn" class="menu-item" type="button" role="menuitem" disabled>我的导出</button>
- <button id="admin-btn" class="menu-item hidden" type="button" role="menuitem">用户管理</button>
- <button id="logout-btn" class="menu-item" type="button" role="menuitem" disabled>退出登录</button>
- </div>
- </div>
- </div>
- </header>
- <section id="chat-messages" class="chat-messages"></section>
- <form id="chat-form" class="chat-form">
- <textarea id="chat-input" placeholder="What is up?" rows="3" class="chat-textarea"></textarea>
- <div class="chat-form-footer">
- <label for="file-input" class="file-input-label">选择文件</label>
- <button type="button" id="expand-all-btn" class="secondary-button">全部展开</button>
- <input id="file-input" type="file" multiple accept=".jpg,.jpeg,.png,.txt,.pdf,.doc,.docx" class="file-input">
- <button type="submit" id="send-btn" class="primary-button">发送</button>
- <button type="button" id="end-chat-btn" class="secondary-button danger hidden" title="提前结束此次对话">提前结束</button>
- </div>
- <div id="chat-status" class="chat-status" aria-live="polite"></div>
- </form>
- </main>
- </div>
- <div id="admin-panel" class="overlay hidden">
- <div class="overlay-content">
- <div class="overlay-header">
- <h2>用户管理</h2>
- <button id="admin-close" class="icon-button overlay-close" type="button" aria-label="关闭弹窗">
- <svg class="icon-close" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
- <path d="M6 6l12 12M18 6 6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
- </svg>
- </button>
- </div>
- <form id="admin-create-form" class="admin-form">
- <h3>新增普通用户</h3>
- <div class="admin-form-grid">
- <input type="text" name="username" placeholder="用户名" required>
- <input type="password" name="password" placeholder="密码" required>
- <button type="submit" class="primary-button">创建</button>
- </div>
- </form>
- <div class="admin-section">
- <h3>用户列表</h3>
- <div id="admin-user-list" class="admin-list"></div>
- </div>
- <div class="admin-section">
- <div class="admin-section-header">
- <h3>导出记录</h3>
- <form class="admin-search">
- <input id="admin-export-search" type="text" placeholder="按用户名搜索">
- <button id="admin-export-refresh" class="secondary-button" type="button">查询</button>
- </form>
- </div>
- <div id="admin-export-list" class="admin-list"></div>
- </div>
- </div>
- </div>
- <div id="export-panel" class="overlay hidden">
- <div class="overlay-content">
- <div class="overlay-header">
- <h2>我的导出</h2>
- <button id="export-close" class="icon-button overlay-close" type="button" aria-label="关闭弹窗">
- <svg class="icon-close" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
- <path d="M6 6l12 12M18 6 6 18" stroke="currentColor" stroke-width="2" stroke-linecap="round"/>
- </svg>
- </button>
- </div>
- <div id="export-list" class="admin-list"></div>
- </div>
- </div>
- <div id="toast" class="toast hidden"></div>
- <script defer src="/static/app.js"></script>
- </body>
- </html>
|