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

981 阅读4分钟

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

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

回顾

之前我们已经把登录、注册接口进行了联调,用户模块还有部分功能暂未开发完毕,今天我们来继续开发~

用户列表接口

首先我们的后台得有用户展示的页面吧?然后可以对用户进行编辑(设置权限、封禁等...)这里的话,需要用到一个列表接口,支持分页、搜索功能、修改用户信息...

老规矩,先来定义一下接口的入参,列表接口这里我用的是get请求,直接设置路径参数好了,为什么不用post请求呢?因为post请求还得定义一个模型-类就是懒

  • 接口入参 列表接口需要鉴权,必须得带上token,但是因为我们没用到用户数据,所以直接命名为_: dict= Depends(Auth())好了

  • 接口返参 app/models/base.py新建一个base列表模型 app/routers/user/user_schema.py新建用户列表返参模型 原来的UserDto我们新增idcreate_time两个字段

  • 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有值时,就对用户名进行模糊搜索过滤,没值就默认不过滤

  • 路由函数逻辑编写 这里直接调用get_user_infos方法即可,将总数和用户列表数据传入用户列表模型中

  • 最后测试一下

正常获取列表数据

搜索用户名

修改用户信息接口

目前我们的用户信息只有用户权限和是否冻结才能修改,其他都不允许修改,先来定义入参

  • 接口入参

这里要判断一下权限角色类型,其他就判空完事了~

  • 接口出参 这里的话,直接用ResponseDto好了,返回提示信息为修改成功

  • 修改用户逻辑编写 首先根据id查询用户,如果查不到就抛出异常,根据传入数据进行修改用户信息

  • 路由函数编写

这里要注意的是,修改用户信息目前就只有管理员才能操作,其他人都不能操作,所以这里要加上权限控制

权限不足时操作

请求接口,发现数据库中的某些字段为空的,还记得我们当初设计表的时候设计了update_codeupdate_name这两个字段,为的是记录xxx修改这条数据,所以这里我们得上用这两个字段,那就加上呗 看到这上面的更新操作,其实都字段算是比较少,那如果以后要更新的字段比较多,不就是很多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方法

最终测试一下

数据库字段

总结

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