diff --git a/.idea/git_toolbox_prj.xml b/.idea/git_toolbox_prj.xml new file mode 100644 index 0000000..02b915b --- /dev/null +++ b/.idea/git_toolbox_prj.xml @@ -0,0 +1,15 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/urban-investment-research.iml b/.idea/urban-investment-research.iml index 8e5446a..e24c4b8 100644 --- a/.idea/urban-investment-research.iml +++ b/.idea/urban-investment-research.iml @@ -3,6 +3,7 @@ + @@ -11,4 +12,11 @@ + + + \ No newline at end of file diff --git a/Context/common.py b/Context/common.py index f587d14..ed6b464 100644 --- a/Context/common.py +++ b/Context/common.py @@ -1,5 +1,8 @@ # 全局使用的服务放到这里初始化,作为项目配置输入的入口 from logging import getLogger + +from sqlalchemy.orm import declarative_base + from Utils.AuthUtils import AuthUtil, TokenDataModel from Utils.RedisUtils import RedisPool from Utils.SqlAlchemyUtils import SqlalchemyConnect @@ -18,7 +21,8 @@ redis_pool = RedisPool(host=conf['redis']['host'], port=int(conf['redis']['port' redis_pool.connect() # 共用mysql数据库 -common_db = SqlalchemyConnect(host=conf['mysql']['host'], +common_db_base = declarative_base() +common_db = SqlalchemyConnect(common_db_base, host=conf['mysql']['host'], user=conf['mysql']['user'], password=conf['mysql']['password'], db=conf['mysql']['db']) diff --git a/Mods/EditRecord/Crud.py b/Mods/EditRecord/Crud.py index e69de29..a565c4e 100644 --- a/Mods/EditRecord/Crud.py +++ b/Mods/EditRecord/Crud.py @@ -0,0 +1,40 @@ +from sqlalchemy.orm import Session +from .Schemas import EditItemTypeQuery, EditItemTypeAddInfo +from .Models import EditRecord, EditItemType + + +def edit_item_type_add(db: Session, data: EditItemTypeAddInfo): + item = EditItemType(**data.dict()) + db.add(item) + db.commit() + db.refresh(item) + return item + + +def edit_item_type_delete(db: Session, item_id: int): + db.query(EditItemType).filter_by(id=item_id).delete() + db.commit() + + +def edit_item_type_query(db: Session, params: EditItemTypeQuery): + params_dict = params.dict() + query = db.query(EditItemType) + db_model = EditItemType + 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'] + 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 052a32d..05756bc 100644 --- a/Mods/EditRecord/Models.py +++ b/Mods/EditRecord/Models.py @@ -1,7 +1,43 @@ -from Utils.SqlAlchemyUtils import Base -from sqlalchemy import Column, Integer, String +from sqlalchemy.orm import relationship + +from Context.common import common_db +from sqlalchemy import Column, Integer, String, ForeignKey, Text + +Base = common_db.Base class EditRecord(Base): + """ + 编辑记录表 + """ + __tablename__ = "edit_record" id = Column(Integer, primary_key=True) - user = Column(String(255)) + edit_user = Column(String(128), ForeignKey('user.email'), comment="填报人") + 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_type_info = relationship('EditItemType', uselist=False, backref='edit_item_type') + before_edit_data = Column(Text, comment="编辑前的信息json") + after_edit_data = Column(Text, comment="编辑后的信息json") + + 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() + return data + + +class EditItemType(Base): + """ + 编辑项信息配置表,这个表需手动配置 + """ + __tablename__ = "edit_item_type" + id = Column(Integer, primary_key=True) + name = Column(String(255), comment="名称") + category = Column(String(255), comment="类别") + + def to_dict(self): + data = {c.name: getattr(self, c.name) for c in self.__table__.columns} + return data diff --git a/Mods/EditRecord/Router.py b/Mods/EditRecord/Router.py index e69de29..584d9d8 100644 --- a/Mods/EditRecord/Router.py +++ b/Mods/EditRecord/Router.py @@ -0,0 +1,35 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session + +from Context.common import common_db +from . import Schemas +from . import Crud + +router = APIRouter(tags=["日报"], + prefix="/api/record") + + +@router.post("/edit_item_type/add", response_model=Schemas.EditItemTypeAddRes) +def edit_item_type_query(req: Schemas.EditItemTypeAddReq, db: Session = Depends(common_db.get_db)): + item = Crud.edit_item_type_add(db, req) + return Schemas.EditItemTypeAddRes(**item.to_dict()) + + +@router.post("/edit_item_type/delete") +def edit_item_type_delete(req: Schemas.EditItemTypeDeleteReq, db: Session = Depends(common_db.get_db)): + Crud.edit_item_type_delete(db, req.id) + return "删除成功" + + +@router.post("/edit_item_type/update", response_model=Schemas.EditItemTypeUpdateRes) +def edit_item_type_update(req: Schemas.EditItemTypeUpdateReq, db: Session = Depends(common_db.get_db)): + count, query = Crud.edit_record_update(db, req) + items = [Schemas.EditItemTypeInfo(**item.to_dict()) for item in query] + return Schemas.EditItemTypeQueryRes(count, items) + + +@router.post("/edit_item_type/query", response_model=Schemas.EditItemTypeQueryRes) +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) diff --git a/Mods/EditRecord/Schemas.py b/Mods/EditRecord/Schemas.py index e69de29..88e8243 100644 --- a/Mods/EditRecord/Schemas.py +++ b/Mods/EditRecord/Schemas.py @@ -0,0 +1,38 @@ +from pydantic import BaseModel +from typing import Optional, List + + +class EditItemTypeInfo(BaseModel): + id: Optional[int] + name: Optional[str] + category: Optional[str] + + +class EditItemTypeAddInfo(BaseModel): + name: str + category: str + + +class EditItemTypeAddReq(EditItemTypeAddInfo): + pass + + +class EditItemTypeAddRes(EditItemTypeInfo): + pass + + +class EditItemTypeQuery(EditItemTypeInfo): + pass + + +class EditItemTypeQueryReq(EditItemTypeQuery): + pass + + +class EditItemTypeQueryRes(BaseModel): + count: int + items: List[EditItemTypeInfo] + + +class EditItemTypeDeleteReq(BaseModel): + id: int diff --git a/Utils/SqlAlchemyUtils.py b/Utils/SqlAlchemyUtils.py index d683c1c..4f869d5 100644 --- a/Utils/SqlAlchemyUtils.py +++ b/Utils/SqlAlchemyUtils.py @@ -2,11 +2,10 @@ from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker, Session -Base = declarative_base() - class SqlalchemyConnect: - def __init__(self, host="127.0.0.1", user="", password="", db=""): + def __init__(self, Base: declarative_base, host="127.0.0.1", user="", password="", db=""): + self.Base = Base self.host = host self.user = user self.password = password @@ -43,4 +42,4 @@ class SqlalchemyConnect: return db def init_database(self): - Base.metadata.create_all(bind=self.engine) + self.Base.metadata.create_all(bind=self.engine) diff --git a/debug.py b/debug.py index 8cbe184..925cb3f 100644 --- a/debug.py +++ b/debug.py @@ -1,6 +1,6 @@ from fastapi.exceptions import RequestValidationError from Config.uvicorn_log_config import uvicorn_log_config -from Middleware.DebugMiddleware import validation_exception_handler, exception_handler +from Utils.MiddlewareUtils import validation_exception_handler, exception_handler from Utils.PrintUtils import hook_print_exception from main import app import uvicorn diff --git a/main.py b/main.py index ab6630f..c1d5865 100644 --- a/main.py +++ b/main.py @@ -3,8 +3,6 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from Config.uvicorn_log_config import uvicorn_log_config -from Router import HelloRouter -from CrudRouter import StudentCrudRouter from Context.common import conf app = FastAPI( @@ -20,8 +18,6 @@ app.add_middleware( allow_headers=["*"], ) -app.include_router(HelloRouter.router) -app.include_router(StudentCrudRouter.router) if __name__ == '__main__': uvicorn.run(app, log_config=uvicorn_log_config, port=int(conf['app']['port']))