FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建

在之前三篇,我们分享的就是需求的分析,基本接口的整理,数据库链接的配置。这次我们分享项目的基本框架,目录结构大致如下:

common目录:
        通用目录,放一些通用的处理

models目录:

        数据库表模型放在这里(你也可以把数据库相关的都放在这个目录下)

routers目录:

        放所有接口的地方

test目录:

        放测试用例的地方

settings目录:
        放配置文件的地方

middlewares目录:

        放所有中间件的地方,比如mysql,redis,mongodb等(主要是数据库操作相关)

Dockerfile:

        docker打包文件

main:

        程序运行主文件

整体的架构设计完毕后,就可以进行相关开发了,这里我们把之前设计的数据库模型相关放到modles目录下的modles.py下:

"""
-*- encoding=utf-8 -*-
Time: 2024/7/19 14:18
Author: lc
Email: 15101006331@163.com
File: models.py
"""
from sqlalchemy import Column, Integer, String, ForeignKey, Boolean, Text, DateTime
from sqlalchemy import MetaData
from sqlalchemy.inspection import inspect
from datetime import datetimefrom sqlalchemy.orm import DeclarativeMetafrom middlewares.mysql.database import Base, engineclass Role(Base):"""角色"""__tablename__ = "roles"id = Column(Integer, primary_key=True, index=True)name = Column(String(length=8), unique=True, index=True)  # 角色名称class User(Base):"""用户基础表"""__tablename__ = "users"id = Column(Integer, primary_key=True, index=True)username = Column(String(length=32), unique=True, index=True)  # 用户名password = Column(String(length=252))  # 密码status = Column(Integer, default=0)  # 删除,0正常job_num = Column(Integer, nullable=True)  # 工号student_num = Column(Integer, nullable=True)  # 学号age = Column(Integer)  # 年龄sex = Column(String(length=8), default="男")  # 性别role = Column(Integer, ForeignKey('roles.id'))  # 角色add_time = Column(DateTime, default=datetime.now())class Course(Base):"""课程"""__tablename__ = "courses"id = Column(Integer, primary_key=True, index=True)name = Column(String(length=252), unique=True, index=True)  # 课程名称icon = Column(String(length=252), nullable=True)  # icondesc = Column(String(length=252), nullable=True)  # 描述status = Column(Boolean, default=False)  # 状态onsale = Column(Boolean, default=False)  # 是否上架catalog = Column(Text, nullable=True)  # 目录owner = Column(Integer, ForeignKey('users.id'))  # 拥有者like_num = Column(Integer, default=0)  # 点赞class StudentCourse(Base):"""学生课程"""__tablename__ = "student_courses"id = Column(Integer, primary_key=True, index=True)student = Column(Integer, ForeignKey('users.id'))  # 学生course = Column(Integer, ForeignKey('courses.id'))  # 课程add_time = Column(DateTime, default=datetime.now())update_time = Column(DateTime, default=datetime.now())status = Column(Integer, default=0)  # 1.删除,0.正常class CourseComment(Base):"""课程评论"""__tablename__ = "course_comments"id = Column(Integer, primary_key=True, index=True)course = Column(Integer, ForeignKey('courses.id'))  # 课程user = Column(Integer, ForeignKey('users.id'))  # 评论人pid = Column(Integer)  # 回复add_time = Column(DateTime, default=datetime.now())top = Column(Boolean, default=False)  # 是否置顶context = Column(Text)status = Column(Boolean, default=0)  # 1删除0正常class Message(Base):__tablename__ = "messages"id = Column(Integer, primary_key=True, index=True)send_user = Column(Integer, ForeignKey('users.id'))  # 发送者accept_user = Column(Integer, ForeignKey('users.id'))  # 接收者read = Column(Boolean, default=False)  # 是否已读,接收者是否已读send_time = Column(String(length=252))  # 发送时间pid = Column(Integer)  # 回复者add_time = Column(DateTime, default=datetime.now())  # 添加时间context = Column(Text)status = Column(Integer, default=0)  # 1删除0正常def create_tables():global_dict = globals()classes = [vfor k, v in global_dict.items()if callable(v) and isinstance(v, DeclarativeMeta) and hasattr(v, "__tablename__")]metadata = MetaData()for _cls in classes:if not inspect(engine).has_table(_cls.__tablename__, schema=None, metadata=metadata):_cls.__table__.create(bind=engine)print(f"表:‘{_cls.__tablename__}’ 创建完成!")else:print(f"表:‘{_cls.__tablename__}’ 已存在!")if __name__ == '__main__':create_tables()

之前配置的链接mysql数据库的配置放在对应的database.py中

"""
-*- encoding=utf-8 -*-
Time: 2024/7/19 14:22
Author: lc
Email: 15101006331@163.com
File: database.py
"""
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker
from settings.config import MYSQL_CONFIGconn = "mysql+pymysql://{username}:{password}@{host}:{port}/{database}?charset=utf8".format(username=MYSQL_CONFIG["username"], password=MYSQL_CONFIG["password"], host=MYSQL_CONFIG["host"],port=MYSQL_CONFIG["port"], database=MYSQL_CONFIG["database"])
engine = create_engine(conn)# 该类的每个实例都是一个数据库会话,该类本身还不是数据库会话,但是一旦我们创建了SessionLocal的实例,这个实例将是实际的数据库会话
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)# 创建数据库基类
Base = declarative_base()def create_db():"""每个请求处理完毕后关闭当前连接,不同的请求使用不同的链接"""db = SessionLocal()try:yield dbfinally:db.close()

接下来我们的开发只需要关注主逻辑的处理即可,准备放到对应的crud.py和schemas.py文件中,其中crud主要是逻辑处理详细代码,schemas中主要是参数模型以及响应结果模型。

common中我们对json和log做了统一的处理,对应可以参考:

FastAPI 学习之路(五十九)封装统一的json返回处理工具

FastAPI 学习之路(六十)打造系统的日志输出

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

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

相关文章

【基础】模拟题 角色授权类

3413. DHCP服务器 题目 提交记录 讨论 题解 视频讲解 动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)是一种自动为网络客户端分配 IP 地址的网络协议。 当支持该协议的计算机刚刚接入网络时,它可以启动一个 DHCP 客户…

【Git远程操作】克隆远程仓库 https协议 | ssh协议

目录 前言 克隆远程仓库https协议 克隆远程仓库ssh协议 前言 这四个都是Git给我们提供的数据传输的协议,最常使用的还是https和ssh协议。本篇主要介绍还是这两种协议。 ssh协议:使用的公钥加密和公钥登录的机制(体现的是实用性和安全性&am…

Nginx的HA高可用的搭建

1. 什么是高可用 高可用(High Availability, HA)是一种系统设计策略,旨在确保服务或应用在面对硬件故障、软件缺陷或任何其他异常情况时,仍能持续稳定地运行。它通过实现冗余性、故障转移、负载均衡、数据一致性、监控自动化、预防…

Java并发04之线程同步机制

文章目录 1 线程安全1.1 线程安全的变量1.2 Spring Bean1.3 如果保证线程安全 2 synchronized关键字2.1 Java对象头2.1.1 对象组成部分2.1.2 锁类型2.1.3 锁对象 2.2 synchronized底层实现2.2.1 无锁状态2.2.2 偏向锁状态2.2.3 轻量级锁状态2.2.4 重量级锁2.2.5 锁类型总结2.2.…

C++11 容器emplace方法刨析

如果是直接插入对象 push_back()和emplace_back()没有区别但如果直接传入构造函数所需参数&#xff0c;emplace_back()会直接在容器底层构造对象&#xff0c;省去了调用拷贝构造或者移动构造的过程 class Test { public:Test(int a){cout<<"Test(int)"<<…

链表(4) ----跳表

跳表&#xff08;Skip List&#xff09;是一种随机化的数据结构&#xff0c;用于替代平衡树&#xff08;如 AVL 树或红黑树&#xff09;。它是基于多层链表的&#xff0c;每一层都是上一层的子集。跳表可以提供与平衡树相似的搜索性能&#xff0c;即在最坏情况下&#xff0c;搜…

zlgcan,周立功Can设备,Qt中间件,QtCanBus插件,即插即用

新增zlgcan插件&#xff0c;需要请看下方视频回复联系&#xff01; 视频链接地址&#xff1a; Qt,canbus manager,周立功,zlgcan插件演示,需要请留言_哔哩哔哩_bilibili

反爬虫策略中的IP地址轮换如何实现?挑战与对策

当今互联网时代&#xff0c;各类网站、网络平台背后隐藏着大量数据&#xff0c;广告数据收集、市场数据收集都需要依托爬虫技术&#xff0c;但很多网站通过反爬虫技术限制或屏蔽爬虫的访问&#xff0c;这给数据收集带来不小的挑战。 为了规避这些反爬虫策略&#xff0c;开发人…

千万罚单,稠州商业银行屡教不改?

撰稿|芋圆 来源|贝多财经 今年&#xff0c;浙江稠州商业银行&#xff08;以下简称“稠州商行”&#xff09;似乎进入了多事之秋&#xff0c;刚刚兼并两家经营不善的村镇银行就紧接着收到大额罚单。 该行在2023年的经营业绩不算难看。据2023年年报&#xff0c;稠州商行的业绩从…

L2TP(Client-initiated模式)over IPSEC远程拨号实验

一、实验目的及拓扑 实验目的&#xff1a;通过L2TP客户端与LNS服务端建立L2TP隧道并承载在IPSEC网络上。其中L2TPoverIPsec客户端采用windows软终端模式&#xff08;Cloud3&#xff09;&#xff0c;AR1上将内网LNS&#xff08;FW1&#xff09;服务器采用NAT方式向外网进行映射…

【机器学习】使用Python的dlib库实现人脸识别技术

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、传统人脸识别技术1. 基于几何特征的方法2. 基于模板匹配的方法3. 基于统计学习的方法 三、深度学习在脸识别中的应用1. 卷积神经网络&#xff08;CNN&#xff09;2. FaceNet和ArcFace 四、使用Python和dlib库实…

Spring1(开发工具安装及配置 初始Spring 解耦实现 SpringIOC SpringDI Spring常见面试题)

目录 一 、开发工具安装及配置 IDEA简介 安装 配置 常⽤快捷键 部署maven 1.配置环境​编辑 2.创建一个maven项目​编辑 选择maven​编辑​编辑 二、初始Spring Spring历史由来 Spring体系结构 Spring生态系统 三、解耦实现 jdbc 三层思想​编辑 四…

可视化剪辑,账号矩阵,视频分发,聚合私信一体化营销工具 源----代码开发部署方案

可视化剪辑&#xff1a; 为了实现可视化剪辑功能&#xff0c;可以使用流行的视频编辑软件或者开发自己的视频编辑工具。其中&#xff0c;通过设计用户友好的界面&#xff0c;用户可以简单地拖拽和放大缩小视频片段&#xff0c;剪辑出满足需求的视频。在开发过程中&#xff0c;可…

多源字段聚合重塑算法

要求如下 [[{"oone": "评估是否聘请第三方机构","otwo": null,"othree": "test",},{"oone": "评估是否聘请第三方机构","otwo": null,"othree": "test",}],[{"oon…

python爬虫获取网易云音乐评论歌词以及歌曲地址

python爬虫获取网易云音乐评论歌词以及歌曲地址 一.寻找数据接口二.对负载分析三.寻找参数加密过程1.首先找到评论的请求包并找到发起程序2.寻找js加密的代码 四.扣取js的加密源码1.加密函数参数分析①.JSON.stringify(i0x)②bse6Y(["流泪", "强"])③bse6Y…

探索元宇宙:开启数字世界的奇妙之旅【小学生也能读懂】

元宇宙&#xff1a;数字新纪元的曙光 随着技术的飞速发展&#xff0c;我们正站在一个全新的数字时代的门槛上。元宇宙&#xff08;Metaverse&#xff09;&#xff0c;这个听起来充满未来感的词汇&#xff0c;已经成为科技界的热门话题。它不仅仅是一个概念&#xff0c;更是一个…

第1关 -- Linux 基础知识

闯关任务 完成SSH连接与端口映射并运行hello_world.py ​​​​ 可选任务 1 将Linux基础命令在开发机上完成一遍 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 创建新的虚拟环境lm3 可选任务 3 创建并运行test.sh文件 参考文档 文档&#xff1a;https://g…

【MySQL-19】一文带你了解存储函数

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

ROS2中间件

ROS2 是重新设计的 Robot Operating System&#xff0c;无论从用户API接口到底层实现都进行了改进。这里主要关注ROS2 的中间件。 1. 通信模式 ROS2 使用DDS协议进行数据传输&#xff0c;并通过抽象的rmw&#xff0c;支持多个厂家的DDS实现&#xff08;FastDDS&#xff0c;Cyc…

【链表】算法题(二) ----- 力扣/牛客

一、链表的回文结构 思路&#xff1a; 找到链表的中间节点&#xff0c;然后逆置链表的后半部分&#xff0c;再一一遍历链表的前半部分和后半部分&#xff0c;判断是是否为回文结构。 快慢指针找到链表的中间节点 slow指针指向的就是中间节点 逆置链表后半部分 逆置链表后半部分…