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.

134 lines
5.2 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="/expenses", tags=["收支管理"])
  14. # 获取列表
  15. @router.get("/list")
  16. async def expense_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. select_query = f"""
  22. SELECT expenses.id,expenses.pay_price, expenses.live_price, expenses.create_at, expensetypes.typename,expenses.descr FROM expenses
  23. LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id
  24. ORDER BY create_at DESC
  25. {limit_clause};
  26. """
  27. expense_list = fetch_all(select_query)
  28. return response_success(expense_list, "expense get list success")
  29. @router.get("/list/{id}")
  30. async def expense_one(id: int):
  31. # 列表参数:收支名称、收支内容、创建时间、收支图片、收支查看时间、收支阅读次数、收支字数、类型名称、标签名列表
  32. select_query = """
  33. SELECT expenses.id,expenses.pay_price, expenses.live_price, expenses.create_at, expensetypes.typename,expenses.descr FROM expenses
  34. LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id
  35. WHERE id = %s
  36. ORDER BY create_at DESC;
  37. """
  38. expense_one = fetch_one(select_query, (id,))
  39. return response_success(expense_one, "expense get expense_one success")
  40. # 收支新增
  41. @router.post("/add")
  42. async def expense_add(expense: expense, _: User = Depends(get_current_active_user)):
  43. select_query = "SELECT * FROM expenses WHERE expensetitle = %s"
  44. existing_expense = fetch_one(select_query, (expense.expensetitle,))
  45. raise_if_exists(existing_expense, "expense already exists")
  46. insert_query = (
  47. "INSERT INTO expenses (expensetitle, expensecontent,imglink, typeid, descr) VALUES (%s, %s, %s, %s,%s)"
  48. )
  49. insert_value=(expense.expensetitle,expense.expensecontent,expense.imglink,expense.typeid,expense.descr)
  50. execute_query(insert_query,insert_value)
  51. return {"message": "expense created successfully"}
  52. # 收支删除
  53. @router.delete("/delete/{id}")
  54. async def expense_delete(id: str = Path(description="收支id")):
  55. select_query = "SELECT * FROM expenses WHERE id = %s"
  56. existing_expense = fetch_one(select_query, (id,))
  57. raise_if_not_found(existing_expense, "expense not found")
  58. delete_query = "DELETE FROM expenses WHERE id = %s"
  59. execute_query(delete_query, (id,))
  60. return response_success(message="expense delete success")
  61. @router.put("/update/{id}")
  62. async def expense_update(id: int, expense: expense, _: User = Depends(get_current_active_user)):
  63. # 检查要编辑的收支是否存在
  64. select_query = "SELECT * FROM expenses WHERE id = %s"
  65. existing_expense = fetch_one(select_query, (id,))
  66. raise_if_not_found(existing_expense, "expense not found")
  67. # 更新收支信息
  68. update_query = (
  69. "UPDATE expenses SET expensetitle = %s, expensecontent = %s, imglink = %s, typeid = %s, descr = %s WHERE id = %s"
  70. )
  71. update_data = (expense.expensetitle, expense.expensecontent,
  72. expense.imglink, expense.typeid, expense.descr, id)
  73. execute_query(update_query, update_data)
  74. return response_success("expense update sucess")
  75. # 收支模糊查询
  76. @router.get("/list/search")
  77. async def expense_list_search(
  78. expensetitle: str = Query(None, description="收支标题"),
  79. typename: str = Query(None, description="收支类型"),
  80. start_date: str = Query(None, description="开始时间"),
  81. end_date: str = Query(None, description="结束时间"),
  82. ):
  83. select_query = """
  84. SELECT expenses.id, expensetitle, expensecontent,wordcount, typename, create_at, update_at, expenses.descr
  85. FROM expenses
  86. LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id
  87. WHERE 1=1
  88. """
  89. params = []
  90. if expensetitle:
  91. select_query += " AND expensetitle LIKE %s"
  92. params.append(f"%{expensetitle}%")
  93. if typename:
  94. select_query += " AND typename LIKE %s"
  95. params.append(f"%{typename}%")
  96. if start_date:
  97. select_query += " AND create_at >= %s"
  98. params.append(start_date)
  99. if end_date:
  100. select_query += " AND create_at <= %s"
  101. params.append(end_date)
  102. select_query += "ORDER BY create_at DESC"
  103. expense_list = fetch_all(select_query, params=params, fetchall=True)
  104. return response_success(data=expense_list, message="expense serach succuessfully!")
  105. # 根据id查询收支
  106. @router.get("/list/search/{id}")
  107. async def get_id_expense(id: str = Path(description="收支id")):
  108. select_query = """SELECT expenses.id, expensetitle, expensecontent,wordcount, expenses.typeid, expenses.descr,imglink FROM expenses
  109. LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id
  110. WHERE expenses.id = %s
  111. """
  112. expense_list = execute_query(select_query, (id,))
  113. return response_success(data=expense_list, message="expense search success")
  114. # 我就测试一下