1. 项目背景与核心价值
汽车租赁行业近年来随着共享经济的兴起迎来了爆发式增长。根据行业数据显示,2022年全球汽车租赁市场规模已达到1,350亿美元,年复合增长率保持在8%以上。在这样的背景下,一个稳定可靠的汽车租赁管理系统成为行业刚需。
这个基于SpringBoot+Vue的汽车租赁系统平台,正是针对这一市场需求设计的全栈解决方案。它采用了当前企业级开发中最主流的"前后端分离"架构模式:
- 后端:SpringBoot 2.7 + MyBatis-Plus 3.5 + MySQL 8.0
- 前端:Vue 3 + Element Plus + Axios
- 辅助工具:Swagger UI(接口文档)、Lombok(代码简化)
这套技术栈的选择体现了现代Java Web开发的几个关键考量:
- SpringBoot的自动配置特性大幅减少了XML配置,内嵌Tomcat简化了部署流程
- MyBatis-Plus在传统MyBatis基础上增强了CRUD操作,开发效率提升40%以上
- Vue 3的Composition API比Options API更灵活,配合TypeScript可获得更好的类型支持
提示:项目源码中已经配置好了MyBatis-Plus的分页插件和性能分析插件,这在处理大量租赁记录时尤为重要。
2. 系统功能模块详解
2.1 车辆管理子系统
作为核心模块,车辆管理实现了完整的CRUD操作和扩展功能:
java复制// 典型的车辆实体类结构
@Data
@TableName("t_vehicle")
public class Vehicle {
@TableId(type = IdType.AUTO)
private Long id;
private String plateNumber; // 车牌号
private String brand; // 品牌
private String model; // 型号
private Integer seatCount; // 座位数
private String fuelType; // 燃油类型
private BigDecimal dailyRate; // 日租金
private Integer status; // 状态(0-可租 1-已租 2-维修)
// 省略getter/setter
}
前端采用Element Plus的表格组件展示车辆列表,配合自定义的筛选条件:
vue复制<template>
<el-table :data="vehicleList" style="width: 100%">
<el-table-column prop="plateNumber" label="车牌号" width="180" />
<el-table-column prop="brand" label="品牌" width="180" />
<el-table-column prop="dailyRate" label="日租金" sortable />
<el-table-column label="操作">
<template #default="scope">
<el-button size="small" @click="handleEdit(scope.row)">编辑</el-button>
<el-button size="small" type="danger" @click="handleDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</template>
2.2 租赁订单流程
订单处理采用状态机模式设计,核心状态包括:
- PENDING(待支付)
- PAID(已支付)
- IN_PROGRESS(使用中)
- COMPLETED(已完成)
- CANCELLED(已取消)
状态转换通过Spring状态机(StateMachine)实现:
java复制public enum OrderEvent {
PAY, // 支付
CANCEL, // 取消
PICK_UP, // 取车
RETURN // 还车
}
public enum OrderState {
PENDING,
PAID,
IN_PROGRESS,
COMPLETED,
CANCELLED
}
2.3 支付结算模块
集成支付宝沙箱环境进行支付处理,关键支付逻辑:
java复制@RestController
@RequestMapping("/payment")
public class PaymentController {
@PostMapping("/create")
public String createPayment(@RequestBody Order order) {
AlipayClient alipayClient = new DefaultAlipayClient(
"https://openapi.alipaydev.com/gateway.do",
APP_ID,
APP_PRIVATE_KEY,
"json",
"UTF-8",
ALIPAY_PUBLIC_KEY,
"RSA2");
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
request.setReturnUrl(returnUrl);
request.setNotifyUrl(notifyUrl);
JSONObject bizContent = new JSONObject();
bizContent.put("out_trade_no", order.getOrderNo());
bizContent.put("total_amount", order.getAmount());
bizContent.put("subject", "车辆租赁费用");
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
return alipayClient.pageExecute(request).getBody();
}
}
3. 数据库设计与SQL脚本解析
3.1 核心表结构
数据库包含12张主要表,关系模型如下:
sql复制CREATE TABLE `t_user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`real_name` varchar(50) DEFAULT NULL COMMENT '真实姓名',
`id_card` varchar(18) DEFAULT NULL COMMENT '身份证号',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`driver_license` varchar(50) DEFAULT NULL COMMENT '驾驶证号',
`status` tinyint DEFAULT '1' COMMENT '状态(0-禁用 1-正常)',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
3.2 关键查询优化
针对高频查询场景,SQL脚本中包含了精心设计的索引:
sql复制-- 车辆查询通常按品牌和状态筛选
ALTER TABLE `t_vehicle` ADD INDEX `idx_brand_status` (`brand`, `status`);
-- 订单表按用户ID和时间范围查询
ALTER TABLE `t_order` ADD INDEX `idx_user_time` (`user_id`, `create_time`);
-- 支付记录需要按订单号快速查询
ALTER TABLE `t_payment` ADD UNIQUE INDEX `idx_order_no` (`order_no`);
注意:项目中的SQL脚本已经包含了测试数据插入语句,开发时可以直接初始化约1000条各类测试数据。
4. 接口文档与前后端联调
4.1 Swagger配置
后端通过SpringFox实现Swagger文档自动生成:
java复制@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.basePackage("com.car.rental.controller"))
.paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("汽车租赁系统API文档")
.description("前后端接口定义")
.version("1.0")
.build();
}
}
4.2 典型接口示例
用户登录接口定义:
java复制@RestController
@RequestMapping("/auth")
@Api(tags = "认证接口")
public class AuthController {
@PostMapping("/login")
@ApiOperation("用户登录")
public Result<LoginVO> login(
@RequestBody @Valid LoginDTO dto) {
// 认证逻辑...
return Result.success(loginVO);
}
}
对应的前端请求封装:
javascript复制// src/api/auth.js
import request from '@/utils/request'
export function login(data) {
return request({
url: '/auth/login',
method: 'post',
data
})
}
4.3 跨域解决方案
针对开发环境的前后端分离跨域问题,项目中提供了两种解决方案:
- 后端全局CORS配置(推荐生产环境使用)
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
- 前端开发代理配置(开发环境使用)
javascript复制// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
}
5. 项目部署与运维
5.1 后端打包与运行
SpringBoot项目支持多种打包方式:
bash复制# 打包为可执行JAR
mvn clean package -DskipTests
# 指定生产环境配置运行
java -jar target/car-rental.jar --spring.profiles.active=prod
5.2 前端构建
Vue项目构建优化建议:
bash复制# 安装依赖
npm install
# 开发模式运行
npm run dev
# 生产环境构建(启用压缩和缓存)
npm run build -- --mode production
5.3 数据库运维
项目中提供了数据库迁移脚本:
sql复制-- 增量更新脚本示例
ALTER TABLE `t_vehicle` ADD COLUMN `insurance_no` VARCHAR(50) COMMENT '保险单号';
-- 数据修复脚本示例
UPDATE `t_order` SET status = 'COMPLETED'
WHERE status = 'IN_PROGRESS' AND return_time IS NOT NULL;
6. 毕设开发经验分享
在实际开发这个汽车租赁系统时,有几个关键点值得特别注意:
- 日期时间处理:租赁业务涉及大量日期计算,推荐使用Java 8的
java.time包:
java复制// 计算租赁天数
long days = ChronoUnit.DAYS.between(
order.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
order.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()
);
- 并发控制:车辆库存和订单状态需要加锁处理:
java复制@Transactional
public Order createOrder(OrderDTO dto) {
// 使用SELECT FOR UPDATE加锁
Vehicle vehicle = vehicleMapper.selectByIdForUpdate(dto.getVehicleId());
if (vehicle.getStatus() != 0) {
throw new BusinessException("该车辆不可租");
}
// 创建订单逻辑...
}
- 前端性能优化:对于车辆列表这类数据量可能较大的页面,实现分页和虚拟滚动:
vue复制<template>
<el-table
:data="vehicleList"
style="width: 100%"
height="calc(100vh - 200px)"
:row-key="row => row.id"
@scroll="handleScroll">
<!-- 列定义 -->
</el-table>
</template>
- 接口安全:所有敏感接口都需要添加权限注解:
java复制@PreAuthorize("hasRole('ADMIN')")
@DeleteMapping("/vehicles/{id}")
public Result deleteVehicle(@PathVariable Long id) {
// 删除逻辑
}
这个项目完整展示了现代Java Web开发的典型技术栈组合,从数据库设计到前端展示,从业务逻辑到系统安全,涵盖了毕业设计需要展示的各方面能力。源码中包含的详细注释和文档,特别适合作为学习SpringBoot和Vue全栈开发的参考项目。
