测试平台系列(19) 编写项目的增删改查接口和页面(1)

开篇闲聊

昨天在JD买了个跳绳的玩意,打算后面好好锻炼下身体。平时久坐又加上不怎么运动,导致各种小毛病还是挺多的,建议大家也在学习之余,多放松下身体。比如像某榜一大哥带妹跑步,带妹羽毛球,都是很不错的锻炼方式。对于我这种懒人,就买根绳子跳一跳吧,不然可能上个6楼都得喘气了!

回顾

上一节咱们定制好了简单的权限系统,也设计了相关的表概念。但是表只有对应的model,并没有编写实际的操作接口,所以今天我们来完善他们!

上次我们编写的TestCase表存在一点问题,首先是没有params字段,也没有body字段,当然可能还缺少很多字段,我们可以在后续的开发过程中陆续补充

在dao/init.py加入新创建的表

image

修改TestCase表

加入params和body字段

编写项目和项目角色的增删改查接口

首先咱们明确一个要求,因为项目有公有和私有的概念,所以对于用户能看到的项目应该是这样的逻辑:

  • 普通用户

    能看到公有项目私有项目(用户在该成员中,成员或创建者)

  • 管理员

    能看到所有项目

    由于我们需要通过用户id拿到对应所属的project,所以我们先编写project_role相关接口

设计表的时候漏掉了,这里补上user_id

编写app/dao/project/ProjectRoleDao.py

from app.models import db
from app.models.project_role import ProjectRole
from app.utils.logger import Log


class ProjectRoleDao(object):
    log = Log("ProjectRoleDao")

    @staticmethod
    def list_project_by_user(user_id):
        """
        通过user_id获取项目列表
        :param user_id:
        :return:
        """
        try:
            projects = ProjectRole.query.filter_by(user_id=user_id, deleted_at=None).all()
            return [p.id for p in projects], None
        except Exception as e:
            ProjectRoleDao.log.error(f"查询用户: {user_id}项目失败, {e}")
            return [], f"查询项目失败, {e}"

    @staticmethod
    def add_project_role(user_id, project_id, project_role, user):
        """
        为项目添加用户
        :param user_id: 用户id
        :param project_id: 项目id
        :param project_role: 用户角色
        :param user: 创建人
        :return:
        """
        try:
            role = ProjectRole.query.filter_by(user_id=user_id, project_id=project_id, project_role=project_role,
                                               deleted_at=None).first()
            if role is not None:
                # 说明角色已经存在了
                return "该用户已存在"
            role = ProjectRole(user_id, project_id, project_role, user)
            db.session.add(role)
            db.session.commit()
        except Exception as e:
            ProjectRoleDao.log.error(f"添加项目用户失败, {e}")
            return f"添加项目用户失败, {e}"
        return None

这边暂时编写了2个接口,1个是通过用户获取到用户的项目,另一个是为项目添加用户,代码很简单,也写了一些注释。由于暂时我们需要快速做一个展示,所以暂时提供,增和查功能即可,后续的接口再慢慢补充。

编写app/dao/project/ProjectRole.py

由于我们已经可以通过user_id获取到他有权限的项目,那么接下来我们把它和共有项目做一个整合就可以了。因为project不可能太多,所以这边我们直接用in操作符,先预想一下sql:

select * from project where deleted_at is null and (owner = user or project_id in (已经查出的用户项目) or private is false);

首先必须是未删除的,其次是owner=user的,再就是非私有或者用户有权限的。

如果对于超级管理员来说的话,那么他们对于所有项目都是可见的。

from sqlalchemy import or_

from app import pity
from app.dao.project.ProjectRoleDao import ProjectRoleDao
from app.models import db
from app.models.project import Project
from app.utils.logger import Log


class ProjectDao(object):
    log = Log("ProjectDao")

    @staticmethod
    def list_project(user, role, page, size, name=None):
        """
        查询/获取项目列表
        :param user: 当前用户
        :param role: 当前用户角色
        :param page: 当前页码
        :param size: 当前size
        :param name: 项目名称
        :return:
        """
        try:
            search = [Project.deleted_at == None]
            if role != pity.config.get("ADMIN"):
                project_list = ProjectRoleDao.list_project_by_user(user)
                search.append(or_(Project.id in project_list, Project.owner == user, Project.private == False))
            if name:
                search.append(Project.name.ilike("%{}%".format(name)))
            data = Project.query.filter(*search)
            total = data.count()
            return data.order_by(Project.created_at.desc()).paginate(page, per_page=size).items, total, None
        except Exception as e:
            ProjectDao.log.error(f"获取用户: {user}项目列表失败, {e}")
            return 0, 0, f"获取用户: {user}项目列表失败, {e}"

    @staticmethod
    def add_project(name, owner, user, private):
        try:
            data = Project.query.filter_by(name=name, deleted_at=None).first()
            if data is None:
                return "项目已存在"
            pr = Project(name, owner, user, private)
            db.session.add(pr)
            db.session.commit(pr)
        except Exception as e:
            ProjectDao.log.error(f"新增项目: {name}失败, {e}")
            return 0, 0, f"新增项目: {name}失败, {e}"

这里重点关注list_project,里面先判断用户是不是ADMIN,如果不是,则查询一下这个用户拥有的项目,等于说是转换了我们刚才写的sql。

最后通过项目的创建时间进行了排序,并进行了分页并返回了项目总数,第三个参数是error信息。

编写具体的接口

  • /project/insertProject
  • /project/listProject
  • /project/insertProjectRole

编写获取分页的相关方法app/handler/page.py

from flask import request

# 默认页数和页码
PAGE = 1
SIZE = 10


class PageHandler(object):

    @staticmethod
    def page():
        """
        获取page和size
        :return:
        """
        page = request.args.get("page")
        if page is None or not page.isdigit():
            page = PAGE
        size = request.args.get("size")
        if size is None or not size.isdigit():
            size = SIZE
        return int(page), int(size)

如果没有获取到page/size或者说他们不是非数字,那么我们就给个默认值。


篇幅有限,这篇内容先到这里吧!再不去做饭要饿死了!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容