1. 项目概述:Python+微信小程序的生猪养殖信息化管理系统
去年帮老家亲戚改造养猪场管理系统时,我深刻体会到传统养殖业的痛点:纸质记录易丢失、数据统计滞后、疫情预警不及时。这套基于Python后端+微信小程序前端的信息化系统,实现了从饲料投喂到出栏销售的全流程数字化管理。养殖户通过手机就能实时查看存栏量、免疫记录、生长曲线等关键数据,特别适合中小型养殖场使用。
系统采用Python+Django构建RESTful API,微信小程序作为轻量级前端,完美解决了养殖场电脑设备不足的问题。数据看板自动生成饲料转化率、日均增重等核心指标,当猪只体温异常或疫苗到期时,会通过小程序服务通知主动提醒。下面分享具体实现方案和踩坑经验。
2. 技术架构设计
2.1 整体技术栈选型
后端核心组件:
- Django REST Framework:快速构建养殖数据API
- Celery:异步处理生长曲线计算等耗时任务
- PostgreSQL:存储结构化养殖数据(相比MySQL更适合复杂查询)
- Redis:缓存高频访问的存栏统计数据
前端技术方案:
- 微信小程序原生开发:无需安装,即用即走
- ECharts for WeChat:可视化养殖数据图表
- Vant Weapp:快速搭建管理界面
特别注意:微信小程序要求所有请求域名备案,需提前准备HTTPS证书。我们使用Let's Encrypt免费证书,通过Nginx反向代理到Django服务。
2.2 数据库关键表设计
python复制# 猪只信息模型示例
class Pig(models.Model):
ear_tag = models.CharField(max_length=20, unique=True) # 耳标号
breed = models.CharField(max_length=50) # 品种
birth_date = models.DateField()
entry_weight = models.DecimalField(max_digits=6, decimal_places=2) # 入场体重
status_choices = [
('nursery', '保育期'),
('fattening', '育肥期'),
('sold', '已出栏'),
('dead', '死亡')
]
status = models.CharField(max_length=10, choices=status_choices)
pen = models.ForeignKey('Pen', on_delete=models.PROTECT) # 所在栏位
def current_weight(self):
# 获取最近一次称重记录
last_record = self.weight_records.latest('record_date')
return last_record.weight
3. 核心功能实现细节
3.1 微信小程序登录鉴权方案
养殖场工作人员通过微信快捷登录,后端通过code换取openid实现无感认证:
python复制# Django后端登录接口
@api_view(['POST'])
def wechat_login(request):
code = request.data.get('code')
appid = settings.WECHAT_APPID
secret = settings.WECHAT_SECRET
# 请求微信接口获取openid
response = requests.get(
f'https://api.weixin.qq.com/sns/jscode2session?appid={appid}&secret={secret}&js_code={code}&grant_type=authorization_code'
)
data = response.json()
openid = data.get('openid')
# 查询或创建用户
user, created = User.objects.get_or_create(
wechat_openid=openid,
defaults={'username': f'wx_{openid[-6:]}'}
)
# 生成JWT token
token = jwt.encode(
{'user_id': user.id},
settings.SECRET_KEY,
algorithm='HS256'
)
return Response({'token': token})
3.2 养殖关键指标计算
饲料转化率(FCR)算法:
python复制def calculate_fcr(pig_id, start_date, end_date):
pig = Pig.objects.get(id=pig_id)
feed_records = FeedRecord.objects.filter(
pig=pig,
feed_date__range=(start_date, end_date)
).aggregate(total_feed=Sum('amount'))
weight_records = WeightRecord.objects.filter(
pig=pig,
record_date__range=(start_date, end_date)
).order_by('record_date')
if not weight_records.exists():
return None
weight_gain = weight_records.last().weight - weight_records.first().weight
return round(float(feed_records['total_feed']) / weight_gain, 2)
4. 数据可视化实践
4.1 微信小程序图表渲染
使用ECharts for WeChat实现生长曲线和存栏结构可视化:
javascript复制// 生长曲线图表配置
function initGrowthChart() {
const chart = echarts.init(this, null, {
width: wx.getSystemInfoSync().windowWidth,
height: 300
});
chart.setOption({
tooltip: { trigger: 'axis' },
xAxis: {
type: 'category',
data: ['第1周', '第2周', '第3周', '第4周']
},
yAxis: { type: 'value', name: '体重(kg)' },
series: [{
data: [25, 32, 41, 49],
type: 'line',
smooth: true,
lineStyle: { color: '#07C160' }
}]
});
this.chart = chart;
}
5. 部署与性能优化
5.1 Nginx关键配置
针对微信小程序的高并发请求优化:
nginx复制upstream pigfarm {
server 127.0.0.1:8000;
keepalive 32;
}
server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location /api/ {
proxy_pass http://pigfarm;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_http_version 1.1;
proxy_set_header Connection "";
# 微信小程序包体较小,适当调整缓存
proxy_buffers 8 32k;
proxy_buffer_size 64k;
}
location /media/ {
alias /var/www/pigfarm/media/;
expires 30d;
}
}
6. 典型问题排查实录
6.1 微信支付对接问题
问题现象:调用wx.requestPayment时返回"access denied"
排查步骤:
- 检查小程序后台「开发」-「开发设置」是否已添加支付域名
- 验证商户号(mch_id)与小程序的绑定关系
- 确认统一下单接口返回的prepay_id格式正确
- 检查签名算法是否符合微信要求
解决方案代码:
python复制def generate_pay_sign(params, api_key):
# 参数按ASCII码排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接成URL参数形式
stringA = '&'.join([f"{k}={v}" for k, v in sorted_params])
# 拼接API密钥
stringSignTemp = f"{stringA}&key={api_key}"
# MD5加密并转大写
return hashlib.md5(stringSignTemp.encode()).hexdigest().upper()
7. 项目演进方向
这套系统在实际部署后,根据养殖场反馈又迭代了以下功能:
- 基于OpenCV的猪只体况评分(通过上传照片自动分析)
- 饲料库存预警与自动补货计算
- 与温湿度传感器的硬件对接实现环境监控
有个容易忽略但很重要的细节:微信小程序包大小限制2MB,对于包含图表库的项目很容易超标。我们最终采用分包加载策略,将ECharts单独放在分包中,主包体积压缩到1.3MB。具体操作是在app.json中配置:
json复制{
"subpackages": [
{
"root": "subpackages/echarts",
"pages": ["index"]
}
]
}
