fastApi框架开发一个web端仓库管理系统 - 实践

news/2025/9/24 14:20:25/文章来源:https://www.cnblogs.com/yfceshi/p/19109178

通过给大家分享一个最近我用python写的一个web项目,对于web项目,用java或者php来开发的比较多,不过为了快速的掌握一门编程语言,我们也能够尝试用别的语言来发开web任务,这篇文章就给大家介绍一下 使用 python fastApi框架 来开发一个仓库管理系统。
技术介绍:
后端框架:FastAPI
数据库:mysql8
前端:Vue2+Element UI
主要实现的能力有:
分类管理、产品管理、客户管理、供应商管理、仓库与库位管理、入库出库操作、管理员管理 。
页面介绍:
首页:
在这里插入图片描述
产品页:
在这里插入图片描述
入库记录:
在这里插入图片描述
出库记录:
在这里插入图片描述
这个项目一共实现了8个菜单的功能,假设你对这个项目有兴趣允许去看看。(非开源)
https://wwwoop.com/home/Index/projectInfo?goodsId=125&typeParam=1&subKey=-1

部分代码:

from typing import Optional
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
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 models.product_category import ProductCategory
from schemas.product_category import ProductCategoryCreate, ProductCategoryUpdate, ProductCategoryResponse, ProductCategorySearchRequest
router = APIRouter()
@router.get("/list")
async def get_product_category_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),
category_name: Optional[str] = None,
status: Optional[int] = None
):
"""
获取产品分类列表(分页,带搜索条件)
"""
# 构建查询条件,只查询未删除的记录
query = db.query(ProductCategory).filter(ProductCategory.is_deleted == 0)
# 分类名称搜索条件
if category_name:
query = query.filter(ProductCategory.category_name.like(f"%{category_name}%"))
# 状态搜索条件
if status is not None:
query = query.filter(ProductCategory.status == status)
# 按序号和创建时间排序
query = query.order_by(ProductCategory.sort_order.asc(), ProductCategory.created_time.desc())
# 分页查询
total = query.count()
categories = query.offset((page - 1) * page_size).limit(page_size).all()
return ResponseModel.success(
data={
"items": [ProductCategoryResponse.model_validate(category) for category in categories],
"total": total,
"page": page,
"page_size": page_size
},
msg="获取成功"
)
@router.get("/detail/{category_id}")
async def get_product_category_detail(
category_id: int,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""
获取产品分类详情
"""
category = db.query(ProductCategory).filter(
ProductCategory.id == category_id,
ProductCategory.is_deleted == 0
).first()
if not category:
raise CustomException(msg="分类不存在")
return ResponseModel.success(
data=ProductCategoryResponse.model_validate(category),
msg="获取成功"
)
@router.post("/create")
async def create_product_category(
category_in: ProductCategoryCreate,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""
创建产品分类
"""
# 检查分类名称是否已存在
existing_category = db.query(ProductCategory).filter(
ProductCategory.category_name == category_in.category_name,
ProductCategory.is_deleted == 0
).first()
if existing_category:
raise CustomException(msg="分类名称已存在")
# 创建新分类
db_category = ProductCategory(
category_name=category_in.category_name,
sort_order=category_in.sort_order,
status=category_in.status,
remark=category_in.remark,
created_id=current_admin.id,
updated_id=current_admin.id
)
db.add(db_category)
db.commit()
db.refresh(db_category)
return ResponseModel.success(
data=ProductCategoryResponse.model_validate(db_category),
msg="创建成功"
)
@router.put("/update/{category_id}")
async def update_product_category(
category_id: int,
category_in: ProductCategoryUpdate,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""
更新产品分类
"""
# 查找要更新的分类
db_category = db.query(ProductCategory).filter(
ProductCategory.id == category_id,
ProductCategory.is_deleted == 0
).first()
if not db_category:
raise CustomException(msg="分类不存在")
# 如果要更新分类名称,检查是否与其他分类重名
if category_in.category_name and category_in.category_name != db_category.category_name:
existing_category = db.query(ProductCategory).filter(
ProductCategory.category_name == category_in.category_name,
ProductCategory.id != category_id,
ProductCategory.is_deleted == 0
).first()
if existing_category:
raise CustomException(msg="分类名称已存在")
# 更新字段
update_data = category_in.model_dump(exclude_unset=True)
for field, value in update_data.items():
setattr(db_category, field, value)
# 更新操作者信息
db_category.updated_id = current_admin.id
db.commit()
db.refresh(db_category)
return ResponseModel.success(
data=ProductCategoryResponse.model_validate(db_category),
msg="更新成功"
)
@router.delete("/delete/{category_id}")
async def delete_product_category(
category_id: int,
db: Session = Depends(get_db),
current_admin: Admin = Depends(get_current_admin)
):
"""
删除产品分类(软删除)
"""
# 查找要删除的分类
db_category = db.query(ProductCategory).filter(
ProductCategory.id == category_id,
ProductCategory.is_deleted == 0
).first()
if not db_category:
raise CustomException(msg="分类不存在")
# 软删除
db_category.is_deleted = 1
db_category.updated_id = current_admin.id
db.commit()
return ResponseModel.success(
data=None,
msg="删除成功"
)

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

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

相关文章

国标GB28181视频平台EasyCVR如何构建安防监控“中枢神经”?

国标GB28181视频平台EasyCVR如何构建安防监控“中枢神经”?在视频监控互联互通的需求日益迫切的今天,如何打破不同品牌、不同协议设备之间的壁垒?本文深度解析基于国家标准GB/T28181协议的视频平台EasyCVR的核心特点…

做个网站跳转链接怎么做网站建设与发布

类的测试与函数的测试相似 测试函数的案例:https://blog.csdn.net/hanhanwanghaha/article/details/107487037 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努…

域名估价网站网页设计的首页如何设计官网

为啥又写一篇&#xff1f; 因为之前 用 Anchor 写的&#xff0c;这东西 放到Paragraph 里就不好使了 。 这回 目录里 和 跳转的地方 用的都是 Chunk 添加 目录条目 返回跳转的标记 public String addMenuTag (List<Pair<Chunk, String>> chunks, String[] men…

vscode中element-plus组件无属性提示

确保安装了Vue(Official)插件在项目根路径下的tsconfig.json中增加以下配置:compilerOptions:{"types": ["element-plus/global"], }重启编辑器即可

minio集群搭建

minio集群配置 minio不能装在/目录下,需要单独挂载磁盘 本文主机IP为 192.168.200.143 192.168.200.144 192.168.200.145 192.168.200.1461、给虚拟机添加磁盘,并配置挂载目录 [root@localhost ~]# fdisk -l磁盘 /de…

在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名餐饮菜谱应用需求洞察

本文分析了一个基于知名餐饮品牌菜谱的开源项目,该项目专注于菜品收录和烹饪指导,支持网页端访问和AI配图功能。通过分析用户反馈,发现了对部署工具和内容管理的具体需求,揭示了在技术实现便捷的背景下,真实用户需…

英伟达入资 11Labs,黄仁勋:语音 AI 带来情感、共情和联结;Qwen3-TTS-Flash:多语言,多音色,多方言丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、…

潍坊网站开发公司影视类网站建设

作者|晶少 转载|CSDN博客 2.4亿人在线使用文档协作无延宕…… 6万名武汉中小学生实力打造“远程课堂”活学高效…… 疫情以来&#xff0c;“远程”、“协作”持续大热&#xff0c;此局毋庸置疑。 根据QuestMobile最新发布的《2020中国移动互联网“战役”专题报告》显示&am…

心理网站建设策划书做一份网站动态图多少钱

题目描述 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&…

好的h5制作网站模板wordpress互动

配置旁挂二层组网隧道转发示例 组网图形 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 组网需求 AC组…

网站建设与网络推广的关系xml网站模板

现有一个使用Relu激活函数的网络&#xff0c;训练过程中发现&#xff0c;它对所有的输入样本都输出一样的预测概率&#xff0c;比如二分类&#xff0c;对所有样本的预测概率都是[0.4,0.6]。由于预测概率都一样&#xff0c;因此预测标签也都一样&#xff0c;全预测为0或1。 一开…

深入解析:一文详解回归分析的探索、分析、检验阶段,以Stata和SPSS为例

深入解析:一文详解回归分析的探索、分析、检验阶段,以Stata和SPSS为例pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

Vue 包依赖总结

Vue 包依赖总结我在安装依赖包时出现问题:error minimatch@10.0.3: The engine "node" is incompatible with this module. Expected version "20 || >=22". Got "16.8.0" 这个错误…

笔记_OpenCV4.5.1新增微信QRCode解码功能

原文地址:https://cloud.tencent.com/developer/article/1786320WeChatQRCode模块为OpenCV4.5.1新增功能,需要在github下载最新opencv源码master和contrib部分编译后使用。 下载和编译: 使用:#include "pch…

完整教程:模电基础:基本放大电路及其优化

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【论文阅读】Uncertainty Modeling for Out-of-Distribution Generalization (ICLR 2022) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

数字孪生 + 碳痕追踪:MyEMS 给能源管理装了套 “全链路全景导航”

如果说传统的能源管理是在迷雾中凭经验摸索前行,那么当下的企业则迫切需要一张清晰、实时、能指引每一步节能减碳决策的“全景地图”。这张地图不仅要能还原能源系统的全貌,更要能追踪每一份能耗的“碳足迹”,直抵管…

空间复杂度和时间复杂度

要理解和计算时间复杂度与空间复杂度,关键是分析算法中重复执行的操作次数(时间)和额外开辟的存储空间(空间)如何随输入规模n变化。下面通过具体代码示例详细说明计算方法。 一、时间复杂度计算 时间复杂度关注核…

河北网站快速排名建设学电脑培训班多少一个月

排查流程 hive任务停止是调用org.apache.hive.jdbc.HiveStatement的close()方法实现的 其底层是委托给org.apache.hive.service.cli.thrift.TCLIService.Iface客户端实例来实现。 同时&#xff0c;通过JDK动态代理为其织入了synchronized同步机制&#xff1a;其底层是委托给…

自己做免费手机网站外贸商做英文网站的目的

目录 一、问题引入 二、缓冲区 1、什么是缓冲区 2、刷新策略 3、缓冲区由谁提供 4、重看问题 三、缓冲区的简单实现 一、问题引入 我们先来看看下面的代码&#xff1a;我们使用了C语言接口和系统调用接口来进行文件操作。在代码的最后&#xff0c;我们还使用fork函数创建…