diff --git a/internal/models.py b/internal/models.py index 61aa190..caf5d0c 100644 --- a/internal/models.py +++ b/internal/models.py @@ -1,5 +1,6 @@ from pydantic import BaseModel,Field from typing import Annotated +from decimal import Decimal # Token相关的模型 class Token(BaseModel): @@ -143,3 +144,24 @@ class Type(BaseModel): description="备注允许为空" )] +class Expense(BaseModel): + pay_price:Annotated[Decimal,Field( + title="支出", + default=0.00, + description="支出不允许为空" + )] + live_price:Annotated[Decimal,Field( + title="收入", + default=0.00, + description="收入不允许为空" + )] + typeid:Annotated[int,Field( + title="类型id", + default=None, + description="类型id允许为空" + )] + descr:Annotated[str,Field( + title="备注", + default=None, + description="备注允许为空" + )] \ No newline at end of file diff --git a/main.py b/main.py index 0bf3715..5d72d79 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,7 @@ from fastapi import Depends, FastAPI, HTTPException, status from dependencies import * from internal.models import Token from fastapi.middleware.cors import CORSMiddleware -from routers import blogtype, usermanage,blogmanage,classticmanage,commonlinkmanage,labelmanage,diarymanage,diarytype,statistic,expensetype +from routers import blogtype, usermanage,blogmanage,classticmanage,commonlinkmanage,labelmanage,diarymanage,diarytype,statistic,disbursemanage app=FastAPI() app.include_router(usermanage.router) app.include_router(blogtype.router) @@ -15,7 +15,7 @@ app.include_router(classticmanage.router) app.include_router(commonlinkmanage.router) app.include_router(labelmanage.router) app.include_router(statistic.router) -app.include_router(expensetype.router) +app.include_router(disbursemanage.router) # 解决跨域 app.add_middleware( CORSMiddleware, diff --git a/routers/disbursemanage.py b/routers/disbursemanage.py new file mode 100644 index 0000000..df47377 --- /dev/null +++ b/routers/disbursemanage.py @@ -0,0 +1,47 @@ +from fastapi import Depends, APIRouter, status, Query, Path, HTTPException +from internal.models import * +from internal.database import fetch_one, fetch_all, execute_query, response_success, raise_if_exists, raise_if_not_found +from dependencies import get_current_active_user + +router = APIRouter( + prefix="/disburses", + tags=['支出管理'] +) +# 获取列表 + + +@router.get("/list/specificdate") +async def disburse_list(days: int): + select_query = """SELECT DATE(create_at) AS create_date, SUM(disburseprice) AS total_disburseprice + FROM disburses + WHERE DATE(create_at) >= DATE_SUB(CURDATE(), INTERVAL %s DAY) -- 一周前的日期 + GROUP BY DATE(create_at) + ORDER BY create_date ASC;""" + disburse_list = fetch_all(select_query, (days-1,)) + return response_success(disburse_list, "disburse get list success") + +# 获取列表 + + +@router.get("/list/classifieddata") +async def classified_list(days: int): + select_query = """SELECT SUM(d.disburseprice) AS value,t.typename AS name FROM disburses d + JOIN disbursetypes t ON d.typeid = t.id + WHERE d.create_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY) + GROUP BY t.typename + ;""" + classified_list = fetch_all(select_query, (days-1,)) + return response_success(classified_list, "disburse get list success") + +# 单条数据查询 + + +@router.get("/list/search") +async def disburse_search(header: str = Query(description="支出标题")): + select_query = "SELECT id,header,text,descr FROM disburses WHERE 1=1 " + params = [] + if header: + select_query += "AND header LIKE %s" + params.append(f"%{header}%") + disburse_query = fetch_all(select_query, params=params, fetchall=True) + return response_success(data=disburse_query, message="disburse search success") diff --git a/routers/disbursetypes.py b/routers/disbursetypes.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/expensemanage.py b/routers/expensemanage.py deleted file mode 100644 index 8900a20..0000000 --- a/routers/expensemanage.py +++ /dev/null @@ -1,134 +0,0 @@ -from fastapi import Depends, APIRouter, Query, Path -from internal.models import * -from internal.database import ( - fetch_one, - fetch_all, - execute_query, - response_success, - raise_if_exists, - raise_if_not_found, -) -from dependencies import get_current_active_user -import json -router = APIRouter(prefix="/expenses", tags=["收支管理"]) - -# 获取列表 - - -@router.get("/list") -async def expense_list(page: int = Query(None), page_size: int = Query(None)): - limit_clause = "" - if page is not None and page_size is not None: - offset = (page - 1) * page_size - limit_clause = f"LIMIT {page_size} OFFSET {offset}" - select_query = f""" - SELECT expenses.id,expenses.pay_price, expenses.live_price, expenses.create_at, expensetypes.typename,expenses.descr FROM expenses - LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id - ORDER BY create_at DESC - {limit_clause}; - """ - expense_list = fetch_all(select_query) - return response_success(expense_list, "expense get list success") - - -@router.get("/list/{id}") -async def expense_one(id: int): - # 列表参数:收支名称、收支内容、创建时间、收支图片、收支查看时间、收支阅读次数、收支字数、类型名称、标签名列表 - select_query = """ - SELECT expenses.id,expenses.pay_price, expenses.live_price, expenses.create_at, expensetypes.typename,expenses.descr FROM expenses - LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id - WHERE id = %s - ORDER BY create_at DESC; - """ - expense_one = fetch_one(select_query, (id,)) - return response_success(expense_one, "expense get expense_one success") - - -# 收支新增 -@router.post("/add") -async def expense_add(expense: expense, _: User = Depends(get_current_active_user)): - select_query = "SELECT * FROM expenses WHERE expensetitle = %s" - existing_expense = fetch_one(select_query, (expense.expensetitle,)) - raise_if_exists(existing_expense, "expense already exists") - insert_query = ( - "INSERT INTO expenses (expensetitle, expensecontent,imglink, typeid, descr) VALUES (%s, %s, %s, %s,%s)" - ) - insert_value=(expense.expensetitle,expense.expensecontent,expense.imglink,expense.typeid,expense.descr) - execute_query(insert_query,insert_value) - - return {"message": "expense created successfully"} - - -# 收支删除 -@router.delete("/delete/{id}") -async def expense_delete(id: str = Path(description="收支id")): - select_query = "SELECT * FROM expenses WHERE id = %s" - existing_expense = fetch_one(select_query, (id,)) - raise_if_not_found(existing_expense, "expense not found") - delete_query = "DELETE FROM expenses WHERE id = %s" - execute_query(delete_query, (id,)) - return response_success(message="expense delete success") - - -@router.put("/update/{id}") -async def expense_update(id: int, expense: expense, _: User = Depends(get_current_active_user)): - # 检查要编辑的收支是否存在 - select_query = "SELECT * FROM expenses WHERE id = %s" - existing_expense = fetch_one(select_query, (id,)) - raise_if_not_found(existing_expense, "expense not found") - - # 更新收支信息 - update_query = ( - "UPDATE expenses SET expensetitle = %s, expensecontent = %s, imglink = %s, typeid = %s, descr = %s WHERE id = %s" - ) - update_data = (expense.expensetitle, expense.expensecontent, - expense.imglink, expense.typeid, expense.descr, id) - execute_query(update_query, update_data) - return response_success("expense update sucess") - - -# 收支模糊查询 -@router.get("/list/search") -async def expense_list_search( - expensetitle: str = Query(None, description="收支标题"), - typename: str = Query(None, description="收支类型"), - start_date: str = Query(None, description="开始时间"), - end_date: str = Query(None, description="结束时间"), -): - select_query = """ - SELECT expenses.id, expensetitle, expensecontent,wordcount, typename, create_at, update_at, expenses.descr - FROM expenses - LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id - WHERE 1=1 - """ - params = [] - if expensetitle: - select_query += " AND expensetitle LIKE %s" - params.append(f"%{expensetitle}%") - if typename: - select_query += " AND typename LIKE %s" - params.append(f"%{typename}%") - if start_date: - select_query += " AND create_at >= %s" - params.append(start_date) - if end_date: - select_query += " AND create_at <= %s" - params.append(end_date) - select_query += "ORDER BY create_at DESC" - expense_list = fetch_all(select_query, params=params, fetchall=True) - return response_success(data=expense_list, message="expense serach succuessfully!") - - -# 根据id查询收支 -@router.get("/list/search/{id}") -async def get_id_expense(id: str = Path(description="收支id")): - select_query = """SELECT expenses.id, expensetitle, expensecontent,wordcount, expenses.typeid, expenses.descr,imglink FROM expenses - LEFT JOIN `expensetypes` ON expenses.typeid = expensetypes.id - WHERE expenses.id = %s - -""" - expense_list = execute_query(select_query, (id,)) - return response_success(data=expense_list, message="expense search success") - - -# 我就测试一下 diff --git a/routers/expensetype.py b/routers/expensetype.py deleted file mode 100644 index 2180bf1..0000000 --- a/routers/expensetype.py +++ /dev/null @@ -1,61 +0,0 @@ -from fastapi import Depends, APIRouter, status, Query, Path, HTTPException -from internal.models import * -from internal.database import fetch_one, fetch_all, execute_query, response_success, raise_if_exists,raise_if_not_found -from dependencies import get_current_active_user - -router = APIRouter( - prefix="/expensetypes", - tags=['收支分类'] -) -# 获取列表 -@router.get("/list") -async def type_list(): - select_query = "SELECT id,typename,descr FROM expensetypes;" - type_list = fetch_all(select_query) - return response_success(type_list, "type get list success") - -# 新增 -@router.post("/add") -async def type_add(type:Type): - insert_query="""INSERT INTO expensetypes (typename,descr) VALUES(%s,%s)""" - insert_value=(type.typename,type.descr) - execute_query(insert_query,insert_value) - return response_success(data=type,message="type create success") - -# 单条数据查询 -@router.get("/list/search") -async def type_search(typename:str=Query(description="类型名称")): - select_query="SELECT id,typename,descr FROM expensetypes WHERE 1=1 " - params=[] - if typename: - select_query+="AND typename LIKE %s" - params.append(f"%{typename}%") - type_query=fetch_all(select_query,params=params,fetchall=True) - return response_success(data=type_query,message="type search success") - -# 语录修改 -@router.put("/update/{id}") -async def type_put(type:Type,id: str = Path(description="类型id")): - update_query = ( - "UPDATE expensetypes SET typename=%s,descr=%s WHERE id=%s;" - ) - update_data = (type.typename,type.descr,id) - execute_query(update_query, update_data) - return response_success("type update sucess") - -# 语录删除 -@router.delete("/delete/{id}") -async def type_del(id: str = Path(description="类型id")): - update_query = ( - "DELETE FROM expensetypes WHERE id=%s;" - ) - update_data = (id) - execute_query(update_query, update_data) - return response_success() - -# 根据id查询语录 -@router.get("/list/search/{id}") -async def type_search_id(id:str=Path(description="类型id")): - select_query="SELECT * FROM expensetypes WHERE id=%s" - type_query=fetch_one(select_query,(id,)) - return response_success(data=type_query,message="type search success") \ No newline at end of file diff --git a/routers/revenuemanage.py b/routers/revenuemanage.py new file mode 100644 index 0000000..e69de29 diff --git a/routers/revenuetypes.py b/routers/revenuetypes.py new file mode 100644 index 0000000..e69de29