技术栈

后端框架
Spring Boot 2.7.x(提供快速开发、自动配置、内嵌Tomcat)
Spring Security(负责用户认证与授权)
Spring Data JPA(简化数据库操作,支持Hibernate作为ORM)

前端框架
Thymeleaf(服务端模板引擎,支持HTML5)
Bootstrap 5(响应式布局与UI组件)
jQuery/Ajax(动态交互与异步请求)

数据库
MySQL 8.0(关系型数据库,支持事务)
Redis(缓存会话、高频访问数据)

开发工具
Maven(依赖管理与构建)
Swagger 3.0(API文档生成)
Lombok(简化POJO代码)

测试工具
JUnit 5(单元测试)
Mockito(模拟依赖)
Postman(接口测试)


功能模块设计

1. 用户管理

  • 角色划分:管理员、普通用户、客服
  • 功能:注册/登录(JWT鉴权)、密码加密(BCrypt)、权限控制(@PreAuthorize)

2. 车辆管理

  • 车辆CRUD:品牌、型号、日租金、库存状态
  • 分类筛选:按价格区间、车型(SUV/轿车)、燃油类型

3. 租赁订单

  • 订单生成:选择车辆、租期计算(日租金×天数)
  • 状态流转:待支付→已支付→已完成/已取消
  • 超时处理:30分钟未支付自动取消(Quartz定时任务)

4. 支付系统

  • 模拟支付:对接支付宝/微信沙箱环境
  • 退款逻辑:订单取消后原路退回(异步通知处理)

5. 统计报表

  • 数据可视化:ECharts展示月度营收、车辆出租率
  • 导出功能:PDF(iText)、Excel(Apache POI)

数据库设计

核心表结构

-- 用户表
CREATE TABLE `user` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `username` VARCHAR(50) UNIQUE NOT NULL,
  `password` VARCHAR(100) NOT NULL,  -- BCrypt加密存储
  `role` ENUM('ADMIN','USER','STAFF') NOT NULL
);

-- 车辆表
CREATE TABLE `car` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `plate_number` VARCHAR(20) UNIQUE NOT NULL,
  `model` VARCHAR(50) NOT NULL,
  `daily_price` DECIMAL(10,2) NOT NULL,
  `status` ENUM('AVAILABLE','RENTED','MAINTENANCE')
);

-- 订单表
CREATE TABLE `order` (
  `id` BIGINT PRIMARY KEY AUTO_INCREMENT,
  `user_id` BIGINT NOT NULL,
  `car_id` BIGINT NOT NULL,
  `start_date` DATE NOT NULL,
  `end_date` DATE NOT NULL,
  `total_amount` DECIMAL(12,2) NOT NULL,
  `status` ENUM('PENDING','PAID','COMPLETED','CANCELLED'),
  FOREIGN KEY (`user_id`) REFERENCES `user`(`id`),
  FOREIGN KEY (`car_id`) REFERENCES `car`(`id`)
);

索引优化

  • order表的user_idcar_id添加外键索引
  • car表的statusdaily_price字段建立复合索引

系统测试设计

单元测试示例(JUnit 5)

@SpringBootTest
public class CarServiceTest {
    @Autowired
    private CarService carService;

    @Test
    @Transactional
    void testRentCar() {
        Car car = new Car();
        car.setStatus(CarStatus.AVAILABLE);
        carRepository.save(car);

        carService.rentCar(car.getId());
        Car updatedCar = carRepository.findById(car.getId()).orElseThrow();
        
        assertEquals(CarStatus.RENTED, updatedCar.getStatus());
    }
}

接口测试(Postman)

  • 测试用例:创建订单
    • 请求:POST /api/orders
    • HeaderAuthorization: Bearer {JWT}
    • Body
      {
        "carId": 1,
        "startDate": "2023-12-01",
        "endDate": "2023-12-05"
      }
      

    • 预期响应:201 Created,返回订单ID与总金额

性能测试

  • 使用JMeter模拟100并发用户,测试车辆查询接口(GET /api/cars)的TPS与平均响应时间

 

源码结构

src/
├── main/
│   ├── java/
│   │   └── com/example/carrental/
│   │       ├── config/       # Spring Security/JPA配置
│   │       ├── controller/   # 暴露API接口
│   │       ├── dto/          # 数据传输对象
│   │       ├── service/      # 业务逻辑
│   │       └── repository/   # 数据库访问
│   └── resources/
│       ├── static/           # JS/CSS
│       ├── templates/        # Thymeleaf页面
│       └── application.yml   # 多环境配置
└── test/                     # 测试代码

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐