paper.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. """
  2. 论文模型
  3. """
  4. from datetime import datetime
  5. from typing import Optional, List, Dict, Any
  6. from pydantic import BaseModel, Field
  7. from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean, Float, JSON
  8. from sqlalchemy.ext.declarative import declarative_base
  9. Base = declarative_base()
  10. class PaperDB(Base):
  11. """论文数据库模型"""
  12. __tablename__ = "papers"
  13. id = Column(Integer, primary_key=True, index=True)
  14. title = Column(String(500), nullable=False, index=True)
  15. authors = Column(Text) # JSON格式存储作者列表
  16. abstract = Column(Text)
  17. keywords = Column(Text) # JSON格式存储关键词
  18. publication_year = Column(Integer)
  19. journal = Column(String(200))
  20. doi = Column(String(100), unique=True, index=True)
  21. arxiv_id = Column(String(50), unique=True, index=True)
  22. pdf_url = Column(String(500))
  23. pdf_path = Column(String(500))
  24. full_text = Column(Text)
  25. embeddings = Column(JSON) # 存储向量嵌入
  26. metadata = Column(JSON) # 存储额外的元数据
  27. quality_score = Column(Float, default=0.0)
  28. relevance_score = Column(Float, default=0.0)
  29. is_processed = Column(Boolean, default=False)
  30. user_id = Column(Integer, index=True)
  31. created_at = Column(DateTime, default=datetime.utcnow)
  32. updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
  33. class Paper(BaseModel):
  34. """论文响应模型"""
  35. id: int
  36. title: str
  37. authors: List[str]
  38. abstract: Optional[str] = None
  39. keywords: List[str] = []
  40. publication_year: Optional[int] = None
  41. journal: Optional[str] = None
  42. doi: Optional[str] = None
  43. arxiv_id: Optional[str] = None
  44. pdf_url: Optional[str] = None
  45. quality_score: float = 0.0
  46. relevance_score: float = 0.0
  47. is_processed: bool = False
  48. created_at: datetime
  49. class Config:
  50. from_attributes = True
  51. class PaperCreate(BaseModel):
  52. """论文创建模型"""
  53. title: str = Field(..., min_length=1, max_length=500)
  54. authors: List[str] = []
  55. abstract: Optional[str] = None
  56. keywords: List[str] = []
  57. publication_year: Optional[int] = None
  58. journal: Optional[str] = None
  59. doi: Optional[str] = None
  60. arxiv_id: Optional[str] = None
  61. pdf_url: Optional[str] = None
  62. class PaperUpdate(BaseModel):
  63. """论文更新模型"""
  64. title: Optional[str] = None
  65. authors: Optional[List[str]] = None
  66. abstract: Optional[str] = None
  67. keywords: Optional[List[str]] = None
  68. publication_year: Optional[int] = None
  69. journal: Optional[str] = None
  70. quality_score: Optional[float] = None
  71. relevance_score: Optional[float] = None
  72. class PaperSearch(BaseModel):
  73. """论文搜索模型"""
  74. query: str = Field(..., min_length=1)
  75. filters: Dict[str, Any] = {}
  76. sort_by: str = "relevance"
  77. limit: int = Field(default=20, ge=1, le=100)
  78. offset: int = Field(default=0, ge=0)
  79. class PaperAnalysis(BaseModel):
  80. """论文分析结果"""
  81. paper_id: int
  82. summary: str
  83. key_findings: List[str]
  84. methodology: str
  85. limitations: List[str]
  86. future_work: List[str]
  87. novelty_score: float
  88. impact_score: float
  89. confidence_score: float