大家好我是Java1234_小锋老师分享一套锋哥原创的基于Python的鲜花商城(花店)管理系统(FastAPIVue3)。项目介绍随着鲜花零售从线下门店加速转向线上渠道传统花店普遍面临商品展示能力不足、订单流转不透明、库存与销量难以及时掌握等问题。针对这一现实需求本文设计并实现了一套基于Python的鲜花商城(花店)系统。系统采用前后端分离架构后端以Python 3为开发语言使用FastAPI构建RESTful接口借助Pydantic完成请求体校验借助SQLAlchemy 2.0完成对象关系映射数据存储于MySQL 8数据库db_flower_shop前端以Vue3为核心结合Vue Router、Pinia、Element Plus与ECharts分别实现会员商城与管理员后台。身份认证采用JWT按照管理员与会员两种角色签发令牌并在中间件中完成路径级鉴权。在业务功能方面会员端覆盖注册登录、分类浏览、鲜花检索、购物车、收货地址、下单支付、确认收货、商品评价、收藏与浏览记录、公告资讯以及个人中心等完整购物闭环管理端覆盖工作台数据统计、分类与鲜花维护、会员启用禁用、订单发货、评价回复、公告发布以及个人资料与密码管理。订单处理在同一事务中完成库存扣减、明细快照与购物车清理支付成功后累计销量取消未支付订单时回补库存从而保证交易数据的一致性。后台首页以近七日订单趋势、分类销量占比和热销TOP5图表辅助经营决策。本文按照软件工程方法依次完成可行性分析、需求分析、概念结构设计、逻辑结构设计、接口设计、编码实现与功能测试。测试结果表明系统主要业务流程运行稳定接口返回结构统一日期时间显示符合YYYY-MM-DD与YYYY-MM-DD HH:MM:SS规范能够满足本科毕业设计对完整性、规范性和可演示性的要求也可作为中小型花店数字化经营的参考实现。源码下载链接: https://pan.baidu.com/s/1M7I7ngNwVTUhh3f-P4T1jw?pwd1234提取码: 1234系统展示核心代码 订单业务实现负责下单、支付、发货和收货 import random from decimal import Decimal from sqlalchemy import select from sqlalchemy.orm import Session from app.common.convert import now, order_dict from app.common.exceptions import BizException from app.models import Address, Cart, Flower, Order, OrderItem def build_order_no() - str: 生成订单号FS 时间 3位随机数 time_part now().strftime(%Y%m%d%H%M%S) return FS time_part f{random.randint(0, 999):03d} def list_items(db: Session, order_id: int): 查询订单明细 return db.scalars(select(OrderItem).where(OrderItem.order_id order_id)).all() def detail(db: Session, order_id: int, user_nicknameNone): 查询订单详情并带上明细 order db.get(Order, order_id) if order is None: raise BizException(订单不存在) return order_dict(order, itemslist_items(db, order_id), user_nicknameuser_nickname) def must_own(db: Session, user_id: int, order_id: int) - Order: 校验订单属于当前会员 order db.get(Order, order_id) if order is None or order.user_id ! user_id: raise BizException(订单不存在) return order def create_order(db: Session, user_id: int, address_id, cart_ids, remark): 根据购物车生成待付款订单并扣减库存 if not cart_ids: raise BizException(请选择要结算的商品) address db.get(Address, address_id) if address is None or address.user_id ! user_id: raise BizException(收货地址不存在) carts db.scalars( select(Cart).where(Cart.user_id user_id, Cart.id.in_(cart_ids)) ).all() if len(carts) ! len(cart_ids): raise BizException(购物车商品已变化请刷新后重试) order Order( order_nobuild_order_no(), user_iduser_id, receiveraddress.receiver, phoneaddress.phone, addressf{address.province}{address.city}{address.district}{address.detail}, status0, remarkremark, total_amountDecimal(0), create_timenow(), ) db.add(order) db.flush() total Decimal(0) for cart in carts: flower db.get(Flower, cart.flower_id) if flower is None or flower.status is None or flower.status ! 1: raise BizException(存在已下架商品无法下单) if cart.quantity is None or cart.quantity 1: raise BizException(商品数量不正确) if flower.stock is None or flower.stock cart.quantity: raise BizException(f{flower.name}库存不足) flower.stock flower.stock - cart.quantity item OrderItem( order_idorder.id, flower_idflower.id, flower_nameflower.name, coverflower.cover, priceflower.price, quantitycart.quantity, commented0, ) db.add(item) total total (Decimal(str(flower.price)) * Decimal(cart.quantity)) db.delete(cart) order.total_amount total db.flush() return detail(db, order.id) def pay(db: Session, user_id: int, order_id: int): 模拟支付支付成功后增加销量 order must_own(db, user_id, order_id) if order.status is None or order.status ! 0: raise BizException(当前订单不能支付) order.status 1 order.pay_time now() for item in list_items(db, order_id): flower db.get(Flower, item.flower_id) if flower is not None: sales 0 if flower.sales is None else flower.sales flower.sales sales item.quantity def receive(db: Session, user_id: int, order_id: int): 会员确认收货 order must_own(db, user_id, order_id) if order.status is None or order.status ! 2: raise BizException(当前订单不能确认收货) order.status 3 order.finish_time now() def cancel(db: Session, user_id: int, order_id: int): 取消未支付订单并退回库存 order must_own(db, user_id, order_id) if order.status is None or order.status ! 0: raise BizException(只有待付款订单可以取消) order.status 4 for item in list_items(db, order_id): flower db.get(Flower, item.flower_id) if flower is not None: stock 0 if flower.stock is None else flower.stock flower.stock stock item.quantity def deliver(db: Session, order_id: int): 管理员发货 order db.get(Order, order_id) if order is None: raise BizException(订单不存在) if order.status is None or order.status ! 1: raise BizException(只有待发货订单可以发货) order.status 2 order.deliver_time now()template div classpage-card div classtoolbar el-input v-modelquery.name placeholder分类名称 clearable stylewidth: 220px keyup.enterload / el-button typeprimary clickload查询/el-button el-button typesuccess clickopen()新增分类/el-button /div el-table :datalist stylewidth: 100% el-table-column propid label编号 min-width80 / el-table-column propname label分类名称 min-width160 / el-table-column label图标 min-width100 template #default{ row }img v-ifrow.icon classicon-img :srcrow.icon alt //template /el-table-column el-table-column propsort label排序 min-width100 / el-table-column propcreateTime label创建时间 min-width180 / el-table-column label操作 min-width160 template #default{ row } el-button link typeprimary clickopen(row)编辑/el-button el-button link typedanger clickremove(row)删除/el-button /template /el-table-column /el-table div classpager el-pagination background layouttotal, prev, pager, next :totaltotal v-model:current-pagequery.pageNum :page-sizequery.pageSize current-changeload / /div el-dialog v-modelvisible :titleform.id ? 编辑分类 : 新增分类 width480px el-form :modelform label-width80px el-form-item label名称el-input v-modelform.name //el-form-item el-form-item label图标ImageUpload v-modelform.icon small //el-form-item el-form-item label排序el-input-number v-modelform.sort :min0 //el-form-item /el-form template #footer el-button clickvisible false取消/el-button el-button typeprimary clicksave保存/el-button /template /el-dialog /div /template script setup import { onMounted, reactive, ref } from vue import { ElMessage, ElMessageBox } from element-plus import ImageUpload from ../../components/ImageUpload.vue import { categoryDelete, categoryPage, categorySave, categoryUpdate } from ../../api/admin const list ref([]) const total ref(0) const visible ref(false) const query reactive({ pageNum: 1, pageSize: 10, name: }) const form reactive({ id: null, name: , icon: , sort: 0 }) /** * 加载分类分页 */ async function load() { const res await categoryPage(query) list.value res.data.records total.value res.data.total } /** * 打开新增或编辑弹窗 */ function open(row) { Object.assign(form, row ? { ...row } : { id: null, name: , icon: , sort: 0 }) visible.value true } /** * 保存分类 */ async function save() { if (form.id) await categoryUpdate(form) else await categorySave(form) ElMessage.success(保存成功) visible.value false load() } /** * 删除分类 */ async function remove(row) { await ElMessageBox.confirm(确认删除该分类吗, 提示) await categoryDelete(row.id) ElMessage.success(删除成功) load() } onMounted(load) /script