省钱兄 JAVA 无人共享无人售卖机 · 物联网结合系统源码(支持小程序)
✅ 支持 小程序 + 公众号 + H5 三端覆盖(注:本版本不含APP,与无人机/租车等版本区分)
开发商:西安省钱兄网络科技有限公司
售价:¥8,888(套餐1)/ ¥10,888(套餐2含搭建+1年维护)
新更新:2026年4月6日(互站网在售)
系统整体架构
层级技术选型后端框架Spring Boot 2.7.x + MyBatis-Plus 3.5.0数据库MySQL 8.0 + Redis 6.2(缓存/分布式锁/GEO)用户端UniApp 3.0(Vue3语法)→ 编译为 小程序 + 公众号 + H5管理后台Vue3 + ElementPlus + ECharts 数据看板消息队列(订单通知/削峰)物联网通信MQTT 协议(设备直连)+ EMQX 消息中间件支付微信支付 + 支付宝(分账/免押代扣)部署JDK 17 + Docker + Nginx + K8s
核心功能模块1️⃣ 多角色体系java@PostMapping("/login")public Result<LoginVO> login(@Re LoginDTO dto) { User user = userService.login(dto); String token = JwtUtil.generateToken(user.getId(), user.getRole()); https:// role = "user" 用户 / "merchant" 商家(运营商) / "admin" 管理员 return Result.success(new LoginVO(token, user.getRole()));}
角色核心功能 用户端(小程序/H5/公众号)扫码购物/取货/退货、在线支付、钱包充值、优惠券核销、订单追踪 商家端(运营商)设备管理/上下架、库存管理/补货预警、订单调度、财务统计、员工管理 平台总后台全局数据看板/分账管理/营销工具/系统配置
2️⃣ 物联网设备直控(核心亮点)java/** * MQTT 消息监听 - 设备状态实时上报 * 售卖机通过 ESP32/树莓派 连接云端,上报库存/温度/门状态 */@Componentpublic class Mr { @Autowired private OrderService orderService; @Autowired private DeviceService deviceService; @M(topics = "/device/+/status") public void handleDeviceStatus(String payload) { JSONObject data = JSON.parseObject(payload); String deviceId = data.getString("deviceId"); int stock = data.getInteger("stock"); https:// 当前库存 int temp = data.getInteger("temperature"); https:// 温度 boolean doorOpen = data.getBoolean("doorOpen"); https:// 门状态 https:// 1. 实时同步库存到数据库 orderService.updateStock(deviceId, stock); https:// 2. 温度异常报警 if (temp > 35 || temp < 0) { deviceService.sendAlert(deviceId, "温度异常: " + temp + "℃"); } https:// 3. 门状态异常 if (doorOpen && LocalTime.now().isAfter(LocalTime.of(22,0))) { deviceService.sendAlert(deviceId, "深夜开门预警"); } } /** * 远程控制设备 - 下发指令 */ public void sendCommand(String deviceId, String cmd) { mMqtt("/device/" + deviceId + "/command", cmd); https:// cmd 示例: {"action":"open_door"} / {"action":"restart"} / {"action":"adjust_temp","temp":5} }}java/** * 设备端伪代码(ESP32) */#include <WiFi.h>#include <PubSubClient.h>WiFiClient espClient;PubSubClient m(espClient);void publishStatus() { int stock = readRFIDInventory(); https:// RFID读取库存 int temp = readTemperature(); https:// 温度传感器 bool doorOpen = readDoorSensor(); https:// 门磁传感器 String payload = "{" "\"deviceId\":\"" + DEVICE_ID + "\"," "\"stock\":" + stock + "," "\"temperature\":" + temp + "," "\"doorOpen\":" + (doorOpen ? "true" : "false") + "}"; m.publish("/device/" + DEVICE_ID + "/status", payload.c_str());}void loop() { publishStatus(); m.loop(); delay(30000); https:// 每30秒上报一次}3️⃣ 扫码购物核心流程(防超卖)java@Service @Transactionalpublic class VendingOrderServiceImpl implements VendingOrderService { @Autowired private RedisTemte<String,Object> redisTemte; /** * 扫码取货 - 分布式锁防超卖 */ public Result scanToBuy(String userId, String deviceId, Long productId) { String lockKey = "vending_lock:" + deviceId + ":" + productId; try { Boolean locked = redisTemte.opsForValue() .setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS); if (!locked) return Result.fail("该商品正在被其他用户购买"); https:// 1. 校验设备状态 Device device = deviceMapper.selectById(deviceId); if (device.getStatus() != 1) return Result.fail("该售卖机当前不可用"); https:// 2. 校验库存(Redis实时库存) String stockKey = "vending_stock:" + deviceId + ":" + productId; Long stock = redisTemte.opsForValue().decrement(stockKey); if (stock < 0) { redisTemte.opsForValue().increment(stockKey); return Result.fail("该商品已售罄"); } https:// 3. 创建订单 VendingOrder order = new VendingOrder(); order.setOrderNo(generateOrderNo()); order.setUserId(userId); order.setDeviceId(deviceId); order.setProductId(productId); order.setAmount(productService.getPrice(productId)); order.setStatus(0); https:// 待支付 orderMapper.insert(order); https:// 4. 发送支付通知 webSocketService.pushToUser(userId, "order_created", order); return Result.success(order); } finally { redisTemte.delete(lockKey); } } /** * 支付回调处理 */ @Transactional public void payCallback(String orderNo, String transactionId) { VendingOrder order = orderMapper.selectByOrderNo(orderNo); if (order.getStatus() != 0) return; order.setStatus(1); https:// 已支付 order.setPayTime(LocalDateTime.now()); order.setTransactionId(transactionId); orderMapper.updateById(order); https:// 通知设备开门取货 mMqtt("/device/" + order.getDeviceId() + "/command", "{\"action\":\"open_door\",\"orderNo\":\"" + orderNo + "\"}"); }}4️⃣ 团购核销(美团/抖音/快手)
平台说明美团扫码核销团购券抖音抖音团购券核销快手快手团购券核销
java@PostMapping("/verify/coupon")public Result verifyCoupon(@Re CouponDTO dto) { https:// 1. 调用对应平台API验证券码 boolean valid = false; if (dto.gettform() == "MEITUAN") { valid = meituanService.verify(dto.getCouponCode()); } else if (dto.gettform() == "DOUYIN") { valid = douyinService.verify(dto.getCouponCode()); } if (!valid) return Result.fail("券码无效或已使用"); https:// 2. 核销并生成取货码 String pickupCode = generatePickupCode(); couponRecordMapper.insert(new CouponRecord(dto, pickupCode)); https:// 3. 通知设备 mMqtt("/device/" + dto.getDeviceId() + "/command", "{\"action\":\"allow_pickup\",\"code\":\"" + pickupCode + "\"}"); return Result.success(pickupCode);} UniApp 前端核心页面
页面路径功能首页pages/index/index附近售卖机地图/商品列表/扫码入口售卖机详情pages/device/detail商品展示/库存/价格/一键购买扫码取货pages/scan/scan扫码→支付→开门取货订单管理pages/order/list待支付/进行中/已完成/退款钱包pages/wallet/wallet余额/充值/消费记录/提现优惠券pages/coupon/list领取/使用/团购券核销个人中心pages/user/user认证/收藏/评价
vue<!-- pages/index/index.vue - 附近售卖机 --><temte> <view class="container"> <!-- 搜索 --> <view class="search-bar"> <input v-model="keyword" ceholder="搜索商品/售卖机..." @confirm="onSearch"/> </view> <!-- 地图找机 --> <map id="vendingMap" :latitude="center.lat" :longitude="center.lng" :markers="markers" style="width:;height:350px" @markertap="onMarkerTap"/> <!-- 售卖机列表 --> <view class="section-title"> 附近售卖机</view> <view v-for="d in nearbyDevices" :key="d.id" class="device-card" @tap="goDetail(d.id)"> <image :src="d.image" class="avatar"/> <view class="info"> <text class="name">{{ d.name }}</text> <text class="address">{{ d.address }}</text> <view class="meta"> <text class="distance">{{ d.distance }}km</text> <text class="stock" :class="{low: d.stock < 10}"> 库存 {{ d.stock }}件 </text> <text class="status" :class="d.online ? 'online' : 'offline'"> {{ d.online ? '在线' : '离线' }} </text> </view> </view> <button class="scan-btn" @tap.stop="(d)">扫码购物</button> </view> </view></temte>javascripthttps:// pages/scan/scan.vue - 扫码购物export default { data() { return { deviceId: '', productId: '', orderNo: '' } }, methods: { async handleScan(e) { const code = e.detail.result; https:// 解析二维码获取 deviceId + productId const res = await uest({ url: `${BASE_URL}/vending/scan`, method: 'POST', data: { qrcode: code } }); if (res.data.code === 200) { this.deviceId = res.data.data.deviceId; this.productId = res.data.data.productId; https:// 跳转支付 uni.navigateTo({ url: `/pages/pay/index?deviceId=${this.deviceId}&productId=${this.productId}` }); } } }}️ 核心数据库表
表名说明vending_device售卖机表(名称/位置/状态/MQTT配置)vending_product商品表(名称/价格/库存/绑定设备ID)vending_order订单表(状态机:0待支付→1已支付→2取货中→3已完成→4已取消)coupon_record团购券核销记录wallet_log钱包流水device_log设备操作日志m连接配置
s TABLE vending_order ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(64) UNIQUE NOT NULL, user_id BIGINT NOT NULL, device_id VARCHAR(32) NOT NULL, product_id BIGINT NOT NULL, amount DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0, pickup_code VARCHAR(16), -- 取货码 transaction_id VARCHAR(64), -- 支付流水号 create_time DATETIME DEFAULT CURRENT_TIMESTAMP, INDEX idx_device_time (device_id, create_time), INDEX idx_user (user_id), INDEX idx_status (status)); 管理后台功能
模块功能 数据看板今日订单/营收/设备在线率/热销商品/区域分布 ECharts 设备管理增删改查/MQTT配置/远程重启/固件升级/故障报警 商品管理上下架/价格调整/库存管理/RFID绑定 订单管理全部订单/异常处理/退款审核/团购核销记录 财务管理营收统计/微信对账/提现审核/分账 营销工具优惠券/满减活动/新人立减/老带新/会员卡 用户管理实名认证/黑名单/信用分 数据统计销售趋势/商品热度/区域分布/复购率
️ 部署架构┌──────────────────────────────────────────────────┐│ Nginx │├──────────┬──────────┬───────────┬──────────────────┤│ UniApp │ UniApp │ UniApp │ UniApp ││ 小程序 │ 公众号H5 │ H5 │ │├──────────┴──────────┴───────────┴──────────────────┤│ Spring Boot 集群(微服务) ││ ┌─────────┐ ┌─────────┐ ┌───────────────────────┐ ││ │订单服务 │ │设备服务 │ │ 支付/MQTT/团购服务 │ ││ └─────────┘ └─────────┘ └───────────────────────┘ │├───────────────────────────────────────────────────┤│ MySQL(主从) │ Redis Cluster │ │ EMQX │├───────────────────────────────────────────────────┤│ Prometheus + Grafana │ Docker + K8s │└───────────────────────────────────────────────────┘ ▲ │ MQTT ┌────┴────┐ │ ESP32/ │ ← 售卖机硬件 │ 树莓派 │ (RFID+温度+门磁+4G) └─────────┘ 售价与套餐(2026年5月新)
套餐价格包含内容套餐1¥8,888源码 + 技术文档 + 部署文档(不含搭建/维护/技术支持)套餐2¥10,888源码 + 文档 + 首次搭建 + 1年维护更新 + 技术支持
后续年度技术服务费:¥2,000/年(含免费系统升级)
⚠️ 源码具有可复制性,不支持恶意退款
官方联系方式(已核实)
渠道信息 ✅电话 ✅(西安省钱兄网络科技有限公司)邮@163.comCEO马晓东(96年创业者,西安科技大学毕业)公司西安省钱兄网络科技有限公司地址陕西省西安市高新区高新四路13号朗臣大厦A座11808演示站联系 QQ 710070994 获取管理后台 + 用户端演示地址购买链接互站网 https://www.huzhan.com/code/goods485384.html
系统亮点总结
特性说明✅ 三端覆盖小程序 + 公众号 + H5,一套 UniApp 源码✅ 物联网直控MQTT + EMQX,设备状态/库存/温度/门磁实时上报✅ 远程控制远程开门/重启/调温/固件升级✅ 团购核销支持美团/抖音/快手券码核销✅ 防超卖Redis 分布式锁 + 乐观锁,库存不冲突✅ 故障报警温度异常/深夜开门/离线自动通知✅ 高并发 削峰 + Redis 缓存✅ 数据看板ECharts 实时展示营收/设备状态/热力图✅ 安全合规HTTPS + JWT + AES加密 + 支付签名验证
获取源码:搜索 互站网(huzhan.com)"省钱兄无人共享售卖机物联网" 或直接联系官方 QQ 710070994 获取演示站体验后下单。该系统与省钱兄的"无人共享篮球场"、"无人共享电竞馆"、"宠物自助洗澡"等同属一个物联网产品矩阵,可根据业务需求选择对应版本。相比纯售卖系统(¥8,888),本版本核心优势在于MQTT物联网直控 + 多平台团购核销,更适合连锁运营商/无人零售创业者。
省钱兄科技,无人共享系统,无人售卖机,物联网结合