diff --git a/app/api/v1/endpoints/article.py b/app/api/v1/endpoints/article.py index 38bb1d0..555db81 100644 --- a/app/api/v1/endpoints/article.py +++ b/app/api/v1/endpoints/article.py @@ -11,7 +11,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_read_article, 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 +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_read_article, 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 from app.schemas.article import SelfCreateFolder router = APIRouter() @@ -190,4 +190,10 @@ async def change_article_name(article_id: int = Body(...), article_name: str = B async def self_tree(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_self_tree(user_id, page_number, page_size, db) - return {"total_folder_num": total_folder_num, "folders": folders} \ No newline at end of file + 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") + article_total_num, articles = await crud_self_article_statistic(user_id, db) + return {"article_total_num": article_total_num, "articles": articles} \ No newline at end of file diff --git a/app/curd/article.py b/app/curd/article.py index 49c140e..283bd54 100644 --- a/app/curd/article.py +++ b/app/curd/article.py @@ -227,4 +227,50 @@ async def crud_self_tree(user_id: int, page_number: int, page_size: int, db: Asy note_array = [{"note_id": note.id, "note_title": note.title} for note in notes] article_array[j]["notes"] = note_array - return total_num, folder_array \ No newline at end of file + return total_num, folder_array + +async def crud_self_article_statistic(user_id: int, db: AsyncSession): + # 查询个人拥有的、未被删除的文献总数 + query = ( + select(func.count(Article.id)) + .join(Folder, Article.folder_id == Folder.id) + .where(Folder.user_id == user_id, Folder.visible == True, Article.visible == True) + ) + result = await db.execute(query) + article_total_num = result.scalar_one_or_none() + + # 获取明天日期和7天前的日期 + tomorrow = datetime.now().date() + timedelta(days=1) + seven_days_ago = datetime.now().date() - timedelta(days=6) + + # 查询近7天内的笔记数目,按日期分组 + query = ( + select( + cast(Article.create_time, Date).label("date"), # 按日期分组 + func.count(Article.id).label("count") # 统计每日期的笔记数 + ) + .join(Folder, Article.folder_id == Folder.id) + .where( + Folder.user_id == user_id, + Folder.visible == True, + Article.visible == True, + Article.create_time >= seven_days_ago, # 大于等于7天前的0点 + Article.create_time < tomorrow, # 小于明天0点 + ) + .group_by(cast(Article.create_time, Date)) # 按日期分组 + .order_by(cast(Article.create_time, Date)) # 按日期排序 + ) + + # 执行查询 + result = await db.execute(query) + data = result.fetchall() + + # 格式化结果为字典列表 + articles = [{"date": row.date, "count": row.count} for row in data] + + # 若某日期没有记录,则为0 + for i in range(0, 7): + if i == len(articles) or articles[i].get("date") != seven_days_ago + timedelta(days=i): + articles.insert(i, {"date": seven_days_ago + timedelta(days=i), "count": 0}) + + return article_total_num, articles \ No newline at end of file