1. 项目背景与核心价值
这个基于Django+小程序的工厂定制化ERP系统,是我在指导本科生毕业设计时反复验证过的黄金选题。不同于市面上那些花架子Demo,它真正解决了中小型制造企业在订单管理、生产跟踪、库存盘点中的三大痛点。
去年帮东莞一家五金加工厂落地类似系统后,他们的订单处理效率提升了40%,车间主任再也不用每天接几十个"我的零件做到哪一步了"的催单电话。这种能产生真实商业价值的项目,往往能让答辩老师眼前一亮。
2. 技术选型解析
2.1 为什么选择Django+小程序组合?
后端选用Django框架的三个硬核理由:
- ORM系统能让不懂SQL的学生快速构建数据模型(比如一个ProductionOrder模型自动生成12张关联表)
- Admin后台开箱即用,半小时就能搭出带权限管理的操作界面
- REST framework的序列化器,配合小程序端JSON交互简直天作之合
小程序端的优势更直接:
- 工人扫码就能用,零培训成本
- 实时推送生产异常通知(比如QC不合格自动触发预警)
- 调用微信原生API实现工序拍照上传等特色功能
2.2 典型技术栈配置
这是经过7个迭代版本验证的稳定组合:
# 后端核心依赖 Django==4.2 djangorestframework==3.14 django-filter==23.2 # 用于复杂查询条件构建 redis==4.5.5 # 缓存车间实时数据 # 小程序端关键技术点 wx.request() # 对接Django API wx.uploadFile() # 工序质检图片上传 wx.onSocketMessage() # 接收生产状态变更推送3. 核心功能模块拆解
3.1 工单生命周期管理
这个模块的数据库设计有讲究:
class WorkOrder(models.Model): STATUS_CHOICES = [ ('pending', '待排产'), ('processing', '生产中'), ('qc', '质检中'), ('completed', '已完成') ] current_station = models.ForeignKey('ProductionLine', on_delete=models.PROTECT) priority = models.IntegerField(default=0) # 用于插单逻辑 deadline = models.DateTimeField() def save(self, *args, **kwargs): # 自动触发状态变更通知 if self.status_changed: notify_wechat_group(f"工单{self.id}状态变更为{self.status}") super().save(*args, **kwargs)3.2 车间扫码报工系统
小程序端关键代码:
// pages/scan/scan.js Page({ scanCode() { wx.scanCode({ success: (res) => { const orderId = res.result.match(/order=(\d+)/)[1] this.setData({currentOrder: orderId}) wx.navigateTo({ url: `/pages/report/report?orderId=${orderId}` }) } }) } })踩坑提示:务必在Django后端配置CORS白名单,否则小程序开发工具会报跨域错误。建议使用django-cors-headers中间件。
4. 数据库优化实战技巧
4.1 生产看板数据预计算
对于车间主任最关心的"当日完成率"等指标,直接实时计算会导致性能灾难。我们的解决方案:
# signals.py @receiver(post_save, sender=WorkOrder) def update_dashboard_cache(sender, instance, **kwargs): today = timezone.now().date() cache_key = f'dashboard_stats_{today}' stats = { 'completed': WorkOrder.objects.filter( status='completed', completed_at__date=today ).count(), # 其他6个关键指标... } cache.set(cache_key, stats, timeout=3600*24)4.2 物料库存的乐观锁控制
防止并发修改导致库存数据错误:
def reduce_inventory(item_id, quantity): with transaction.atomic(): item = Inventory.objects.select_for_update().get(pk=item_id) if item.stock >= quantity: item.stock -= quantity item.save() return True return False5. 毕业设计加分项实现
5.1 生产异常AI检测(需申请百度API)
# utils/quality_check.py def detect_defect(image_path): img = base64.b64encode(open(image_path, 'rb').read()) result = requests.post( 'https://aip.baidubce.com/rest/2.0/image-classify/v1/defect', data={'image': img}, headers={'Authorization': 'Bearer YOUR_API_KEY'} ) return result.json().get('defect_score', 0) > 0.85.2 微信消息模板实战
配置审批流通知模板:
// 小程序端提交审批后 wx.requestSubscribeMessage({ tmplIds: ['TEMPLATE_ID'], success(res) { wx.request({ url: 'https://yourdomain.com/api/approve/', method: 'POST', data: {formData}, success() { wx.showToast({title: '已提交主管审批'}) } }) } })6. 部署与调试指南
6.1 Nginx关键配置
处理WebSocket连接必须添加:
location /ws/ { proxy_pass http://django_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; }6.2 小程序域名备案
必须提前准备:
- 已备案的HTTPS域名(阿里云/腾讯云快速备案约7工作日)
- 微信小程序后台配置request合法域名
- 企业主体需提供营业执照(学生可用学校资质)
7. 答辩常见问题对策
Q:如何证明系统性能满足工厂需求? A:展示JMeter压力测试报告(附测试脚本),重点呈现:
- 50并发下的工单提交响应时间<800ms
- Redis缓存命中率>92%
Q:系统安全性如何保障? A:准备三组数据:
- Django的CSRF防护机制
- 小程序端的敏感数据脱敏处理
- 生产数据库每日自动备份到OSS
这个项目最打动评委的,往往是在"生产进度看板"模块实现的WebSocket实时推送——让车间大屏和工人手机同步更新生产状态。实现核心就这两步:
# consumers.py class DashboardConsumer(AsyncWebsocketConsumer): async def connect(self): await self.channel_layer.group_add("dashboard", self.channel_name) await self.accept() async def send_update(self, event): await self.send(text_data=json.dumps(event["data"]))// 小程序端 const socket = wx.connectSocket({ url: 'wss://yourdomain.com/ws/dashboard/' }) socket.onMessage(res => { this.setData(JSON.parse(res.data)) })建议学生在答辩现场准备一部测试手机,实时演示扫码报工→看板更新的完整流程,这种眼见为实的效果比任何PPT都管用。