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

一、说明 

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

 证明接口文档正常,

数据库正常

我们贴下代码

安装dao==》server==》controler

二、建立部分do文件

需要学习do vo这些区别的

可以看看

领域驱动系列-浅析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,这个只是打个基础,欢迎大家一起学习 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/618242.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内如何用GPT4

许多人曾向我咨询是否有一个稳定且不折腾的全球AI大模型测试网站,既能确保真实可靠性,又能保障稳定、快速的运行,避免频繁出现故障、错误或漫长的等待时间。到目前为止,我已经尝试了国内超过10个镜像站点,但遗憾的是&a…

set与map使用

目录 set使用 insert find与erase lower_bound 与 upper_bound equal_range count multiset使用 insert find count equal_range与erase map使用 insert 迭代器 operator[] 统计次数 multimap使用 前置学习内容: 搜索二叉树-CSDN博客 set与map的底层都是搜索二叉…

多输入多输出 | Matlab实现XGboost多输入多输出预测

多输入多输出 | Matlab实现XGboost多输入多输出预测 目录 多输入多输出 | Matlab实现XGboost多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 Matlab实现XGboost多输入多输出预测 1.data为数据集,10个输入特征,3个输出变量…

Doris 内网安装部署,基于 CentOS 7

实测 CentOS 7.6 和 7.9都可用,CentOS安装包为:标准安装盘DVD版,如果系统安装的是精简版,需要挂载DVD版或者自行下载依赖。 参考文档 快速开始 - Apache Doris Doris 下载地址:2.1.1 ( Latest ) -> x64 ( avx2 )…

transformer上手(4) —— 模型与分词器

1 模型 除了像之前使用 AutoModel 根据 checkpoint 自动加载模型以外,我们也可以直接使用模型对应的 Model 类,例如 BERT 对应的就是 BertModel: from transformers import BertModel model BertModel.from_pretrained("bert-base-ca…

滚雪球学Java(75):Java零基础,轻松学会文件读写技巧

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…

Unsupervised Learning ~ Anomaly detection

unusual events vibration: 振动 Density estimation: Gaussian(normal) Distribution. standard deviation: 标准差 variance deviation sigma Mu Parameter estimation Anomaly detection algorithm 少量异常样本点的处理经验 algorithm evaluation skewed datatsets:…

2024年腾讯云最新优惠活动及领券入口整理分享

随着云计算技术的快速发展,越来越多的企业和个人选择将业务部署在云端。腾讯云作为国内知名的云计算服务提供商,为用户提供了丰富的云产品和服务。为了帮助用户降低成本,腾讯云定期推出各种优惠活动。本文将为大家整理分享2024年腾讯云的最新…

UE5 HLSL 详细学习笔记

这里的POSITION是变量Position的语义,告诉寄存器,此变量的保存位置,通常语义用于着色器的输入和输出,以冒号“:”的方式进一步说明此变量,COLOR也类似 还有什么语义呢? HLSL核心函数&#xff1a…

1panel更新系统

准备两个软件包 名为dist的前端包 以.jar为后缀的后端jar包 更新后端 进去1Panel管理页面(浏览器收藏里有) http://127.0.0.1:42689/f2a8a874bd 点击容器,将名为app的容器直接删除掉 打开软件electerm 点击书签,连接2222 连接成功后长这样&#xff…