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元):
| 设备类型 | 推荐型号 | 关键参数 | 单价 |
|---|---|---|---|
| 主控制器 | 树莓派4B | 4GB内存,支持Python/Java | 600元 |
| 通信模块 | 有人USR-G806 | 4G全网通,MQTT支持 | 500元 |
| 水压传感器 | 米科MPM489 | 0-1MPa量程,4-20mA输出 | 350元 |
| 电磁阀 | SMC VDW21 | 1/2英寸,AC220V | 280元 |
| 扫码器 | 霍尼韦尔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": "成功率"
}]
}
]
}
本系统源码包含完整的前后端实现、数据库脚本和部署文档,特别适合以下应用场景:
- 社区24小时无人洗车站
- 加油站配套洗车服务
- 商业停车场增值服务
- 高速公路服务区洗车点
典型部署效果:
- 硬件成本:单站点8000-15000元
- 部署周期:3-5个工作日
- 支付成功率:≥99.5%
- 故障响应时间:<15分钟
系统持续迭代路线包括AI洗车质检、预测性维护等创新功能,确保技术持续领先行业标准。