EasyCode 是一个面向算法学习者的本地 AI 刷题平台。它把 LeetCode 式的三栏刷题体验、Monaco Python 编辑器、计时练习、代码快照、LLM 评测复盘和 SRS 间隔复习串成一个完整闭环。
它适合已经读过算法讲解、但需要大量动手练习的人。传统刷题平台通常只告诉你“通过/不通过”,EasyCode 更关注“你是怎么写出来的”:哪里卡住、什么时候改了思路、复杂度是否合理、代码质量还有哪些提升空间。提交后,LLM 会基于最终代码和过程快照给出结构化反馈,让每次练习都变成一次可复盘、可追踪、可安排复习的训练。
EasyCode 不绑定固定题库。仓库只附带少量示例题,你可以把自己的题目 Markdown 放入 Code/,一键导入后变成个人专属刷题系统。
提交后,后端会调用 OpenAI 兼容的 LLM endpoint,生成一份 5 维评测报告:
| 维度 | 内容 |
|---|---|
| 编译判断 | 静态语法判断与问题清单 |
| 代码质量 | 可读性、风格、边界条件与常见陷阱 |
| 复杂度分析 | 时间/空间复杂度与推导说明 |
| 优化建议 | 可替代算法与局部改进方向 |
| 过程复盘 | 基于代码快照分析解题过程 |
评测会给出 A/B/C/D 评级,并支持手动覆盖评级。
练习过程中,前端每 30 秒采集一次代码快照。提交时,EasyCode 不只发送最终答案,也会把关键时间线交给 LLM 分析。你可以在历史页面逐帧回放当时的代码变化,复盘思路转折和卡点。
LLM 评级会直接驱动 SRS 复习计划:
| 评级 | 下次复习 |
|---|---|
| A | 14 天后 |
| B | 7 天后 |
| C | 3 天后 |
| D | 1 天后 |
待复习题会聚合到导航栏,帮助你把一次性刷题变成持续训练。
数据默认保存在本地 SQLite。代码草稿、提交记录、快照、评测结果都属于你自己的本地学习资产。LLM provider 可自由切换,支持 DeepSeek、Qwen、OpenRouter 或本地 Ollama 等 OpenAI 兼容服务。
| 工具 | 版本 |
|---|---|
| Python | 3.11+ |
| uv | latest |
| Node.js | 20+ |
| pnpm | 9+ |
| LLM | 任意 OpenAI 兼容 endpoint |
git clone https://github.com/Dreamaker-TA/EasyCode.git
cd EasyCode
./scripts/bootstrap.sh首次执行会从 .env.example 复制 .env 并提示你填写 LLM_API_KEY。
编辑 .env:
LLM_BASE_URL=https://api.deepseek.com/v1
LLM_API_KEY=replace-with-your-api-key
LLM_MODEL=deepseek-chat填完后再次运行:
./scripts/bootstrap.shmake dev浏览器打开:
http://localhost:5173
EasyCode 使用 Markdown 作为题库源。仓库内置少量示例题用于跑通流程,你可以把自己的题目放进:
Code/<章节>/<题号_标题>.md
然后执行:
make ingest题目格式见 Code/PROJECT_GUIDE.md。
题库列表
|
三栏刷题界面
|
计时练习与快照状态
|
LLM 评测结果
|
graph LR
A[选择题目] --> B[计时练习]
B --> C[30s 代码快照]
C --> D[提交代码]
D --> E[LLM 评测]
E --> F[A/B/C/D 评级]
F --> G[SRS 复习计划]
E --> H[历史回放]
| 变量 | 说明 | 默认值 |
|---|---|---|
LLM_BASE_URL |
OpenAI 兼容 API 地址 | https://api.deepseek.com/v1 |
LLM_API_KEY |
LLM API key | 必填 |
LLM_MODEL |
模型名 | deepseek-chat |
DB_PATH |
SQLite 路径 | backend/data/easycode.db |
CORS_ORIGINS |
后端允许来源 | http://localhost:5173,http://127.0.0.1:5173 |
VITE_API_BASE |
前端 API 地址 | http://127.0.0.1:8000/api |
常用 provider 示例:
# DeepSeek
LLM_BASE_URL=https://api.deepseek.com/v1
LLM_API_KEY=replace-with-your-deepseek-key
LLM_MODEL=deepseek-chat
# Qwen
LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
LLM_API_KEY=replace-with-your-qwen-key
LLM_MODEL=qwen-max
# OpenRouter
LLM_BASE_URL=https://openrouter.ai/api/v1
LLM_API_KEY=replace-with-your-openrouter-key
LLM_MODEL=anthropic/claude-3.5-sonnet
# Ollama
LLM_BASE_URL=http://localhost:11434/v1
LLM_API_KEY=ollama
LLM_MODEL=qwen2.5-coder:14b| 命令 | 说明 |
|---|---|
make dev |
同时启动前后端 |
make backend |
只启动后端 |
make frontend |
只启动前端 |
make install |
安装前后端依赖 |
make ingest |
重新导入题库 |
make migrate |
执行数据库迁移 |
make seed |
灌入题库数据 |
make clean |
清理依赖、数据库与导入产物 |
- Backend: FastAPI, SQLAlchemy, Alembic, Pydantic, SQLite, OpenAI-compatible SDK
- Frontend: React, TypeScript, Vite, Monaco Editor, TanStack Query, axios
- Tooling: uv, pnpm, Makefile
检查 .env 中的 LLM_API_KEY。等号后应该直接写 key 字面值,不要带引号、反引号或列表前缀。
确认 .env 的 CORS_ORIGINS 包含当前前端地址,例如 http://localhost:5173。
可以执行:
make clean && ./scripts/bootstrap.sh这会删除本地 SQLite 数据库,提交历史会丢失。重要练习记录建议定期备份:
cp backend/data/easycode.db ~/easycode_backup.dbIf EasyCode helps your algorithm practice become more deliberate, give it a star.



