diff --git a/Mods/EditRecord/Crud.py b/Mods/EditRecord/Crud.py index 796f7e5..5f0c256 100644 --- a/Mods/EditRecord/Crud.py +++ b/Mods/EditRecord/Crud.py @@ -1,9 +1,9 @@ from sqlalchemy.orm import Session -from .Schemas import EditItemTypeQuery, EditItemTypeAddInfo, EditItemTypeUpdateInfo +from . import Schemas from .Models import EditRecord, EditItemType -def edit_item_type_add(db: Session, data: EditItemTypeAddInfo): +def edit_item_type_add(db: Session, data: Schemas.EditItemTypeAddInfo): item = EditItemType(**data.dict()) db.add(item) db.commit() @@ -16,8 +16,8 @@ def edit_item_type_delete(db: Session, item_id: int): db.commit() -def edit_item_type_update(db: Session, data: EditItemTypeUpdateInfo): - db.query(EditItemType).filter_by(id=data.id).update(data.dict()) +def edit_item_type_update(db: Session, data: Schemas.EditItemTypeUpdateInfo): + db.query(EditItemType).filter_by(id=data.id).update({key: v for key, v in data.dict().items() if v is not None}) db.commit() item = db.query(EditItemType).filter_by(id=data.id).first() return item @@ -28,7 +28,7 @@ def edit_item_type_get(db: Session, item_id: int): return item -def edit_item_type_query(db: Session, params: EditItemTypeQuery): +def edit_item_type_query(db: Session, params: Schemas.EditItemTypeQuery): params_dict = params.dict() query = db.query(EditItemType) db_model = EditItemType @@ -47,6 +47,62 @@ def edit_item_type_query(db: Session, params: EditItemTypeQuery): page = params_dict['page'] if 'page_size' in params_dict: page_size = params_dict['page_size'] + # 页数不超过100 + page_size = min(page_size, 100) + if page is not None and page_size is not None: + query = query.offset((page - 1) * page_size).limit(page_size).all() + return count, query + + +################# + + +def edit_record_add(db: Session, data: Schemas.EditRecordAddInfo): + item = EditRecord(**data.dict()) + db.add(item) + db.commit() + db.refresh(item) + return item + + +def edit_record_delete(db: Session, item_id: int): + db.query(EditRecord).filter_by(id=item_id).delete() + db.commit() + + +def edit_record_update(db: Session, data: Schemas.EditRecordUpdateInfo): + db.query(EditRecord).filter_by(id=data.id).update({key: v for key, v in data.dict().items() if v is not None}) + db.commit() + item = db.query(EditRecord).filter_by(id=data.id).first() + return item + + +def edit_record_get(db: Session, item_id: int): + item = db.query(EditRecord).filter_by(id=item_id).first() + return item + + +def edit_record_query(db: Session, params: Schemas.EditRecordQuery): + params_dict = params.dict() + query = db.query(EditRecord) + db_model = EditRecord + for key, value in params_dict.items(): + if key not in ['page', 'page_size'] and value is not None: + if type(value) == str: + query = query.filter(getattr(db_model, key).like(f'%{value}%')) + elif type(value) in [int, float, bool]: + query = query.filter_by(**{key: value}) + else: + query = query.filter(getattr(db_model, key) == value) + count = query.count() + page = None + page_size = None + if 'page' in params_dict: + page = params_dict['page'] + if 'page_size' in params_dict: + page_size = params_dict['page_size'] + # 页数不超过100 + page_size = min(page_size, 100) if page is not None and page_size is not None: query = query.offset((page - 1) * page_size).limit(page_size).all() return count, query diff --git a/Mods/EditRecord/Models.py b/Mods/EditRecord/Models.py index dea75c8..4356263 100644 --- a/Mods/EditRecord/Models.py +++ b/Mods/EditRecord/Models.py @@ -1,7 +1,7 @@ from sqlalchemy.orm import relationship from Context.common import common_db -from sqlalchemy import Column, Integer, String, ForeignKey, Text +from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, func from Mods.User.Models import User @@ -11,20 +11,22 @@ class EditRecord(common_db.Base): """ __tablename__ = "edit_record" id = Column(Integer, primary_key=True) - edit_user = Column(String(128), ForeignKey('user.email'), comment="填报人") + edit_user = Column(String(128), ForeignKey('user.email'), comment="填报人", nullable=False) user_info = relationship('User', uselist=False, backref='user') - item_id = Column(Integer, comment="编辑项id") - item_type_id = Column(Integer, ForeignKey('edit_item_type.id'), comment="编辑项类型信息") + item_id = Column(Integer, comment="编辑项id", nullable=False) + item_type_id = Column(Integer, ForeignKey('edit_item_type.id'), comment="编辑项类型信息", nullable=False) item_type_info = relationship('EditItemType', uselist=False, backref='edit_item_type') before_edit_data = Column(Text, comment="编辑前的信息json") after_edit_data = Column(Text, comment="编辑后的信息json") + edit_time = Column(DateTime, server_default=func.now(), comment='编辑时间') + create_time = Column(DateTime, server_default=func.now(), comment='创建时间') def to_dict(self): data = {c.name: getattr(self, c.name) for c in self.__table__.columns} - user_info = getattr(self, 'user_info') - data['user_info'] = user_info.to_dict() item_type_info = getattr(self, 'item_type_info') data['item_type_info'] = item_type_info.to_dict() + user_info = getattr(self, 'user_info') + data['user_info'] = user_info.to_dict() return data @@ -34,8 +36,8 @@ class EditItemType(common_db.Base): """ __tablename__ = "edit_item_type" id = Column(Integer, primary_key=True) - name = Column(String(255), comment="名称") - category = Column(String(255), comment="类别") + name = Column(String(255), comment="名称", nullable=False) + category = Column(String(255), comment="类别", nullable=False) def to_dict(self): data = {c.name: getattr(self, c.name) for c in self.__table__.columns} diff --git a/Mods/EditRecord/Router.py b/Mods/EditRecord/Router.py index 6f013a5..e03dd8b 100644 --- a/Mods/EditRecord/Router.py +++ b/Mods/EditRecord/Router.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from Context.common import common_db @@ -28,8 +28,10 @@ def edit_item_type_update(req: Schemas.EditItemTypeUpdateReq, db: Session = Depe @router.post("/edit_item_type/get", summary="获取修改项类型", response_model=Schemas.EditItemTypeGetRes) -def edit_item_type_update(req: Schemas.EditItemTypeGetReq, db: Session = Depends(common_db.get_db)): - item = Crud.edit_item_type_get(db, req) +def edit_item_type_get(req: Schemas.EditItemTypeGetReq, db: Session = Depends(common_db.get_db)): + item = Crud.edit_item_type_get(db, req.id) + if not item: + raise HTTPException(detail="未查询到信息", status_code=404) return Schemas.EditItemTypeGetRes(**item.to_dict()) @@ -37,4 +39,39 @@ def edit_item_type_update(req: Schemas.EditItemTypeGetReq, db: Session = Depends def edit_item_type_query(req: Schemas.EditItemTypeQueryReq, db: Session = Depends(common_db.get_db)): count, query = Crud.edit_item_type_query(db, req) items = [Schemas.EditItemTypeInfo(**item.to_dict()) for item in query] - return Schemas.EditItemTypeQueryRes(count, items) + return Schemas.EditItemTypeQueryRes(count=count, items=items) + + +######### + +@router.post("/edit_record/add", summary="添加编辑记录", response_model=Schemas.EditRecordAddRes) +def edit_record_query(req: Schemas.EditRecordAddReq, db: Session = Depends(common_db.get_db)): + item = Crud.edit_record_add(db, req) + return Schemas.EditRecordAddRes(**item.to_dict()) + + +@router.post("/edit_record/delete", summary="删除编辑记录") +def edit_record_delete(req: Schemas.EditRecordDeleteReq, db: Session = Depends(common_db.get_db)): + Crud.edit_record_delete(db, req.id) + return "删除成功" + + +@router.post("/edit_record/update", summary="更新编辑记录", response_model=Schemas.EditRecordUpdateRes) +def edit_record_update(req: Schemas.EditRecordUpdateReq, db: Session = Depends(common_db.get_db)): + item = Crud.edit_record_update(db, req) + return Schemas.EditRecordUpdateRes(**item.to_dict()) + + +@router.post("/edit_record/get", summary="获取编辑记录", response_model=Schemas.EditRecordGetRes) +def edit_record_get(req: Schemas.EditRecordGetReq, db: Session = Depends(common_db.get_db)): + item = Crud.edit_record_get(db, req.id) + if not item: + raise HTTPException(detail="未查询到信息", status_code=404) + return Schemas.EditRecordGetRes(**item.to_dict()) + + +@router.post("/edit_record/query", summary="查询编辑记录", response_model=Schemas.EditRecordQueryRes) +def edit_record_query(req: Schemas.EditRecordQueryReq, db: Session = Depends(common_db.get_db)): + count, query = Crud.edit_record_query(db, req) + items = [Schemas.EditRecordFullInfo(**item.to_dict()) for item in query] + return Schemas.EditRecordQueryRes(count=count, items=items) diff --git a/Mods/EditRecord/Schemas.py b/Mods/EditRecord/Schemas.py index c8ca2e1..5e55e20 100644 --- a/Mods/EditRecord/Schemas.py +++ b/Mods/EditRecord/Schemas.py @@ -1,6 +1,10 @@ +from datetime import datetime + from pydantic import BaseModel from typing import Optional, List +from Mods.User.Schemas import UserInfo + class EditItemTypeInfo(BaseModel): id: Optional[int] @@ -56,3 +60,76 @@ class EditItemTypeQueryRes(BaseModel): class EditItemTypeDeleteReq(BaseModel): id: int + + +####################### + +class EditRecordInfo(BaseModel): + id: Optional[int] + edit_user: Optional[str] + item_id: Optional[int] + item_type_id: Optional[int] + before_edit_data: Optional[str] + after_edit_data: Optional[str] + edit_time: Optional[datetime] + create_time: Optional[datetime] + + +class EditRecordFullInfo(EditRecordInfo): + user_info: Optional[UserInfo] + item_type_info: EditItemTypeInfo + + +class EditRecordAddInfo(BaseModel): + edit_user: str + item_id: int + item_type_id: int + before_edit_data: Optional[str] + after_edit_data: Optional[str] + + +class EditRecordAddReq(EditRecordAddInfo): + pass + + +class EditRecordAddRes(EditRecordInfo): + pass + + +class EditRecordUpdateInfo(EditRecordInfo): + pass + + +class EditRecordUpdateReq(EditRecordUpdateInfo): + pass + + +class EditRecordUpdateRes(EditRecordInfo): + pass + + +class EditRecordQuery(EditRecordInfo): + pass + + +class EditRecordQueryReq(EditRecordQuery): + pass + + +class EditRecordGetReq(BaseModel): + id: int + + +class EditRecordGetRes(EditRecordFullInfo): + pass + + +class EditRecordQueryRes(BaseModel): + count: int + items: List[EditRecordFullInfo] + + +class EditRecordDeleteReq(BaseModel): + id: int + +########## diff --git a/Mods/User/Schemas.py b/Mods/User/Schemas.py index e69de29..6e5d90f 100644 --- a/Mods/User/Schemas.py +++ b/Mods/User/Schemas.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel + + +class UserInfo(BaseModel): + email: str + name: str + post: str + department: str + registered: bool