1. 项目概述:SpringBoot与微信小程序的汽车维修管理系统
这个项目是一个典型的"前后端分离+移动端适配"的行业解决方案。汽车维修行业长期以来存在工单管理混乱、客户跟进不及时、配件库存不清晰等痛点,而传统PC端管理系统又无法满足技师随时随地的操作需求。我们基于SpringBoot后端+微信小程序前端的架构,打造了一套轻量但功能完备的维修管理工具。
微信小程序的选择绝非偶然——在汽车后市场场景中,90%的维修技师都会在工作间隙使用微信。相比独立App,小程序无需安装、即用即走的特性完美匹配了车间环境下的碎片化操作需求。而后端采用SpringBoot则确保了系统能够快速迭代,同时兼容未来可能的4S店ERP系统对接。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 后端SpringBoot设计要点
采用经典的MVC分层架构:
code复制com.weixin256.carrepair
├── config # 微信支付/登录配置
├── controller
│ ├── ApiAuthController.java # 小程序登录鉴权
│ ├── OrderController.java # 工单核心逻辑
│ └── PartsController.java # 配件管理
├── service
│ ├── impl
│ └── WeixinService.java # 封装微信API调用
└── repository # JPA数据持久层
关键配置示例(application.yml):
yaml复制wx:
appid: wx256xxxx
secret: xxxxxxxxx
mch-id: 123456790 # 微信支付商户号
mini-program:
page-size: 10 # 小程序分页大小
2.2 微信小程序前端设计
采用微信原生框架+自定义组件开发:
- pages/
- order/ # 工单模块
- create.wxml
- detail.wxml
- parts/ # 配件模块
- order/ # 工单模块
- components/
- repair-card/ # 通用维修卡片
- app.wxss # 全局样式
特别优化了表单组件:
xml复制<view class="form-item">
<text>车牌号:</text>
<input
type="text"
placeholder="请输入车牌"
bindinput="onPlateNumberChange"
data-field="plateNumber"/>
</view>
3. 核心功能实现细节
3.1 维修工单全流程
- 创建工单:通过OCR识别行驶证自动填充车辆信息
java复制// SpringBoot后端识别接口
@PostMapping("/ocr/license")
public Result ocrLicense(@RequestParam MultipartFile file) {
String plateNo = baiduOcrService.recognize(file);
return Result.success(plateNo);
}
- 状态机设计(订单状态流转):
java复制public enum OrderStatus {
CREATED(1), // 已创建
DIAGNOSING(2), // 诊断中
WAITING_PARTS(3), // 待料
REPAIRING(4), // 维修中
FINISHED(5), // 已完成
PAID(6); // 已结算
// 状态校验逻辑
public boolean canTransferTo(OrderStatus next) {
// 具体实现省略...
}
}
3.2 配件库存管理
采用乐观锁解决并发修改问题:
java复制@Transactional
public void deductStock(Long partId, int count) {
Parts part = partsRepository.findById(partId);
if (part.getStock() < count) {
throw new BusinessException("库存不足");
}
part.setVersion(part.getVersion() + 1); // 版本号+1
part.setStock(part.getStock() - count);
partsRepository.save(part);
}
微信小程序端库存预警效果:
javascript复制// pages/parts/list.js
Page({
onLoad() {
wx.request({
url: '/api/parts/low-stock',
success: (res) => {
this.setData({
alertCount: res.data.length
});
if (res.data.length > 0) {
wx.showToast({
title: `${res.data.length}种配件库存不足`,
icon: 'none'
});
}
}
});
}
});
4. 关键技术难点解决方案
4.1 微信登录与Session维护
采用JWT替代传统Session方案:
java复制public String createToken(WxUser user) {
return Jwts.builder()
.setSubject(user.getOpenid())
.claim("sessionKey", user.getSessionKey())
.setExpiration(new Date(System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000)) // 7天有效期
.signWith(SignatureAlgorithm.HS256, "your-secret-key")
.compact();
}
小程序端封装登录逻辑:
javascript复制// utils/auth.js
const login = () => {
return new Promise((resolve) => {
wx.login({
success: (res) => {
wx.request({
url: '/api/auth/login',
method: 'POST',
data: { code: res.code },
success: (res) => {
wx.setStorageSync('token', res.data.token);
resolve(true);
}
});
}
});
});
};
4.2 微信支付集成
后端统一下单接口:
java复制@PostMapping("/payment/create")
public Result createPayment(@RequestBody PaymentDTO dto) {
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setBody("汽车维修服务");
request.setOutTradeNo(generateOrderNo());
request.setTotalFee(dto.getAmount());
request.setSpbillCreateIp(dto.getClientIp());
request.setNotifyUrl("https://yourdomain.com/api/payment/notify");
request.setTradeType("JSAPI");
request.setOpenid(dto.getOpenid());
WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request);
return Result.success(result);
}
小程序端调起支付:
javascript复制wx.requestPayment({
timeStamp: res.data.timeStamp,
nonceStr: res.data.nonceStr,
package: res.data.package,
signType: 'MD5',
paySign: res.data.paySign,
success: () => {
wx.showToast({ title: '支付成功' });
}
});
5. 性能优化实践
5.1 小程序端优化技巧
- setData优化:
javascript复制// 错误做法 - 频繁更新
this.setData({ 'list[0].status': 1 });
this.setData({ 'list[1].status': 2 });
// 正确做法 - 批量更新
const update = {};
update['list[0].status'] = 1;
update['list[1].status'] = 2;
this.setData(update);
- 图片懒加载:
xml复制<image
lazy-load
src="{{item.image}}"
mode="aspectFill"/>
5.2 后端缓存策略
使用Spring Cache注解实现多级缓存:
java复制@Cacheable(value = "parts", key = "#id", unless = "#result == null")
public Parts getPartById(Long id) {
return partsRepository.findById(id);
}
@CacheEvict(value = "parts", key = "#part.id")
public void updatePart(Parts part) {
partsRepository.save(part);
}
Redis配置示例:
yaml复制spring:
redis:
host: 127.0.0.1
port: 6379
cache:
type: redis
redis:
time-to-live: 1800s # 30分钟过期
6. 项目部署方案
6.1 后端SpringBoot部署
推荐使用Docker容器化部署:
dockerfile复制FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/car-repair-0.0.1.jar app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
启动命令:
bash复制docker build -t car-repair .
docker run -d -p 8080:8080 \
-e SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/repair \
-e SPRING_DATASOURCE_USERNAME=root \
car-repair
6.2 微信小程序发布
-
域名配置:
- 登录微信公众平台
- 开发 → 开发设置 → 服务器域名
- 添加request合法域名(如:https://api.yourdomain.com)
-
代码上传:
bash复制# 使用CI工具自动上传
npm install -g miniprogram-ci
miniprogram-ci \
upload \
--pp ./dist \
--pkp /path/to/private.key \
--appid wx256xxxx \
--uv 1.0.0
7. 扩展功能建议
7.1 技师定位考勤
利用微信获取地理位置:
javascript复制wx.getLocation({
type: 'gcj02',
success: (res) => {
wx.request({
url: '/api/attendance/check-in',
data: {
latitude: res.latitude,
longitude: res.longitude
}
});
}
});
7.2 客户微信消息通知
使用微信模板消息:
java复制public void sendRepairCompleteMsg(String openid, String orderNo) {
WxMaTemplateMessage msg = WxMaTemplateMessage.builder()
.toUser(openid)
.templateId("AT1234") // 审核通过的模板ID
.formId("formid_from_payment") // 支付表单提交获得的formid
.data(Lists.newArrayList(
new WxMaTemplateData("keyword1", orderNo),
new WxMaTemplateData("keyword2", "已完成")
))
.build();
wxMaService.getMsgService().sendTemplateMsg(msg);
}
8. 避坑指南
8.1 微信小程序常见问题
- textarea父元素margin失效:
css复制/* 解决方案 */
.textarea-container {
position: relative;
z-index: 0; /* 必须设置z-index */
}
.textarea-container textarea {
position: relative;
z-index: -1; /* 负值使textarea下沉 */
}
- webview覆盖层问题:
xml复制<!-- 使用cover-view组件 -->
<web-view src="https://example.com">
<cover-view class="overlay">
<cover-image src="/images/close.png"/>
</cover-view>
</web-view>
8.2 SpringBoot开发陷阱
- PDF XSS防护:
java复制@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.headers()
.contentSecurityPolicy("script-src 'self'");
}
}
- 启动时执行代码:
java复制@Component
public class StartupRunner implements CommandLineRunner {
@Override
public void run(String... args) {
// 系统启动后执行的代码
}
}
