持续创作,加速生长!这是我参与「日新计划 6 月更文应战」的第12天,点击检查活动概况

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

回顾

之前咱们现已把登录、注册接口进行了联调,用户模块还有部分功能暂未开发结束,今天咱们来持续开发~

用户列表接口

首要咱们的后台得有用户展现的页面吧?然后可以对用户进行编辑(设置权限、封禁等…)这儿的话,需求用到一个列表接口,支撑分页、搜索功能、修正用户信息…

老规矩,先来界说一下接口的入参,列表接口这儿我用的是get恳求,直接设置途径参数好了,为什么不必post恳求呢?由于post恳求还得界说一个模型-类便是懒

  • 接口入参

    数据工厂系列(10)用户模块功能开发
    列表接口需求鉴权,必须得带上token,可是由于咱们没用到用户数据,所以直接命名为_: dict= Depends(Auth())好了

  • 接口返参 app/models/base.py新建一个base列表模型

    数据工厂系列(10)用户模块功能开发
    app/routers/user/user_schema.py新建用户列表返参模型
    数据工厂系列(10)用户模块功能开发
    本来的UserDto咱们新增idcreate_time两个字段
    数据工厂系列(10)用户模块功能开发

  • UserDao逻辑编写 app/curd/user/UserDao.py新增用户列表逻辑,新增如下:

@classmethod
    @record_log
    def get_user_infos(cls, page: int=1, limit: int=10, search: str=None) ->(int, DataFactoryUser):
        """获取用户信息列表"""
        with Session() as session:
            filter_list = []
            data = session.query(DataFactoryUser)
            if search:
                filter_list.append(DataFactoryUser.username.like(f"%{search}%"))
            user_infos = data.order_by(asc(DataFactoryUser.id)).filter(*filter_list)
            total = user_infos.count()
            return total, user_infos.limit(limit).offset((page - 1) * limit).all()

这儿的limit(limit).offset((page - 1) * limit)是分页的核心代码,大家记住不要写反了,从第几页开始,一页获取多少条数据,如果search有值时,就对用户名进行模糊搜索过滤,没值就默许不过滤

  • 路由函数逻辑编写

    数据工厂系列(10)用户模块功能开发
    这儿直接调用get_user_infos办法即可,将总数和用户列表数据传入用户列表模型中

  • 终究测验一下

正常获取列表数据

数据工厂系列(10)用户模块功能开发

搜索用户名

数据工厂系列(10)用户模块功能开发

修正用户信息接口

现在咱们的用户信息只要用户权限和是否冻结才干修正,其他都不允许修正,先来界说入参

  • 接口入参

数据工厂系列(10)用户模块功能开发
这儿要判别一下权限人物类型,其他就判空完事了~

  • 接口出参 这儿的话,直接用ResponseDto好了,回来提示信息为修正成功

  • 修正用户逻辑编写

    数据工厂系列(10)用户模块功能开发
    首要根据id查询用户,如果查不到就抛出反常,根据传入数据进行修正用户信息

  • 路由函数编写

数据工厂系列(10)用户模块功能开发
这儿要注意的是,修正用户信息现在就只要管理员才干操作,其他人都不能操作,所以这儿要加上权限控制

权限不足时操作

数据工厂系列(10)用户模块功能开发

恳求接口,发现数据库中的某些字段为空的,还记住咱们最初规划表的时候规划了update_codeupdate_name这两个字段,为的是记录xxx修正这条数据,所以这儿咱们得上用这两个字段,那就加上呗

数据工厂系列(10)用户模块功能开发
数据工厂系列(10)用户模块功能开发
看到这上面的更新操作,其实都字段算是比较少,那如果以后要更新的字段比较多,不便是很多xxx.xxx = xxx为此,咱们就更新这个操作封装一下,以下代码来自于无敌哥的pity,无敌哥yyds

新建app/utils/db_utils.py

from datetime import datetime
class DbUtils(object):
    @staticmethod
    def update_model(dist, source, update_user=None, not_null=False):
        """
        :param dist: 表对象
        :param source: 更新的数据
        :param update_user: 更新人
        :param not_null: 是否疏忽更新null
        :return:
        """
        for var, value in source.items():
            if not_null:
                if value:
                    setattr(dist, var, value)
            else:
                setattr(dist, var, value)
            if update_user:
                setattr(dist, 'update_code', update_user['id'])
                setattr(dist, 'update_name', update_user['username'])
    @staticmethod
    def delete_model(dist, delete_user=None):
        """
        :param dist:
        :param delete_user:
        :return:
        """
        dist.del_flag = 1
        dist.update_time = datetime.now()
        if delete_user:
            dist.update_code =  delete_user['id']
            dist.update_name =  delete_user['username']

update_model通过传进去的数据,循环进行setattr,如果not_null=True就更新字段值,否则不更新,delete_model默许更新del_flagupdate_time字段,这个办法暂时用不上,先占个坑~

接着改造update_user办法

数据工厂系列(10)用户模块功能开发

终究测验一下

数据工厂系列(10)用户模块功能开发

数据库字段

数据工厂系列(10)用户模块功能开发

总结

今天进行了用户模块的功能完善,咱们的用户模块暂时告一段落啦,用户模块算是开发好啦~下期咱们来进行前后端联调!

  • 项目地址
    • 后端:github.com/JokerChat/F…
    • 前端:github.com/JokerChat/F…
  • 今日提交代码
    • 4e4e3aebaed39406e146cd76484dc13746dd51a2