持续创作,加速成长!这是我参与「掘金日新计划 · 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_account
和git_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
,注意这里的权限,我们设置成组长以上才能新增项目,其他都不能新增项目~
随便测试一下
数据入库之后,发现密码为明文,下期我们来优化一下
总结
今天设计了项目表,并完成了项目的新增逻辑编写,今天内容不算多,大家跟着教程慢慢跟下去~
- 项目地址
- 今日已提交代码
- 后端:24a2275