以下是一个基于Spring Boot + Vue的汽车租赁系统 实现方案,分为技术选型、系统架构设计、核心功能模块和开发步骤四个部分:
一、技术选型
模块 技术栈 后端 Spring Boot 3.x + MyBatis Plus + MySQL 8 + Redis + JWT + Spring Security 前端 Vue 3 + TypeScript + Element Plus/Pinia + Axios + Vue Router 部署 Nginx + Docker + Jenkins (CI/CD) 其他工具 Swagger 3 (API文档) + Lombok + Hutool工具库 + 阿里云OSS (文件存储)
二、系统架构设计
┌───────────────┐
│ 前端Vue 3 │
│ (Element Plus) │
└───────┬───────┘
│ HTTP/HTTPS
┌───────▼───────┐
│ Nginx反向代理 │
└───────┬───────┘
│
┌──────────────────┐ │ ┌──────────────────┐
│ Spring Boot ◄───────┼───────► MySQL 8 │
│ (RESTful API) │ │ │ (主从分离) │
└─────┬────────────┘ │ └──────────────────┘
│ │
│ │
┌─────▼────────────┐ │ ┌──────────────────┐
│ Redis缓存 │ │ │ 阿里云OSS │
│ (Session/热点数据) │ │ │ (车辆图片存储) │
└───────────────────┘ │ └──────────────────┘
三、核心功能模块
1. 用户端功能
模块 功能点 用户注册/登录 手机号/邮箱注册、JWT身份认证、短信验证码 车辆浏览 多条件筛选(价格/车型/品牌)、车辆详情页(图片轮播+参数说明) 订单管理 在线预订(选择取还车时间)、订单状态跟踪(待支付/已完成/已取消) 支付功能 集成支付宝/微信支付沙箱、模拟支付回调 个人中心 驾驶证信息上传、历史订单查询、个人信息修改
2. 管理端功能
模块 功能点 车辆管理 CRUD操作、车辆状态监控(可租/维修中)、库存管理 订单管理 订单审核、手动修改订单状态、导出订单报表 数据统计 租赁量趋势图、热门车型分析、营收统计(按日/月/年) 权限管理 RBAC角色控制(管理员/客服/财务)
四、数据库设计(关键表)
-- 用户表
CREATE TABLE `user` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) UNIQUE NOT NULL,
`password` VARCHAR(100) NOT NULL,
`phone` VARCHAR(20),
`driver_license` VARCHAR(50) COMMENT '驾驶证编号',
`status` TINYINT DEFAULT 1 COMMENT '0-禁用 1-正常'
);
-- 车辆表
CREATE TABLE `car` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`model` VARCHAR(100) NOT NULL COMMENT '车型',
`brand` VARCHAR(50) NOT NULL,
`daily_price` DECIMAL(10,2) NOT NULL,
`status` TINYINT DEFAULT 0 COMMENT '0-可租 1-已租 2-维修',
`image_url` VARCHAR(255) COMMENT '封面图OSS地址'
);
-- 订单表
CREATE TABLE `order` (
`id` VARCHAR(32) PRIMARY KEY COMMENT '订单号',
`user_id` BIGINT NOT NULL,
`car_id` BIGINT NOT NULL,
`start_time` DATETIME NOT NULL,
`end_time` DATETIME NOT NULL,
`total_amount` DECIMAL(10,2) NOT NULL,
`status` TINYINT DEFAULT 0 COMMENT '0-待支付 1-已支付 2-已完成 3-已取消',
FOREIGN KEY (user_id) REFERENCES user(id),
FOREIGN KEY (car_id) REFERENCES car(id)
);
五、关键接口示例(Spring Boot)
1. 车辆分页查询接口
@GetMapping("/cars")
public R<Page<CarVO>> listCars(
@RequestParam(required = false) String brand,
@RequestParam(required = false) BigDecimal minPrice,
@RequestParam(required = false) BigDecimal maxPrice,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
QueryWrapper<Car> wrapper = new QueryWrapper<>();
wrapper.eq(StringUtils.isNotBlank(brand), "brand", brand)
.ge(minPrice != null, "daily_price", minPrice)
.le(maxPrice != null, "daily_price", maxPrice);
Page<Car> page = carService.page(new Page<>(pageNum, pageSize), wrapper);
return R.ok(page.convert(car -> CarConverter.INSTANCE.toVO(car)));
}
2. 创建订单接口
@PostMapping("/orders")
@PreAuthorize("hasRole('USER')")
public R<String> createOrder(@RequestBody @Valid OrderCreateDTO dto) {
// 校验车辆是否可用
Car car = carService.getById(dto.getCarId());
if (car.getStatus() != 0) {
throw new BusinessException("该车辆当前不可租");
}
// 计算租期天数
long days = ChronoUnit.DAYS.between(dto.getStartTime(), dto.getEndTime());
BigDecimal total = car.getDailyPrice().multiply(new BigDecimal(days));
// 生成订单
Order order = new Order();
order.setUserId(SecurityUtils.getCurrentUserId());
order.setCarId(dto.getCarId());
order.setTotalAmount(total);
order.setStatus(OrderStatus.UNPAID.getCode());
orderService.save(order);
return R.ok(order.getId());
}
六、前端实现要点
1. Vue路由配置(router/index.ts)
const routes: Array<RouteRecordRaw> = [
{
path: '/',
component: HomeView,
meta: { requiresAuth: true }
},
{
path: '/car/:id',
component: () => import('@/views/CarDetail.vue')
},
{
path: '/order',
component: () => import('@/views/OrderCreate.vue'),
meta: { requiresAuth: true }
}
];
2. Pinia状态管理(stores/orderStore.ts)
export const useOrderStore = defineStore('order', {
state: () => ({
currentOrder: null as OrderDTO | null,
orderList: [] as OrderDTO[]
}),
actions: {
async fetchOrders() {
const res = await axios.get('/api/orders');
this.orderList = res.data;
}
}
});
七、部署方案
后端打包 :使用mvn clean package
生成可执行JAR
前端构建 :执行npm run build
生成静态文件
Docker部署 :
# Spring Boot Dockerfile
FROM openjdk:17-jdk-alpine
COPY target/car-rental.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
# Nginx Dockerfile
FROM nginx:alpine
COPY dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
八、扩展优化方向
风控系统 :接入第三方征信接口验证用户信用
智能推荐 :基于用户历史行为推荐车型
车辆定位 :集成高德地图API展示实时位置
微服务化 :拆分订单服务、车辆服务、支付服务
该方案可实现一个高可用的汽车租赁系统,具体开发时需根据实际需求调整功能细节。