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.

140 lines
5.3 KiB

8 months ago
  1. from fastapi import Depends, APIRouter, Query, Path
  2. from internal.models import *
  3. from internal.database import (
  4. fetch_one,
  5. fetch_all,
  6. execute_query,
  7. response_success,
  8. raise_if_exists,
  9. raise_if_not_found,
  10. )
  11. from dependencies import get_current_active_user
  12. import json
  13. router = APIRouter(prefix="/diarys", tags=["日记管理"])
  14. # 获取列表
  15. @router.get("/list")
  16. async def diary_list(page: int = Query(None), page_size: int = Query(None)):
  17. limit_clause = ""
  18. if page is not None and page_size is not None:
  19. offset = (page - 1) * page_size
  20. limit_clause = f"LIMIT {page_size} OFFSET {offset}"
  21. # 列表参数:日记名称、日记内容、创建时间、日记图片、日记查看时间、日记阅读次数、日记字数、类型名称、标签名列表
  22. select_query = f"""
  23. SELECT diarys.id,diarys.diarytitle, diarys.diarycontent, diarys.create_at, diarys.imglink,
  24. diarys.wordcount, diarytypes.typename FROM diarys
  25. LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id
  26. ORDER BY create_at DESC
  27. {limit_clause};
  28. """
  29. diary_list = fetch_all(select_query)
  30. count_query = "SELECT COUNT(*) AS total FROM diarys;"
  31. total_records = fetch_one(count_query)["total"]
  32. return response_success({
  33. "diarys": diary_list,
  34. "total": total_records,
  35. }, "diary get list success")
  36. @router.get("/list/{id}")
  37. async def diary_one(id: int):
  38. # 列表参数:日记名称、日记内容、创建时间、日记图片、日记查看时间、日记阅读次数、日记字数、类型名称、标签名列表
  39. select_query = """
  40. SELECT id, diarytitle, diarycontent FROM diarys
  41. WHERE id = %s
  42. ORDER BY create_at DESC;
  43. """
  44. diary_one = fetch_one(select_query, (id,))
  45. return response_success(diary_one, "diary get diary_one success")
  46. # 日记新增
  47. @router.post("/add")
  48. async def diary_add(diary: Diary, _: User = Depends(get_current_active_user)):
  49. select_query = "SELECT * FROM diarys WHERE diarytitle = %s"
  50. existing_diary = fetch_one(select_query, (diary.diarytitle,))
  51. raise_if_exists(existing_diary, "diary already exists")
  52. insert_query = (
  53. "INSERT INTO diarys (diarytitle, diarycontent,imglink, typeid, descr) VALUES (%s, %s, %s, %s,%s)"
  54. )
  55. insert_value=(diary.diarytitle,diary.diarycontent,diary.imglink,diary.typeid,diary.descr)
  56. execute_query(insert_query,insert_value)
  57. return {"message": "diary created successfully"}
  58. # 日记删除
  59. @router.delete("/delete/{id}")
  60. async def diary_delete(id: str = Path(description="日记id")):
  61. select_query = "SELECT * FROM diarys WHERE id = %s"
  62. existing_diary = fetch_one(select_query, (id,))
  63. raise_if_not_found(existing_diary, "diary not found")
  64. delete_query = "DELETE FROM diarys WHERE id = %s"
  65. execute_query(delete_query, (id,))
  66. return response_success(message="diary delete success")
  67. @router.put("/update/{id}")
  68. async def diary_update(id: int, diary: Diary, _: User = Depends(get_current_active_user)):
  69. # 检查要编辑的日记是否存在
  70. select_query = "SELECT * FROM diarys WHERE id = %s"
  71. existing_diary = fetch_one(select_query, (id,))
  72. raise_if_not_found(existing_diary, "diary not found")
  73. # 更新日记信息
  74. update_query = (
  75. "UPDATE diarys SET diarytitle = %s, diarycontent = %s, imglink = %s, typeid = %s, descr = %s WHERE id = %s"
  76. )
  77. update_data = (diary.diarytitle, diary.diarycontent,
  78. diary.imglink, diary.typeid, diary.descr, id)
  79. execute_query(update_query, update_data)
  80. return response_success("diary update sucess")
  81. # 日记模糊查询
  82. @router.get("/list/search")
  83. async def diary_list_search(
  84. diarytitle: str = Query(None, description="日记标题"),
  85. typename: str = Query(None, description="日记类型"),
  86. start_date: str = Query(None, description="开始时间"),
  87. end_date: str = Query(None, description="结束时间"),
  88. ):
  89. select_query = """
  90. SELECT diarys.id, diarytitle, diarycontent,wordcount, typename, create_at, update_at, diarys.descr
  91. FROM diarys
  92. LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id
  93. WHERE 1=1
  94. """
  95. params = []
  96. if diarytitle:
  97. select_query += " AND diarytitle LIKE %s"
  98. params.append(f"%{diarytitle}%")
  99. if typename:
  100. select_query += " AND typename LIKE %s"
  101. params.append(f"%{typename}%")
  102. if start_date:
  103. select_query += " AND create_at >= %s"
  104. params.append(start_date)
  105. if end_date:
  106. select_query += " AND create_at <= %s"
  107. params.append(end_date)
  108. select_query += "ORDER BY create_at DESC"
  109. diary_list = fetch_all(select_query, params=params, fetchall=True)
  110. return response_success(data=diary_list, message="diary serach succuessfully!")
  111. # 根据id查询日记
  112. @router.get("/list/search/{id}")
  113. async def get_id_diary(id: str = Path(description="日记id")):
  114. select_query = """SELECT diarys.id, diarytitle, diarycontent,wordcount, diarys.typeid, diarys.descr,imglink FROM diarys
  115. LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id
  116. WHERE diarys.id = %s
  117. """
  118. diary_list = execute_query(select_query, (id,))
  119. return response_success(data=diary_list, message="diary search success")
  120. # 我就测试一下