目录

🍑 桃子专注 · Peach Focus

一款把番茄工作法「桃子化」的全栈时间管理 Web 应用:待办任务 + 桃子钟专注计时 + 数据可视化 + 本地大模型 AI 助手。

  • 前端:Vue 3 + Pinia + Vue Router + Element-Plus + ECharts + vue-i18n(Vite 构建,PWA 离线缓存)
  • 后端:Spring Boot 2.7 (Java 8) + MyBatis-Plus + MySQL 8 + JWT + WebSocket + Caffeine 缓存
  • AI 端:Ollama 本地推理,主力模型为基于 Qwen2.5-3B-Instruct 微调(QLoRA)peach-focus:latest,视觉模型 qwen2.5vl:3b
  • 部署:Docker Compose 一键编排(MySQL / 后端 / Nginx 前端 / Ollama 可选)

一、功能清单

1. 账号与安全

  • 注册 / 登录,JWT 令牌鉴权(Authorization: Bearer
  • BCrypt 密码加密、修改密码、登录接口限流(5 次/分钟)
  • 接口层用户数据隔离(防越权访问)、参数校验、操作审计

2. 待办任务(TodosView)

  • 任务 CRUD,四级优先级:紧急最高 / 高 / 普通 / 低
  • 子任务(子事项)独立勾选,全部完成自动完成主任务
  • 截止日期、到点提醒(remindAt)、重复规则、标签、拖拽排序
  • 按优先级 / 时间范围(今天、本周、已逾期)/ 标签筛选
  • 一键「去专注」把任务绑定到计时器
  • IndexedDB 离线缓存,先读缓存秒开、后台同步后端

3. 桃子钟专注计时(FocusView)

  • 绑定任务开始专注,自定义专注 / 休息时长(个人中心可设默认值)
  • 计时中页面锁定、暂停 / 继续 / 结束二次确认、结束提示音
  • 专注记录自动归档到后端(pomodoro_record),驱动统计

4. 数据统计大屏(StatsView)

  • 今日 / 本周 / 本月 KPI:专注总时长、桃子钟数、完成任务、完成率、日均专注、最佳时段
  • ECharts:专注时长趋势、完成率仪表盘、优先级分布、热力图等
  • AI 周报生成、报告导出(jsPDF + html2canvas)
  • 日间 / 夜间双主题自适应配色

5. 到点提醒(双通道)

  • WebSocket 实时推送:后端每 60s 扫描到点任务,经 /api/ws/reminder 推送,前端弹出通知
  • 本地轮询兜底:前端每 15s 扫描任务 remindAt,离线也能提醒
  • 双通道去重,同一任务只弹一次;另支持浏览器系统通知

6. 桃子助手(AiPanel,右侧常驻)

  • 流式问答:SSE 逐字输出,可中途「停止回答」,支持引用追问
  • 自然语言建任务:「明天下午3点提醒我开组会」→ 自动解析日期/时间/优先级并创建待办
  • 图片识别建任务:上传截图(待办清单、聊天记录、课表等),视觉模型提取任务列表,勾选后批量导入
  • 上下文增强:注入当前任务、本周专注数据、近期相关任务(轻量 RAG)、多轮对话历史
  • AI 周报、任务拆解一键入库(拆解步骤可加为子事项 / 新任务 / 按天计划)
  • 算术预计算(后端先算好再交给模型,杜绝算错)、<think> 思考标记过滤
  • 对话历史持久化(MySQL),支持查看与再次提问
  • 后端 / 模型不可用时自动回退到内置规则回复

7. 其他

  • 日间 / 夜间「桃子」双主题(CSS 变量 + Element-Plus dark)
  • 中英文切换(vue-i18n)
  • PWA:Service Worker 缓存、离线可用
  • Swagger 接口文档(springdoc,/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

三、本地开发运行

0. 环境要求

  • Node 16+、JDK 8+、Maven 3.6+、MySQL 8、Ollama(AI 功能需要)

1. 数据库

CREATE DATABASE peach_focus DEFAULT CHARACTER SET utf8mb4;
-- 导入 backend/src/main/resources/db/schema.sql

backend/src/main/resources/application.yml 中改成你的 MySQL 账号密码。

2. 后端(端口 8080,context-path /api

cd backend
mvn spring-boot:run

3. AI 模型(可选,不启动则 AI 助手走规则回复兜底)

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 倍速差)。

4. 前端(端口 5173)

npm install
npm run dev

浏览器打开 http://localhost:5173 。Vite 已把 /api/api/ws(WebSocket)代理到 :8080

5. 测试

npx vitest run               # 前端单元测试
cd backend && mvn test       # 后端单元测试

四、Docker 一键部署

# 在项目根目录准备 .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 显存)

五、AI 微调流水线(training/)

  1. build_dataset.py:生成时间管理领域 SFT 数据集(任务规划、拆解、数据解读等场景)
  2. finetune_lora.py:QLoRA 4-bit 微调 Qwen2.5-3B-Instruct(RTX 4060 8GB 可训)
  3. merge_lora.py:合并 LoRA 权重 → llama.cpp 转 GGUF 并量化(q8_0)
  4. Modelfile + ollama create peach-focus:注入系统提示词、few-shot 与推理参数,部署为本地服务

六、实现要点

  • 鉴权链路:登录签发 JWT → 前端 utils/backend.js 统一注入 → 后端拦截器解析出 userId,所有查询强制带 userId 隔离数据
  • 流式问答:后端以 stream:true 调 Ollama /api/chat,逐行读 NDJSON 转发为 SSE;前端 AbortController 支持中断
  • 实时提醒ReminderService 每 60s 扫 remind_at ±30s 窗口 → ReminderWebSocket 按 userId 推送 → MainLayout.vue 订阅弹窗;前端另有 15s 本地轮询兜底,双通道以 reminded 标记去重
  • 性能:Ollama keep_alive 模型常驻显存;Caffeine 缓存统计查询;Vite server.watch.ignored 排除 training/dist 等大目录避免 watcher 卡死;IndexedDB 缓存任务列表实现秒开
  • 可靠性:AI / 后端不可用时前端规则兜底;WS 断线 3 秒自动重连;算术表达式后端预计算防止模型算错
关于

一款以「桃子 🍑」为主题、基于番茄工作法的时间管理 Web 系统。 前端 Vue 3 + Pinia + Element Plus + ECharts,后端 Spring Boot + MyBatis-Plus + MySQL, 并集成本地大模型(Ollama)驱动的 AI 专注助手。

3.0 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号