基于SpringBoot+Vue的无人自助拼豆系统开发全流程实战指南
随着线下自助业态的快速发展,拼豆作为年轻群体喜爱的手工DIY项目,无人自助模式可有效降低运营成本、提升用户消费灵活性。本文将从架构设计、功能实现、难点优化、部署测试全环节,完整讲解基于SpringBoot+Vue技术栈的无人自助拼豆系统开发实践,方案同样可复用在各类无人共享业态的系统搭建。
一、需求分析与系统架构设计
需求拆解
系统覆盖三类角色的核心需求:
- 普通用户:扫码解锁自助设备、查看附近门店及导航、拼豆套餐选择、订单记录查询、制作教程查看;
- 运营管理员:设备状态远程监控、订单全生命周期管理、拼豆物料库存预警、运营数据可视化统计;
- 设备终端:状态实时上报、接收远程开锁指令、物料消耗数据自动同步。
技术架构选型
参考主流无人共享系统的成熟技术方案,采用前后端分离的分布式架构:
- 后端核心服务:基于SpringBoot 2.7.x + MyBatis Plus 3.5.x开发,数据库采用MySQL 8.0存储业务数据,Redis作为缓存中间件实现热点数据存储和分布式锁;
- 用户端:采用UniApp(基于Vue 2语法)开发,支持编译为小程序、H5、APP多端适配,降低多端开发成本;
- 管理后台:采用Vue 2 + Element UI构建,通过可视化界面降低运营人员操作门槛;
- 物联网联动层:采用MQTT协议实现后端与自助设备的通信,完成软硬件一体化的状态同步与指令下发。
整体架构分为五层:展示层(用户端、管理后台)、网关层(Nginx反向代理、请求鉴权)、业务服务层(用户服务、订单服务、设备服务、统计服务)、数据层(MySQL、Redis、MQTT Broker)、终端层(自助拼豆设备)。
二、核心功能模块技术实现
1. 用户端核心逻辑实现
用户扫码进入小程序后,首先调用后端接口校验设备在线状态,状态为空闲时展示可选购的拼豆套餐,用户确认下单后,后端生成订单并调用设备开锁接口,用户即可取出拼豆材料进行创作。核心订单创建接口代码示例如下:
@RestController@RequestMapping("/api/order")publicclassOrderController{@AutowiredprivateOrderServiceorderService;@AutowiredprivateDeviceServicedeviceService;@AutowiredprivateMqttServicemqttService;@PostMapping("/create")publicResultcreateOrder(@RequestBodyOrderCreateDTOdto,@RequestHeader("userId")LonguserId){// 校验设备是否存在且状态正常Devicedevice=deviceService.getById(dto.getDeviceId());if(device==null||!DeviceStatusEnum.ONLINE_NORMAL.getCode().equals(device.getStatus())){returnResult.fail("设备不可用,请选择其他设备");}// 校验套餐库存合法性PindouPackagepackageInfo=packageService.getById(dto.getPackageId());if(packageInfo==null||packageInfo.getStock()<=0){returnResult.fail("所选套餐库存不足");}// 创建订单并锁定库存Orderorder=orderService.createOrder(userId,dto,packageInfo);// 向设备下发开锁指令mqttService.publish(TOPIC_DEVICE_PREFIX+device.getDeviceSn(),"open");returnResult.success(order.getOrderNo());}}2. 管理后台功能实现
管理后台核心包含设备管理、订单管理、库存管理、数据统计四大模块,其中分页查询订单列表是高频操作,借助MyBatis Plus的分页插件可快速实现:
@GetMapping("/list")publicResultgetOrderList(OrderQueryDTOdto){Page<OrderVO>page=newPage<>(dto.getPageNum(),dto.getPageSize());LambdaQueryWrapper<Order>wrapper=Wrappers.lambdaQuery();if(StringUtils.isNotBlank(dto.getOrderNo())){wrapper.like(Order::getOrderNo,dto.getOrderNo());}if(dto.getStatus()!=null){wrapper.eq(Order::getStatus,dto.getStatus());}wrapper.orderByDesc(Order::getCreateTime);IPage<OrderVO>orderPage=orderService.page(page,wrapper).convert(order->{OrderVOvo=newOrderVO();BeanUtils.copyProperties(order,vo);returnvo;});returnResult.success(orderPage);}库存预警功能采用SpringBoot自带的@Scheduled定时任务实现,每天凌晨扫描库存低于阈值的物料,生成预警记录推送至管理员账号。
3. 物联网联动模块实现
设备端通过MQTT协议与后端通信,设备上线、状态变更、物料消耗都会主动上报到指定Topic,后端订阅对应Topic处理消息:
@MqttSubscribe(topic="device/report/+")publicvoidhandleDeviceReport(Stringtopic,Stringpayload){StringdeviceSn=topic.split("/")[2];DeviceReportDTOreport=JSON.parseObject(payload,DeviceReportDTO.class);// 更新设备实时状态deviceService.updateStatus(deviceSn,report.getStatus());// 如果是物料消耗上报,更新对应套餐库存if(ReportTypeEnum.CONSUME.getCode().equals(report.getType())){packageService.reduceStock(report.getPackageId(),1);}}三、关键技术难点与优化方案
1. 高并发下设备状态一致性问题
痛点:周末、节假日高峰时段可能出现多个用户同时扫码同一台设备的情况,容易出现超卖、重复开锁的问题。
解决方案:引入Redis分布式锁,用户扫码请求进入时,先以deviceId作为key申请锁,锁过期时间设置为30s,只有获取到锁的请求才能继续执行订单创建逻辑,执行完成后主动释放锁,避免并发冲突。核心逻辑代码如下:
StringlockKey="lock:device:"+dto.getDeviceId();Booleanlock=redisTemplate.opsForValue().setIfAbsent(lockKey,userId.toString(),30,TimeUnit.SECONDS);if(!lock){returnResult.fail("当前设备正在被其他用户操作,请稍后重试");}try{// 执行订单创建核心逻辑}finally{// 释放锁,避免锁占用if(userId.toString().equals(redisTemplate.opsForValue().get(lockKey))){redisTemplate.delete(lockKey);}}2. 多端状态实时同步问题
痛点:订单状态变更、设备状态变更需要同时同步到用户端和管理后台,传统轮询方式效率低、延迟高,用户体验差。
解决方案:用户端和管理后台接入WebSocket,后端在收到设备状态上报、订单状态变更时,通过WebSocket主动推送消息到对应客户端,实现状态毫秒级同步。
3. 设备离线场景兼容
痛点:门店网络波动可能导致设备短时间断网,用户下单后无法收到开锁指令,订单状态出现不一致。
解决方案:设备端内置本地缓存,断网时将操作记录暂存在本地,网络恢复后自动上报到后端;后端增加定时对账任务,每小时比对设备上报的操作记录和系统订单记录,补全异常状态的订单,保证数据一致性。
四、系统部署与测试落地
部署方面采用容器化部署方案,提升部署效率和可维护性:
- 后端服务打包为Jar包后,编写Dockerfile构建镜像,通过Docker Compose统一编排后端服务、MySQL、Redis、MQTT Broker等组件,实现一键启动;
- 管理后台Vue项目执行
npm run build打包生成静态资源,部署到Nginx服务器,配置反向代理指向后端服务接口; - UniApp用户端根据业务需求编译为H5、小程序等不同端,分别部署或发布到对应平台。
测试环节覆盖三类测试场景:
- 功能测试:覆盖用户扫码下单、开锁取料、订单查询、管理后台设备监控、库存预警等全流程功能点,保证业务逻辑正确性;
- 性能测试:使用JMeter模拟1000并发用户下单请求,测试接口响应时间稳定在200ms以内,错误率低于0.1%,满足高峰时段使用需求;
- 物联网联调测试:模拟设备离线、重连、指令丢失等异常场景,验证系统的容错能力和数据一致性。
本套开发方案不仅适用于无人自助拼豆场景,其核心架构和功能逻辑也可以快速复用在无人共享球杆柜、无人售卖机、共享运动场馆等各类无人自助业态,只需要替换对应业务模型和设备交互逻辑即可快速完成定制开发,大幅降低同类无人系统的开发成本。