feat: overhaul UI styling, improve templates, enhance services and tests
This commit is contained in:
+6
-2
@@ -74,7 +74,9 @@ async def admin_crawl(
|
||||
db.commit()
|
||||
except Exception:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=409, detail=f"Crawl already running for {target_date}")
|
||||
raise HTTPException(
|
||||
status_code=409, detail=f"Crawl already running for {target_date}"
|
||||
)
|
||||
|
||||
try:
|
||||
result = await crawl_daily(db, target_date)
|
||||
@@ -96,7 +98,9 @@ async def admin_summarize_batch(
|
||||
"""批量总结所有 pending 论文。"""
|
||||
result = await summarize_batch(db)
|
||||
if result.get("status") == "conflict":
|
||||
raise HTTPException(status_code=409, detail=result.get("error", "batch already running"))
|
||||
raise HTTPException(
|
||||
status_code=409, detail=result.get("error", "batch already running")
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
|
||||
+27
-15
@@ -58,10 +58,13 @@ def day_page(date_str: str, request: Request, db: Session = Depends(get_db)):
|
||||
.limit(30)
|
||||
.all()
|
||||
)
|
||||
available_dates = [d[0].isoformat() if isinstance(d[0], date) else str(d[0]) for d in dates_raw]
|
||||
available_dates = [
|
||||
d[0].isoformat() if isinstance(d[0], date) else str(d[0]) for d in dates_raw
|
||||
]
|
||||
|
||||
return templates.TemplateResponse(
|
||||
request, "index.html",
|
||||
request,
|
||||
"index.html",
|
||||
{
|
||||
"papers": papers,
|
||||
"current_date": date_str,
|
||||
@@ -105,7 +108,8 @@ def paper_detail(arxiv_id: str, request: Request, db: Session = Depends(get_db))
|
||||
images = _get_paper_images(arxiv_id)
|
||||
|
||||
return templates.TemplateResponse(
|
||||
request, "detail.html",
|
||||
request,
|
||||
"detail.html",
|
||||
{
|
||||
"paper": paper,
|
||||
"summary_state": summary_state,
|
||||
@@ -166,7 +170,11 @@ def _get_similar_papers(db: Session, arxiv_id: str, top_k: int = 6) -> list[dict
|
||||
|
||||
# 从 DB 加载论文信息
|
||||
similar_ids = results["ids"][0]
|
||||
distances = results["distances"][0] if results["distances"] else [0.0] * len(similar_ids)
|
||||
distances = (
|
||||
results["distances"][0]
|
||||
if results["distances"]
|
||||
else [0.0] * len(similar_ids)
|
||||
)
|
||||
|
||||
# 排除自身
|
||||
papers_info = {}
|
||||
@@ -186,13 +194,15 @@ def _get_similar_papers(db: Session, arxiv_id: str, top_k: int = 6) -> list[dict
|
||||
|
||||
items = []
|
||||
for p in papers:
|
||||
items.append({
|
||||
"arxiv_id": p.arxiv_id,
|
||||
"title_zh": p.title_zh or p.title_en,
|
||||
"distance": papers_info.get(p.arxiv_id, 0.0),
|
||||
"paper_date": p.paper_date.isoformat() if p.paper_date else "",
|
||||
"tags": [t.tag for t in p.tags[:3]],
|
||||
})
|
||||
items.append(
|
||||
{
|
||||
"arxiv_id": p.arxiv_id,
|
||||
"title_zh": p.title_zh or p.title_en,
|
||||
"distance": papers_info.get(p.arxiv_id, 0.0),
|
||||
"paper_date": p.paper_date.isoformat() if p.paper_date else "",
|
||||
"tags": [t.tag for t in p.tags[:3]],
|
||||
}
|
||||
)
|
||||
|
||||
# 按距离排序
|
||||
items.sort(key=lambda x: x["distance"])
|
||||
@@ -215,8 +225,10 @@ def _get_paper_images(arxiv_id: str) -> list[dict]:
|
||||
images = []
|
||||
for img_file in sorted(images_dir.iterdir()):
|
||||
if img_file.suffix.lower() in (".png", ".jpg", ".jpeg", ".gif", ".svg"):
|
||||
images.append({
|
||||
"url": f"/papers/{arxiv_id}/images/{img_file.name}",
|
||||
"name": img_file.name,
|
||||
})
|
||||
images.append(
|
||||
{
|
||||
"url": f"/papers/{arxiv_id}/images/{img_file.name}",
|
||||
"name": img_file.name,
|
||||
}
|
||||
)
|
||||
return images
|
||||
|
||||
@@ -34,7 +34,9 @@ def search_page(
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""搜索页面,支持 keyword 和 semantic 模式。"""
|
||||
result = search_papers(db, query=q or None, tag=tag or None, sort=sort, page=page, mode=mode)
|
||||
result = search_papers(
|
||||
db, query=q or None, tag=tag or None, sort=sort, page=page, mode=mode
|
||||
)
|
||||
all_tags = get_all_tags(db)
|
||||
|
||||
return templates.TemplateResponse(
|
||||
@@ -72,7 +74,9 @@ def search_api(
|
||||
db: Session = Depends(get_db),
|
||||
):
|
||||
"""搜索 JSON API,支持 keyword 和 semantic 模式。"""
|
||||
result = search_papers(db, query=q or None, tag=tag or None, sort=sort, page=page, mode=mode)
|
||||
result = search_papers(
|
||||
db, query=q or None, tag=tag or None, sort=sort, page=page, mode=mode
|
||||
)
|
||||
distances = result.get("distances", {})
|
||||
|
||||
items = []
|
||||
@@ -170,7 +174,9 @@ def _generate_rss_xml(papers: list[Paper], base_url: str, tag: str | None) -> st
|
||||
channel_title += f" — {tag}"
|
||||
lines.append(f" <title>{escape(channel_title)}</title>")
|
||||
lines.append(f" <link>{escape(base_url)}</link>")
|
||||
lines.append(" <description>HuggingFace Daily Papers — 中文论文导览站</description>")
|
||||
lines.append(
|
||||
" <description>HuggingFace Daily Papers — 中文论文导览站</description>"
|
||||
)
|
||||
lines.append(" <language>zh-CN</language>")
|
||||
|
||||
for paper in papers:
|
||||
|
||||
Reference in New Issue
Block a user