012、Python+fastapi,第一个后台管理项目走向第12步:建立python+fastapi项目,建个接口测试一下是否能跑通

一、说明 

上图是做了个登录接口,很简单很简单,只是为了跑通代码

 证明接口文档正常,

数据库正常

我们贴下代码

安装dao==》server==》controler

二、建立部分do文件

需要学习do vo这些区别的,可以理解为do就是数据库的表对应,而vo就是do转化为view需要用到的类

可以看看

领域驱动系列-浅析VO、DTO、DO、PO - 知乎 (zhihu.com)icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/643346204

#mucauna-fastapi/admin/entity/do/dept_do.py
from sqlalchemy import Column, Integer, String, DateTime
from config.database import Base
from datetime import datetime


class SysDept(Base):
    """
    部门表
    """
    __tablename__ = 'sys_dept'

    dept_id = Column(Integer, primary_key=True, autoincrement=True, comment='部门id')
    parent_id = Column(Integer, default=0, comment='父部门id')
    ancestors = Column(String(50), nullable=True, default='', comment='祖级列表')
    dept_name = Column(String(30), nullable=True, default='', comment='部门名称')
    order_num = Column(Integer, default=0, comment='显示顺序')
    leader = Column(String(20), nullable=True, default=None, comment='负责人')
    phone = Column(String(11), nullable=True, default=None, comment='联系电话')
    email = Column(String(50), nullable=True, default=None, comment='邮箱')
    status = Column(String(1), nullable=True, default=0, comment='部门状态(0正常 1停用)')
    del_flag = Column(String(1), nullable=True, default=0, comment='删除标志(0代表存在 2代表删除)')
    create_by = Column(String(64), nullable=True, default='', comment='创建者')
    create_time = Column(DateTime, nullable=True, default=datetime.now(), comment='创建时间')
    update_by = Column(String(64), nullable=True, default='', comment='更新者')
    update_time = Column(DateTime, nullable=True, default=datetime.now(), comment='更新时间')
 

#mucauna-fastapi/admin/entity/do/user_do.py
from sqlalchemy import Column, Integer, String, DateTime
from config.database import Base
from datetime import datetime


class SysUser(Base):
    """
    用户信息表
    """
    __tablename__ = 'sys_user'

    user_id = Column(Integer, primary_key=True, autoincrement=True, comment='用户ID')
    dept_id = Column(Integer, comment='部门ID')
    user_name = Column(String(30, collation='utf8_general_ci'), nullable=False, comment='用户账号')
    nick_name = Column(String(30, collation='utf8_general_ci'), nullable=False, comment='用户昵称')
    user_type = Column(String(2, collation='utf8_general_ci'), default='00', comment='用户类型(00系统用户)')
    email = Column(String(50, collation='utf8_general_ci'), default='', comment='用户邮箱')
    phonenumber = Column(String(11, collation='utf8_general_ci'), default='', comment='手机号码')
    sex = Column(String(1, collation='utf8_general_ci'), default='0', comment='用户性别(0男 1女 2未知)')
    avatar = Column(String(100, collation='utf8_general_ci'), default='', comment='头像地址')
    password = Column(String(100, collation='utf8_general_ci'), default='', comment='密码')
    status = Column(String(1, collation='utf8_general_ci'), default='0', comment='帐号状态(0正常 1停用)')
    del_flag = Column(String(1, collation='utf8_general_ci'), default='0', comment='删除标志(0代表存在 2代表删除)')
    login_ip = Column(String(128, collation='utf8_general_ci'), default='', comment='最后登录IP')
    login_date = Column(DateTime, comment='最后登录时间')
    create_by = Column(String(64, collation='utf8_general_ci'), default='', comment='创建者')
    create_time = Column(DateTime, comment='创建时间', default=datetime.now())
    update_by = Column(String(64, collation='utf8_general_ci'), default='', comment='更新者')
    update_time = Column(DateTime, comment='更新时间', default=datetime.now())
    remark = Column(String(500, collation='utf8_general_ci'), comment='备注')


class SysUserRole(Base):
    """
    用户和角色关联表
    """
    __tablename__ = 'sys_user_role'

    user_id = Column(Integer, primary_key=True, nullable=False, comment='用户ID')
    role_id = Column(Integer, primary_key=True, nullable=False, comment='角色ID')


class SysUserPost(Base):
    """
    用户与岗位关联表
    """
    __tablename__ = 'sys_user_post'

    user_id = Column(Integer, primary_key=True, nullable=False, comment='用户ID')
    post_id = Column(Integer, primary_key=True, nullable=False, comment='岗位ID')
 

 三、建立部分vo文件

#mucauna-fastapi/admin/entity/vo/login_vo.py
from pydantic import BaseModel, ConfigDict
from pydantic.alias_generators import to_camel
from typing import Optional


class UserLogin(BaseModel):
    model_config = ConfigDict(alias_generator=to_camel)

    user_name: str
    password: str
    code: Optional[str] = None
    uuid: Optional[str] = None
    login_info: Optional[dict] = None
    captcha_enabled: Optional[bool] = None

四、login_dao

#mucauna-fastapi/admin/dao/login_dao.py
from sqlalchemy.orm import Session
from admin.entity.do.user_do import SysUser
from admin.entity.do.dept_do import SysDept
from sqlalchemy import and_

def login_by_account(db: Session, user_name: str):
    """
    根据用户名查询用户信息
    :param db: orm对象
    :param user_name: 用户名
    :return: 用户对象
    """
    user = db.query(SysUser, SysDept)\
        .filter(SysUser.user_name == user_name, SysUser.del_flag == '0') \
        .outerjoin(SysDept, and_(SysUser.dept_id == SysDept.dept_id, SysDept.status == 0, SysDept.del_flag == 0)) \
        .distinct() \
        .first()

    return user

五、login_service

#mucauna-fastapi/admin/service/login_service.py
from fastapi import Request
from admin.entity.vo.login_vo import *
from admin.dao.login_dao import *
from systemhandle.exceptions.exception import LoginException
from loguru import logger

class LoginService:
    """
    登录模块服务层
    """
    @classmethod
    async def authenticate_user(cls, request: Request, query_db: Session, login_user: UserLogin):
        """
        根据用户名密码校验用户登录
        :param request: Request对象
        :param query_db: orm对象
        :param login_user: 登录用户对象
        :return: 校验结果
        """
        user = login_by_account(query_db, login_user.user_name)
        if not user:
            logger.warning("用户不存在")
            raise LoginException(data="", message="用户不存在")
        logger.debug("user = ",user)

 六、login_controller

#mucauna-fastapi/admin/controller/login_controller.py
from fastapi import APIRouter
from admin.service.login_service import *
from admin.entity.vo.login_vo import *
from admin.dao.login_dao import *

from utils.response_util import ResponseUtil
from utils.log_util import *
from datetime import timedelta
from fastapi import Depends
from config.get_db import get_db

loginController = APIRouter()
@loginController.post("/login")
async def login(request: Request, userName:str,password:str, query_db: Session = Depends(get_db)):
    user = UserLogin(
        userName=userName,
        password=password,  #"$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2",
        captchaEnabled=False
    )
    try:
        result = await LoginService.authenticate_user(request, query_db, user)
        logger.debug("result = ",result)
    except LoginException as e:
        return ResponseUtil.failure(msg=e.message)
    return ResponseUtil.success(
            msg='登录成功',
            dict_content={'token': "1234"})

 七、最后一步

在server.py上加上

from admin.controller.login_controller import loginController

。。。。。

# 加载路由列表
controller_list = [
   #先全部去掉,后面再一个一个加
   {'router': loginController, 'tags': ['登录模块']},
]
 

这几步基本算是加一个业务的逻辑,就这么加,后面再搞搞权限啊,什么的

我的目标是ai,这个只是打个基础,欢迎大家一起学习 

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值