"随心行"汽车租赁系统是一个基于SpringBoot+Vue技术栈的移动端解决方案,专为Android平台设计。这个系统将传统租车业务数字化,通过前后端分离架构实现车辆管理、用户预约、订单处理等核心功能。我在实际开发中发现,这种技术组合特别适合中小型租车公司快速搭建自己的数字化平台。
系统采用SpringBoot作为后端框架,提供稳定的RESTful API;前端使用Vue.js构建响应式界面,通过WebView或混合开发方式嵌入Android应用。这种架构既保证了开发效率,又能充分利用原生Android设备的特性(如GPS定位、摄像头扫码等)。
SpringBoot 2.7.x作为后端基础框架,主要基于以下考虑:
数据库采用MySQL 8.0,主要表结构设计包括:
关键点:所有表都添加了逻辑删除标记(is_deleted),避免直接物理删除数据
Vue 3.x作为前端框架,配合以下关键组件:
与Android原生交互主要通过两种方式:
javascript复制// 典型的位置获取代码示例
export function getLocation() {
return new Promise((resolve, reject) => {
if(window.androidBridge) {
window.androidBridge.getGPSLocation(resolve, reject)
} else {
navigator.geolocation.getCurrentPosition(resolve, reject)
}
})
}
完整的租赁流程包含以下步骤:
java复制// 预约锁定核心逻辑
@Transactional
public ReservationResult reserveCar(Long carId, Long userId) {
Car car = carRepository.findById(carId)
.orElseThrow(() -> new BusinessException("车辆不存在"));
if(!car.isAvailable()) {
throw new BusinessException("车辆已被预约");
}
car.setStatus(CarStatus.RESERVED);
carRepository.save(car);
Reservation reservation = new Reservation();
reservation.setCarId(carId);
reservation.setUserId(userId);
reservation.setExpireTime(LocalDateTime.now().plusMinutes(15));
reservationRepository.save(reservation);
return new ReservationResult(reservation.getId(), car.getLicensePlate());
}
支付模块采用策略模式设计,支持多种支付方式:
关键安全措施:
Android端需要特殊处理的功能点:
| 功能 | 实现方式 | 注意事项 |
|---|---|---|
| GPS定位 | 通过FusedLocationProvider获取 | 需要动态权限申请 |
| 扫码功能 | 集成ZXing库 | 注意相机权限处理 |
| 消息推送 | 使用Firebase Cloud Messaging | 国内需考虑厂商通道 |
java复制webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
vue复制<template>
<img v-lazy="car.imageUrl" alt="车辆图片">
</template>
java复制@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.favorParameter(true)
.parameterName("mediaType")
.ignoreAcceptHeader(true)
.useRegisteredExtensionsOnly(false)
.defaultContentType(MediaType.APPLICATION_JSON)
.mediaType("json", MediaType.APPLICATION_JSON);
}
}
推荐使用Docker Compose部署:
yaml复制version: '3'
services:
app:
image: openjdk:11-jre
ports:
- "8080:8080"
volumes:
- ./app.jar:/app.jar
command: java -jar /app.jar
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: yourpassword
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
现象:用户位置显示不准确
解决方案:
典型错误场景:
处理流程:
可能原因:
调试方法:
java复制webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
Log.d("WebView", message + " -- From line "
+ lineNumber + " of " + sourceID);
}
});
在实际运营中,可以考虑添加以下增值功能:
实现OBD数据读取示例:
java复制public class OBDReader {
private static final UUID OBD_SERVICE_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
public void connect(BluetoothDevice device) {
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(OBD_SERVICE_UUID);
socket.connect();
InputStream in = socket.getInputStream();
// 读取OBD数据流...
}
}
java复制@Bean
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setConfig(new SimpleStringPBEConfig());
return encryptor;
}
建议集成以下监控组件:
关键指标监控项:
测试代码示例:
java复制@SpringBootTest
class CarServiceTest {
@Autowired
private CarService carService;
@Test
void testReserveCar() {
Car car = new Car();
car.setStatus(CarStatus.AVAILABLE);
carRepository.save(car);
ReservationResult result = carService.reserveCar(car.getId(), 1L);
assertNotNull(result.getReservationId());
Car updatedCar = carRepository.findById(car.getId()).get();
assertEquals(CarStatus.RESERVED, updatedCar.getStatus());
}
}
在项目实际开发中,我们发现最大的挑战是保持Android端WebView的性能和稳定性。经过多次迭代,最终采用以下优化方案:
这些经验来自于三个月的真实用户反馈和性能监控数据分析,显著降低了用户投诉率。