基于springboot的新能源汽车租赁系统的设计与实现 - 代码讲解文档

在这里插入图片描述

一、项目概述

本项目是一个基于SpringBoot框架开发的新能源汽车租赁管理系统,旨在为客户提供便捷的新能源汽车租赁服务,同时为管理员提供车辆管理、订单管理、维保管理等功能。系统采用前后端分离架构,后端使用SpringBoot框架,前端使用Vue技术栈,数据库采用MySQL。

项目定位

  • 提供新能源汽车浏览、预约租赁功能
  • 提供租赁订单管理和支付功能
  • 提供车辆维保记录管理功能
  • 提供押金退还管理功能
  • 提供数据统计分析功能

技术选型

技术层 技术选型
后端框架 SpringBoot 2.x
ORM框架 MyBatis-Plus
数据库 MySQL 5.7
前端框架 Vue.js
认证方式 Token机制
日志审计 SysLog注解

二、技术架构

2.1 系统架构图

┌─────────────────────────────────────────────────────────────┐
│                      前端展示层 (Vue.js)                      │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐        │
│  │ 客户端   │ │ 员工端   │ │ 管理端   │ │ 统计报表 │        │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘        │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      后端业务层 (SpringBoot)                  │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                    Controller层                       │   │
│  │  XinnengyuanqicheController / ZulindingdanController..│   │
│  └──────────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                    Service层                          │   │
│  │  XinnengyuanqicheService / ZulindingdanService...     │   │
│  └──────────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                    Dao/Mapper层                       │   │
│  │  XinnengyuanqicheDao / ZulindingdanDao...             │   │
│  └──────────────────────────────────────────────────────┘   │
│  ┌──────────────────────────────────────────────────────┐   │
│  │                    日志审计层                         │   │
│  │  SysLogAspect (AOP切面)                               │   │
│  └──────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                      数据持久层 (MySQL)                       │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐        │
│  │xinnengyu..│ │zulinding..│ │qicheweibao│ │tuihaiyajin│     │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘        │
└─────────────────────────────────────────────────────────────┘

2.2 项目目录结构

springbooty389h945/
├── src/main/java/com/
│   ├── controller/              # 控制器层
│   │   ├── XinnengyuanqicheController.java   # 新能源汽车管理
│   │   ├── QichepinpaiController.java        # 汽车品牌管理
│   │   ├── ZulindingdanController.java       # 租赁订单管理
│   │   ├── HaichexinxiController.java        # 还车信息管理
│   │   ├── QicheweibaoController.java        # 汽车维保管理
│   │   ├── TuihaiyajinController.java        # 退还押金管理
│   │   ├── KehuController.java               # 客户管理
│   │   ├── YuangongController.java           # 员工管理
│   │   ├── NewsController.java               # 新闻公告管理
│   │   ├── SyslogController.java             # 系统日志管理
│   │   └── ...
│   ├── service/                 # 服务层
│   │   ├── impl/                # 服务实现
│   │   ├── XinnengyuanqicheService.java
│   │   └── ...
│   ├── dao/                     # 数据访问层
│   │   ├── XinnengyuanqicheDao.java
│   │   └── ...
│   ├── entity/                  # 实体类
│   │   ├── XinnengyuanqicheEntity.java      # 新能源汽车实体
│   │   ├── QichepinpaiEntity.java           # 汽车品牌实体
│   │   ├── ZulindingdanEntity.java          # 租赁订单实体
│   │   ├── HaichexinxiEntity.java           # 还车信息实体
│   │   ├── QicheweibaoEntity.java           # 汽车维保实体
│   │   ├── TuihaiyajinEntity.java           # 退还押金实体
│   │   ├── KehuEntity.java                  # 客户实体
│   │   ├── YuangongEntity.java              # 员工实体
│   │   ├── SyslogEntity.java                # 系统日志实体
│   │   ├── StoreupEntity.java               # 收藏实体
│   │   ├── MenuEntity.java                  # 菜单实体
│   │   └── ...
│   ├── annotation/              # 自定义注解
│   │   └ SysLog.java            # 系统日志注解
│   ├── aspect/                  # AOP切面
│   │   └ SysLogAspect.java      # 日志切面
│   ├── config/                  # 配置类
│   ├── interceptor/             # 拦截器
│   └── utils/                   # 工具类
└── db/
    └── springbooty389h945.sql   # 数据库脚本

三、核心功能模块讲解

3.1 新能源汽车管理模块

功能说明

新能源汽车模块是系统的核心模块,负责车辆信息的管理,包括车辆基本信息、出租状态、租赁价格等。

实体类设计 - XinnengyuanqicheEntity
@TableName("xinnengyuanqiche")
public class XinnengyuanqicheEntity<T> implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;                     // 主键id
    
    private String qichemingcheng;        // 汽车名称
    private String qichepinpai;           // 汽车品牌
    private String chepaihaoma;           // 车牌号码
    private String chexing;               // 车型
    private String qicheyanse;            // 汽车颜色
    private String qichetupian;           // 汽车图片
    private Integer rizujiage;            // 日租价格
    private Integer yajin;                // 押金
    private String chuzuzhuangtai;        // 出租状态
    private String qichexiangqing;        // 汽车详情
    
    private Date clicktime;               // 最近点击时间
    private Integer clicknum;             // 点击次数
    private Integer storeupnum;           // 收藏数
    
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    private Date addtime;                 // 创建时间
    
    // getter/setter方法...
}
Controller核心代码
@RestController
@RequestMapping("/xinnengyuanqiche")
public class XinnengyuanqicheController {
    @Autowired
    private XinnengyuanqicheService xinnengyuanqicheService;
    
    @Autowired
    private StoreupService storeupService;
    
    /**
     * 保存新能源汽车 - 使用系统日志注解
     */
    @RequestMapping("/save")
    @SysLog("新增新能源汽车") 
    public R save(@RequestBody XinnengyuanqicheEntity xinnengyuanqiche, HttpServletRequest request){
        // 验证车牌号唯一性
        if(xinnengyuanqicheService.selectCount(new EntityWrapper<XinnengyuanqicheEntity>()
            .eq("chepaihaoma", xinnengyuanqiche.getChepaihaoma()))>0) {
            return R.error("车牌号码已存在");
        }
        xinnengyuanqicheService.insert(xinnengyuanqiche);
        return R.ok();
    }
    
    /**
     * 修改新能源汽车
     */
    @RequestMapping("/update")
    @Transactional
    @SysLog("修改新能源汽车")
    public R update(@RequestBody XinnengyuanqicheEntity xinnengyuanqiche, HttpServletRequest request){
        // 验证车牌号唯一性(排除自身)
        if(xinnengyuanqicheService.selectCount(new EntityWrapper<XinnengyuanqicheEntity>()
            .ne("id", xinnengyuanqiche.getId())
            .eq("chepaihaoma", xinnengyuanqiche.getChepaihaoma()))>0) {
            return R.error("车牌号码已存在");
        }
        xinnengyuanqicheService.updateById(xinnengyuanqiche);
        return R.ok();
    }
    
    /**
     * 删除新能源汽车
     */
    @RequestMapping("/delete")
    @SysLog("删除新能源汽车")
    public R delete(@RequestBody Long[] ids){
        xinnengyuanqicheService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 协同算法(按收藏推荐)
     */
    @RequestMapping("/autoSort2")
    public R autoSort2(@RequestParam Map<String, Object> params, XinnengyuanqicheEntity xinnengyuanqiche, 
        HttpServletRequest request){
        String userId = request.getSession().getAttribute("userId").toString();
        String inteltypeColumn = "qichepinpai"; // 按汽车品牌推荐
        
        // 查询用户收藏的车辆
        List<StoreupEntity> storeups = storeupService.selectList(
            new EntityWrapper<StoreupEntity>().eq("type", 1)
                .eq("userid", userId)
                .eq("tablename", "xinnengyuanqiche")
                .orderBy("addtime", false));
        
        List<XinnengyuanqicheEntity> xinnengyuanqicheList = new ArrayList<XinnengyuanqicheEntity>();
        
        // 根据收藏的品牌推荐同品牌车辆
        if(storeups!=null && storeups.size()>0) {
            List<String> typeList = new ArrayList<String>();
            for(StoreupEntity s : storeups) {
                if(typeList.contains(s.getInteltype())) continue;
                typeList.add(s.getInteltype());
                xinnengyuanqicheList.addAll(xinnengyuanqicheService.selectList(
                    new EntityWrapper<XinnengyuanqicheEntity>().eq(inteltypeColumn, s.getInteltype())));
            }
        }
        
        PageUtils page = xinnengyuanqicheService.queryPage(params, ...);
        page.setList(xinnengyuanqicheList);
        return R.ok().put("data", page);
    }
    
    /**
     * 按值统计 - 数据分析
     */
    @RequestMapping("/value/{xColumnName}/{yColumnName}")
    public R value(@PathVariable("yColumnName") String yColumnName, 
        @PathVariable("xColumnName") String xColumnName, HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("yColumn", yColumnName);
        EntityWrapper<XinnengyuanqicheEntity> ew = new EntityWrapper<XinnengyuanqicheEntity>();
        List<Map<String, Object>> result = xinnengyuanqicheService.selectValue(params, ew);
        return R.ok().put("data", result);
    }
    
    /**
     * 分组统计
     */
    @RequestMapping("/group/{columnName}")
    public R group(@PathVariable("columnName") String columnName, HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("column", columnName);
        EntityWrapper<XinnengyuanqicheEntity> ew = new EntityWrapper<XinnengyuanqicheEntity>();
        List<Map<String, Object>> result = xinnengyuanqicheService.selectGroup(params, ew);
        return R.ok().put("data", result);
    }
    
    /**
     * 总数量统计
     */
    @RequestMapping("/count")
    public R count(@RequestParam Map<String, Object> params, XinnengyuanqicheEntity xinnengyuanqiche){
        EntityWrapper<XinnengyuanqicheEntity> ew = new EntityWrapper<XinnengyuanqicheEntity>();
        int count = xinnengyuanqicheService.selectCount(
            MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, xinnengyuanqiche), params), params));
        return R.ok().put("data", count);
    }
}

3.2 租赁订单管理模块

功能说明

租赁订单模块管理客户的租车订单,包括订单创建、状态管理、支付状态等。

核心流程
客户选择车辆 -> 提交租赁申请 -> 订单审核 -> 支付押金和租金 -> 
使用车辆 -> 还车 -> 押金退还
实体类设计 - ZulindingdanEntity

主要字段:

  • dingdanbianhao: 订单编号
  • qichemingcheng: 汽车名称
  • qichepinpai: 汽车品牌
  • chepaihaoma: 车牌号码
  • rizujiage: 日租价格
  • zulintianshu: 租赁天数
  • zulinfeiyong: 租赁费用
  • yajin: 押金
  • kehuzhanghao: 客户账号
  • kehuxingming: 客户姓名
  • zulindate: 租赁日期
  • sfsh: 是否审核
  • shhf: 审核回复
  • ispay: 是否支付

3.3 还车信息管理模块

功能说明

还车信息模块记录客户归还车辆的详细信息,包括还车时间、车辆状态等。

实体类设计 - HaichexinxiEntity

主要字段:

  • haichexinxiid: 还车信息id
  • dingdanbianhao: 订单编号
  • chepaihaoma: 车牌号码
  • haicheshijian: 还车时间
  • haichebeizhu: 还车备注
  • kehuzhanghao: 客户账号

3.4 汽车维保管理模块

功能说明

汽车维保模块管理车辆的维修保养记录,确保车辆处于良好状态。

实体类设计 - QicheweibaoEntity

主要字段:

  • chepaihaoma: 车牌号码
  • weibaoleixing: 维保类型
  • weibaofeiyong: 维保费用
  • weibaoshijian: 维保时间
  • weibaobeizhu: 维保备注

3.5 退还押金管理模块

功能说明

退还押金模块管理客户还车后的押金退还流程。

实体类设计 - TuihaiyajinEntity

主要字段:

  • tuihaibianhao: 退还编号
  • dingdanbianhao: 订单编号
  • kehuzhanghao: 客户账号
  • tuihaiyajin: 退还押金
  • tuihaishijian: 退还时间
  • tuihaibeizhu: 退还备注
  • sfsh: 是否审核

3.6 汽车品牌管理模块

功能说明

汽车品牌模块管理新能源汽车的品牌分类信息。

实体类设计 - QichepinpaiEntity

主要字段:

  • qichepinpai: 汽车品牌名称

3.7 系统日志管理模块

功能说明

系统日志模块记录用户的关键操作,用于审计追踪。

SysLog注解设计
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface SysLog {
    String value() default "";
}
AOP切面实现
@Aspect
@Component
public class SysLogAspect {
    @Autowired
    private SyslogService syslogService;
    
    @Pointcut("@annotation(com.annotation.SysLog)")
    public void logPointCut() {}
    
    @Around("logPointCut()")
    public Object around(ProceedingJoinPoint point) throws Throwable {
        long beginTime = System.currentTimeMillis();
        Object result = point.proceed();
        long time = System.currentTimeMillis() - beginTime;
        
        // 保存日志
        SyslogEntity syslogEntity = new SyslogEntity();
        syslogEntity.setOperation(point.getSignature().getName());
        syslogEntity.setTime(time);
        syslogEntity.setMethod(point.getSignature().getName());
        // ... 设置其他字段
        syslogService.insert(syslogEntity);
        
        return result;
    }
}

四、数据库设计分析

4.1 数据库表概览

表名 说明 主要字段
xinnengyuanqiche 新能源汽车表 qichemingcheng, chepaihaoma, rizujiage, chuzuzhuangtai
qichepinpai 汽车品牌表 qichepinpai
zulindingdan 租赁订单表 dingdanbianhao, zulinfeiyong, yajin, sfsh
haichexinxi 还车信息表 haicheshijian, haichebeizhu
qicheweibao 汽车维保表 weibaoleixing, weibaofeiyong, weibaoshijian
tuihaiyajin 退还押金表 tuihaiyajin, tuihaishijian, sfsh
kehu 客户表 kehuzhanghao, mima, kehuxingming
yuangong 员工表 yuangonggonghao, mima, yuangongxingming
menu 菜单表 title, url, icon
syslog 系统日志表 operation, method, time
news 新闻公告表 title, content
storeup 收藏表 userid, refid, inteltype

4.2 核心表结构详解

xinnengyuanqiche(新能源汽车表)
CREATE TABLE `xinnengyuanqiche` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `qichemingcheng` varchar(200) NOT NULL COMMENT '汽车名称',
  `qichepinpai` varchar(200) NOT NULL COMMENT '汽车品牌',
  `chepaihaoma` varchar(200) NOT NULL COMMENT '车牌号码',
  `chexing` varchar(200) COMMENT '车型',
  `qicheyanse` varchar(200) COMMENT '汽车颜色',
  `qichetupian` longtext COMMENT '汽车图片',
  `rizujiage` int(11) NOT NULL COMMENT '日租价格',
  `yajin` int(11) NOT NULL COMMENT '押金',
  `chuzuzhuangtai` varchar(200) COMMENT '出租状态',
  `qichexiangqing` longtext COMMENT '汽车详情',
  `clicktime` datetime COMMENT '最近点击时间',
  `clicknum` int(11) DEFAULT '0' COMMENT '点击次数',
  `storeupnum` int(11) DEFAULT '0' COMMENT '收藏数',
  PRIMARY KEY (`id`),
  KEY `qichepinpai` (`qichepinpai`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='新能源汽车';
zulindingdan(租赁订单表)
CREATE TABLE `zulindingdan` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `dingdanbianhao` varchar(200) COMMENT '订单编号',
  `qichemingcheng` varchar(200) COMMENT '汽车名称',
  `qichepinpai` varchar(200) COMMENT '汽车品牌',
  `chepaihaoma` varchar(200) COMMENT '车牌号码',
  `rizujiage` int(11) COMMENT '日租价格',
  `zulintianshu` int(11) COMMENT '租赁天数',
  `zulinfeiyong` int(11) COMMENT '租赁费用',
  `yajin` int(11) COMMENT '押金',
  `kehuzhanghao` varchar(200) COMMENT '客户账号',
  `kehuxingming` varchar(200) COMMENT '客户姓名',
  `zulindate` datetime COMMENT '租赁日期',
  `sfsh` varchar(200) DEFAULT '待审核' COMMENT '是否审核',
  `shhf` longtext COMMENT '审核回复',
  `ispay` varchar(200) DEFAULT '未支付' COMMENT '是否支付',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租赁订单';

4.3 数据库关系设计

┌─────────────┐     ┌─────────────┐
│ qichepinpai │────▶│xinnengyuanqi│
│ (汽车品牌) │     │  (品牌关联) │
└─────────────┘     └─────────────┘
                          │
                          ▼
┌─────────────┐     ┌─────────────┐
│   kehu      │────▶│zulindingdan │
│   (客户)    │     │ (租赁订单) │
└─────────────┘     └─────────────┘
                          │
          ┌───────────────┼───────────────┐
          ▼               ▼               ▼
┌─────────────┐   ┌─────────────┐   ┌─────────────┐
│ haichexinxi │   │qicheweibao │   │tuihaiyajin │
│ (还车信息) │   │ (汽车维保) │   │ (退还押金) │
└─────────────┘   └─────────────┘   └─────────────┘

五、关键代码解析

5.1 SysLog系统日志注解

系统使用自定义注解记录关键操作:

@SysLog("新增新能源汽车")
@RequestMapping("/save")
public R save(@RequestBody XinnengyuanqicheEntity xinnengyuanqiche) {
    // 业务逻辑
}

5.2 协同推荐算法

系统根据用户收藏推荐同品牌车辆:

@RequestMapping("/autoSort2")
public R autoSort2(@RequestParam Map<String, Object> params) {
    String userId = request.getSession().getAttribute("userId").toString();
    String inteltypeColumn = "qichepinpai";
    
    // 查询用户收藏
    List<StoreupEntity> storeups = storeupService.selectList(
        new EntityWrapper<StoreupEntity>().eq("type", 1)
            .eq("userid", userId).eq("tablename", "xinnengyuanqiche"));
    
    // 根据收藏品牌推荐同品牌车辆
    List<XinnengyuanqicheEntity> recommendList = new ArrayList<>();
    for(StoreupEntity s : storeups) {
        recommendList.addAll(xinnengyuanqicheService.selectList(
            new EntityWrapper<XinnengyuanqicheEntity>()
                .eq(inteltypeColumn, s.getInteltype())));
    }
    
    return R.ok().put("data", recommendList);
}

5.3 数据统计分析

系统提供多种数据统计接口:

// 按值统计(如品牌统计租赁数量)
@RequestMapping("/value/{xColumnName}/{yColumnName}")
public R value(String xColumnName, String yColumnName) {
    List<Map<String, Object>> result = xinnengyuanqicheService.selectValue(params, ew);
    return R.ok().put("data", result);
}

// 分组统计
@RequestMapping("/group/{columnName}")
public R group(String columnName) {
    List<Map<String, Object>> result = xinnengyuanqicheService.selectGroup(params, ew);
    return R.ok().put("data", result);
}

// 总数量统计
@RequestMapping("/count")
public R count(Map<String, Object> params) {
    int count = xinnengyuanqicheService.selectCount(ew);
    return R.ok().put("data", count);
}

5.4 车牌号唯一性验证

// 新增时验证
if(xinnengyuanqicheService.selectCount(
    new EntityWrapper<XinnengyuanqicheEntity>()
        .eq("chepaihaoma", xinnengyuanqiche.getChepaihaoma()))>0) {
    return R.error("车牌号码已存在");
}

// 修改时验证(排除自身)
if(xinnengyuanqicheService.selectCount(
    new EntityWrapper<XinnengyuanqicheEntity>()
        .ne("id", xinnengyuanqiche.getId())
        .eq("chepaihaoma", xinnengyuanqiche.getChepaihaoma()))>0) {
    return R.error("车牌号码已存在");
}

六、系统特色功能

6.1 系统日志审计

使用AOP切面记录用户关键操作,便于审计追踪:

  • @SysLog注解标记需要记录的方法
  • SysLogAspect切面自动拦截并记录日志

6.2 协同推荐算法

根据用户收藏历史推荐同品牌车辆,提升用户体验。

6.3 车牌号唯一性验证

确保系统中车牌号码唯一,避免数据冲突。

6.4 完整租赁流程

  • 租赁订单管理
  • 还车信息记录
  • 押金退还处理
  • 汽车维保管理

6.5 数据统计分析

  • 按值统计(品牌租赁数量等)
  • 分组统计(车型分组统计等)
  • 总数量统计

6.6 智能排序

  • 按点击量排序热门车辆
  • 按收藏推荐同类型车辆

七、运行与部署

7.1 数据库配置

spring:
  datasource:
    driverClassName: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springbooty389h945
    username: root
    password: root

7.2 项目启动步骤

  1. 导入数据库脚本springbooty389h945.sql
  2. 配置application.yml数据库连接
  3. 运行SpringBootApplication主类
  4. 访问前端页面

7.3 默认账号

  • 管理员:admin / admin
  • 客户账号:客户账号1 / 123456
  • 员工账号:员工工号1 / 123456

八、总结

本项目是一个专业的新能源汽车租赁管理系统,实现了完整的车辆租赁业务流程。系统采用SpringBoot+MyBatis-Plus+Vue技术栈,具有清晰的分层架构和完善的日志审计机制。特色功能包括协同推荐算法、车牌号唯一性验证、数据统计分析、完整的租赁流程管理等,适合新能源汽车租赁企业使用。系统的日志审计功能为操作追踪和安全审计提供了有力保障。

更多推荐