diff --git a/internal/models.py b/internal/models.py index 735df7e..61aa190 100644 --- a/internal/models.py +++ b/internal/models.py @@ -75,7 +75,33 @@ class Blog(BaseModel): default=None, description="备注允许为空" )] - +class Diary(BaseModel): + diarytitle:Annotated[str,Field( + title="日记标题", + pattern=r'^.{4,20}$', + examples=[""], + description="允许6-20个字符" + )] + diarycontent:Annotated[str,Field( + title="日记内容", + min_length=1, + description="最少1个字符" + )] + imglink:Annotated[str,Field( + title="文图地址", + )] + typeid:Annotated[int,Field( + title="类型id", + default=None, + description="类型id允许为空" + )] + + descr:Annotated[str,Field( + title="备注", + default=None, + description="备注允许为空" + )] + class Classtic(BaseModel): header:Annotated[str,Field( title="语录名称", diff --git a/main.py b/main.py index 678364e..e3bb021 100644 --- a/main.py +++ b/main.py @@ -4,11 +4,13 @@ from fastapi import Depends, FastAPI, HTTPException, status from dependencies import * from internal.models import Token from fastapi.middleware.cors import CORSMiddleware -from routers import usermanage,typemanage,blogmanage,classticmanage,commonlinkmanage,labelmanage +from routers import blogtype, usermanage,blogmanage,classticmanage,commonlinkmanage,labelmanage,diarymanage,diarytype app=FastAPI() app.include_router(usermanage.router) -app.include_router(typemanage.router) +app.include_router(blogtype.router) app.include_router(blogmanage.router) +app.include_router(diarymanage.router) +app.include_router(diarytype.router) app.include_router(classticmanage.router) app.include_router(commonlinkmanage.router) app.include_router(labelmanage.router) diff --git a/routers/blogmanage.py b/routers/blogmanage.py index 8a96c36..9c37fc7 100644 --- a/routers/blogmanage.py +++ b/routers/blogmanage.py @@ -22,13 +22,13 @@ async def blog_list(page: int = Query(None), page_size: int = Query(None)): # 列表参数:博客名称、博客内容、创建时间、博客图片、博客查看时间、博客阅读次数、博客字数、类型名称、标签名列表 select_query = f""" SELECT blogs.id,blogs.blogtitle, blogs.blogcontent, blogs.create_at, blogs.imglink, - blogs.wordcount, types.typename,JSON_ARRAYAGG(labels.labelname) AS labelnames + blogs.wordcount, blogtypes.typename,JSON_ARRAYAGG(labels.labelname) AS labelnames FROM blogs - LEFT JOIN `types` ON blogs.typeid = types.id + LEFT JOIN `blogtypes` ON blogs.typeid = blogtypes.id LEFT JOIN blog_label ON blog_label.blogid = blogs.id LEFT JOIN labels ON blog_label.labelid = labels.id GROUP BY blogs.id, blogs.blogtitle, blogs.blogcontent, blogs.create_at, blogs.imglink, - blogs.wordcount, types.typename ORDER BY create_at DESC + blogs.wordcount, blogtypes.typename ORDER BY create_at DESC {limit_clause}; """ blog_list = fetch_all(select_query) @@ -120,7 +120,7 @@ async def blog_list_search( select_query = """ SELECT blogs.id, blogtitle, blogcontent,wordcount, typename, create_at, update_at, blogs.descr,JSON_ARRAYAGG(labels.labelname) AS labelnames FROM blogs - LEFT JOIN `types` ON blogs.typeid = types.id + LEFT JOIN `blogtypes` ON blogs.typeid = blogtypes.id LEFT JOIN blog_label ON blogs.id = blog_label.blogid LEFT JOIN labels ON blog_label.labelid = labels.id WHERE 1=1 @@ -138,7 +138,7 @@ async def blog_list_search( if end_date: select_query += " AND create_at <= %s" params.append(end_date) - select_query += "GROUP BY blogs.id, blogs.blogtitle, blogs.blogcontent,blogs.wordcount, types.typename, blogs.create_at, blogs.update_at, blogs.descr ORDER BY create_at DESC" + select_query += "GROUP BY blogs.id, blogs.blogtitle, blogs.blogcontent,blogs.wordcount, blogtypes.typename, blogs.create_at, blogs.update_at, blogs.descr ORDER BY create_at DESC" blog_list = fetch_all(select_query, params=params, fetchall=True) return response_success(data=blog_list, message="blog serach succuessfully!") @@ -147,7 +147,7 @@ async def blog_list_search( @router.get("/list/search/{id}") async def get_id_blog(id: str = Path(description="博客id")): select_query = """SELECT blogs.id, blogtitle, blogcontent,wordcount, blogs.typeid, blogs.descr,JSON_ARRAYAGG(labels.id) AS labelnames,imglink FROM blogs - LEFT JOIN `types` ON blogs.typeid = types.id + LEFT JOIN `blogtypes` ON blogs.typeid = blogtypes.id LEFT JOIN blog_label ON blogs.id = blog_label.blogid LEFT JOIN labels ON blog_label.labelid = labels.id WHERE blogs.id = %s diff --git a/routers/typemanage.py b/routers/blogtype.py similarity index 80% rename from routers/typemanage.py rename to routers/blogtype.py index 0ab9c9a..db1d41e 100644 --- a/routers/typemanage.py +++ b/routers/blogtype.py @@ -4,20 +4,20 @@ from internal.database import fetch_one, fetch_all, execute_query, response_succ from dependencies import get_current_active_user router = APIRouter( - prefix="/types", - tags=['分类管理'] + prefix="/blogtypes", + tags=['博客分类'] ) # 获取列表 @router.get("/list") async def type_list(): - select_query = "SELECT id,typename,descr FROM types;" + select_query = "SELECT id,typename,descr FROM blogtypes;" 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 types (typename,descr) VALUES(%s,%s)""" + insert_query="""INSERT INTO blogtypes (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") @@ -25,7 +25,7 @@ async def type_add(type:Type): # 单条数据查询 @router.get("/list/search") async def type_search(typename:str=Query(description="类型名称")): - select_query="SELECT id,typename,descr FROM types WHERE 1=1 " + select_query="SELECT id,typename,descr FROM blogtypes WHERE 1=1 " params=[] if typename: select_query+="AND typename LIKE %s" @@ -37,7 +37,7 @@ async def type_search(typename:str=Query(description="类型名称")): @router.put("/update/{id}") async def type_put(type:Type,id: str = Path(description="类型id")): update_query = ( - "UPDATE types SET typename=%s,descr=%s WHERE id=%s;" + "UPDATE blogtypes SET typename=%s,descr=%s WHERE id=%s;" ) update_data = (type.typename,type.descr,id) execute_query(update_query, update_data) @@ -47,7 +47,7 @@ async def type_put(type:Type,id: str = Path(description="类型id")): @router.delete("/delete/{id}") async def type_del(id: str = Path(description="类型id")): update_query = ( - "DELETE FROM types WHERE id=%s;" + "DELETE FROM blogtypes WHERE id=%s;" ) update_data = (id) execute_query(update_query, update_data) @@ -56,6 +56,6 @@ async def type_del(id: str = Path(description="类型id")): # 根据id查询语录 @router.get("/list/search/{id}") async def type_search_id(id:str=Path(description="类型id")): - select_query="SELECT * FROM types WHERE id=%s" + select_query="SELECT * FROM blogtypes 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/diarymanage.py b/routers/diarymanage.py new file mode 100644 index 0000000..aabcc2d --- /dev/null +++ b/routers/diarymanage.py @@ -0,0 +1,140 @@ +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="/diarys", tags=["日记管理"]) + +# 获取列表 + + +@router.get("/list") +async def diary_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 diarys.id,diarys.diarytitle, diarys.diarycontent, diarys.create_at, diarys.imglink, + diarys.wordcount, diarytypes.typename FROM diarys + LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id + ORDER BY create_at DESC + {limit_clause}; + """ + diary_list = fetch_all(select_query) + count_query = "SELECT COUNT(*) AS total FROM diarys;" + total_records = fetch_one(count_query)["total"] + return response_success({ + "diarys": diary_list, + "total": total_records, + }, "diary get list success") + + +@router.get("/list/{id}") +async def diary_one(id: int): + # 列表参数:日记名称、日记内容、创建时间、日记图片、日记查看时间、日记阅读次数、日记字数、类型名称、标签名列表 + select_query = """ + SELECT id, diarytitle, diarycontent FROM diarys + WHERE id = %s + ORDER BY create_at DESC; + """ + diary_one = fetch_one(select_query, (id,)) + return response_success(diary_one, "diary get diary_one success") + + +# 日记新增 +@router.post("/add") +async def diary_add(diary: Diary, _: User = Depends(get_current_active_user)): + select_query = "SELECT * FROM diarys WHERE diarytitle = %s" + existing_diary = fetch_one(select_query, (diary.diarytitle,)) + raise_if_exists(existing_diary, "diary already exists") + insert_query = ( + "INSERT INTO diarys (diarytitle, diarycontent,imglink, typeid, descr) VALUES (%s, %s, %s, %s,%s)" + ) + insert_value=(diary.diarytitle,diary.diarycontent,diary.imglink,diary.typeid,diary.descr) + execute_query(insert_query,insert_value) + + return {"message": "diary created successfully"} + + +# 日记删除 +@router.delete("/delete/{id}") +async def diary_delete(id: str = Path(description="日记id")): + select_query = "SELECT * FROM diarys WHERE id = %s" + existing_diary = fetch_one(select_query, (id,)) + raise_if_not_found(existing_diary, "diary not found") + delete_query = "DELETE FROM diarys WHERE id = %s" + execute_query(delete_query, (id,)) + return response_success(message="diary delete success") + + +@router.put("/update/{id}") +async def diary_update(id: int, diary: Diary, _: User = Depends(get_current_active_user)): + # 检查要编辑的日记是否存在 + select_query = "SELECT * FROM diarys WHERE id = %s" + existing_diary = fetch_one(select_query, (id,)) + raise_if_not_found(existing_diary, "diary not found") + + # 更新日记信息 + update_query = ( + "UPDATE diarys SET diarytitle = %s, diarycontent = %s, imglink = %s, typeid = %s, descr = %s WHERE id = %s" + ) + update_data = (diary.diarytitle, diary.diarycontent, + diary.imglink, diary.typeid, diary.descr, id) + execute_query(update_query, update_data) + return response_success("diary update sucess") + + +# 日记模糊查询 +@router.get("/list/search") +async def diary_list_search( + diarytitle: str = Query(None, description="日记标题"), + typename: str = Query(None, description="日记类型"), + start_date: str = Query(None, description="开始时间"), + end_date: str = Query(None, description="结束时间"), +): + select_query = """ + SELECT diarys.id, diarytitle, diarycontent,wordcount, typename, create_at, update_at, diarys.descr + FROM diarys + LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id + WHERE 1=1 + """ + params = [] + if diarytitle: + select_query += " AND diarytitle LIKE %s" + params.append(f"%{diarytitle}%") + 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" + diary_list = fetch_all(select_query, params=params, fetchall=True) + return response_success(data=diary_list, message="diary serach succuessfully!") + + +# 根据id查询日记 +@router.get("/list/search/{id}") +async def get_id_diary(id: str = Path(description="日记id")): + select_query = """SELECT diarys.id, diarytitle, diarycontent,wordcount, diarys.typeid, diarys.descr,imglink FROM diarys + LEFT JOIN `diarytypes` ON diarys.typeid = diarytypes.id + WHERE diarys.id = %s + +""" + diary_list = execute_query(select_query, (id,)) + return response_success(data=diary_list, message="diary search success") + + +# 我就测试一下 diff --git a/routers/diarytype.py b/routers/diarytype.py new file mode 100644 index 0000000..791fd46 --- /dev/null +++ b/routers/diarytype.py @@ -0,0 +1,61 @@ +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="/diarytypes", + tags=['日记分类'] +) +# 获取列表 +@router.get("/list") +async def type_list(): + select_query = "SELECT id,typename,descr FROM diarytypes;" + 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 diarytypes (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 diarytypes 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 diarytypes 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 diarytypes 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 diarytypes 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