当前位置: 首页 > news >正文

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

通过给大家分享一个最近我用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.jsqmd.com/news/2845/

相关文章:

  • 国标GB28181视频平台EasyCVR如何构建安防监控“中枢神经”?
  • vscode中element-plus组件无属性提示
  • minio集群搭建
  • 在AI技术唾手可得的时代,挖掘新需求成为核心竞争力——某知名餐饮菜谱应用需求洞察
  • 英伟达入资 11Labs,黄仁勋:语音 AI 带来情感、共情和联结;Qwen3-TTS-Flash:多语言,多音色,多方言丨日报
  • 深入解析:一文详解回归分析的探索、分析、检验阶段,以Stata和SPSS为例
  • Vue 包依赖总结
  • 笔记_OpenCV4.5.1新增微信QRCode解码功能
  • 完整教程:模电基础:基本放大电路及其优化
  • 【论文阅读】Uncertainty Modeling for Out-of-Distribution Generalization (ICLR 2022) - 详解
  • 数字孪生 + 碳痕追踪:MyEMS 给能源管理装了套 “全链路全景导航”
  • 空间复杂度和时间复杂度
  • 基于IOS26的iOS 内存分析与必要内存界定
  • 深入解析:ARM架构学习9——LM75温度传感器+ADC转换器
  • 破局 “节能不省钱” 悖论:开源 EMS 生态如何让中小企业用 1/3 成本实现能效跃升?
  • 实用指南:U盘歌单管理器 (专业车载音乐播放列表制作工具)
  • iOS 26 性能测试实战,如何评估启动速度、CPUGPU 负载、帧率与系统资源适配(uni-app 与 iOS 原生应用性能方案)
  • P14062 【MX-X21-T7】[IAMOI R5] 若我不曾见过太阳 题解
  • unity确定性帧同步框架
  • 03-堆和栈
  • 深入解析:Django事务
  • 视频汇聚平台EasyCVR如何构建智慧农业监控监管系统?
  • 一套自用的git提交规范,可清晰的识别到关联的任务/bug - 实践
  • 撕开厂商锁定黑箱:MyEMS 如何用开源代码夺回能源管理的 “自主控制权”?
  • 继续 Vibe Coding 撸工具:Markdown写作 + 一键发布
  • C造桥与砍树
  • 基于衍射神经网络的光学高速粒子分类体系A1(未做完)
  • Keil uVision5 MDK 5.42安装教程(支持ARM Cortex全系列开发)
  • 2024 ICPC ECfinal E
  • 从Void到Task<PublishAggregateResult>:一次服务方法返回类型重构的纠结与决策