site logo

Marico's space

书店管理

前端技术 2026-09-04 14:49:02 9

Python全栈实习那会儿,接到的第一个正经项目是做个书店管理系统——带商品目录、库存追踪、购物车、支付结算、订单管理、评论和心愿单那种。说白了就是一个能跑起来的电商小闭环。这篇聊聊我实际踩了哪些坑,以及怎么绕过去的。

功能清单

需求文档列的功能基本就是一个正经书店该有的样子:

图书目录——分类、作者、标签,支持按书名、ISBN、作者名和简介搜索
库存管理——实时库存数量,"预留数量"机制防止付款处理中最后一本书被超卖,低库存告警(后台能看到,也提供了可定时执行的命令行脚本发邮件)
购物车——基于Session实现,不用强制登录,商品数量跟实际库存挂钩
结算——收货地址、支付方式选择、实时订单摘要、包邮门槛
用户认证——注册、登录登出、密码重置、个人主页,用的是Django自带的django.contrib.auth,没自己造轮子
订单管理——历史订单、状态时间线(待支付→处理中→已发货→已送达),取消订单时自动释放预留/已购库存
评论与评分——每个用户每本书只能发一条,1到5星,评分在书出现的每个地方都会显示
心愿单——添加、移除、一键移入购物车

除了前台页面,还用Django REST Framework搭了一套完整的REST API,覆盖图书、作者、分类、标签和评论,还给运营人员专门做了一个low_stock端点用于库存看板。毕竟一个正经书店迟早要有移动端或者对接第三方系统,把API和网站一起做比后面再补要省事得多。

技术栈

后端:Django 4.2 + Django REST Framework + django-filter
数据库:本地开发用SQLite,换成MySQL 8.x只需要改一行配置
前端:Django模板 + Bootstrap 5,没上Vue/React这些框架——这种项目SSR(服务端渲染)简单直接,出活快
支付:自己写了个模拟支付网关,整套支付流程都能演示,不需要真实API密钥——卡号尾数0000会模拟拒付,重试流程也不是纸上谈兵

没人提前告诉你的部分:环境配置

这段估计是最有用的。代码其实不难搞定,真正吃掉我大半天的是Windows上的Python环境。

Python版本问题。一开始装的是Python 3.14——很新,但Pillow和mysqlclient都没有针对Windows预编译的wheel包。pip尝试从源码编译,结果失败,因为系统里没装C编译器和MySQL的头文件。解决方案很简单:装了Python 3.12和3.14共存,用3.12建虚拟环境(py -3.12 -m venv venv)。新版本不一定更好用,得看依赖包有没有跟上。
MySQL的坑。mysqlclient在Windows上编译需要能找到MySQL的C头文件,这本身就是个大坑——然后还有个灵魂拷问:几个月前设的root密码你还记得吗?最后我的做法是本地开发默认用SQLite,但MySQL支持已经完整接好了,只需要一个环境变量(DB_ENGINE=mysql)就能切过去。Django的ORM完全抽象了数据库引擎,应用代码一行都不用改,就是配置文件里换个开关。
PowerShell不是Bash。跟着教程走的话,source venv/bin/activate在Windows上会静默失败——正确的是venv\Scripts\Activate.ps1,而且可能需要先放宽PowerShell的执行策略(Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser)。

这些东西知道了就不难,但确实是Django文档里不会写、第一次做项目会实实在在吃掉时间的那种。

如果能重来,我会告诉自己这些

本地开发默认用SQLite。只有确实需要测试时才换MySQL/PostgreSQL,每多一个基础设施就多一个"配置日"可能出问题的点。
依赖版本要锁定,但别锁太死。Pillow==10.4.0这种严格版本号,一旦有人用比这个版本发布时还新的Python就炸了。用版本范围给pip留点选择空间,它能找到有wheel的兼容版本。
库存逻辑要在结算逻辑之前做。下单时就预留库存(而不是支付成功时才扣),才能防止两个顾客同时"买走"最后一本书——从一开始就做进去比后面再补要简单太多。
重复劳动写成管理命令。低库存检查(check_low_stock)就三行ORM查询,但做成定时任务就能变成真正有用的每日告警,基本不费额外功夫。
项目收尾

这个项目做下来,"全栈"在实际中是什么感觉体会挺深的:数据建模(库存预留、订单快照保留历史价格)、权限控制、REST API、基于Session的状态管理(购物车),以及——可能最接近真实项目的一面——怎么让一个刚拿到代码的陌生人在自己机器上跑起来。

如果你也在做类似的实习项目或者作品集,只有一条建议:先把环境配置弄稳定、弄无脑。剩下的就是Django的基本功了。