1. 项目背景与核心价值
去年在给某连锁咖啡品牌做技术咨询时,发现他们门店每天要处理上百次"WiFi密码在哪"的顾客询问。服务员重复回答相同问题,顾客体验也不够流畅。这促使我开发了这套WiFi扫码连接系统,用技术手段把繁琐的密码输入过程简化成一秒扫码。
这套系统由两个核心部分组成:Vue 3构建的管理后台供商家配置WiFi信息,微信小程序端供顾客扫码连接。实际落地后,门店客服压力减少70%,顾客连接成功率从原来的85%提升到99%。最让我意外的是,有些顾客会因为"扫码连WiFi太酷了"而拍照分享,无形中带来了二次传播。
2. 技术架构设计
2.1 整体架构图解
[管理后台] ←HTTP→ [后端API] ←WebSocket→ [微信小程序] ↑ ↑ MySQL Redis缓存管理后台与小程序通过同一套RESTful API交互,考虑到实时性要求,在线设备数统计采用WebSocket推送。这种架构选择基于三个实际考量:
- 中小商户的服务器资源有限,需要轻量级方案
- WiFi信息变更频率低,读多写少适合加缓存
- 微信小程序必须使用HTTPS,因此直接排除了HTTP方案
2.2 关键技术选型
Vue 3生态链组合:
- Pinia替代Vuex:配置信息这类全局状态更适合用Pinia的store结构
- Vite构建:实测项目冷启动时间从Webpack的28s降到1.9s
- Naive UI:选择这个新兴组件库是因为它的Tree组件能完美支持多级门店分类
小程序端特殊处理:
- 分包加载:将二维码生成模块单独分包,首包体积控制在1MB内
- 自定义二维码样式:通过canvas绘制品牌专属二维码,提升视觉统一性
3. 管理后台实现细节
3.1 配置模块开发实录
核心配置表单包含三个关键字段验证:
// WiFi密码强度验证规则 const passwordRules = [ { validator: (_, value) => { if (value.length < 8) return Promise.reject('密码至少8位') if (!/[A-Z]/.test(value)) return Promise.reject('需包含大写字母') return Promise.resolve() } } ]门店树形组件优化技巧:
- 采用虚拟滚动处理超过500家门店的情况
- 实现懒加载时注意展开状态的保持
- 添加右键菜单快速操作(批量配置等)
3.2 数据看板实现
使用ECharts实现的关键指标:
- 实时连接设备数(WebSocket推送)
- 分时段连接趋势图
- 设备品牌分布饼图
性能优化点:
// 使用防抖处理窗口resize this.chart.resize = _.debounce(this.chart.resize, 300) // 大数据量时开启渐进渲染 series: { progressive: 1000, progressiveThreshold: 3000 }4. 微信小程序端核心技术
4.1 扫码连接流程
二维码编码规范:
- 采用WIFI:T:WPA;S:SSID;P:Password;H:;格式
- 添加时间戳和门店ID作为查询参数
自动连接实现:
wx.connectWiFi({ SSID: decoded.ssid, password: decoded.password, success: () => { this.logConnection(true) }, fail: (err) => { this.showErrorModal(err.errMsg) } })4.2 遇到的典型问题
Android机型兼容性问题:
- 华为部分机型需要先获取位置权限
- 小米手机需要引导用户手动点击"信任此网络"
解决方案代码:
// 检测Android特殊处理 if (isAndroid) { await checkLocationPermission() showTrustNetworkGuide() }5. 安全与性能优化
5.1 安全防护措施
- 二维码有效期控制(默认5分钟)
- 接口调用频率限制(10次/分钟)
- 密码传输使用RSA加密
- 管理后台操作日志审计
5.2 性能提升实战
缓存策略对比测试结果:
| 策略 | 平均响应时间 | 服务器负载 |
|---|---|---|
| 无缓存 | 320ms | 78% |
| Redis缓存 | 45ms | 32% |
| 本地内存+Redis | 28ms | 25% |
最终采用两级缓存方案,门店基础信息缓存在内存,连接记录等大数据量存Redis。
6. 部署与运维要点
6.1 生产环境部署
推荐使用Docker Compose编排:
version: '3' services: backend: image: node:16-alpine command: npm start ports: - "3000:3000" redis: image: redis:6 volumes: - redis_data:/data6.2 监控方案
- 使用PM2的监控功能
- 关键接口添加Sentry监控
- 小程序错误日志上报
7. 扩展功能实践
7.1 营销功能扩展
在连接成功页添加:
- 优惠券领取入口
- 会员注册引导
- 满意度调查
7.2 多平台适配
通过条件编译实现一套代码支持:
- 微信小程序
- 支付宝小程序
- 字节跳动小程序
构建命令示例:
"scripts": { "build:wechat": "cross-env PLATFORM=wechat vite build", "build:alipay": "cross-env PLATFORM=alipay vite build" }8. 项目复盘与经验总结
最值得分享的三个经验:
- 在Vue 3的setup中,使用
markRaw避免不必要的响应式转换能提升性能约15% - 小程序端一定要在真机上测试所有Android主流机型
- 管理后台的批量操作功能要添加二次确认,我们曾因误操作导致200家门店配置被覆盖
后续优化方向:
- 试验WebAssembly加速二维码生成
- 加入WiFi信号质量检测功能
- 探索无密码的WPA3认证方案
这套系统目前已在37家门店稳定运行8个月,日均处理连接请求2300+次。最大的收获是认识到:技术解决方案的价值不在于有多先进,而在于能否精准解决实际场景中的痛点。