feat: 实现CutThenThink P0阶段核心功能

项目初始化
- 创建完整项目结构(src/, data/, docs/, examples/, tests/)
- 配置requirements.txt依赖
- 创建.gitignore

P0基础框架
- 数据库模型:Record模型,6种分类类型
- 配置管理:YAML配置,支持AI/OCR/云存储/UI配置
- OCR模块:PaddleOCR本地识别,支持云端扩展
- AI模块:支持OpenAI/Claude/通义/Ollama,6种分类
- 存储模块:完整CRUD,搜索,统计,导入导出
- 主窗口框架:侧边栏导航,米白配色方案
- 图片处理:截图/剪贴板/文件选择/图片预览
- 处理流程整合:OCR→AI→存储串联,Markdown展示,剪贴板复制
- 分类浏览:卡片网格展示,分类筛选,搜索,详情查看

技术栈
- PyQt6 + SQLAlchemy + PaddleOCR + OpenAI/Claude SDK
- 共47个Python文件,4000+行代码

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
congsh
2026-02-11 18:21:31 +08:00
commit c4a77f8aa4
79 changed files with 19412 additions and 0 deletions

213
tests/test_browse_view.py Normal file
View File

@@ -0,0 +1,213 @@
"""
测试浏览视图功能
创建测试数据并启动浏览视图进行验证
"""
import sys
from datetime import datetime
from pathlib import Path
from PyQt6.QtWidgets import QApplication
from PyQt6.QtCore import Qt
# 添加项目路径
sys.path.insert(0, str(Path(__file__).parent.parent))
from src.models.database import init_database, Record, RecordCategory, get_db
from src.gui.widgets.browse_view import BrowseView
def create_test_data():
"""创建测试数据"""
print("正在创建测试数据...")
# 初始化数据库
db_path = "sqlite:////home/congsh/CodeSpace/ClaudeSpace/CutThenThink/data/cutnthink.db"
init_database(db_path)
session = get_db()
# 检查是否已有数据
existing_count = session.query(Record).count()
if existing_count > 0:
print(f"数据库中已有 {existing_count} 条记录,跳过创建测试数据")
session.close()
return
# 创建测试记录
test_records = [
{
"image_path": "/tmp/test_todo_1.png",
"ocr_text": "完成项目报告\n需要在周五之前提交季度报告给老板",
"category": RecordCategory.TODO,
"ai_result": """# 任务分析
这是一个待办事项,需要在周五之前完成。
## 行动建议
1. 整理季度数据和成果
2. 撰写报告草稿
3. 请同事审阅
4. 最终修改并提交
**截止时间**: 本周五""",
"tags": ["工作", "报告"],
"notes": "重要优先级高"
},
{
"image_path": "/tmp/test_note_1.png",
"ocr_text": "Python学习笔记\n\n1. 列表推导式: [x*2 for x in range(10)]\n2. 装饰器: @property\n3. 生成器: yield",
"category": RecordCategory.NOTE,
"ai_result": """# Python笔记摘要
这份笔记涵盖了三个重要的Python概念
- 列表推导式: 简洁的列表创建方式
- 装饰器: 修改函数行为的工具
- 生成器: 内存友好的迭代器
**建议**: 可以添加更多实际例子加深理解。""",
"tags": ["编程", "Python"],
"notes": "需要复习装饰器部分"
},
{
"image_path": "/tmp/test_idea_1.png",
"ocr_text": "产品创意:智能日程助手\n\n功能:\n- 自动识别会议邀请\n- 智能安排时间\n- 提醒重要事项",
"category": RecordCategory.IDEA,
"ai_result": """# 创意评估
这是一个很好的产品方向!
## 优势
- 解决实际痛点
- 技术可行性高
## 建议
1. 先做MVP验证核心功能
2. 考虑与现有日历应用集成
3. 加入AI推荐功能
**推荐指数**: ⭐⭐⭐⭐⭐""",
"tags": ["产品", "创意"],
"notes": "可以作为下一个项目"
},
{
"image_path": "/tmp/test_ref_1.png",
"ocr_text": "Django REST Framework 官方文档\n\nhttps://www.django-rest-framework.org/\n\nViewSets和Routers的使用",
"category": RecordCategory.REF,
"ai_result": """# 学习资源
Django REST Framework 是构建Web API的强大工具。
## 核心概念
- **Serializers**: 数据序列化和验证
- **ViewSets**: 视图逻辑组织
- **Routers**: URL自动生成
## 建议学习路径
1. 快速入门教程
2. 序列化器深入
3. 认证和权限""",
"tags": ["文档", "Django"],
"notes": "需要深入学习认证部分"
},
{
"image_path": "/tmp/test_funny_1.png",
"ocr_text": "程序员段子\n\n程序员最讨厌的四件事:\n1. 写注释\n2. 写文档\n3. 别人不写注释\n4. 别人不写文档",
"category": RecordCategory.FUNNY,
"ai_result": """# 😄 经典段子
这是一个程序员圈子里很火的段子!
## 为什么好笑
- 说出了程序员的心声
- 既矛盾又真实
- 自嘲式幽默
## 启示
代码质量很重要,但也不能忽视文档工作啊~ 😅""",
"tags": ["幽默", "程序员"],
"notes": "太真实了"
},
{
"image_path": "/tmp/test_text_1.png",
"ocr_text": "这是一段普通的文本内容,用于测试纯文本类型的记录。\n\n可以包含各种文字信息,比如会议记录、聊天记录等。",
"category": RecordCategory.TEXT,
"ai_result": None,
"tags": ["测试"],
"notes": "测试用文本记录"
},
# TODO类型更多测试数据
{
"image_path": "/tmp/test_todo_2.png",
"ocr_text": "买咖啡 ☕\n\n- 意式浓缩豆\n- 拿铁咖啡豆\n- 滤纸",
"category": RecordCategory.TODO,
"ai_result": "# 购物清单\n\n记得去超市买咖啡用品!",
"tags": ["购物", "咖啡"],
"notes": "周末去买"
},
# NOTE类型更多测试数据
{
"image_path": "/tmp/test_note_2.png",
"ocr_text": "会议记录 - 产品评审\n\n日期: 2024-01-15\n\n讨论内容:\n1. 新功能开发计划\n2. 用户反馈处理\n3. 下季度规划",
"category": RecordCategory.NOTE,
"ai_result": """# 会议要点
## 产品评审会议
**日期**: 2024-01-15
### 决策事项
1. 新功能开发优先级已确定
2. 用户反馈需要建立跟进机制
3. 下季度开始筹备规划会议
### 行动项
- [ ] 整理会议纪要
- [ ] 跟进各个部门负责人""",
"tags": ["会议", "工作"],
"notes": "重要会议"
},
]
# 添加记录到数据库
for i, data in enumerate(test_records):
record = Record(
image_path=data["image_path"],
ocr_text=data["ocr_text"],
category=data["category"],
ai_result=data.get("ai_result"),
tags=data.get("tags"),
notes=data.get("notes"),
created_at=datetime.now(),
)
session.add(record)
print(f"已创建测试记录 {i+1}/{len(test_records)}: {data['category']}")
session.commit()
print(f"\n成功创建 {len(test_records)} 条测试记录")
session.close()
def main():
"""主函数"""
# 创建应用
app = QApplication(sys.argv)
app.setApplicationName("CutThenThink 浏览视图测试")
# 创建测试数据
create_test_data()
# 创建并显示浏览视图
view = BrowseView()
view.setWindowTitle("浏览视图测试")
view.resize(1200, 800)
view.show()
# 运行应用
sys.exit(app.exec())
if __name__ == "__main__":
main()