今天给大家分享一个 我最近使用python 框架 fastapi 写的一个web项目 ,叫图书管理系统。项目主要是来巩固 python的编程技术。使用的是前端后 分离开发。
主要实现的功能:
1、用户管理:可以新增、编辑、删除用户信息。
2、图书管理:添加、修改、删除图书,并能够查看图书列表。
3、借阅管理:记录图书借阅、归还情况。
4、数据展示:通过前端页面展示系统中的图书、用户信息,提供了简洁、易用的界面。
使用技术
FastAPI:后端使用FastAPI框架
MySQL 5.7:作为关系型数据库管理系统,MySQL用于存储用户和图书信息,并支持CRUD操作。
Vue 2:前端使用Vue2框架,配合Element UI组件库,提供响应式页面和现代化用户界面。
Element UI:帮助实现简洁且功能丰富的UI设计,极大提高了前端开发效率。
先给大家看一下 页面效果
首页:在这里插入图片描述
代码结构:
在这里插入图片描述
菜单个别页面截图:
在这里插入图片描述
在这里插入图片描述
项目零星代码:

<template><div class="home-container"><el-container><el-aside width="200px"><el-menu:default-active="$route.path"class="el-menu-vertical"background-color="#304156"text-color="#bfcbd9"active-text-color="#409EFF"router><el-menu-item index="/"><i class="el-icon-s-home"></i><span slot="title">首页</span></el-menu-item><el-submenu index="1"><template slot="title"><i class="el-icon-reading"></i><span>图书管理</span></template><el-menu-item index="/category/list"><i class="el-icon-collection"></i><span slot="title">图书分类</span></el-menu-item><el-menu-item index="/book/list"><i class="el-icon-notebook-2"></i><span slot="title">图书列表</span></el-menu-item></el-submenu><el-submenu index="2"><template slot="title"><i class="el-icon-document"></i><span>借用归还</span></template><el-menu-item index="/borrow/list"><i class="el-icon-document-copy"></i><span slot="title">借用列表</span></el-menu-item><el-menu-item index="/return/list"><i class="el-icon-document-checked"></i><span slot="title">归还列表</span></el-menu-item></el-submenu><el-submenu index="3"><template slot="title"><i class="el-icon-user-solid"></i><span>会员管理</span></template><el-menu-item index="/member/list"><i class="el-icon-user"></i><span slot="title">会员列表</span></el-menu-item><el-menu-item index="/recharge/list"><i class="el-icon-money"></i><span slot="title">充值记录</span></el-menu-item></el-submenu><el-submenu index="4"><template slot="title"><i class="el-icon-user"></i><span>系统管理</span></template><el-menu-item index="/admin/list"><i class="el-icon-user"></i><span slot="title">管理员列表</span></el-menu-item></el-submenu></el-menu></el-aside><el-container><el-header><div class="header-right"><el-dropdown trigger="click" @command="handleCommand"><span class="el-dropdown-link">{{ userInfo ? userInfo.username : 'admin' }}<i class="el-icon-arrow-down el-icon--right"></i></span><el-dropdown-menu slot="dropdown"><el-dropdown-item command="logout">退出登录</el-dropdown-item></el-dropdown-menu></el-dropdown></div></el-header><el-main><router-view /></el-main></el-container></el-container></div>
</template><script>
import { mapState } from 'vuex'export default {name: 'Home',computed: {...mapState('user', ['userInfo'])},methods: {handleCommand(command) {if (command === 'logout') {this.$store.dispatch('user/resetToken').then(() => {this.$router.push('/login')})}}}
}
</script><style lang="scss" scoped>
.home-container {height: 100vh;.el-container {height: 100%;}.el-aside {background-color: #304156;.el-menu {border: none;}}.el-header {background-color: #fff;box-shadow: 0 1px 4px rgba(0,21,41,.08);display: flex;justify-content: flex-end;align-items: center;.header-right {.el-dropdown-link {cursor: pointer;color: #409EFF;}}}.el-main {background-color: #f0f2f5;padding: 0;}
}
</style>

再分享一段pyhon 后端代码:

from datetime import timedelta
from typing import Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from core.config import settings
from core.security import create_access_token
from core.response import ResponseModel
from core.exceptions import CustomException
from core.deps import get_current_admin
from db.database import get_db
from models.admin import Admin
from schemas.admin import AdminLogin, Token, AdminResponse, AdminCreate, AdminUpdate, AdminListResponse
import hashlibrouter = APIRouter()@router.post("/login")
async def login(login_data: AdminLogin, db: Session = Depends(get_db)):# 查询管理员admin = db.query(Admin).filter(Admin.username == login_data.username).first()if not admin:raise CustomException(msg="用户名或密码错误")# MD5加密密码进行比对md5_password = hashlib.md5(login_data.password.encode()).hexdigest()if admin.password != md5_password:raise CustomException(msg="用户名或密码错误")# 生成访问令牌access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)access_token = create_access_token(data={"sub": str(admin.id)},expires_delta=access_token_expires)token = Token(access_token=access_token,token_type="bearer")return ResponseModel.success(data=token.model_dump(),msg="登录成功")@router.get("/info")
async def get_admin_info(admin: Admin = Depends(get_current_admin)):return ResponseModel.success(data=AdminResponse.model_validate(admin),msg="获取成功")@router.get("/list")
async def get_admin_list(db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin),page: int = Query(1, ge=1),page_size: int = Query(10, ge=1, le=100),username: Optional[str] = None
):query = db.query(Admin)if username:query = query.filter(Admin.username.like(f"%{username}%"))total = query.count()items = [AdminResponse.model_validate(item) for item in query.offset((page - 1) * page_size).limit(page_size).all()]response = AdminListResponse(total=total, items=items)return ResponseModel.success(data=response.model_dump())@router.get("/detail/{admin_id}")
async def get_admin_detail(admin_id: int,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):admin = db.query(Admin).filter(Admin.id == admin_id).first()if not admin:raise CustomException(msg="管理员不存在")return ResponseModel.success(data=AdminResponse.model_validate(admin))@router.post("/create")
async def create_admin(admin_in: AdminCreate,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):# 检查用户名是否已存在if db.query(Admin).filter(Admin.username == admin_in.username).first():raise CustomException(msg="用户名已存在")# MD5加密密码md5_password = hashlib.md5(admin_in.password.encode()).hexdigest()admin = Admin(username=admin_in.username,password=md5_password,nickname=admin_in.nickname,is_super=admin_in.is_super,created_by=current_admin.username)db.add(admin)db.commit()db.refresh(admin)return ResponseModel.success(data=AdminResponse.model_validate(admin))@router.put("/update/{admin_id}")
async def update_admin(admin_id: int,admin_in: AdminUpdate,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):admin = db.query(Admin).filter(Admin.id == admin_id).first()if not admin:raise CustomException(msg="管理员不存在")update_data = admin_in.model_dump()admin.nickname = update_data['nickname']db.commit()db.refresh(admin)return ResponseModel.success(data=AdminResponse.model_validate(admin))@router.delete("/delete/{admin_id}")
async def delete_admin(admin_id: int,db: Session = Depends(get_db),current_admin: Admin = Depends(get_current_admin)
):admin = db.query(Admin).filter(Admin.id == admin_id).first()if not admin:raise CustomException(msg="管理员不存在")# 不允许删除超级管理员if admin.is_super:raise CustomException(msg="不能删除超级管理员")db.delete(admin)db.commit()return ResponseModel.success()

项目虽然功能不是很复杂,但是对于刚开始学习编程的小伙伴,有可能也是有难度的,不过如果自己能尝试着 敲一些项目,会对自己的学习到的编程知识有一个更深的体会。对此项目有兴趣的小伙伴可以去看看学习一下。【非开源项目】
https://wwwoop.com/home/Index/projectInfo?goodsId=98&typeParam=1&subKey=-1

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

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

相关文章

上位机知识篇---Docker

Docker 详细介绍 一、Docker 是什么 Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个标准化的单元&#xff08;称为容器&#xff09;中&#xff0c;确保应用在任何环境中都能以相同的方式运行。 简单来说&#xff0c;Docker 解决了 &…

蓝桥杯第十六届(2025)真题深度解析:思路复盘与代码实战

> 省一选手的血泪经验:**避免这些坑,你也能冲进国赛!** 2025年蓝桥杯省赛已落下帷幕,作为近年来**难度最高的一届竞赛**,不少选手在考场上遭遇了“滑铁卢”。本文将以C++ B组真题为例,逐题解析解题思路,并提供**优化后的AC代码与详细注释**。笔者最终排名省一前40%,…

使用gdal读取shp及filegdb文件

一、使用qgis开源工具构建两个文件&#xff0c;分别是filegdb和shp&#xff0c;每个文件包含一个图层&#xff0c;图层内容只包含一个字段&#xff1a;id&#xff0c;有两个数据行&#xff0c;图层几何为多边形&#xff0c;图层都是如下的效果。二、使用rust读取上述文件 rust依…

从0开始学习R语言--Day44--LR检验

之前我们提到用LM检验的方式&#xff0c;来判断数据在空间上是否受到邻近数据及其残差的影响&#xff0c;但是LM检验是采用直接计算的方式&#xff0c;只关注了数据的残差平方和&#xff0c;没有数据关于依赖项的考虑&#xff0c;容易被结果误导。而LR检验虽然在结果上有时候跟…

openEuler 24.03 (LTS-SP1) 下私有镜像仓库部署与自签 SSL 全流程目标

目录 openEuler 24.03 (LTS-SP1) 下私有镜像仓库部署与自签 SSL 全流程 1 创建根 CA 与服务器证书&#xff08;修正版&#xff1a;SAN 写法兼容所有 OpenSSL&#xff09; 2 配置 Docker Compose 文件 3 客户端节点信任 CA 3.1 Docker 3.2 containerd 4 推送 / 拉取测试 …

mysql的LIMIT 用法

常见用法1. 限制返回行数-- 返回前5条记录 SELECT * FROM products LIMIT 5;2. 分页查询&#xff08;带偏移量&#xff09;-- 跳过前10条&#xff0c;返回接下来的5条记录&#xff08;第11-15条&#xff09; SELECT * FROM products LIMIT 10, 5;-- MySQL 8.0 也支持这种语法 S…

maven 发布到中央仓库之持续集成-03

maven 系列 maven-01-发布到中央仓库概览 maven-02-发布到中央仓库常用脚本 maven-03-发布到中央仓库之持续集成 maven-04-发布到中央仓库之 Ignore Licence maven-05-maven 配置进阶学习 maven-06-maven 中央仓库 OSSRH 停止服务&#xff0c;Central Publishing Portal …

(补充)RS422

RS4221. 基本定义与定位 官方名称&#xff1a; EIA/TIA-422&#xff08;电子工业协会/电信工业协会标准422&#xff09;。类型&#xff1a; 一种定义了电气特性的 平衡式差分 串行通信标准。目的&#xff1a; 克服 RS-232 在传输距离、速率和抗干扰能力上的严重局限性。核心思想…

自建ELK vs 云商日志服务:成本对比分析

在当今数据驱动的时代&#xff0c;日志管理已成为企业IT基础设施中不可或缺的一部分。面对日益增长的日志数据&#xff0c;许多团队都在纠结&#xff1a;是自建ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;堆栈&#xff0c;还是直接使用云服务商提供的日志服务…

Eigen 几何模块深拆:Isometry3d vs Affine3d + 变换矩阵本质详解

文章目录0 写在前面1 数学背景对比2 Eigen 实现差异3 Isometry3d 是不是 4 4 矩阵&#xff1f;4 核心 API 速查5 实战示例5.1 SLAM 位姿链&#xff1a;相机点 → 世界点5.2 体素滤波&#xff1a;各向异性缩放&#xff08;X/Y → 5 cm&#xff0c;Z → 10 cm&#xff09;5.3 把…

python的病例管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 随着医疗…

博客系统开发全流程解析(前端+后端+数据库)与 AI 协作初体验

一、前言&#xff1a;为什么选择博客系统作为全栈入门&#xff1f; 对于初入编程世界的开发者来说&#xff0c;“全栈” 似乎是一个庞大而遥远的概念。前端、后端、数据库、部署运维… 知识体系繁杂&#xff0c;令人望而生畏。选择一个目标明确、功能完整且贴近实际应用的项目…

Xavier公式的原理

数学原理&#xff1a; (1) 前向传播的方差一致性 假设输入 x 的均值为 0&#xff0c;方差为 σx2σ_x^2σx2​&#xff0c;权重 W的均值为 0&#xff0c;方差为 σW2σ_W^2σW2​&#xff0c;则输出 zWxzWxzWx的方差为&#xff1a; Var(z)nin⋅Var(W)⋅Var(x) Var(z)n_{in}⋅Va…

pytorch学习笔记(二)-- pytorch模型开发步骤详解

简介&#xff1a; 本章主要是针对Pytorch神经网络的开发步骤做一个详细的总结&#xff0c;对每一步的前世今生做一个了解&#xff0c;下面先列一下开发需要的步骤有哪些&#xff1a; 模型构建&#xff0c;主要是前向传递函数的确认确认损失函数以及学习步频&#xff08;learni…

consul 的安装与服务发现

1. helm 安装 consul 到 k8s 安装放在这里了&#xff1a;https://github.com/lianan2/installation/tree/master/consul-helm consul 的常用命令&#xff1a; # 查看集群状态 kubectl -n consul exec -it consul-server-0 -- consul operator raft list-peers kubectl -n con…

ros topic和service的使用

在做ldiar slam的时候&#xff0c;最常用的当属topic&#xff0c;偶尔也会用一下service&#xff0c;action则很少使用。现在一块来看一下topic的使用。一、topic的使用topic的消息订阅和发布#include<ros/ros.h> #include<rosbag/bag.h> #include<rosbag/view.…

【TCP/IP】18. 因特网服务质量

18. 因特网服务质量18. 因特网服务质量18.1 服务质量&#xff08;QoS&#xff09;18.2 实时传输协议&#xff08;RTP&#xff09;18.3 实时传输控制协议&#xff08;RTCP&#xff09;18.4 集成业务&#xff08;IntServ&#xff09;18.5 区分业务&#xff08;DiffServ&#xff0…

数据集相关类代码回顾理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter

【PyTorch】图像多分类项目 目录 StratifiedShuffleSplit transforms.ToTensor Counter StratifiedShuffleSplit sss StratifiedShuffleSplit(n_splits1, test_size0.2, random_state0) 创建StratifiedShuffleSplit对象&#xff0c;用于将数据集划分为训练集和测试集。 …

【环境配置】KAG - Windows 安装部署

前言 本博客将介绍如何在 Windows 系统上 部署运行 KAG 项目&#xff0c;将使用 WSL 和 Docker 和 Vscode 帮助我们之后利用 KAG 开发个人知识库问答项目。 KAG&#xff08;Knowledge-Augmented Generation&#xff09;知识增强生成系统 是一个融合知识图谱与大语言模型能力的…

《探索电脑麦克风声音采集多窗口实时可视化技术》

引言在当今数字化信息飞速发展的时代&#xff0c;声音作为一种重要的信息载体&#xff0c;其处理和分析技术日益受到广泛关注。声音可视化技术&#xff0c;作为声音处理领域的关键技术之一&#xff0c;具有极为重要的价值。它能够将抽象的声音信号转化为直观的视觉图像&#xf…