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

完整教程:【MongoDB实战】8.1 项目需求与架构设计:简易商品管理系统实战项目

文章目录

  • 第 8 章:简易商品管理系统实战项目-实战项目1:简易商品管理系统
    • 8.1 项目需求与架构设计
      • 8.1.1 核心需求(细化版)
      • 8.1.2 架构设计(分层设计)
      • 8.1.3 数据模型设计(`MongoDB文档结构`)
    • 8.2 实战实操代码
      • 8.2.1 环境准备
      • 8.2.2 完整代码实现
        • 步骤1:配置文件(.env)
        • 步骤2:数据层(DAO层)- [goods_dao.py](goods_dao.py)
        • 步骤3:业务层(Service层)- [goods_service.py](goods_service.py)
        • 步骤4:接口层(CLI层)- [main.py](main.py)
      • 8.2.3 代码运行与测试
    • 8.3 扩展与优化建议

第 8 章:简易商品管理系统实战项目-实战项目1:简易商品管理系统

8.1 项目需求与架构设计

8.1.1 核心需求(细化版)

功能模块具体需求
商品添加支持录入完整商品信息(含嵌套分类、标签数组),校验必填字段(名称、价格、库存)
多条件查询支持按名称(模糊)、分类(一级/二级)、价格区间、库存区间、标签组合查询
库存更新支持库存增加/减少,校验库存不能为负数
商品删除支持按商品ID删除,支持批量删除(可选)
分类统计按一级分类/二级分类统计商品数量、总库存、商品总价值(现价×库存)
数据校验所有操作需校验数据合法性(价格≥0、库存≥0、必填字段非空)

8.1.2 架构设计(分层设计)

采用经典的 三层架构,解耦数据操作、业务逻辑和用户交互

层级职责核心技术/实现方式
数据层(DAO)封装MongoDB的CRUD操作,屏蔽数据存储细节,仅对外提供数据操作接口Python + PyMongo(MongoDB官方驱动)
业务层(Service)处理核心业务逻辑(数据校验、业务规则),调用数据层接口完成操作面向对象封装(业务类+方法)
接口层(CLI / API)提供用户交互入口,接收用户输入,调用业务层处理,返回结果展示命令行界面(CLI)/Flask Web API(可选)

8.1.3 数据模型设计(MongoDB文档结构

MongoDB为 文档型数据库,商品文档设计包含基础字段、嵌套文档(分类)、数组字段(标签),具体结构如下:

{

"_id": ObjectId("655e8b78f1234567890abcde"),  // MongoDB自动生成的唯一ID
"goods_id": "G001",                          // 自定义商品编号(唯一)
"goods_name": "华为Mate70 Pro",              // 商品名称(必填)
"category": {
                                // 嵌套文档:商品分类
"first_cate": "手机数码",                  // 一级分类
"second_cate": "智能手机"                  // 二级分类
},
"price": {
                                   // 嵌套文档:价格信息
"original_price": 6999.0,                 // 原价
"current_price": 6499.0                   // 现价(必填)
},
"stock": 100,                                // 库存数量(≥0,必填)
"tags": ["鸿蒙", "5G", "旗舰"],              // 数组字段:商品标签
"shelf_time": ISODate("2025-01-01T00:00:00Z"), // 上架时间
"description": "华为2025旗舰机型,搭载鸿蒙5.0" // 商品描述(可选)
}

8.2 实战实操代码

8.2.1 环境准备

pip install pymongo python-dotenv
    1. 启动MongoDB(本地部署或使用MongoDB Atlas云服务),记录连接信息。

8.2.2 完整代码实现

步骤1:配置文件(.env)

存放MongoDB连接信息,解耦配置与代码:

# .env文件内容
MONGO_URI=mongodb://localhost:27017/
MONGO_DB_NAME=goods_management
MONGO_COLLECTION_NAME=goods
步骤2:数据层(DAO层)- goods_dao.py

封装MongoDB的CRUD操作,仅负责数据存取:

import os
from dotenv import load_dotenv
from pymongo import MongoClient
from pymongo.collection import Collection
from bson.objectid import ObjectId
from datetime import datetime
# 加载环境变量
load_dotenv()
class GoodsDAO:
"""商品数据访问层,封装MongoDB操作"""
def __init__(self):
# 初始化MongoDB连接
self.client = MongoClient(os.getenv("MONGO_URI"))
self.db = self.client[os.getenv("MONGO_DB_NAME")]
self.collection: Collection = self.db[os.getenv("MONGO_COLLECTION_NAME")]
def add_goods(self, goods_data: dict) -> bool:
"""添加商品"""
try:
# 补充上架时间(默认当前时间)
if "shelf_time" not in goods_data:
goods_data["shelf_time"] = datetime.now()
self.collection.insert_one(goods_data)
return True
except Exception as e:
print(f"添加商品失败:{
e}")
return False
# 在 goods_dao.py 文件中的 query_goods 方法中修改如下部分
def query_goods(self, query_conditions: dict) -> list:
"""多条件查询商品"""
try:
# 转换ObjectId(如果有_id查询)
if "_id" in query_conditions:
query_conditions["_id"] = ObjectId(query_conditions["_id"])
# 执行查询并返回列表(转换ObjectId和datetime为字符串)
goods_list = []
for goods in self.collection.find(query_conditions):
goods["_id"] = str(goods["_id"])  # 转换为字符串方便展示
# 将 datetime 对象转换为字符串
if "shelf_time" in goods and isinstance(goods["shelf_time"], datetime):
goods["shelf_time"] = goods["shelf_time"].isoformat()
goods_list.append(goods)
return goods_list
except Exception as e:
print(f"查询商品失败:
http://www.jsqmd.com/news/338580/

相关文章:

  • 科普招商消费分期场景额度的使用规则以及取出来方法 - 金诚数码回收
  • 学生党论文写作效率提升工具全攻略(不走弯路)
  • 2/3树的直径等内容 学习总结
  • 2/3学习总结
  • Nat Hum Behav:记忆系统“殊途同归”?情景记忆与语义记忆在大脑中竟共用一套系统!
  • 澳洲奶粉品牌排名十强:澳洲A2奶源,好消化吸收,提升宝宝免疫力的奶粉! - 深度智识库
  • VS Code工作空间忽略部分文件和文件夹
  • DeepSeek论文发表16天后,国内团队已经写出了模型的「生物字典」
  • nyx
  • 阿里发布了他们最强思考模型,有点东西。。(附实测)
  • 关于招商消费分期场景额度怎么使用以及如何提出来变现 - 金诚数码回收
  • 腾讯拟12-18个月内扩大中东数据中心规模
  • 彼得林奇如何看待公司的跨界合作策略
  • 学术--读书笔记更新 《复杂》(Complexity: A Guided Tour):智能涌现的幽灵——是“自指”吗?
  • C++中的观察者模式实战
  • 字节跳动的800V还在招标,美团就要先用上SST直流供电了
  • 《探索AI应用架构师为智能虚拟人设计系统带来的创新点》
  • C++代码风格检查工具
  • 企业代理记账系统首页界面设计优化
  • 为没有Linus的一天做准备!Linux社区敲定接班预案:若维护者不愿干就立刻定替代人选,这事绝不能拖
  • 深入理解LuatOS中的Modbus RTU通信实现原理
  • CVE-2021-44228_ ApacheLog4j2远程代码执行漏洞
  • 高性能TCP服务器设计
  • <span class=“js_title_inner“>4000万行的Linux怎么管?Linus爆料:两周合并1.2万次提交、7周专门抓Bug,“我不是世界之王,只能给内核定规矩”</span>
  • 2026年最新成都公墓代理商五大推荐:成都陵园、墓地、丧葬一条龙服务,省心选墓权威指南 - 深度智识库
  • 2026年重庆防火门窗行业优质服务商推荐:钢制防火门窗、钢质防火门窗、甲级防火门窗、钢质防火门、木质防火门、钢木质防火门选择指南 - 海棠依旧大
  • 基于机器学习的就业岗位推荐系统(源码+lw+部署文档+讲解等)
  • 【读书笔记】 《复杂》(Complexity: A Guided Tour):智能涌现的幽灵——是“自指”吗?
  • 基于人脸识别的智慧医疗预约挂号平台系统(源码+lw+部署文档+讲解等)
  • Microsoft Agent Framework在微信公众号AI辅助撰文中的应用