You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
4.2 KiB

7 months ago
8 months ago
8 months ago
8 months ago
8 months ago
7 months ago
8 months ago
7 months ago
8 months ago
8 months ago
8 months ago
8 months ago
7 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
7 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
8 months ago
  1. from fastapi import Depends, APIRouter, status, Query, Path, HTTPException,Request
  2. from internal.models import *
  3. from internal.database import fetch_one, fetch_all, execute_query, response_success, raise_if_exists, raise_if_not_found
  4. from dependencies import get_current_active_user
  5. from collections import defaultdict
  6. from limiter_config import limiter
  7. router = APIRouter(
  8. prefix="/statistics",
  9. tags=['统计']
  10. )
  11. # 统计编辑量
  12. @router.get("/list")
  13. @limiter.limit("10/minute")
  14. async def statistic_list(request: Request):
  15. select_query = """SELECT DATE(create_at) AS date,COUNT(*) AS writCount FROM
  16. (SELECT create_at FROM diarys
  17. UNION ALL
  18. SELECT create_at FROM blogs) AS combined
  19. GROUP BY DATE
  20. ORDER BY DATE DESC;"""
  21. statistic_list = fetch_all(select_query)
  22. return response_success(statistic_list, "statistic get list success")
  23. # 记录所有blog和diary数据
  24. # 获取首页数据
  25. @router.get("/homepage")
  26. @limiter.limit("10/minute")
  27. async def get_homepage_data(request: Request):
  28. # 获取博客数据
  29. select_blog = """
  30. SELECT blogs.id, blogs.blogtitle, blogs.blogcontent, blogs.create_at, blogs.imglink,
  31. blogs.wordcount, blogtypes.typename, JSON_ARRAYAGG(labels.labelname) AS labelnames
  32. FROM blogs
  33. LEFT JOIN `blogtypes` ON blogs.typeid = blogtypes.id
  34. LEFT JOIN blog_label ON blog_label.blogid = blogs.id
  35. LEFT JOIN labels ON blog_label.labelid = labels.id
  36. GROUP BY blogs.id, blogs.blogtitle, blogs.blogcontent, blogs.create_at, blogs.imglink,
  37. blogs.wordcount, blogtypes.typename
  38. ORDER BY create_at DESC
  39. """
  40. blog_list = fetch_all(select_blog)
  41. # 获取日记数据
  42. select_diary = """
  43. SELECT diarys.id, diarys.diarytitle, diarys.diarycontent, diarys.imglink,
  44. diarytypes.typename, diarys.create_at, diarys.update_at
  45. FROM diarys
  46. LEFT JOIN diarytypes ON diarys.typeid = diarytypes.id
  47. ORDER BY create_at DESC
  48. """
  49. diary_list = fetch_all(select_diary)
  50. # 合并博客和日记数据,按照创建日期降序排序
  51. combined_data = sorted(blog_list + diary_list, key=lambda x: x['create_at'], reverse=True)
  52. return {"data": combined_data}
  53. @router.get("/searchtitle")
  54. @limiter.limit("10/minute")
  55. async def search_homepage_data(request: Request,title: str = Query("", description="Title to search for")):
  56. # 查询博客数据
  57. select_blog = """
  58. SELECT
  59. blogs.id,
  60. blogs.blogtitle,
  61. blogs.blogcontent,
  62. blogs.create_at,
  63. blogs.imglink,
  64. blogs.readnum,
  65. blogs.wordcount,
  66. blogtypes.typename,
  67. JSON_ARRAYAGG(labels.labelname) AS labelnames
  68. FROM blogs
  69. LEFT JOIN blogtypes ON blogs.typeid = blogtypes.id
  70. LEFT JOIN blog_label ON blog_label.blogid = blogs.id
  71. LEFT JOIN labels ON blog_label.labelid = labels.id
  72. WHERE blogs.blogtitle LIKE %s
  73. GROUP BY
  74. blogs.id,
  75. blogs.blogtitle,
  76. blogs.blogcontent,
  77. blogs.create_at,
  78. blogs.imglink,
  79. blogs.wordcount,
  80. blogtypes.typename
  81. ORDER BY create_at DESC
  82. """
  83. blog_list =fetch_all(select_blog, ('%' + title + '%',))
  84. # 查询日记数据
  85. select_diary = """
  86. SELECT
  87. diarys.id,
  88. diarys.diarytitle,
  89. diarys.diarycontent,
  90. diarys.readnum,
  91. diarys.imglink,
  92. diarytypes.typename,
  93. diarys.create_at,
  94. diarys.update_at
  95. FROM diarys
  96. LEFT JOIN diarytypes ON diarys.typeid = diarytypes.id
  97. WHERE diarys.diarytitle LIKE %s
  98. ORDER BY create_at DESC
  99. """
  100. diary_list =fetch_all(select_diary, ('%' + title + '%',))
  101. # 合并博客和日记数据,按照创建日期降序排序
  102. filtered_blog_list = [item for item in blog_list if item.get('create_at')]
  103. filtered_diary_list = [item for item in diary_list if item.get('create_at')]
  104. combined_list = filtered_blog_list + filtered_diary_list
  105. combined_data = sorted(combined_list, key=lambda x: x['create_at'], reverse=True)
  106. return {"data": combined_data}