feat: add admin dashboard, pipeline service, lightbox, and update dependencies

This commit is contained in:
2026-06-09 09:32:10 +08:00
parent 0d293422ac
commit 32978b3fc5
50 changed files with 4054 additions and 1618 deletions
+34 -7
View File
@@ -1,6 +1,6 @@
"""SQLAlchemy ORM 模型 — papers, authors, tags, summaries, user data, logs, locks。"""
from datetime import date, datetime
from enum import StrEnum
from sqlalchemy import (
Boolean,
@@ -8,17 +8,29 @@ from sqlalchemy import (
Date,
DateTime,
ForeignKey,
Index,
Integer,
String,
Text,
UniqueConstraint,
)
from sqlalchemy.orm import relationship
from sqlalchemy.orm import joinedload, relationship
from app.database import Base
# ── 枚举 ────────────────────────────────────────────────────────────────
class SummaryState(StrEnum):
"""总结状态枚举 — 对应 summary_status.status 列。"""
PENDING = "pending"
PROCESSING = "processing"
DONE = "done"
FAILED = "failed"
PERMANENT_FAILURE = "permanent_failure"
# ── papers ──────────────────────────────────────────────────────────────
class Paper(Base):
__tablename__ = "papers"
@@ -35,10 +47,6 @@ class Paper(Base):
hf_url = Column(String)
arxiv_url = Column(String)
pdf_url = Column(String)
source_url = Column(String)
asset_status = Column(String, default="not_downloaded")
asset_error = Column(String)
meta_path = Column(String)
summary_path = Column(String)
raw_output_path = Column(String)
summary_quality = Column(String)
@@ -170,6 +178,7 @@ class CrawlLog(Base):
papers_found = Column(Integer)
papers_new = Column(Integer)
error = Column(Text)
details_json = Column(Text) # 任务专用元数据 JSON(如 cleanup: {scanned, removed}
started_at = Column(DateTime, nullable=False)
completed_at = Column(DateTime)
@@ -244,3 +253,21 @@ class DataDeleteJob(Base):
error = Column(Text)
started_at = Column(DateTime, nullable=False)
completed_at = Column(DateTime)
# ── 常用 joinedload 选项集 ──────────────────────────────────────────────
# 避免在各路由/服务中重复写 .options(joinedload(Paper.authors), ...)
PAPER_DEFAULT_LOAD = (
joinedload(Paper.authors),
joinedload(Paper.tags),
joinedload(Paper.summary_status),
)
PAPER_FULL_LOAD = (
joinedload(Paper.authors),
joinedload(Paper.tags),
joinedload(Paper.summary_status),
joinedload(Paper.bookmark),
joinedload(Paper.reading_status),
)