From c57e26f3eb791bfad6f4b77411d44f3a669559c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9F=A9=E6=98=95=E7=9D=BF?= <22371298@buaa.edu.cn> Date: Fri, 6 Jun 2025 14:54:06 +0800 Subject: [PATCH] =?UTF-8?q?[feat]:=20=E5=9C=A8=E4=B8=AA=E4=BA=BA=E6=96=87?= =?UTF-8?q?=E7=8C=AE=E4=B8=AD=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/v1/endpoints/article.py | 8 +++++++- app/curd/article.py | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/app/api/v1/endpoints/article.py b/app/api/v1/endpoints/article.py index eb1e017..39a7a1b 100644 --- a/app/api/v1/endpoints/article.py +++ b/app/api/v1/endpoints/article.py @@ -12,7 +12,7 @@ from app.utils.get_db import get_db from app.utils.auth import get_current_user -from app.curd.article import crud_upload_to_self_folder, crud_get_self_folders, crud_get_articles_in_folder, crud_self_create_folder, crud_self_article_to_recycle_bin, crud_self_folder_to_recycle_bin, crud_annotate_self_article, crud_read_article, crud_read_article_by_url, crud_import_self_folder, crud_export_self_folder,crud_create_tag, crud_delete_tag, crud_get_article_tags, crud_all_tags_order, crud_change_folder_name, crud_change_article_name, crud_article_statistic, crud_self_tree, crud_self_article_statistic, crud_items_in_recycle_bin, crud_delete_forever, crud_recover +from app.curd.article import crud_upload_to_self_folder, crud_get_self_folders, crud_get_articles_in_folder, crud_self_create_folder, crud_self_article_to_recycle_bin, crud_self_folder_to_recycle_bin, crud_annotate_self_article, crud_read_article, crud_read_article_by_url, crud_import_self_folder, crud_export_self_folder,crud_create_tag, crud_delete_tag, crud_get_article_tags, crud_all_tags_order, crud_change_folder_name, crud_change_article_name, crud_article_statistic, crud_self_tree, crud_search, crud_self_article_statistic, crud_items_in_recycle_bin, crud_delete_forever, crud_recover from app.schemas.article import SelfCreateFolder router = APIRouter() @@ -194,6 +194,12 @@ async def self_tree(page_number: Optional[int] = Query(None, ge=1), page_size: O total_folder_num, folders = await crud_self_tree(user_id, page_number, page_size, db) return {"total_folder_num": total_folder_num, "folders": folders} +@router.get("/search", response_model="dict") +async def search(query: str = Query(...), page_number: Optional[int] = Query(None, ge=1), page_size: Optional[int] = Query(None, ge=1), db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)): + user_id = user.get("id") + total_folder_num, folders = await crud_search(user_id, query, page_number, page_size, db) + return {"total_folder_num": total_folder_num, "folders": folders} + @router.get("/selfArticleStatistic", response_model=dict) async def self_article_statistic(db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)): user_id = user.get("id") diff --git a/app/curd/article.py b/app/curd/article.py index b555782..8bfaf9a 100644 --- a/app/curd/article.py +++ b/app/curd/article.py @@ -258,6 +258,42 @@ async def crud_self_tree(user_id: int, page_number: int, page_size: int, db: Asy return total_num, folder_array +async def crud_search(user_id: int, input: str, page_number: int, page_size: int, db: AsyncSession): + # 应在所有文件夹下搜索文献 + query = select(Folder).where(Folder.user_id == user_id, Folder.visible == True).order_by(Folder.id.desc()) + result = await db.execute(query) + folders = result.scalars().all() + folder_array = [{"folder_id": folder.id, "folder_name": folder.name, "articles": []} for folder in folders] + # 查询文献 + for i in range(len(folder_array)): + query = select(Article).where(Article.folder_id == folder_array[i].get("folder_id"), Article.visible == True, Article.name.like(f"%{input}%")).order_by(Article.id.desc()) + result = await db.execute(query) + articles = result.scalars().all() + article_array = [{"article_id": article.id, "article_name": article.name, "tags": [], "notes": []} for article in articles] + folder_array[i]["articles"] = article_array + # 查询所有tag和笔记 + for j in range(len(article_array)): + # 查找所有tag + query = select(Tag).where(Tag.article_id == article_array[j].get("article_id")).order_by(Tag.id.asc()) + result = await db.execute(query) + tags = result.scalars().all() + tag_array = [{"tag_id": tag.id, "tag_content": tag.content} for tag in tags] + article_array[j]["tags"] = tag_array + # 查找所有note + query = select(Note).where(Note.article_id == article_array[j].get("article_id"), Note.visible == True).order_by(Note.id.desc()) + result = await db.execute(query) + notes = result.scalars().all() + note_array = [{"note_id": note.id, "note_title": note.title} for note in notes] + article_array[j]["notes"] = note_array + # 屏蔽掉没有搜索到文献的文件夹 + folder_array[:] = [folder for folder in folder_array if folder["articles"]] + total_num = len(folder_array) + # 分页 + if page_number and page_size: + folder_array = folder_array[(page_number - 1) * page_size : page_number * page_size] + # 返回 + return total_num, folder_array + async def crud_self_article_statistic(user_id: int, db: AsyncSession): # 查询个人拥有的、未被删除的文献总数 query = (