# ssh-terminal **Repository Path**: mingjianyeying/ssh-terminal ## Basic Information - **Project Name**: ssh-terminal - **Description**: A modern cross-platform SSH client with session management and terminal emulation - **Primary Language**: TypeScript - **License**: Not specified - **Default Branch**: master - **Homepage**: https://shenjianz.github.io/ssh-terminal/ - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-25 - **Last Updated**: 2026-02-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SSH Terminal
![Tauri](https://img.shields.io/badge/Tauri-2.0-FFC131?logo=tauri&logoColor=000000) ![React](https://img.shields.io/badge/React-19-61DAFB?logo=react&logoColor=000000) ![TypeScript](https://img.shields.io/badge/TypeScript-5.8-3178C6?logo=typescript&logoColor=FFFFFF) ![Rust](https://img.shields.io/badge/Rust-1.70+-000000?logo=rust&logoColor=FFFFFF) ![Vite](https://img.shields.io/badge/Vite-6.0-646CFF?logo=vite&logoColor=FFFFFF) ![Tailwind CSS](https://img.shields.io/badge/Tailwind-4.0-06B6D4?logo=tailwindcss&logoColor=FFFFFF) ![Zustand](https://img.shields.io/badge/Zustand-5.0-FFB84D?logoColor=FFFFFF) ![License](https://img.shields.io/badge/License-MIT-green) 一个基于 Tauri + React 的现代化 SSH 终端客户端应用,提供跨平台的 SSH 连接管理、AI 辅助、SFTP 文件管理等功能。 **[功能特性](#-特性)** • **[快速开始](#-快速开始)** • **[技术栈](#-技术栈)** • **[架构设计](#-架构设计)** • **[开发指南](#-开发指南)**
## 📸 应用截图 ![主界面](./public/other-aoge.png) ![设置页面](./public/setting-page.svg) ## 🚀 快速开始 ### 环境要求 - **Node.js** 18+ - **pnpm** 10.14.0+ - **Rust** 1.70+ - **系统 SSH 客户端**(Windows 需要 Git Bash 或 WSL) ### 安装依赖 ```bash pnpm install ``` ### 开发模式 启动开发服务器(同时运行前端和后端): ```bash pnpm tauri dev ``` 这将: 1. 启动 Vite 开发服务器(端口 1420) 2. 启动 Tauri 应用窗口 3. 启用热模块替换(HMR) ### 前端开发(仅开发前端) ```bash pnpm dev ``` ### 生产构建 构建生产版本: ```bash pnpm tauri build ``` 构建产物位于 `src-tauri/target/release/bundle/` 目录。 ## 🐳 Docker 服务器部署 如果你需要部署 ssh-terminal-server(后端服务),可以使用 Docker 快速部署。 ### 前置要求 - Docker 已安装 - 服务器可访问互联网(用于拉取镜像) ### 快速部署步骤 #### 1. 创建数据目录 ```bash # Linux mkdir -p /data/ssh-terminal-server/data chmod -R 755 /data/ssh-terminal-server ``` #### 2. 创建 Docker 网络 ```bash docker network create ssh-terminal-net ``` #### 3. 部署 Redis(如已安装可跳过) ```bash docker run -d \ --name Redis7 \ --network ssh-terminal-net \ -p 6379:6379 \ redis:7 \ redis-server --requirepass your_password ``` > ⚠️ 请将 `your_password` 替换为强密码 #### 4. 部署 ssh-terminal-server ```bash docker run -d \ --name ssh-terminal \ --restart unless-stopped \ -p 6236:3000 \ -e SERVER__HOST=0.0.0.0 \ -e SERVER__PORT=3000 \ -e DATABASE__TYPE=sqlite \ -e DATABASE__PATH=/data/app.db \ # ⚠️ 改成你的 Redis 容器名或地址 -e REDIS__HOST=Redis7 \ # ⚠️ Redis 端口(一般不用改) -e REDIS__PORT=6379 \ # ⚠️ 改成你的 Redis 密码 -e REDIS__PASSWORD=your_password \ # ⚠️ 强烈建议改成你自己的随机密钥 -e AUTH__JWT_SECRET=9f7d3c365454dsfsasa8f28544b5e6d7a \ -e AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES=15 \ -e AUTH__REFRESH_TOKEN_EXPIRATION_DAYS=7 \ # ==================== 邮件配置(可选) ==================== # 是否启用邮件功能(用于发送验证码) # - false: 不启用邮件验证 # - true: 启用邮件验证,用户注册时必须输入验证码 -e EMAIL__ENABLED=false \ # SMTP 服务器配置 -e EMAIL__SMTP_HOST=smtp.163.com \ -e EMAIL__SMTP_PORT=465 \ -e EMAIL__SMTP_USERNAME=your-email@163.com \ -e EMAIL__SMTP_PASSWORD=your-app-password \ # 发件人信息 -e EMAIL__FROM_NAME="SSH Terminal" \ -e EMAIL__FROM_EMAIL=your-email@163.com \ # Worker 配置(仅异步模式使用) -e EMAIL__WORKER_POOL_SIZE=10 \ -e EMAIL__WORKER_TIMEOUT_SECONDS=10 \ # ⚠️ 本机持久化目录 -v /data/ssh-terminal-server/data:/data \ --network ssh-terminal-net \ registry.cn-hangzhou.aliyuncs.com/pull-image/ssh-terminal-server:latest ``` > ⚠️ **邮件配置提示**: > - 对于 QQ/163 等邮箱,需要使用"授权码"而不是登录密码 > - 获取方式:邮箱设置 → 账户 → POP3/SMTP 服务 → 生成授权码 > - Gmail 需要启用"两步验证"并生成"应用专用密码" > - 常用 SMTP 服务器: > - 163邮箱: smtp.163.com, 端口 465 (SSL) 或 994 (SSL) > - QQ邮箱: smtp.qq.com, 端口 465 (SSL) 或 587 (STARTTLS) > - Gmail: smtp.gmail.com, 端口 587 (STARTTLS) 或 465 (SSL) > - Outlook: smtp-mail.outlook.com, 端口 587 (STARTTLS) ### 环境变量说明 | 变量名 | 说明 | 默认值 | |--------|------|--------| | `SERVER__HOST` | 服务器监听地址 | `0.0.0.0` | | `SERVER__PORT` | 服务器监听端口 | `3000` | | `DATABASE__TYPE` | 数据库类型 | `sqlite` | | `DATABASE__PATH` | 数据库文件路径 | `/data/app.db` | | `REDIS__HOST` | Redis 主机地址 | `localhost` | | `REDIS__PORT` | Redis 端口 | `6379` | | `REDIS__PASSWORD` | Redis 密码 | - | | `AUTH__JWT_SECRET` | JWT 签名密钥 | - | | `AUTH__ACCESS_TOKEN_EXPIRATION_MINUTES` | 访问令牌过期时间(分钟) | `15` | | `AUTH__REFRESH_TOKEN_EXPIRATION_DAYS` | 刷新令牌过期时间(天) | `7` | | `EMAIL__ENABLED` | 是否启用邮件功能 | `false` | | `EMAIL__SMTP_HOST` | SMTP 服务器地址 | - | | `EMAIL__SMTP_PORT` | SMTP 服务器端口 | - | | `EMAIL__SMTP_USERNAME` | SMTP 用户名 | - | | `EMAIL__SMTP_PASSWORD` | SMTP 密码/授权码 | - | | `EMAIL__FROM_NAME` | 发件人名称 | `SSH Terminal` | | `EMAIL__FROM_EMAIL` | 发件人邮箱地址 | - | | `EMAIL__WORKER_POOL_SIZE` | Worker 连接池大小 | `10` | | `EMAIL__WORKER_TIMEOUT_SECONDS` | Worker 超时时间(秒) | `10` | ### 验证部署 第一次启动后,查看容器日志: ```bash docker logs -f ssh-terminal ``` 重点检查以下信息: - ✅ `Redis 连接成功` - ✅ `SQLite 初始化成功` - ✅ `Server started` 执行健康检查: ```bash curl http://localhost:6236/info ``` ### 常用操作 #### 查看日志 ```bash docker logs -f ssh-terminal ``` #### 更新镜像 ```bash docker pull registry.cn-hangzhou.aliyuncs.com/pull-image/ssh-terminal-server:1.0.0 docker stop ssh-terminal docker rm ssh-terminal # 重新运行部署命令 ``` ## ✨ 特性 ### 🖥️ 核心功能 - **多会话管理** - 支持同时管理多个 SSH 连接,使用标签页切换 - **终端模拟** - 基于 xterm.js 提供完整的终端模拟体验 - **会话持久化** - 保存 SSH 连接配置,方便快速重连 - **主题支持** - 支持 8 种终端主题(One Dark、Dracula、Nord、Tokyo Night、Monokai、GitHub Light、Solarized Light/Dark) - **音效系统** - 操作反馈音效 - **主机密钥验证** - 自动检测并提示主机密钥确认 ### 🔧 高级特性 - **心跳保活** - 可配置的心跳间隔(0-120秒)防止连接断开 - **会话分组** - 支持将会话按分组组织 - **快速连接** - 临时连接不保存配置 - **连接实例与配置分离** - 一个配置可以创建多个连接实例 - **加密存储** - 使用 AES-256-GCM 加密保存密码和密钥 - **快捷键系统** - 完整的快捷键绑定和自定义功能 - **russh 纯 Rust 后端** - 除了系统 SSH,还支持纯 Rust 实现的 SSH 客户端,提供更好的跨平台兼容性 - **本地数据库存储** - 使用 SQLite 存储会话配置、用户资料等数据 ### ☁️ 云同步功能 - **多设备同步** - 支持在不同设备间同步 SSH 会话、用户资料等数据 - **增量同步** - 只同步变更的数据,提高同步效率 - **冲突检测与解决** - 自动检测数据冲突,提供多种解决策略(保留服务器、保留本地、保留两者) - **自动同步** - 可配置的自动同步间隔 - **离线支持** - 本地数据持久化,离线时仍可正常使用 ### 👤 用户认证 - **账号系统** - 支持用户注册、登录、登出 - **多账号切换** - 支持在多个账号间快速切换 - **Token 认证** - 基于 JWT 的安全认证机制(Access Token + Refresh Token) - **本地匿名模式** - 未登录时可使用本地模式,数据仅保存在本地 - **用户资料管理** - 支持头像上传、用户信息编辑 - **账号删除** - 支持删除账号及相关数据 ### 📹 视频录制系统 - **视频录制** - 使用 Canvas.captureStream 捕获终端画面 - 支持 WebM (VP9/VP8) 和 MP4 (H.264) 格式 - 三种质量预设:Low (500 kbps)、Medium (2 Mbps)、High (5 Mbps) - 使用 WebGL 渲染器提高性能 - **音频录制** - 支持麦克风和扬声器同步录制 - 麦克风录制:单声道,48kHz 采样率,支持回声消除、噪声抑制 - 扬声器录制:Windows WASAPI Loopback Recording,2.0x 音量增益补偿 - **事件录制** - 记录所有终端交互事件(input/output/resize/metadata) - **录制控制** - 支持 2 秒倒计时、暂停/恢复 - **录制管理** - 录制文件保存、加载、删除、导出 - **回放功能** - 基于事件的回放引擎,支持变速播放 ### 🤖 AI 智能助手 - **自然语言转命令** - 用自然语言描述需求,AI 自动生成命令 - **命令解释** - 选中命令后 AI 提供详细解释和用法说明 - **错误分析** - AI 分析终端错误并提供解决方案 - **AI 对话界面** - 独立的 AI 聊天页面,支持多轮对话和历史记录 - **会话历史管理** - 按服务器分组管理 AI 对话历史 - **多 AI Provider 支持** - 支持 OpenAI、Ollama、Qwen、文心一言等多个 AI 服务商 - **AI 缓存池** - 智能 Provider 缓存和负载均衡 - **流式响应** - 支持 AI 流式输出,提升交互体验 ### 📁 SFTP 文件管理 - **双面板文件浏览器** - 类似 WinSCP 的双面板界面 - **文件上传下载** - 支持文件和文件夹的传输 - **远程文件操作** - 支持删除、重命名、移动等操作 - **文件预览** - 支持文本文件预览 ### 🎬 录制功能 - **终端录制** - 录制终端操作为视频 - **视频导出** - 支持多种格式导出(GIF、MP4、WebM) - **录制管理** - 管理和回放录制内容 ### 📱 跨平台支持 - **桌面端** - Windows、macOS、Linux - **移动端适配** - 响应式设计,支持移动设备 - **触摸优化** - 移动端专门的交互优化 ### 🔨 开发者工具(仅开发模式) - **DOM to SVG** - 选择页面元素并导出为 SVG 矢量图形([使用文档](./docs/DOM_TO_SVG.md)) ## 📚 文档 - **[快捷键列表](./docs/Shortcuts.md)** - 所有快捷键及其生效范围 - **[DOM to SVG 使用指南](./docs/DOM_TO_SVG.md)** - 开发者工具使用文档 ## 🏗️ 技术栈 ### 前端技术栈 - **React 19** - 最新的 React 版本,支持现代特性 - **TypeScript 5.8+** - 完整的类型安全支持 - **shadcn/ui** - 基于 Radix UI 的美观、可访问的 UI 组件库 - **Tailwind CSS 4.0** - 实用优先的 CSS 框架 - **Zustand** - 轻量级状态管理库 - **React Router 7** - 前端路由管理 - **xterm.js** - 终端模拟器核心库 - **React Hook Form + Zod** - 表单管理和验证 ### 后端技术栈 - **Rust** - 高性能、安全的系统编程语言 - **Tauri 2.0** - 跨平台桌面应用框架 - **tokio** - 异步运行时 - **portable-pty** - 跨平台 PTY 支持 - **serde** - 序列化/反序列化 - **aes-gcm + argon2** - 加密存储 - **russh** - 纯 Rust SSH 实现 ### 后端服务器技术栈 (ssh-terminal-server) - **Rust** - 高性能后端开发语言 - **Axum 0.7** - 现代异步 Web 框架 - **SeaORM 1.1** - 异步 ORM 框架 - **Redis 0.27** - Refresh Token 缓存 - **JWT 9.x** - JSON Web Token 认证 - **Argon2 0.5** - 密码哈希算法 - **tracing** - 结构化日志框架 - **数据库支持** - SQLite / MySQL / PostgreSQL ### 开发工具 - **pnpm** - 快速、节省磁盘空间的包管理器 - **Vite** - 现代化的前端构建工具 - **ESLint** - 代码质量检查和格式化 ### AI & 音频 - **OpenAI / Anthropic API** - AI 服务提供商 - **Web Audio API** - 音频录制和处理 - **Web Speech API** - 语音识别 ### 其他依赖 - **axios** - HTTP 请求库 - **date-fns** - 日期处理 - **clsx / tailwind-merge** - CSS 类名工具 ## 🏛️ 架构设计 ### 整体架构 ``` ┌─────────────────────────────────────────────────────────────────┐ │ Frontend (React 19) │ ├─────────────────────────────────────────────────────────────────┤ │ Pages: │ │ Terminal | SessionManager | Settings | AIChatPage | SftpManager│ │ ↓ ↓ ↓ ↓ ↓ │ │ Components: │ │ Layout Session Settings AI SFTP │ │ (Sidebar, -QuickConnect -AI -Chat -DualPane │ │ TopBar) -SessionCard -Terminal -Command -FileList │ │ -EditDialog -Keybindings -History │ │ Terminal SSH Recording Mobile │ │ -TabBar -HostKey -Controls -MobileLayout │ │ -XTerm -Confirm -Export -SessionList │ │ -Status -Manager │ │ ↓ │ │ Store (Zustand): │ │ - sessionStore (会话管理) │ │ - terminalStore (终端实例管理) │ │ - terminalConfigStore (配置管理) │ │ - aiStore (AI 状态管理) │ │ ↓ │ │ Lib & Utils: │ │ - historyManager (AI 历史管理) │ │ - AudioCaptureManager (音频录制) │ │ - sounds (音效系统) │ └────────────────────────┬──────────────────────────────────────────┘ │ Tauri IPC Commands ↓ ┌─────────────────────────────────────────────────────────────────┐ │ Backend (Rust + Tauri 2.0) │ ├─────────────────────────────────────────────────────────────────┤ │ Commands Layer: │ │ - session.rs (会话管理命令) │ │ - terminal.rs (终端操作命令) │ │ - storage.rs (持久化命令) │ │ ↓ │ │ SSH Manager Layer: │ │ - SSHManager (管理 Session 和 Connection) │ │ ↓ │ │ SSH Backend Layer: │ │ - SSHBackend (抽象 trait) │ │ - SystemSSHBackend (系统 SSH 实现) │ │ - portable-pty (跨平台 PTY 支持) │ │ ↓ │ │ Storage Layer: │ │ - Storage (加密存储管理) │ │ - AES-256-GCM 加密 │ └─────────────────────────────────────────────────────────────────┘ ↑ │ External APIs ↓ ┌─────────────────────────────────────────────────────────────────┐ │ Backend Server (ssh-terminal-server) │ ├─────────────────────────────────────────────────────────────────┤ │ API Endpoints: │ │ - POST /auth/register - 用户注册 │ │ - POST /auth/login - 用户登录 │ │ - POST /auth/refresh - 刷新 Token │ │ - GET /api/user/profile - 获取用户资料 │ │ - PUT /api/user/profile - 更新用户资料 │ │ - GET /api/ssh/sessions - 获取 SSH 会话列表 │ │ - POST /api/ssh/sessions - 创建 SSH 会话 │ │ - POST /api/sync - 数据同步 │ │ - POST /api/sync/resolve-conflict - 解决冲突 │ │ ↓ │ │ Services: │ │ - AuthService (认证服务) │ │ - SyncService (同步服务) │ │ ↓ │ │ Repositories: │ │ - UserRepository (用户数据访问) │ │ - UserProfileRepository (用户资料数据访问) │ │ - SshSessionRepository (SSH 会话数据访问) │ │ ↓ │ │ Storage: │ │ - SQLite/MySQL/PostgreSQL (数据库) │ │ - Redis (Refresh Token 缓存) │ └─────────────────────────────────────────────────────────────────┘ ↑ │ External APIs ↓ ┌─────────────────────────────────────────────────────────────────┐ │ External Services │ ├─────────────────────────────────────────────────────────────────┤ │ - OpenAI API - Ollama API - Qwen API - Wenxin API │ │ - SSH Servers - SFTP Servers │ └─────────────────────────────────────────────────────────────────┘ ### 认证流程 ``` ┌──────────────┐ │ 用户登录 │ └──────┬───────┘ ↓ ┌─────────────────────┐ │ POST /auth/login │ │ (邮箱 + 密码) │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 验证密码 (Argon2) │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 生成 Access Token │ │ (15分钟过期) │ │ 生成 Refresh Token │ │ (7天过期) │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ Refresh Token 存入 │ │ Redis Set │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 返回 Token 对 │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 后续请求携带 │ │ Access Token │ └─────────────────────┘ ``` ### 同步流程 ``` ┌──────────────┐ │ 手动/自动同步 │ └──────┬───────┘ ↓ ┌─────────────────────┐ │ POST /api/sync │ │ (携带 Access Token) │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 1. 检查用户状态 │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 2. 冲突检测 │ │ (对比 last_sync_at) │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 3. Push 阶段 │ │ - 上传用户资料 │ │ - 上传 SSH 会话 │ │ - 处理删除操作 │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 4. Pull 阶段 │ │ - 拉取更新的数据 │ │ - 增量同步 │ └──────┬──────────────┘ ↓ ┌─────────────────────┐ │ 5. 返回同步结果 │ │ - 更新的数据 │ │ - 冲突信息 │ └─────────────────────┘ ``` ### 数据流 #### SSH 连接流 ``` 用户操作 → React 组件 → Zustand Store → Tauri Command → SSH Manager → SSH Backend → SSH Server ↓ ↑ 界面更新 ← Tauri Event (ssh-output-{id}) ← SSH Reader ← PTY ← SSH Process ←──────────┘ ``` #### AI 交互流 ``` 用户输入 → AI 组件 → aiStore → API 调用 → AI Provider (OpenAI/Claude/...) ↓ ↑ 界面更新 ← AI 响应 ← AI Provider ← HTTP 请求 ←─────────────────────────────────────┘ ``` ### 核心概念 1. **Session(会话配置)** - 保存的 SSH 连接配置,包含主机、端口、用户名等信息 2. **Connection(连接实例)** - 基于 Session 创建的实际连接,一个 Session 可以创建多个 Connection 3. **TerminalTab(终端标签页)** - 前端展示的终端标签,每个标签对应一个 Connection 4. **AI Conversation(AI 对话)** - AI 聊天会话,支持多轮对话和历史记录 5. **AI Provider(AI 服务商)** - 支持多个 AI 服务提供商,可配置和切换 ### 数据库架构 #### 客户端本地数据库 (SQLite) ``` src-tauri/data/app.db ├── user_auth # 用户认证表 │ ├── id (PK) │ ├── email # 邮箱 │ ├── password_hash # 密码哈希 │ ├── device_id # 设备ID(用于加密) │ ├── created_at │ └── deleted_at │ ├── ssh_sessions # SSH 会话表 │ ├── id (PK) │ ├── user_id # 用户ID(关联 user_auth) │ ├── name # 会话名称 │ ├── host # 主机地址 │ ├── port # 端口 │ ├── username # 用户名 │ ├── auth_method # 认证方式 │ ├── password_encrypted # 加密密码 │ ├── private_key_encrypted # 加密私钥 │ ├── group_name # 分组名称 │ ├── server_ver # 服务器版本号 │ ├── client_ver # 客户端版本号 │ ├── last_sync_at # 最后同步时间 │ ├── created_at │ └── deleted_at │ ├── user_profiles # 用户资料表 │ ├── id (PK) │ ├── user_id # 用户ID(关联 user_auth) │ ├── username # 用户名 │ ├── bio # 简介 │ ├── avatar_base64 # 头像(Base64) │ ├── phone # 电话 │ ├── qq # QQ号 │ ├── wechat # 微信号 │ ├── server_ver # 服务器版本号 │ ├── client_ver # 客户端版本号 │ ├── last_sync_at # 最后同步时间 │ ├── created_at │ └── deleted_at │ ├── app_settings # 应用设置表 │ ├── id (PK) │ ├── server_url # 服务器地址 │ ├── auto_sync_enabled # 自动同步开关 │ ├── sync_interval_minutes # 同步间隔 │ ├── language # 语言设置 │ └── updated_at │ └── sync_state # 同步状态表 ├── id (PK) ├── last_sync_at # 最后同步时间 ├── pending_count # 待同步数量 └── conflict_count # 冲突数量 ``` #### 服务器数据库 (SQLite/MySQL/PostgreSQL) ``` ssh-terminal-server 数据库 ├── users # 用户表 │ ├── id (PK, 10位数字) │ ├── email # 邮箱(唯一) │ ├── password_hash # Argon2 密码哈希 │ ├── created_at │ └── deleted_at │ ├── user_profiles # 用户资料表 │ ├── id (PK) │ ├── user_id (FK → users.id) │ ├── username # 用户名 │ ├── bio # 简介 │ ├── avatar_base64 # 头像 │ ├── phone # 电话 │ ├── qq # QQ号 │ ├── wechat # 微信号 │ ├── server_ver # 服务器版本号 │ ├── client_ver # 客户端版本号 │ ├── last_sync_at # 最后同步时间 │ ├── created_at │ └── deleted_at │ └── ssh_sessions # SSH 会话表 ├── id (PK) ├── user_id (FK → users.id) ├── name # 会话名称 ├── host # 主机地址 ├── port # 端口 ├── username # 用户名 ├── auth_method # 认证方式 ├── password_encrypted # 加密密码 ├── private_key_encrypted # 加密私钥 ├── passphrase_encrypted # 加密私钥密码 ├── group_name # 分组名称 ├── server_ver # 服务器版本号 ├── client_ver # 客户端版本号 ├── last_sync_at # 最后同步时间 ├── created_at └── deleted_at ``` ### 数据同步策略 1. **版本控制** - 每条记录维护 `server_ver` 和 `client_ver` 两个版本号 2. **冲突检测** - 比较记录的 `updated_at` 和版本号判断冲突 3. **增量同步** - 只同步 `last_sync_at` 之后变更的数据 4. **软删除** - 使用 `deleted_at` 字段标记删除,支持数据恢复 ## 🤖 AI 功能详解 ### 支持的 AI Provider - **OpenAI** - GPT-4、GPT-3.5 等模型 - **Ollama** - 本地大模型部署 - **Qwen (通义千问)** - 阿里云大模型服务 - **Wenxin (文心一言)** - 百度大模型服务 - **其他兼容 OpenAI API 的服务** ### AI 功能模块 1. **自然语言转命令 (NL to Command)** - 在终端中按快捷键或点击按钮打开对话框 - 输入自然语言描述(如"查看当前目录下所有文件") - AI 生成对应的 Shell 命令 - 可直接插入终端或复制到剪贴板 2. **命令解释器** - 选中终端中的命令 - 调用 AI 解释命令的作用和参数 - 提供使用示例和注意事项 3. **错误分析器** - 当终端出现错误时选中错误信息 - AI 分析错误原因 - 提供解决方案和修复建议 4. **AI 对话界面** - 独立的全屏聊天界面 - 支持多轮对话和上下文理解 - 按服务器自动分组对话历史 - 支持语音输入 ### AI 配置 在设置页面的 AI 标签中配置: - 选择 AI Provider - 输入 API Key - 选择模型 - 调整参数(温度、最大 tokens 等) ## ⌨️ 快捷键系统 应用支持完整的快捷键绑定和自定义功能。 ### 默认快捷键 | 功能 | Windows/Linux | macOS | |------|---------------|-------| | 新建连接 | `Ctrl+N` | `Cmd+N` | | 关闭标签 | `Ctrl+W` | `Cmd+W` | | 切换标签 | `Ctrl+Tab` | `Cmd+Tab` | | 快速连接 | `Ctrl+Shift+K` | `Cmd+Shift+K` | | 打开设置 | `Ctrl+,` | `Cmd+,` | | NL 转命令 | `Ctrl+Shift+A` | `Cmd+Shift+A` | | 复制 | `Ctrl+Shift+C` | `Cmd+Shift+C` | | 粘贴 | `Ctrl+Shift+V` | `Cmd+Shift+V` | > 查看完整快捷键列表:[快捷键文档](./docs/Shortcuts.md) ### 自定义快捷键 1. 打开设置页面 2. 进入"快捷键"标签 3. 点击快捷键项右侧的编辑按钮 4. 按下新的快捷键组合 5. 点击保存 ## 🎬 录制功能详解 ### 录制架构 ``` 用户点击录制 ↓ 2 秒倒计时 ↓ ┌─────────────────────┐ │ 1. TerminalRecorder │ - 记录终端事件 │ (input/output) │ ├─────────────────────┤ │ 2. VideoRecorder │ - 捕获 Canvas 画面 │ canvas.captureStream(30) │ │ MediaRecorder (WebM/MP4) │ ├─────────────────────┤ │ 3. AudioCaptureManager │ - 捕获音频 │ 麦克风 + 扬声器 │ │ AudioContext 混合 │ └─────────────────────┘ ↓ 停止录制 ↓ 保存录制文件 (JSON) + 视频文件 ``` ### 录制质量设置 | 质量 | 视频码率 | 音频质量 | 适用场景 | |------|----------|----------|----------| | Low | 500 kbps | Low | 长时间录制、存储空间有限 | | Medium | 2 Mbps | Medium | 日常使用、平衡质量和大小 | | High | 5 Mbps | High | 演示、教学、需要高质量 | ### 音频录制配置 - **采样率**:48 kHz - **通道数**:单声道 - **音频缓冲区**:300 个音频包(约 5 秒) - **音频包大小**:960 样本(20ms @ 48kHz) - **扬声器音量增益**:2.0x(补偿 WASAPI Loopback 音量较低) ### 录制文件格式 - **录制文件**:JSON 格式,包含所有终端事件 - **视频文件**:WebM (VP9/VP8) 或 MP4 (H.264) - **音频**:嵌入到视频文件中 ### 回放功能 - 支持基于事件的回放 - 可调节播放速度(0.5x、1x、1.5x、2x) - 暂停/恢复播放 - 跳转到任意时间点 ## 🎨 主题系统 项目支持多种终端主题,使用 CSS 变量实现主题切换: - **One Dark** - 经典的深色主题 - **Dracula** - 优雅的深色主题 - **Nord** - 北欧风格的深色主题 - **Tokyo Night** - 现代深色主题 - **Monokai** - 经典的代码编辑器主题 - **GitHub Light** - GitHub 浅色主题 - **Solarized Light** - Solarized 浅色主题 - **Solarized Dark** - Solarized 深色主题 主题配置位于 `src/config/themes.ts`。 ## 🔐 安全特性 ### 加密存储 会话密码和密钥使用 AES-256-GCM 加密存储: - 使用 Argon2 密码派生函数生成加密密钥 - 每个会话使用唯一的随机 nonce - 支持密码和密钥两种认证方式 ### 主机密钥验证 自动检测 SSH 主机密钥变化,并在首次连接或密钥变化时提示用户确认。 ## 🛠️ 开发指南 ### 添加新的 shadcn/ui 组件 ```bash npx shadcn@latest add [component-name] ``` 示例: ```bash npx shadcn@latest add toast ``` ### 添加新的 Tauri 命令 1. 在 `src-tauri/src/commands/` 中创建或编辑命令文件 2. 使用 `#[tauri::command]` 宏标记函数 3. 在 `src-tauri/src/lib.rs` 的 `invoke_handler` 中注册命令 4. 在前端使用 `invoke('command_name', { params })` 调用 示例: ```rust // src-tauri/src/commands/example.rs #[tauri::command] fn greet(name: &str) -> String { format!("Hello, {}!", name) } ``` ```typescript // 前端调用 import { invoke } from '@tauri-apps/api/core'; const message = await invoke('greet', { name: 'World' }); ``` ### 添加新的页面 1. 在 `src/pages/` 创建页面组件 2. 在 `src/App.tsx` 的 `Routes` 中添加路由 3. 在侧边栏添加导航链接(如果需要) ### 修改主题 编辑 `src/config/themes.ts` 中的主题配置,或添加新主题。 ## 📝 代码规范 ### 前端 (React + TypeScript) - **组件命名**:使用 PascalCase(如 `MainLayout.tsx`) - **文件命名**:使用 PascalCase(组件)、camelCase(工具函数) - **类型定义**:使用 `interface` 定义对象类型,使用 `type` 定义联合类型 - **导入顺序**: 1. React 相关 2. 第三方库 3. 本地组件(使用 `@/` 别名) 4. 本地工具函数和类型 - **使用 shadcn/ui 组件**:优先使用 `src/components/ui/` 中的组件 - **状态管理**:使用 Zustand 进行全局状态管理,遵循单一数据源原则 ### 后端 (Rust) - **命名风格**:遵循 Rust 命名规范 - 类型、结构体、枚举:PascalCase - 函数、变量、模块:snake_case - 常量:SCREAMING_SNAKE_CASE - **错误处理**:使用 `Result` 和自定义错误类型(定义在 `error.rs`) - **异步编程**:使用 `async/await` 和 `tokio` 运行时 - **Tauri 命令**: - 使用 `#[tauri::command]` 宏标记命令函数 - 命令参数和返回值必须实现 `serde::Serialize` 和 `serde::Deserialize` - 在 `lib.rs` 中注册命令 ### Git 提交规范 使用清晰的提交信息: ``` ():