数据工厂系列(12)项目管理模块-项目基础信息开发

97 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

大家好~我是小方,欢迎大家关注笋货测试笔记体完记得俾个like

回顾

我们已经完成管理中心-用户管理功能开发,管理中心还有一个模块-项目管理,我们继续开干吧~

表设计

项目管理,我们可以来想一下,会有哪些字段呢?最基础的字段会有创建时间、更新时间、是否删除、创建人、修改人、项目名称、项目描述、项目负责人等,我们之前有介绍过,通过git地址拉取项目,那么会有git地址、分支名、拉取方式(这里支持http拉取或者ssh拉取)、http拉取的话,是要有账号密码的,那就是git账号和密码···上面介绍了这么多,那么我们先来设计表吧 表字段相对来说比较多,大家后续可慢慢磨磨~ wait!这里发现其实每个表都会主键id、创建时间、更新时间、创建人、更新人,那我们每次新建表都重复写一遍不就很累?所以这里我们新建一个BaseModel,通过继承它,那么每次新建的表都会有这些字段~

我们在app/models/base.py新建这个BaseModel

class FunBaseModel(Base):
    id = Column(INT, primary_key=True, comment="主键id")
    create_time = Column(DATETIME, nullable=False, comment="创建时间")
    update_time = Column(DATETIME, onupdate=func.now(), nullable=False, comment="更新时间")
    del_flag = Column(SMALLINT, default=0, nullable=False, comment="0: 未删除 1: 已删除")
    create_code = Column(String(20), nullable=True, comment="创建人编码")
    create_name = Column(String(20), nullable=True, comment="创建人")
    update_code = Column(String(20), nullable=True, comment="更新人编码")
    update_name = Column(String(20), nullable=True, comment="更新人")
    #设置为True,代表为基类,不会被创建为表
    __abstract__ = True

    def __init__(self, create_code=None, create_name=None, update_code=None, update_name=None, del_flag=0, id = None):
        self.id = id
        self.create_time = datetime.now()
        self.update_time = datetime.now()
        self.del_flag = del_flag
        self.create_code = create_code
        self.create_name= create_name
        self.update_code = update_code
        self.update_name = update_name

修改后

接着我们来设计一下新增项目的模型吧,新建app/routers/project/project_schema.py,记得要新建project目录,完整代码:

from pydantic import BaseModel, validator, Field
from typing import Literal, Optional
from app.models.base import ToolsSchemas


class AddProject(BaseModel):
    project_name: str = Field(..., title="项目名称", description="必传")
    description: str = Field(None, title="项目描述", description="非必传")
    owner: str = Field(..., title="项目负责人", description="必传")
    directory: str = Field(..., title="脚本目录", description="必传")
    private: bool = Field(..., title="是否私有", description="必传")
    pull_type: Literal[0, 1] = Field(..., title="拉取项目形式", description="必传")
    git_project: str = Field(..., title="git项目名", description="必传")
    git_url: str = Field(..., title="git地址", description="必传")
    git_branch: str = Field(..., title="git分支名", description="必传")
    git_account: Optional[str] = Field(..., title="git账号", description="非必传")
    git_password: Optional[str] = Field(..., title="git密码", description="非必传")

    @validator('project_name', 'owner', 'directory', 'private', 'git_project', 'pull_type', 'git_url','git_branch')
    def name_not_empty(cls, v):
        return ToolsSchemas.not_empty(v)

    @validator('git_account')
    def check_account(cls, v, values, **kwargs):
        if 'pull_type' in values and values['pull_type'] == 0:
            v = ToolsSchemas.not_empty(v)
            return v
        return v

    @validator('git_password')
    def check_pwd(cls, v, values, **kwargs):
        if 'pull_type' in values and values['pull_type'] == 0:
            v = ToolsSchemas.not_empty(v)
            return v
        return v

这里新增项目的字段其实跟我们设计的表结构基本一致,这里有个巧妙之处,git_accountgit_password这两个字段只有拉取方式为ssh时,才是需要必传,所以如果pull_type = 0 就要校验是否为空!

设计好新增模型之后,我们初始化表时,将其用上~

项目表新增功能设计

新建app/curd/project/ProjectDao.py,添加以下代码:

from sqlalchemy import or_
from app.models import Session
from app.models.project import DataFactoryProject
from app.models.user import DataFactoryUser
from app.routers.project.project_schema import AddProject
from app.utils.logger import Log
from app.utils.exception_utils import record_log
from app.utils.exception_utils import NormalException


class ProjectDao(object):

    log = Log("ProjectDao")

    @classmethod
    @record_log
    def insert_project(cls, form: AddProject, user: dict) -> DataFactoryProject:
        with Session() as session:
            session.expire_on_commit = False
            user_query = session.query(DataFactoryUser.username).filter( DataFactoryUser.username == form.owner).first()
            if user_query is None:
                raise NormalException("用户不存在!!!")
            project = session.query(DataFactoryProject).filter( or_(DataFactoryProject.project_name == form.project_name, DataFactoryProject.git_project == form.git_project),
                                                   DataFactoryProject.del_flag==0).first()
            if project:
                raise NormalException("项目名或者git项目名重复, 请重新录入!!!")
            projects = DataFactoryProject(form, user)
            session.add(projects)
            session.commit()
            session.expunge(projects)
            return projects

这里逻辑简单说一下,先判断传过来的用户是否存在,再根据项目名或者git项目名判断是否重复,提交数据库后,刷新projects并返回projects

新增项目路由函数

在写路由函数之前,我们先来定义一下新增项目的返参模型

class ProjectDto(BaseModel):
    id: int
    project_name: str
    description: str = None
    directory: str
    owner: str
    private: bool
    pull_type: int
    git_project: str
    git_url: str
    git_branch: str
    git_account: str = None
    git_password: str = None
    create_time: datetime
    update_time: datetime
    del_flag: int
    create_code: int
    create_name: str
    update_code: str = None
    update_name: str = None

    class Config:
        orm_mode = True
        json_encoders = {
            datetime: lambda v: v.strftime("%Y-%m-%d %H:%M:%S")
        }

class ProjectResDto(ResponseDto):
    data: ProjectDto

新建app/routers/project/project.py,添加以下代码:

from fastapi import APIRouter, Depends
from app.curd.project.ProjectDao import ProjectDao
from app.routers.project.project_schema import AddProject
from app.utils.auth_utils import Auth
from app.utils.exception_utils import NormalException
from app.models.base import ResponseDto
from config import Permission

router = APIRouter()

@router.post('/insert', name='新增项目')
def insert_project(body: AddProject, user= Depends(Auth(Permission.LEADER))):
    try:
        _ = ProjectDao.insert_project(body, user)
        return ResponseDto(msg="新增成功")
    except Exception as e:
        raise NormalException(str(e))

这里不过多解释啦,都是直接引用ProjectDao.insert_project,注意这里的权限,我们设置成组长以上才能新增项目,其他都不能新增项目~

随便测试一下

数据入库之后,发现密码为明文,下期我们来优化一下

总结

今天设计了项目表,并完成了项目的新增逻辑编写,今天内容不算多,大家跟着教程慢慢跟下去~