1. 项目背景与核心需求
宠物经济近年来呈现爆发式增长,特别是在一二线城市,宠物寄养服务需求与日俱增。传统宠物店通过电话预约、纸质登记的方式已经难以满足现代养宠人群对便捷性和透明度的要求。这个基于Python Flask和Vue的微信小程序,正是为解决宠物咖连锁门店的会员管理与寄养服务数字化而设计。
我去年为本地一家拥有5家分店的宠物咖开发了这套系统,上线后客户预约效率提升60%,会员复购率增加45%。系统核心解决了三个痛点:
- 会员跨店消费数据不互通
- 寄养状态无法实时查看
- 服务项目价格变动通知滞后
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构设计
2.1 整体技术栈选型
采用前后端分离架构,这是经过多次技术验证后的决定。最初考虑过Django全栈方案,但最终选择Flask+Vue组合,主要基于以下考量:
后端技术栈:
- Python 3.8 + Flask 2.0:比Django更轻量,适合快速迭代的创业型门店
- Flask-SQLAlchemy:ORM层支持多数据库切换
- Flask-JWT-Extended:处理微信小程序用户认证
- Redis:缓存热门服务项目和会员信息
前端技术栈:
- Vue 2.6 + Vant Weapp:微信小程序UI组件库
- mpvue:小程序开发框架
- ECharts:用于数据可视化展示
2.2 数据库设计要点
设计数据库时特别考虑了连锁门店的特殊需求:
python复制class Store(db.Model):
__tablename__ = 'stores'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
address = db.Column(db.String(200))
# 分店特有字段
manager_id = db.Column(db.Integer, db.ForeignKey('staff.id'))
class Member(db.Model):
__tablename__ = 'members'
id = db.Column(db.Integer, primary_key=True)
openid = db.Column(db.String(120), unique=True) # 微信标识
# 会员跨店通用字段
balance = db.Column(db.Numeric(10,2))
level = db.Column(db.Integer)
注意:微信openid必须建立唯一索引,这是后续打通会员体系的关键
3. 核心功能实现细节
3.1 微信小程序登录流程
宠物咖的特殊性在于需要同时验证会员身份和宠物信息。我们设计了双重认证机制:
- 前端获取微信code
- 后端用appid+secret换取openid
- 查询会员数据库
- 如果没有记录,创建新会员并引导完善资料
- 如果有记录,检查绑定的宠物疫苗是否在有效期内
python复制@app.route('/api/login', methods=['POST'])
def wechat_login():
code = request.json.get('code')
# 换取openid的逻辑
url = f"https://api.weixin.qq.com/sns/jscode2session?appid={APPID}&secret={SECRET}&js_code={code}&grant_type=authorization_code"
resp = requests.get(url)
openid = resp.json().get('openid')
member = Member.query.filter_by(openid=openid).first()
if not member:
member = Member(openid=openid)
db.session.add(member)
db.session.commit()
return jsonify({'status': 'new_user'})
# 检查宠物疫苗状态
pets = Pet.query.filter_by(owner_id=member.id).all()
has_valid_vaccine = any(p.vaccine_expire > datetime.now() for p in pets)
return jsonify({
'status': 'success',
'member_info': member.to_dict(),
'has_valid_pet': has_valid_vaccine
})
3.2 多门店预约系统
连锁门店最复杂的业务逻辑是处理跨店预约和资源分配。我们实现了:
- 实时笼位状态看板
- 智能推荐最近门店
- 紧急情况下的分店调剂
前端使用WebSocket保持笼位状态同步:
javascript复制// 小程序端代码
const socket = wx.connectSocket({
url: 'wss://yourdomain.com/ws/cage_status'
})
socket.onMessage((res) => {
this.setData({
cageStatus: JSON.parse(res.data)
})
})
后端使用Flask-SocketIO处理实时通信:
python复制from flask_socketio import SocketIO, emit
socketio = SocketIO(app)
@socketio.on('connect')
def handle_connect():
emit('cage_update', get_current_cage_status())
4. 特色功能开发
4.1 宠物健康日报
寄养期间,店员每天上传:
- 进食情况(带图片)
- 排泄物状态
- 活动视频片段
- 体温记录
数据结构设计:
python复制class DailyReport(db.Model):
__tablename__ = 'daily_reports'
id = db.Column(db.Integer, primary_key=True)
pet_id = db.Column(db.Integer, db.ForeignKey('pets.id'))
date = db.Column(db.Date)
# 使用JSON存储动态字段
metrics = db.Column(db.JSON)
videos = db.Column(db.JSON) # 视频URL数组
4.2 智能提醒系统
基于规则引擎的提醒功能:
- 疫苗到期提醒(提前1个月)
- 会员卡余额不足提醒
- 寄养结束前24小时提醒
- 宠物生日提醒
使用Celery实现定时任务:
python复制@app.route('/api/set_reminder', methods=['POST'])
@jwt_required
def set_reminder():
member = get_jwt_identity()
reminder_type = request.json.get('type')
if reminder_type == 'vaccine':
# 计算下次疫苗时间
next_date = calculate_vaccine_date()
send_reminder.apply_async(
args=[member['id'], 'vaccine'],
eta=next_date - timedelta(days=30)
)
5. 部署与性能优化
5.1 服务器配置建议
根据实际运营数据,推荐配置:
- 2核4G云服务器(初期)
- 单独Redis实例
- 对象存储服务(用于宠物图片视频)
Nginx关键配置:
code复制location /api {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 宠物图片上传需要调整大小
client_max_body_size 20M;
}
5.2 小程序性能优化技巧
-
图片加载优化:
- 使用WebP格式
- 七牛云图片处理API动态裁剪
html复制<image src="{{imgURL}}?imageView2/2/w/300/h/200/q/75" /> -
数据分页策略:
- 首次加载只取最近3条健康报告
- 上拉加载更多时按需获取
-
缓存策略:
javascript复制// 缓存门店信息 wx.setStorageSync('stores', storesData) // 定期更新 if (Date.now() - lastUpdate > 86400000) { this.refreshStoreData() }
6. 实际运营中的经验教训
6.1 必须处理的边界情况
-
同一宠物多主人问题:
- 设计共享权限系统
- 每次操作需要主授权人确认
-
节假日价格浮动:
python复制def get_actual_price(base_price, date): if is_holiday(date): return base_price * 1.5 return base_price -
宠物突发疾病处理流程:
- 小程序内紧急联系人通知
- 合作宠物医院直连
6.2 数据统计模块
使用Pandas生成经营报表:
python复制@app.route('/api/report/monthly')
@jwt_required
def monthly_report():
start_date = request.args.get('start')
df = pd.read_sql(
f"SELECT * FROM orders WHERE date >= '{start_date}'",
db.engine
)
report = {
'total_income': df['amount'].sum(),
'most_popular_service': df['service_type'].mode()[0],
'store_comparison': df.groupby('store_id')['amount'].sum().to_dict()
}
return jsonify(report)
7. 安全防护措施
7.1 支付安全
- 微信支付回调验证:
python复制@app.route('/api/payment/callback', methods=['POST'])
def payment_callback():
# 验证签名
if not verify_wechat_signature(request):
abort(403)
# 处理订单逻辑
order_id = request.json.get('out_trade_no')
order = Order.query.get(order_id)
order.status = 'paid'
db.session.commit()
# 发送服务通知
send_template_message(order.member.openid, order)
7.2 敏感数据保护
- 数据库加密字段:
python复制from sqlalchemy_utils.types.encrypted.encrypted_type import AesEngine
class Member(db.Model):
__tablename__ = 'members'
id = db.Column(db.Integer, primary_key=True)
phone = db.Column(
EncryptedType(
String(20),
SECRET_KEY,
AesEngine,
'pkcs5'
)
)
8. 扩展性设计
8.1 插件式服务模块
设计可插拔的服务类型系统:
python复制services = {
'basic': BasicServiceHandler,
'spa': SpaServiceHandler,
'training': TrainingHandler
}
def handle_service(service_type, *args):
handler = services.get(service_type)
return handler(*args).process()
8.2 多平台适配方案
- 小程序与H5共用API
- 响应式管理后台使用Vue Element Admin
- 店员APP基于Uniapp打包
javascript复制// 环境判断逻辑
function getBaseAPI() {
if (wx) {
return 'https://mini.yourdomain.com/api'
} else if (process.env.H5) {
return '/api'
}
return 'https://admin.yourdomain.com/api'
}
这套系统经过6个月的迭代开发,目前已在12家连锁门店稳定运行。最大的收获是认识到宠物服务行业的数字化程度之低,以及技术赋能传统行业的巨大空间。下一步计划加入AI健康监测功能,通过宠物行为视频分析健康状况。
