Add LICENSE
一款把番茄工作法「桃子化」的全栈时间管理 Web 应用:待办任务 + 桃子钟专注计时 + 数据可视化 + 本地大模型 AI 助手。
peach-focus:latest
qwen2.5vl:3b
Authorization: Bearer
/api/ws/reminder
<think>
/api/swagger-ui.html
peach-focus/ ├── index.html / vite.config.js / package.json ├── public/ # PWA manifest、sw.js、桃子吉祥物图 ├── src/ # ─── 前端 ─── │ ├── main.js # 入口:Element-Plus / Pinia / Router / i18n │ ├── layouts/MainLayout.vue # 三栏布局 + WS 提醒订阅 + 本地提醒轮询 │ ├── components/ │ │ ├── AiPanel.vue # 桃子助手(流式聊天/图片识别/任务拆解/主题切换) │ │ └── PeachIcon.vue │ ├── views/ # Home / Todos / Focus / Stats / Login / Profile │ ├── stores/ # Pinia:tasks / focus / ai / auth / theme │ ├── utils/ │ │ ├── backend.js # 后端 REST 封装(JWT 注入) │ │ ├── websocket.js # WS 提醒连接(断线 3s 重连) │ │ ├── reminder.js # 本地提醒轮询兜底 │ │ ├── taskParser.js # 自然语言 → 任务(日期/优先级解析) │ │ ├── taskExtractor.js # AI 回答 → 可入库任务/步骤提取 │ │ ├── offlineDb.js # IndexedDB 离线缓存 │ │ └── ... # stats / format / storage / llmConfig 等 │ ├── locales/ # zh / en 语言包 │ └── styles/main.css # 桃子主题 CSS 变量(含暗色) ├── backend/ # ─── 后端(Spring Boot)─── │ ├── pom.xml # Spring Boot 2.7.18 / Java 8 │ └── src/main/ │ ├── java/com/peach/focus/ │ │ ├── controller/ # Auth/Task/SubTask/Tag/Pomodoro/Stat/Ai/User/Backup/Audit │ │ ├── service/ # 业务层(ReminderService 定时扫描提醒等) │ │ ├── websocket/ # ReminderWebSocket 推送 │ │ ├── config/ # WebConfig / WebSocketConfig / 拦截器 / 限流 │ │ └── entity|mapper/ # MyBatis-Plus │ └── resources/ │ ├── application.yml │ └── db/schema.sql # 建库脚本 ├── training/ # ─── AI 微调流水线 ─── │ ├── build_dataset.py # 领域 SFT 数据集构造 │ ├── finetune_lora.py # QLoRA 微调(8GB 显存可跑) │ ├── merge_lora.py / evaluate.py │ ├── Modelfile* # Ollama 模型定义(GGUF + 系统提示词) │ └── llama.cpp/ # GGUF 转换与量化 ├── docker/ # Nginx 配置、后端 Docker 专用 application.yml ├── docker-compose.yml # MySQL + 后端 + 前端 + Ollama(可选) 编排 └── Dockerfile / backend/Dockerfile
CREATE DATABASE peach_focus DEFAULT CHARACTER SET utf8mb4; -- 导入 backend/src/main/resources/db/schema.sql
在 backend/src/main/resources/application.yml 中改成你的 MySQL 账号密码。
backend/src/main/resources/application.yml
/api
cd backend mvn spring-boot:run
ollama serve # 默认 http://127.0.0.1:11434 ollama run peach-focus # 微调后的领域模型(见 training/ 目录) # 没有微调模型时,可在 application.yml 把 ollama.model 换成 qwen2.5:3b 等通用模型 # 图片识别需要:ollama pull qwen2.5vl:3b
⚠️ 若 AI 回答异常缓慢,先 ollama ps 看 PROCESSOR 列:显示 100% CPU 说明启动时 GPU 探测失败(开机初期常见),重启 Ollama 即可恢复 GPU 推理(约 10 倍速差)。
ollama ps
100% CPU
npm install npm run dev
浏览器打开 http://localhost:5173 。Vite 已把 /api 与 /api/ws(WebSocket)代理到 :8080。
/api/ws
:8080
npx vitest run # 前端单元测试 cd backend && mvn test # 后端单元测试
# 在项目根目录准备 .env(可参考 backend/.env.example),至少包含: # MYSQL_PASSWORD=xxx JWT_SECRET=xxx PASSWORD_SALT=xxx docker compose up -d # MySQL + 后端 + 前端(Nginx :80) docker compose --profile ai up -d # 额外启动 Ollama(需 ≥6GB 内存或 ≥4GB 显存)
build_dataset.py
finetune_lora.py
merge_lora.py
llama.cpp
Modelfile
ollama create peach-focus
utils/backend.js
stream:true
/api/chat
AbortController
ReminderService
remind_at
ReminderWebSocket
MainLayout.vue
reminded
keep_alive
server.watch.ignored
一款以「桃子 🍑」为主题、基于番茄工作法的时间管理 Web 系统。 前端 Vue 3 + Pinia + Element Plus + ECharts,后端 Spring Boot + MyBatis-Plus + MySQL, 并集成本地大模型(Ollama)驱动的 AI 专注助手。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
🍑 桃子专注 · Peach Focus
一款把番茄工作法「桃子化」的全栈时间管理 Web 应用:待办任务 + 桃子钟专注计时 + 数据可视化 + 本地大模型 AI 助手。
peach-focus:latest,视觉模型qwen2.5vl:3b一、功能清单
1. 账号与安全
Authorization: Bearer)2. 待办任务(TodosView)
3. 桃子钟专注计时(FocusView)
4. 数据统计大屏(StatsView)
5. 到点提醒(双通道)
/api/ws/reminder推送,前端弹出通知6. 桃子助手(AiPanel,右侧常驻)
<think>思考标记过滤7. 其他
/api/swagger-ui.html)二、目录结构
三、本地开发运行
0. 环境要求
1. 数据库
在
backend/src/main/resources/application.yml中改成你的 MySQL 账号密码。2. 后端(端口 8080,context-path
/api)3. AI 模型(可选,不启动则 AI 助手走规则回复兜底)
4. 前端(端口 5173)
浏览器打开 http://localhost:5173 。Vite 已把
/api与/api/ws(WebSocket)代理到:8080。5. 测试
四、Docker 一键部署
五、AI 微调流水线(training/)
build_dataset.py:生成时间管理领域 SFT 数据集(任务规划、拆解、数据解读等场景)finetune_lora.py:QLoRA 4-bit 微调 Qwen2.5-3B-Instruct(RTX 4060 8GB 可训)merge_lora.py:合并 LoRA 权重 →llama.cpp转 GGUF 并量化(q8_0)Modelfile+ollama create peach-focus:注入系统提示词、few-shot 与推理参数,部署为本地服务六、实现要点
utils/backend.js统一注入 → 后端拦截器解析出 userId,所有查询强制带 userId 隔离数据stream:true调 Ollama/api/chat,逐行读 NDJSON 转发为 SSE;前端AbortController支持中断ReminderService每 60s 扫remind_at±30s 窗口 →ReminderWebSocket按 userId 推送 →MainLayout.vue订阅弹窗;前端另有 15s 本地轮询兜底,双通道以reminded标记去重keep_alive模型常驻显存;Caffeine 缓存统计查询;Viteserver.watch.ignored排除 training/dist 等大目录避免 watcher 卡死;IndexedDB 缓存任务列表实现秒开