版本: v1.0
日期: 2026-01-16
状态: 草稿 (Draft)
本文档旨在为 LovingCode 平台提供详细的技术实现方案。基于产品需求文档 (PRD v1.0),我们将构建一个以 "From Coding to Architecting" 为核心理念的 AI 辅助编程挑战平台。
核心技术目标:
- 高性能交互: 复杂的编辑器状态同步与流式 AI 响应。
- 安全沙盒: 隔离执行用户生成的代码,防止恶意攻击。
- 可扩展性: 支持多种 LLM 模型切换及高并发评测。
- 核心框架: Vue 3 (Composition API)
- 构建工具: Vite
- 语言: TypeScript
- 状态管理: Pinia (持久化 + 复杂状态流转)
- UI 组件库: Tailwind CSS (原子化样式) + Element Plus (通用组件)
- 代码编辑器: Monaco Editor (VS Code 内核)
- 路由管理: Vue Router 4
- 数据获取: Axios + TanStack Query (Vue Query)
- 实时通信: Socket.io Client
- 运行环境: Node.js (v20+ LTS)
- Web 框架: NestJS (推荐) 或 Express (考虑到架构扩展性,建议使用 NestJS)
- 语言: TypeScript
- API 协议: RESTful API (常规业务) + WebSocket (代码运行输出、AI流式对话)
- ORM: Prisma 或 TypeORM
- 队列服务: BullMQ (基于 Redis,用于处理代码执行任务队列)
- 数据库: PostgreSQL (存储用户、题目、提交记录)
- 缓存/消息代理: Redis (Session 缓存、任务队列、实时消息)
- 代码沙盒: Docker + gVisor (安全容器运行时)
- 对象存储: AWS S3 / MinIO (存储题目资源、图片)
graph TD
Client[Vue 3 Client] -->|REST API| Gateway[API Gateway / Load Balancer]
Client -->|WebSocket| Gateway
Gateway --> Service_Auth[Auth Service]
Gateway --> Service_Core[Core API Service]
Service_Core --> DB[(PostgreSQL)]
Service_Core --> Cache[(Redis)]
Service_Core --> Queue[Task Queue (Redis)]
Queue --> Worker_Sandbox[Sandbox Worker (Node.js)]
Worker_Sandbox --> Docker[Docker Engine]
Service_Core --> Service_LLM[LLM Gateway Service]
Service_LLM --> OpenAI[OpenAI API]
Service_LLM --> Anthropic[Anthropic API]
src/
├── assets/ # 静态资源
├── components/ # 通用基础组件 (Button, Modal)
├── composables/ # 组合式函数 (useAuth, useWebSocket)
├── layouts/ # 页面布局 (MainLayout, AuthLayout)
├── modules/ # 业务模块 (核心)
│ ├── challenge/ # 挑战相关
│ │ ├── components/ # 题目面板, 约束条
│ │ └── store/ # 题目状态
│ ├── workshop/ # 代码工作台
│ │ ├── components/ # MonacoWrapper, Terminal, DiffView
│ │ └── composables/# 代码执行逻辑
│ └── commander/ # Prompt 指令台
│ ├── components/ # PromptEditor, ChatHistory
│ └── utils/ # Prompt 模板处理
├── router/ # 路由配置
├── services/ # API 接口封装
├── stores/ # 全局状态 (User, Settings)
└── utils/ # 工具函数
MonacoEditor.vue: 封装 Monaco Editor 实例。- Props:
code,language,readOnly,decorations(用于 Cue 高亮). - Events:
update:code,selection-change(触发 Cue 悬浮).
- Props:
DiffViewer.vue: 使用 Monaco Editor 的 Diff Editor 模式,展示 AI 修改前后的对比。TerminalPanel.vue: 集成xterm.js,通过 WebSocket 连接后端容器流。
PromptInput.vue: 支持 Slash Command (/) 的富文本输入框。ThoughtTree.vue: 可视化展示思维链分支 (Tree of Thoughts),允许用户回溯和分叉对话。
CueFloatingWidget.vue: 监听编辑器选区事件,计算绝对坐标进行定位。- 功能: 输入微调指令,调用
In-painting接口。
- 功能: 输入微调指令,调用
useChallengeStore:currentChallenge: 题目详情。constraints: 当前 Token/Turn 消耗情况。
useWorkshopStore:files: 虚拟文件系统结构。activeFile: 当前编辑文件。executionStatus: 运行中/成功/失败。
useChatStore:messages: 对话历史 (Role, Content)。branches: 思维链分支数据。
- 处理注册、登录、JWT 签发。
- 集成 GitHub/Google OAuth。
- 管理题目 CRUD。
- 获取题目详情、附件、约束条件。
- Prompt Manager: 组装 System Prompt,注入题目上下文 (Context)。
- Model Router: 根据策略路由到 GPT-4o 或 GPT-4o-mini。
- Token Counter: 计算消耗,更新用户配额。
- Streaming Service: 处理流式响应,推送到前端。
- Container Manager: 使用
dockerode库管理容器生命周期。 - Execution Strategy: 针对不同语言 (JS, Python) 的执行策略。
- Output Stream: 捕获容器
stdout/stderr并通过 WebSocket 转发。
Users (用户表)
id(UUID)email,usernametoken_balance(剩余 Token 数)
Challenges (题目表)
id(UUID)title,description(Markdown)difficultyconstraints(JSON: { max_tokens, max_turns, allowed_models })starter_code(Text)test_cases(JSON/Text)
Sessions (挑战会话表)
id(UUID)user_id,challenge_idstatus(active, completed)token_usage,turn_count
Prompts (对话记录表)
id(UUID)session_idrole(user, assistant, system)content(Text)parent_id(UUID, 用于支持思维链分支)
Executions (执行记录表)
id(UUID)session_idcode_snapshotoutputstatus(success, error)score
为了安全运行用户代码,我们将采用 按需容器 方案。
- 触发: 用户点击 "Run Code"。
- 创建: 后端
SandboxService收到请求,分配一个唯一的execution_id。 - 启动: 使用 Docker 启动一个临时容器(限制 CPU/内存/网络)。
- 镜像:
lovingcode-runtime-node或lovingcode-runtime-python。 - 挂载: 将用户代码作为 Volume 挂载或写入容器
/app目录。
- 镜像:
- 执行: 运行
npm test或python main.py。 - 流式反馈: Docker 的 Log Stream 通过 WebSocket 实时推送到前端
TerminalPanel。 - 清理: 执行结束后立即销毁容器,或保留短时间以供复用(Warm Pool 策略)。
如何实现只修改选中的 5 行代码?
- 前端: 获取选区代码
selection,以及选区前代码prefix和选区后代码suffix。 - 后端: 构造特殊的 Prompt 给 LLM。
You are a code editing assistant. Original Code Context: [PRE] ${prefix} [SEL] ${selection} [SUF] ${suffix} User Instruction: "${user_cue}" Task: Rewrite the [SEL] part to satisfy the instruction. Output ONLY the replaced code. - 应用: 前端接收到新代码,使用
Monaco的executeEditsAPI 替换选区。
当 AI 生成全新版本的代码时:
- 后端不直接覆盖文件。
- 前端接收到 AI 响应的新代码字符串。
- 调用
monaco.editor.createDiffEditor。 Original Model= 当前编辑器内容。Modified Model= AI 生成的内容。- 用户在 Diff 视图中逐个或全部 Accept 变更。
- CI/CD: GitHub Actions 自动构建 Docker 镜像并部署。
- 前端托管: Vercel (自动对接 GitHub)。
- 后端托管: AWS EC2 或 DigitalOcean Droplet (Docker Compose 编排)。
- 监控:
- Sentry: 前后端错误追踪。
- Prometheus + Grafana: 监控 API 延迟、容器数量、Token 消耗速率。
- 初始化仓库: 设置 Monorepo (Turborepo) 或独立仓库。
- 搭建基础脚手架: 配置 Vue 3 + Tailwind, NestJS + Prisma。
- PoC (概念验证): 实现一个简单的 "Hello World" 代码通过 API 在 Docker 中运行并返回结果。