Skip to content

Commit ee66e5f

Browse files
committed
[feat]: 个人文献统计功能
1 parent 3a5dbb7 commit ee66e5f

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

app/api/v1/endpoints/article.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from app.utils.get_db import get_db
1313
from app.utils.auth import get_current_user
14-
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
14+
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
1515
from app.schemas.article import SelfCreateFolder
1616

1717
router = APIRouter()
@@ -190,4 +190,10 @@ async def change_article_name(article_id: int = Body(...), article_name: str = B
190190
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)):
191191
user_id = user.get("id")
192192
total_folder_num, folders = await crud_self_tree(user_id, page_number, page_size, db)
193-
return {"total_folder_num": total_folder_num, "folders": folders}
193+
return {"total_folder_num": total_folder_num, "folders": folders}
194+
195+
@router.get("/selfArticleStatistic", response_model=dict)
196+
async def self_article_statistic(db: AsyncSession = Depends(get_db), user: dict = Depends(get_current_user)):
197+
user_id = user.get("id")
198+
article_total_num, articles = await crud_self_article_statistic(user_id, db)
199+
return {"article_total_num": article_total_num, "articles": articles}

app/curd/article.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,50 @@ async def crud_self_tree(user_id: int, page_number: int, page_size: int, db: Asy
227227
note_array = [{"note_id": note.id, "note_title": note.title} for note in notes]
228228
article_array[j]["notes"] = note_array
229229

230-
return total_num, folder_array
230+
return total_num, folder_array
231+
232+
async def crud_self_article_statistic(user_id: int, db: AsyncSession):
233+
# 查询个人拥有的、未被删除的文献总数
234+
query = (
235+
select(func.count(Article.id))
236+
.join(Folder, Article.folder_id == Folder.id)
237+
.where(Folder.user_id == user_id, Folder.visible == True, Article.visible == True)
238+
)
239+
result = await db.execute(query)
240+
article_total_num = result.scalar_one_or_none()
241+
242+
# 获取明天日期和7天前的日期
243+
tomorrow = datetime.now().date() + timedelta(days=1)
244+
seven_days_ago = datetime.now().date() - timedelta(days=6)
245+
246+
# 查询近7天内的笔记数目,按日期分组
247+
query = (
248+
select(
249+
cast(Article.create_time, Date).label("date"), # 按日期分组
250+
func.count(Article.id).label("count") # 统计每日期的笔记数
251+
)
252+
.join(Folder, Article.folder_id == Folder.id)
253+
.where(
254+
Folder.user_id == user_id,
255+
Folder.visible == True,
256+
Article.visible == True,
257+
Article.create_time >= seven_days_ago, # 大于等于7天前的0点
258+
Article.create_time < tomorrow, # 小于明天0点
259+
)
260+
.group_by(cast(Article.create_time, Date)) # 按日期分组
261+
.order_by(cast(Article.create_time, Date)) # 按日期排序
262+
)
263+
264+
# 执行查询
265+
result = await db.execute(query)
266+
data = result.fetchall()
267+
268+
# 格式化结果为字典列表
269+
articles = [{"date": row.date, "count": row.count} for row in data]
270+
271+
# 若某日期没有记录,则为0
272+
for i in range(0, 7):
273+
if i == len(articles) or articles[i].get("date") != seven_days_ago + timedelta(days=i):
274+
articles.insert(i, {"date": seven_days_ago + timedelta(days=i), "count": 0})
275+
276+
return article_total_num, articles

0 commit comments

Comments
 (0)