1、立项背景与目标
中小养殖场的仔猪销售长期依赖纸质台账和微信群沟通,批次库存靠人工记忆,容易出现同一批仔猪被重复预定、售出后库存不同步、销售与收款账目对不上等问题;买家也只能反复打电话询问批次和订单进度。本项目希望用一个轻量、免安装的网站,把“批次上架—在线预定—成交出售—财务对账”整个流程线上化,让养殖场少跑腿、买家能自助查询,并兼顾手机操作,适应乡村网络环境。
2、软件功能与核心模块
①批次库存管理:按批次登记数量、单价、预计出售日期,实时展示已订、可订与已售数量;
②在线预定:买家或操作员选择批次和数量提交预定,支持修改与退订;
③出售与财务:确认出售后自动扣减库存并生成财务流水,支持按时间、类型筛选和汇总统计;
④账号与权限:超级管理员、操作员、买家三级角色,支持注册、登录、修改密码、重置密码、启用/禁用,权限或密码变更后目标账号立即下线;
⑤买家中心:注册买家只能查看本人的订单、已售重量与金额、支付方式;
⑥批次相册:工作人员按批次上传照片,买家在首页和“我的订单”中只读浏览,支持手机左右滑动、键盘方向键、返回键关闭;
⑦移动端适配:首页、后台和相册在 375、390、1366 三种宽度下均无横向滚动。
3、业务流程与功能路径
管理员登录后台 → 在库存页录入批次 → 买家注册登录后在首页选择批次、填写数量并提交预定 → 养殖场在“预定”页确认或修改 → 在“出售”页完成出售,系统自动写入财务记录 → 管理员在“财务”页对账统计。买家侧路径为:首页 → 选择批次 → 提交预定 → 在“我的订单”查看进度、成交信息和批次相册。
1、整体架构和设计思路
项目是无框架的 PHP 单体应用:public 作为唯一站点根目录,app 下按 config、lib、service、views 分层;数据库统一使用 PDO 预处理与单例连接,业务规则集中在 Service 层,页面只负责参数校验和渲染。前端采用原生 JavaScript 加本地化 Bootstrap 5.3,不依赖 CDN。核心思路是“数据正确性优先”:预定、退订、改单、出售都在数据库事务中完成,关键表加行锁,订单号加唯一索引和命名锁,防止并发超卖和重复成交;列表与统计改为服务端分页和 SQL 聚合,避免一次渲染全表。相册采用服务端转码:上传后用 GD 生成 360px 缩略图和 1200px 查看图两档 WebP,不保留原图,静态资源设置一年 immutable 缓存;前端灯箱按需请求列表,用 IntersectionObserver 懒加载可视区缩略图,大图切换到哪张才下载哪张,适配流量计费的云主机。
2、我负责的模块和结果
独立完成需求梳理、数据库设计、后端接口、后台页面、买家端页面及移动端适配。主要结果:将原本 1447 行的后台单页 success.php 重构为 276 行,并按功能拆分为独立视图;为预定、出售、财务补充索引和唯一约束,修复并发重复成交;新增三级账号体系与“改密/禁用后立即下线”机制;完成批次相册从建表、上传、后台管理到前台灯箱的全链路;41 个 PHP 文件静态检查全部通过,相册功能的权限与接口测试 51 项、浏览器端 70 项、后台 14 项全部通过;30 张照片的相册首屏只加载 9 张缩略图,打开时仅请求 1 张查看图,同批次再次打开 0 请求;375/390/1366 三档无横向溢出。
3、我遇到的难点、坑和解决方案
①并发重复出售:采用“服务端重新读取订单 + 事务行锁 + 订单号命名锁 + 唯一索引”四层保护,确保同一订单只能成交一次;②数据量大时页面卡顿:列表改为服务端筛选分页,统计改为 SQL 聚合,相册数量用批量查询避免 N+1;③手机返回键误退出页面:灯箱打开时写入一条历史记录,监听 popstate 先关闭灯箱并恢复滚动位置和已填表单;实测发现触摸屏点按按钮不会让按钮获得焦点,修正为记录触发按钮本身,关闭后焦点准确回到入口;④流量成本:不保留原图、两档 WebP、懒加载、不预取、长缓存,首屏流量控制在几十 KB;⑤环境约束:运行环境为 PHP 7.3,不能使用类型属性等新语法,图片处理也用 GD 资源式写法,全部代码按 7.3 兼容;导入数据库时 MySQL 对中文路径解析失败,改为先复制到英文临时路径再导入。另外还处理了旧 MD5 密码登录时自动升级为 bcrypt、CSRF 校验、未登录与越权访问拦截等安全和兼容问题。