diff --git a/Mods/BasicInformation/Mods/CompanyBaseInfo/Schemas.py b/Mods/BasicInformation/Mods/CompanyBaseInfo/Schemas.py index c1217c4..224b49f 100644 --- a/Mods/BasicInformation/Mods/CompanyBaseInfo/Schemas.py +++ b/Mods/BasicInformation/Mods/CompanyBaseInfo/Schemas.py @@ -9,8 +9,8 @@ class CompanyBaseInfoInfo(BaseModel): legal_person: Optional[str] reg_capital: Optional[str] paid_capital: Optional[str] - establish_date: date - approved_date: date + establish_date: Optional[date] + approved_date: Optional[date] license_duration: Optional[str] reg_status: Optional[str] reg_location: Optional[str] diff --git a/Mods/CommonInformation/Mods/OpinionInformation/Crud.py b/Mods/CommonInformation/Mods/OpinionInformation/Crud.py new file mode 100644 index 0000000..19101e1 --- /dev/null +++ b/Mods/CommonInformation/Mods/OpinionInformation/Crud.py @@ -0,0 +1,57 @@ +from sqlalchemy.orm import Session +from . import Schemas +from .Models import OpinionInformation + + +def opinion_information_add(db: Session, data: Schemas.OpinionInformationAddInfo): + item = OpinionInformation(**data.dict()) + db.add(item) + db.commit() + db.refresh(item) + return item + + +def opinion_information_delete(db: Session, item_id: int): + db.query(OpinionInformation).filter_by(id=item_id).delete() + db.commit() + + +def opinion_information_update(db: Session, data: Schemas.OpinionInformationUpdateInfo): + db.query(OpinionInformation).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(OpinionInformation).filter_by(id=data.id).first() + return item + + +def opinion_information_get(db: Session, item_id: int): + item = db.query(OpinionInformation).filter_by(id=item_id).first() + return item + + +def opinion_information_query(db: Session, params: Schemas.OpinionInformationQuery): + params_dict = params.dict() + query = db.query(OpinionInformation) + db_model = OpinionInformation + 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 + + +################ \ No newline at end of file diff --git a/Mods/CommonInformation/Mods/OpinionInformation/Models.py b/Mods/CommonInformation/Mods/OpinionInformation/Models.py new file mode 100644 index 0000000..dfb1288 --- /dev/null +++ b/Mods/CommonInformation/Mods/OpinionInformation/Models.py @@ -0,0 +1,22 @@ +from sqlalchemy.orm import relationship +from Context.common import common_db +from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, func, Date + + +class OpinionInformation(common_db.Base): + """ + 舆情资讯表 + """ + __tablename__ = "opinion_information" + id = Column(Integer) + type = Column(String(128), comment="主体类别") + item_id = Column(Integer, comment="资讯主体id") + title = Column(String(128), comment="标题") + url = Column(Text, comment="原文链接") + publish_date = Column(Date, comment="发布时间") + remark = Column(Text, comment="备注") + created_at = Column(DateTime, comment="创建时间") + + def to_dict(self): + data = {c.name: getattr(self, c.name) for c in self.__table__.columns} + return data diff --git a/Mods/CommonInformation/Mods/OpinionInformation/Router.py b/Mods/CommonInformation/Mods/OpinionInformation/Router.py new file mode 100644 index 0000000..46ef743 --- /dev/null +++ b/Mods/CommonInformation/Mods/OpinionInformation/Router.py @@ -0,0 +1,43 @@ +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session + +from Context.common import common_db +from . import Schemas +from . import Crud + +router = APIRouter(tags=["舆情资讯"]) + + +@router.post("/opinion_information/add", summary="添加舆情资讯", response_model=Schemas.OpinionInformationAddRes) +def opinion_information_add(req: Schemas.OpinionInformationAddReq, db: Session = Depends(common_db.get_db)): + item = Crud.opinion_information_add(db, req) + return Schemas.OpinionInformationAddRes(**item.to_dict()) + + +@router.post("/opinion_information/delete", summary="删除舆情资讯") +def opinion_information_delete(req: Schemas.OpinionInformationDeleteReq, db: Session = Depends(common_db.get_db)): + Crud.opinion_information_delete(db, req.id) + return "删除成功" + + +@router.post("/opinion_information/update", summary="更新舆情资讯", response_model=Schemas.OpinionInformationUpdateRes) +def opinion_information_update(req: Schemas.OpinionInformationUpdateReq, db: Session = Depends(common_db.get_db)): + item = Crud.opinion_information_update(db, req) + return Schemas.OpinionInformationUpdateRes(**item.to_dict()) + + +@router.post("/opinion_information/get", summary="获取舆情资讯", response_model=Schemas.OpinionInformationGetRes) +def opinion_information_get(req: Schemas.OpinionInformationGetReq, db: Session = Depends(common_db.get_db)): + item = Crud.opinion_information_get(db, req.id) + if not item: + raise HTTPException(detail="未查询到信息", status_code=404) + return Schemas.OpinionInformationGetRes(**item.to_dict()) + + +@router.post("/opinion_information/query", summary="查询舆情资讯", response_model=Schemas.OpinionInformationQueryRes) +def opinion_information_query(req: Schemas.OpinionInformationQueryReq, db: Session = Depends(common_db.get_db)): + count, query = Crud.opinion_information_query(db, req) + items = [Schemas.OpinionInformationInfo(**item.to_dict()) for item in query] + return Schemas.OpinionInformationQueryRes(count=count, items=items) + +######### diff --git a/Mods/CommonInformation/Mods/OpinionInformation/Schemas.py b/Mods/CommonInformation/Mods/OpinionInformation/Schemas.py new file mode 100644 index 0000000..e3a07d6 --- /dev/null +++ b/Mods/CommonInformation/Mods/OpinionInformation/Schemas.py @@ -0,0 +1,71 @@ +from datetime import datetime, date +from pydantic import BaseModel +from typing import Optional, List + + +class OpinionInformationInfo(BaseModel): + id: Optional[int] + type: Optional[str] + item_id: Optional[int] + title: Optional[str] + url: Optional[str] + publish_date: Optional[date] + remark: Optional[str] + created_at: Optional[datetime] + + +class OpinionInformationAddInfo(BaseModel): + type: Optional[str] + item_id: Optional[int] + title: str + url: Optional[str] + publish_date: Optional[date] + remark: Optional[str] + + +class OpinionInformationAddReq(OpinionInformationAddInfo): + pass + + +class OpinionInformationAddRes(OpinionInformationInfo): + pass + + +class OpinionInformationUpdateInfo(OpinionInformationInfo): + pass + + +class OpinionInformationUpdateReq(OpinionInformationUpdateInfo): + pass + + +class OpinionInformationUpdateRes(OpinionInformationInfo): + pass + + +class OpinionInformationQuery(OpinionInformationInfo): + page_size: Optional[int] + page: Optional[int] + + +class OpinionInformationQueryReq(OpinionInformationQuery): + pass + + +class OpinionInformationGetReq(BaseModel): + id: int + + +class OpinionInformationGetRes(OpinionInformationInfo): + pass + + +class OpinionInformationQueryRes(BaseModel): + count: int + items: List[OpinionInformationInfo] + + +class OpinionInformationDeleteReq(BaseModel): + id: int + +####################### diff --git a/Mods/CommonInformation/Router.py b/Mods/CommonInformation/Router.py new file mode 100644 index 0000000..4b3b2d5 --- /dev/null +++ b/Mods/CommonInformation/Router.py @@ -0,0 +1,9 @@ +from fastapi import APIRouter, Depends +from .Mods.OpinionInformation import Router as OpinionInformationRouter +from Context.common import auth_util + +router = APIRouter( + prefix="/api/common_information", + dependencies=[Depends(auth_util.token_data_depend)] +) +router.include_router(OpinionInformationRouter.router) diff --git a/main.py b/main.py index 38fe89e..9c7eee1 100644 --- a/main.py +++ b/main.py @@ -7,7 +7,9 @@ from Mods.EditRecord import Router as EditRecordRouter from Mods.User import Router as UserRouter from Mods.BasicInformation import Router as BasicInformationRouter from Mods.OtherInformation import Router as OtherInformationRouter +from Mods.CommonInformation import Router as CommonInformationRouter from Utils.RecordUtils import record_middleware + common_db.init_database() app = FastAPI( title="城投调研工具后端", @@ -22,12 +24,12 @@ app.add_middleware( allow_headers=["*"], ) - app.middleware('http')(record_middleware) app.include_router(EditRecordRouter.router) app.include_router(UserRouter.router) app.include_router(BasicInformationRouter.router) app.include_router(OtherInformationRouter.router) +app.include_router(CommonInformationRouter.router) if __name__ == '__main__': uvicorn.run(app, log_config=uvicorn_log_config, port=int(conf['app']['port']))