【新品上线】线下自助共享洗车店,无人洗车全套源码

90 阅读5分钟

2.png

3.png

4.png

5.png

24小时无人共享自助洗车系统全栈开发指南

一、系统架构与核心技术

1. 整体技术架构

本系统采用前后端分离的微服务架构,支持高并发访问和分布式部署。前端基于Uni-App跨平台框架开发,后端采用Java Spring Cloud技术栈,设备通信使用MQTT协议实现物联网控制。

系统架构图

graph LR
    A[用户小程序] --> B(API网关)
    B --> C[订单服务]
    B --> D[支付服务]
    B --> E[设备服务]
    E --> F[MQTT Broker]
    F --> G[洗车设备]
    C --> H[MySQL]
    D --> I[Redis]

2. 核心功能代码实现

设备控制服务(Java)

@RestController
@RequestMapping("/device")
public class DeviceController {
    
    @Autowired
    private MqttGateway mqttGateway;
    
    @PostMapping("/start")
    public ResponseEntity<?> startDevice(
            @RequestParam String deviceId,
            @RequestParam String userId) {
        
        // 1. 验证用户权限和余额
        if (!userService.checkUserStatus(userId)) {
            return ResponseEntity.badRequest().body("用户状态异常");
        }
        
        // 2. 发送MQTT指令
        mqttGateway.sendToMqtt("device/"+deviceId+"/control", 
                             "start:"+System.currentTimeMillis());
        
        // 3. 创建订单记录
        Order order = new Order();
        order.setUserId(userId);
        order.setDeviceId(deviceId);
        order.setStartTime(LocalDateTime.now());
        orderService.save(order);
        
        return ResponseEntity.ok("设备启动成功");
    }
}

小程序支付逻辑(JavaScript)

// pages/payment/payment.js
const app = getApp()

Page({
  data: {
    orderInfo: null,
    paymentMethods: ['wechat', 'alipay', 'balance']
  },
  
  onLoad: function(options) {
    this.setData({
      orderInfo: JSON.parse(options.orderInfo)
    })
  },
  
  handlePayment: function(e) {
    const method = e.currentTarget.dataset.method
    const orderId = this.data.orderInfo.orderId
    
    wx.request({
      url: app.globalData.apiBase + '/payment/create',
      method: 'POST',
      data: {
        orderId: orderId,
        method: method
      },
      success: (res) => {
        if (method === 'wechat') {
          this.wechatPay(res.data.paymentParams)
        } else if (method === 'alipay') {
          this.alipayPay(res.data.paymentParams)
        }
      }
    })
  },
  
  wechatPay: function(params) {
    wx.requestPayment({
      timeStamp: params.timeStamp,
      nonceStr: params.nonceStr,
      package: params.package,
      signType: params.signType,
      paySign: params.paySign,
      success: () => {
        wx.navigateTo({
          url: '/pages/success/success?orderId=' + this.data.orderInfo.orderId
        })
      }
    })
  }
})

二、硬件系统集成方案

1. 基础硬件配置

低成本硬件方案(总价约8000元)

设备类型推荐型号关键参数单价
主控制器树莓派4B4GB内存,支持Python/Java600元
通信模块有人USR-G8064G全网通,MQTT支持500元
水压传感器米科MPM4890-1MPa量程,4-20mA输出350元
电磁阀SMC VDW211/2英寸,AC220V280元
扫码器霍尼韦尔1900防水IP65,USB接口850元

2. 设备端控制代码

Python设备控制脚本

import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import time

# GPIO初始化
GPIO.setmode(GPIO.BCM)
WATER_PIN = 17
SOAP_PIN = 27
GPIO.setup(WATER_PIN, GPIO.OUT)
GPIO.setup(SOAP_PIN, GPIO.OUT)

# MQTT回调函数
def on_message(client, userdata, msg):
    command = msg.payload.decode()
    if command.startswith("start"):
        # 启动洗车流程
        GPIO.output(WATER_PIN, GPIO.HIGH)
        time.sleep(5)  # 预洗5秒
        GPIO.output(SOAP_PIN, GPIO.HIGH)
        time.sleep(120) # 泡沫清洗120秒
        GPIO.output(SOAP_PIN, GPIO.LOW)
        GPIO.output(WATER_PIN, GPIO.HIGH)
        time.sleep(60)  # 清水冲洗60秒
        GPIO.output(WATER_PIN, GPIO.LOW)

# MQTT客户端配置
client = mqtt.Client()
client.on_message = on_message
client.connect("mqtt.example.com", 1883)
client.subscribe("device/+/control")
client.loop_forever()

三、商业模型与数据统计

1. 动态定价算法

@Service
public class PricingService {
    
    // 基础价格配置
    private static final BigDecimal BASE_PRICE = new BigDecimal("5.00");
    private static final BigDecimal NIGHT_PREMIUM = new BigDecimal("1.50");
    private static final BigDecimal RAIN_PREMIUM = new BigDecimal("2.00");
    
    public BigDecimal calculatePrice(LocalDateTime time, 
                                   WeatherCondition weather,
                                   Integer nearbyCars) {
        BigDecimal price = BASE_PRICE;
        
        // 时段加成 (19:00-7:00夜间服务费)
        if (time.getHour() >= 19 || time.getHour() <= 7) {
            price = price.add(NIGHT_PREMIUM);
        }
        
        // 天气因素 (雨雪天气溢价)
        if (weather == WeatherCondition.RAINY || 
            weather == WeatherCondition.SNOWY) {
            price = price.add(RAIN_PREMIUM);
        }
        
        // 附近车辆密度 (动态调价)
        if (nearbyCars != null && nearbyCars > 3) {
            BigDecimal surge = new BigDecimal(nearbyCars * 0.5);
            price = price.add(surge);
        }
        
        return price.setScale(2, RoundingMode.HALF_UP);
    }
}

2. 运营数据可视化

管理后台ECharts配置

// 设备使用率统计
const option = {
    tooltip: {
        trigger: 'axis',
        axisPointer: { type: 'shadow' }
    },
    legend: {
        data: ['使用率', '故障率']
    },
    grid: {
        left: '3%',
        right: '4%',
        bottom: '3%',
        containLabel: true
    },
    xAxis: {
        type: 'category',
        data: ['00-04', '04-08', '08-12', '12-16', '16-20', '20-24']
    },
    yAxis: {
        type: 'value',
        max: 100
    },
    series: [
        {
            name: '使用率',
            type: 'bar',
            data: [15, 42, 78, 65, 85, 35]
        },
        {
            name: '故障率',
            type: 'line',
            data: [2, 1, 3, 2, 4, 1]
        }
    ]
};

四、安全与扩展功能

1. 支付风控系统

@Aspect
@Component
public class PaymentSecurityAspect {
    
    private static final int MAX_ATTEMPTS = 5;
    private static final long LOCK_TIME = 30 * 60 * 1000; // 30分钟
    
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    
    @Around("execution(* com..payment.*.*(..))")
    public Object checkRisk(ProceedingJoinPoint pjp) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes)
            RequestContextHolder.getRequestAttributes()).getRequest();
        
        String ip = request.getRemoteAddr();
        String key = "payment:lock:" + ip;
        
        // 检查IP是否被锁定
        String locked = redisTemplate.opsForValue().get(key);
        if ("1".equals(locked)) {
            throw new SecurityException("操作过于频繁,请稍后再试");
        }
        
        // 记录尝试次数
        Long count = redisTemplate.opsForValue().increment("payment:count:" + ip);
        if (count != null && count >= MAX_ATTEMPTS) {
            redisTemplate.opsForValue().set(key, "1", LOCK_TIME, TimeUnit.MILLISECONDS);
            throw new SecurityException("操作过于频繁,账户已被临时锁定");
        }
        
        try {
            return pjp.proceed();
        } finally {
            // 成功则重置计数器
            redisTemplate.delete("payment:count:" + ip);
        }
    }
}

2. 车牌识别集成

OpenCV车牌识别示例

import cv2
import numpy as np

def detect_plate(image_path):
    # 加载预训练模型
    net = cv2.dnn.readNet("plate_detection.pb")
    
    # 读取并预处理图像
    image = cv2.imread(image_path)
    blob = cv2.dnn.blobFromImage(image, scalefactor=1.0, 
                               size=(300, 300), 
                               mean=(104.0, 177.0, 123.0))
    
    # 执行检测
    net.setInput(blob)
    detections = net.forward()
    
    # 解析结果
    plates = []
    for i in range(detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > 0.7:
            box = detections[0, 0, i, 3:7] * np.array([image.shape[1], image.shape[0], 
                                                     image.shape[1], image.shape[0]])
            plates.append(box.astype("int"))
    
    return plates

五、部署与运维方案

1. Docker Compose部署

version: '3.8'

services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_DATABASE: carwash
      MYSQL_USER: ${DB_USER}
      MYSQL_PASSWORD: ${DB_PASSWORD}
    volumes:
      - mysql_data:/var/lib/mysql
    ports:
      - "3306:3306"
      
  redis:
    image: redis:6
    volumes:
      - redis_data:/data
    ports:
      - "6379:6379"
      
  mqtt:
    image: eclipse-mosquitto:2.0
    ports:
      - "1883:1883"
      - "9001:9001"
      
  app:
    build: .
    environment:
      SPRING_PROFILES_ACTIVE: prod
      DB_URL: jdbc:mysql://mysql:3306/carwash
    depends_on:
      - mysql
      - redis
      - mqtt
    ports:
      - "8080:8080"

volumes:
  mysql_data:
  redis_data:

2. 监控告警配置

Prometheus监控指标

# prometheus.yml 配置示例
scrape_configs:
  - job_name: 'carwash'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['app:8080']
        
  - job_name: 'mqtt'
    static_configs:
      - targets: ['mqtt:1883']

Grafana仪表板JSON片段

{
  "panels": [
    {
      "title": "设备在线状态",
      "type": "stat",
      "targets": [{
        "expr": "sum(up{job='carwash'})",
        "legendFormat": "在线设备"
      }]
    },
    {
      "title": "支付成功率",
      "type": "gauge",
      "targets": [{
        "expr": "sum(payment_success_total) / sum(payment_attempt_total) * 100",
        "legendFormat": "成功率"
      }]
    }
  ]
}

本系统源码包含完整的前后端实现、数据库脚本和部署文档,特别适合以下应用场景:

  1. 社区24小时无人洗车站
  2. 加油站配套洗车服务
  3. 商业停车场增值服务
  4. 高速公路服务区洗车点

典型部署效果:

  • 硬件成本:单站点8000-15000元
  • 部署周期:3-5个工作日
  • 支付成功率:≥99.5%
  • 故障响应时间:<15分钟

系统持续迭代路线包括AI洗车质检、预测性维护等创新功能,确保技术持续领先行业标准。