Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions app/api/v1/endpoints/article.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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}
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}
48 changes: 47 additions & 1 deletion app/curd/article.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
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