作为一名经历过多次汽修行业数字化转型项目的开发者,我深知传统汽修门店在信息化管理上面临的困境。去年参与某连锁汽修品牌系统升级时,门店经理向我抱怨:"每天手工记录预约、手写检测报告、纸质单据满天飞,客户等个报价都要半小时..."这正是促成本次毕业设计选题的现实背景。
"车管家"智慧汽修服务平台采用SpringBoot+Uni-app技术栈,旨在解决以下行业痛点:
系统创新性地将微信小程序轻量级入口与后台管理系统深度整合,实现:
技术选型心得:选择Uni-app而非原生小程序开发,节省了30%的前端工作量,一套代码可同时发布到微信、支付宝等多端,特别适合快速验证业务模式的毕业设计场景。
前端架构:
javascript复制// Uni-app条件编译示例
// #ifdef MP-WEIXIN
wx.login()
// #endif
// #ifdef H5
location.href = '/login'
// #endif
后端架构:
数据库设计:
BFF层设计:
针对小程序与管理后台的不同数据需求,采用Backend for Frontend模式:
/api/miniapp/ 专为小程序优化的聚合接口/api/admin/ 包含完整业务字段的管理接口状态机设计:
服务预约状态流转采用状态模式:
java复制public interface ServiceState {
void handle(ServiceOrder order);
}
@Component("PENDING")
public class PendingState implements ServiceState {
@Override
public void handle(ServiceOrder order) {
// 超时自动取消逻辑
}
}
分布式ID生成:
采用美团Leaf方案解决分库分表ID冲突:
sql复制CREATE TABLE `leaf_alloc` (
`biz_tag` varchar(128) NOT NULL,
`max_id` bigint(20) NOT NULL DEFAULT '1',
PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;
业务流程:
并发控制:
java复制@Transactional
public boolean createOrder(OrderDTO dto) {
// 分布式锁防止超卖
String lockKey = "order:" + dto.getTimeSlotId();
try {
Boolean locked = redisTemplate.opsForValue()
.setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
if (!locked) throw new BusException("当前时段预约冲突");
// 库存检查
int remain = stockMapper.selectRemain(dto.getServiceId());
if (remain < 1) throw new BusException("服务库存不足");
// 创建订单
return orderMapper.insert(dto) > 0;
} finally {
redisTemplate.delete(lockKey);
}
}
技术亮点:
异常处理:
java复制public String generateReport(VehicleCheck check) {
try {
Configure config = Configure.builder()
.useSpringEL(true)
.build();
Template template = new Template(
new ClassPathResource("template/report.docx").getFile(),
config);
Map<String, Object> data = new HashMap<>();
data.put("mileage", check.getMileage());
// 其他字段填充...
template.render(data, new FileOutputStream("report.docx"));
return cosClient.upload(new File("report.docx"));
} catch (Exception e) {
log.error("报告生成失败", e);
throw new BusException("检测报告生成异常");
}
}
痛点:
解决方案:
wx.requestSubscribeMessage获取权限java复制@Scheduled(fixedRate = 60000)
public void pushNotifications() {
List<Order> orders = orderMapper.selectPendingNotify();
orders.forEach(order -> {
String cacheKey = "msg:" + order.getId();
if (redisTemplate.opsForValue().setIfAbsent(
cacheKey, "1", 23, TimeUnit.HOURS)) {
wechatService.pushMsg(order);
}
});
}
业务规则:
实现代码:
java复制public void submitComment(CommentDTO dto) {
// 校验评价时效
ServiceOrder order = orderMapper.selectById(dto.getOrderId());
if (order.getCompleteTime().isBefore(
LocalDateTime.now().minusHours(72))) {
throw new BusException("已超过评价时效");
}
// 内容安全检测
if (!securityClient.checkText(dto.getContent())) {
throw new BusException("评价内容包含敏感信息");
}
// 保存评价
Comment comment = new Comment();
BeanUtils.copyProperties(dto, comment);
commentMapper.insert(comment);
// 更新店铺评分
shopMapper.updateScore(dto.getShopId());
}
服务器配置:
dockerfile复制FROM openjdk:11-jre
COPY target/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
性能调优:
bash复制-Xms512m -Xmx1024m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
sql复制ALTER TABLE service_order
ADD INDEX idx_shop_status (shop_id, status);
监控体系:
日志收集:
yaml复制# Logback配置示例
<appender name="ELK" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>logstash:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
现象:
排查过程:
bash复制tcpdump -i eth0 port 443 -w pay.pcap
解决方案:
nginx复制location /api/pay/callback {
proxy_pass http://backend;
proxy_set_header Content-Type "application/json";
proxy_pass_request_body on;
}
复现步骤:
根本原因:
最终方案:
sql复制UPDATE service_stock
SET remain = remain - 1
WHERE service_id = ? AND remain >= 1
智能调度扩展:
配件供应链整合:
数据价值挖掘:
python复制# 使用Prophet预测客流
from fbprophet import Prophet
model = Prophet(seasonality_mode='multiplicative')
model.fit(df)
forecast = model.make_future_dataframe(periods=30)
实际开发中发现,汽修行业数字化转型的最大阻力不是技术,而是门店工作习惯的改变。建议后续迭代加入"老匠人模式"——保留部分纸质工单的熟悉感,逐步引导用户过渡到全数字化流程。例如在打印的检测报告上增加二维码,扫码即可查看电子版完整报告。