当前位置:网站首页>项目管理模块-项目权限功能开发
项目管理模块-项目权限功能开发
2022-08-02 14:14:00 【程序员小小度】
回顾
上一期,我们已经完成了项目的基础功能开发,但是初始化项目,同步项目这两个我们还没弄,这是数据工厂的核心点,本来这期想要讲这两个点,但是我觉得比较复杂,先延后了,今天我们来讲讲项目权限配置功能
需求
我们先来捋一下,我们的造数脚本关联着项目,如果不加项目权限的话,别人就可以随便执行脚本,不太友好;再加上项目的同步、初始化都依赖于git,里面存放着关键信息,随便开放给人编辑的话,会导致造数脚本无法执行···为此,我们得加入项目权限管理功能
项目权限表设计
在app/models
下新建project_role.py
class DataFactoryProjectRole(FunBaseModel):
"""
项目权限表
"""
__tablename__ = 'data_factory_project_role'
user_id = Column(INT, nullable=False, comment="用户id")
project_id = Column(INT, nullable=False, comment="项目id")
project_role = Column(SMALLINT, default=0, nullable=False, comment="0: 普通用户 1: 组长")
表比较简单,就记录哪个用户有哪个项目有什么权限
新增项目权限接口
- 入参模型
在app/routers/project
目录下,新建project_role_schema.py
,新增AddProjectRole
模型,代码如下:
class AddProjectRole(BaseModel):
project_id: int = Field(..., title="项目id", description="必传")
project_role: Literal[0, 1] = Field(..., title="项目权限", description="必传")
user_id: int = Field(..., title="用户id", description="必传")
@validator('project_id', 'project_role', 'user_id')
def name_not_empty(cls, v):
return ToolsSchemas.not_empty(v)
初始化表时,引用AddProjectRole
模型
- curd逻辑编写
新建app/curd/project_role/ProjectRoleDao.py
编写新增逻辑,代码如下:
class ProjectRoleDao(object):
log = Log("ProjectRoleDao")
@classmethod
@record_log
def insert_project_role(cls, form: AddProjectRole, user: dict) ->None:
"""
新增用户项目权限
:param form: 新增模型
:param user: 用户数据
:return:
"""
with Session() as session:
user_query = session.query(DataFactoryUser).filter(DataFactoryUser.id == form.user_id).first()
if user_query is None:
raise Exception("用户不存在!!!")
if user_query.is_valid:
raise NormalException("对不起, 该账号已被冻结, 无法添加项目权限")
user_role_query = session.query(DataFactoryProjectRole).filter(DataFactoryProjectRole.user_id == form.user_id, DataFactoryProjectRole.project_id == form.project_id, DataFactoryProjectRole.del_flag == 0).first()
if user_role_query is not None:
raise NormalException("该用户项目权限已存在!!!")
project_role = DataFactoryProjectRole(form, user)
session.add(project_role)
session.commit()
- 路由函数编写
这里路由编跟新增项目路由函数类似,有人好奇,为什么新增接口会返回新增之后的数据,其实就是为了前端体验好点,新增之后返回新增的数据,前端不再刷新列表接口更新页面数据;这里我重新思考了一下,新增接口还是做成不返回表对象好了,如果单表就还好,涉及到多表的,还得关联表查询一遍,还不如前端直接刷新列表接口去更新列表数据
编辑项目权限接口
- 入参模型
老规矩,这里通过继承即可,加个主键id好了
- curd逻辑编写
@classmethod
@record_log
def update_project_role(cls, form: EditProjectRole, user: dict) -> None:
"""更新用户项目权限"""
with Session() as session:
session.expire_on_commit = False
user_role_query = session.query(DataFactoryProjectRole).filter(DataFactoryProjectRole.id == form.id,
DataFactoryProjectRole.del_flag == 0).first()
if user_role_query is None:
raise Exception("用户角色不存在!!!")
DbUtils.update_model(user_role_query, form.dict(), user)
session.commit()
编辑逻辑比较简单,这里就不说了
- 路由函数编写
@router.post("/role/update", name="更新用户项目权限")
def update_project_role(data: EditProjectRole, user= Depends(Auth())):
try:
ProjectRoleDao.update_project_role(data, user)
return ResponseDto(msg="更新成功")
except Exception as e:
raise NormalException(str(e))
删除项目权限接口
- 入参模型
这里我们直接通过query参数,传入主键id即可
- curd逻辑
@classmethod
@record_log
def delete_project_role(cls, id: int, user: dict) -> None:
"""
删除项目权限
:param id: 主键id
:param user: 用户数据
:return:
"""
with Session() as session:
user_role_query = session.query(DataFactoryProjectRole).filter(DataFactoryProjectRole.id == id,
DataFactoryProjectRole.del_flag == 0).first()
if user_role_query is None:
raise NormalException("用户角色不存在!!!")
DbUtils.delete_model(user_role_query, user)
session.commit()
- 路由函数
@classmethod
@record_log
def delete_project_role(cls, id: int, user: dict) -> None:
"""
删除项目权限
:param id: 主键id
:param user: 用户数据
:return:
"""
with Session() as session:
user_role_query = session.query(DataFactoryProjectRole).filter(DataFactoryProjectRole.id == id,
DataFactoryProjectRole.del_flag == 0).first()
if user_role_query is None:
raise NormalException("用户角色不存在!!!")
DbUtils.delete_model(user_role_query, user)
session.commit()
项目权限列表接口
- 入参模型
这里入参跟项目列表接口类似,直接照搬过来即可
- curd逻辑
目前我们的项目权限表只存了用户id,但是前端页面展示这里的数据,需要把用户数据给展示出来,所以这里我们得连表进行查询;这里的话,只需要关联user表好了,展示用户信息的
@classmethod
@record_log
def project_role_list(cls, project_id: int, page = 1, limit = 10, search=None):
"""
获取项目权限成员列表
:param project_id: 项目id
:param page: 页码
:param limit: 大小
:param search: 搜索内容
:return:
"""
with Session() as session:
filter_list = [DataFactoryProjectRole.del_flag == 0, DataFactoryProjectRole.project_id == project_id]
if search:
filter_list.append(or_(DataFactoryUser.username.like(f"%{search}%"), DataFactoryUser.email.like(f"%{search}%")))
roles = session.query(DataFactoryUser.name, DataFactoryUser.username, DataFactoryUser.email, DataFactoryProjectRole.user_id,
DataFactoryProjectRole.project_role, DataFactoryProjectRole.project_id, DataFactoryProjectRole.id, DataFactoryProjectRole.create_name,
DataFactoryProjectRole.create_time).\
outerjoin(DataFactoryProjectRole, DataFactoryProjectRole.user_id == DataFactoryUser.id)
roles = roles.filter(*filter_list)
role_infos = roles.order_by(desc(DataFactoryProjectRole.create_time)).limit(limit).offset((page - 1) * limit).all()
count = roles.count()
return role_infos, count
- 返参模型
这里跟项目列表接口一样的套路好了
class RoleDto(BaseModel):
id: int
username: str
name: str
email: str
project_role: int
project_id: int
user_id: int
create_name: str
create_time: datetime
class Config:
orm_mode = True
json_encoders = {
datetime: lambda v: v.strftime("%Y-%m-%d %H:%M:%S")
}
class RoleList(ListDto):
lists: List[RoleDto]
class RoleListResDto(ResponseDto):
data: RoleList
class Config:
json_encoders = {
datetime: lambda v: v.strftime("%Y-%m-%d %H:%M:%S")
}
- 路由函数
@router.get("/role/list", name="获取项目权限成员列表", response_model=RoleListResDto)
def project_role_list(project_id: int, page: int=1, limit: int=10, search=None, _= Depends(Auth())):
try:
roles, count = ProjectRoleDao.project_role_list(project_id, page, limit, search)
return RoleListResDto(data=dict(total=count, lists=roles))
except Exception as e:
raise NormalException(str(e))
测试环节
- 新增项目成员权限
- 编辑项目成员权限
好像编辑这里有点问题,直接把原来的user_id给更新进去了,那我们把调整一下入参模型
调整后入参
- 删除项目成员权限
- 项目成员权限列表
总结
今天完成了项目管理模块-项目权限curd开发,curd比较简单,也比较枯燥,下一期我们来设计项目权限相关的逻辑,并在某些接口引入项目权限
边栏推荐
猜你喜欢
随机推荐
Oauth2.0 认证服务器添加验证码登陆方式
change the available bandwidth of tcp flow dynamically in mininet
Litestar 4D – WebCatalog 7:全自动数据管理
Test case exercises
CDH(computational Diffie-Hellman)问题以及与离散对数、DDH问题的区别
Qt | 读取文件内容并删除文件 QFile
net start mysql 服务名无效。
仿真结果的格式&定制
分布式一致性协议-Raft
基类和派生类的关系【继承】/多态和虚函数/【继承和多态】抽象类和简单工厂
【网络安全】学习笔记 --00
LITESTAR 4D应用:室内植物照明模拟
锥形相位掩模的Talbot图像
我的2021回忆录
【线程安全】用户级,内核级,组合级线程|线程同步的处理(条件变量)|strtok_r(可冲入函数)
The use of a semaphore/interprocess communication 】 【 Shared memory
Manifest merger failed : Attribute [email protected] value=
剑指offer:合并两个排序的链表
Problems related to prime numbers - small notes
三方对接接口数据安全问题