feat: overhaul UI styling, improve templates, enhance services and tests

This commit is contained in:
2026-06-06 00:38:56 +08:00
parent f7f1a4c0cb
commit 904eec392e
38 changed files with 1471 additions and 795 deletions
+37 -13
View File
@@ -90,12 +90,24 @@ def search_papers(
if match_expr:
return _search_with_fts(
db, match_expr, tag_join, tag_where, tag_params,
sort, page, page_size, offset,
db,
match_expr,
tag_join,
tag_where,
tag_params,
sort,
page,
page_size,
offset,
)
else:
return _search_tag_only(
db, tag, sort, page, page_size, offset,
db,
tag,
sort,
page,
page_size,
offset,
)
@@ -114,7 +126,11 @@ def _search_with_fts(
params = {"query": match_expr, "limit": page_size, "offset": offset}
params.update(tag_params)
order = "bm25(papers_fts)" if sort == "relevance" else "p.paper_date DESC, p.upvotes DESC"
order = (
"bm25(papers_fts)"
if sort == "relevance"
else "p.paper_date DESC, p.upvotes DESC"
)
# ── 主查询:取 ID + rank + snippet ──
rows_sql = text(f"""
@@ -145,12 +161,11 @@ def _search_with_fts(
total = db.execute(count_sql, params).scalar() or 0
paper_ids = [row[0] for row in fts_rows]
snippets = {
row[0]: {"title_zh": row[2], "abstract": row[3]}
for row in fts_rows
}
snippets = {row[0]: {"title_zh": row[2], "abstract": row[3]} for row in fts_rows}
papers = _load_papers_by_ids(db, paper_ids, sort, {row[0]: row[1] for row in fts_rows})
papers = _load_papers_by_ids(
db, paper_ids, sort, {row[0]: row[1] for row in fts_rows}
)
return {
"results": papers,
@@ -188,7 +203,10 @@ def _search_semantic(
"JOIN paper_tags pt ON pt.paper_id = p.id" if tag else "",
"AND pt.tag = :tag" if tag else "",
{"tag": tag} if tag else {},
sort, page, page_size, (page - 1) * page_size,
sort,
page,
page_size,
(page - 1) * page_size,
)
# 按 arxiv_id 从 DB 加载完整数据
@@ -218,7 +236,7 @@ def _search_semantic(
# 分页
total = len(papers)
start = (page - 1) * page_size
page_papers = papers[start:start + page_size]
page_papers = papers[start : start + page_size]
return {
"results": page_papers,
@@ -239,7 +257,11 @@ def _search_tag_only(
offset: int,
) -> dict:
"""只有标签筛选,无关键词。"""
order = "p.paper_date DESC, p.upvotes DESC" if sort == "date" else "p.paper_date DESC, p.upvotes DESC"
order = (
"p.paper_date DESC, p.upvotes DESC"
if sort == "date"
else "p.paper_date DESC, p.upvotes DESC"
)
rows_sql = text(f"""
SELECT p.id
@@ -249,7 +271,9 @@ def _search_tag_only(
ORDER BY {order}
LIMIT :limit OFFSET :offset
""")
rows = db.execute(rows_sql, {"tag": tag, "limit": page_size, "offset": offset}).fetchall()
rows = db.execute(
rows_sql, {"tag": tag, "limit": page_size, "offset": offset}
).fetchall()
count_sql = text("""
SELECT COUNT(DISTINCT p.id)