出租车公司管理系统
创建于 2025 年 3 月 20 日
项目介绍
这是一个基于若依 RuoYi-Vue 3.8.9 前后端分离脚手架二次开发的出租车公司管理系统(目录 20250320-出租车公司管理系统,含 -api 后端与 -web 前端两部分,根目录 20250320-3.sql 为全量库脚本)。业务场景是出租车公司的日常运营管理:公司有多少辆车、车况如何,驾驶员档案与证照是否到期,每天的运营订单与营收,乘客评价、车辆维护、事故处理,以及按车型和时段制定的收费标准,全部收进一个管理后台。
项目结构非常”标准若依”:后端是 ruoyi-admin(启动入口)、ruoyi-framework、ruoyi-system、ruoyi-common、ruoyi-generator、ruoyi-quartz 的多模块布局,业务代码集中在 ruoyi-admin 的 com.ruoyi.taxi 包——7 个 Controller + 7 个 domain,没有单独的 service 层,查询逻辑直接写在 Controller 里通过 EasyEntityQuery 链式构建;前端是 Vue 2 + Element UI 的经典若依目录,业务页面放在 src/views/taxi/ 下(vehicle、driver、order、evaluation、maintenance、accident、rule 七个目录),接口封装在 src/api/taxi/。
从数据库脚本能还原出完整的开发过程:gen_table 中记录了 2025-03-21 上午 08:16 起用代码生成器三次导入 taxi_vehicle、taxi_order、taxi_evaluation、taxi_maintenance、taxi_fare_rule、taxi_accident、taxi_driver 七张表(操作日志 sys_oper_log 里能看到每次 importTableSave 的请求参数),随后手工调整了部分字段的下拉字典(如驾驶证类型挂 taxi_license_type、车辆类型挂 taxi_vehicle_type),08:58 起通过”菜单管理”逐步搭出”业务管理”目录下的九个菜单,直到 20:15 还在调整”数据备份/数据恢复”菜单排序——一个典型的”脚手架 + 代码生成器 + 手工打磨”二次开发项目。
项目架构
系统沿用若依经典前后端分离架构:后端 Spring Boot 2.5.15(端口 8080)+ Spring Security + JWT 认证,前端 Vue 2.6 + Element UI 2.15 + vue-cli(vue.config.js 将 /dev-api 代理到 http://localhost:8080)。技术选型上最有特色的是数据访问层:
| 模块 | 技术栈 | 说明 |
|---|---|---|
ruoyi-admin | Spring Boot 2.5.15、EasyQuery 2.5.17、MyBatis-Plus 3.5.4、Druid、Swagger | 启动入口 + 全部业务代码:com.ruoyi.taxi.controller 下 7 个业务 Controller(/app/* 前缀 + 权限标识 app:order:list 等)+ BigScreenController(/system/big-screen 统计大屏)+ BackupController(/system/backup SQL 备份恢复) |
ruoyi-common | EasyQuery(sql-api-proxy / sql-processor / sql-springboot-starter 2.5.17)、mybatis-plus-join 1.5.2、Hutool | 公共依赖;EasyQuery 配置 easy-query: database: mysql / name-conversion: underlined / default-track: true |
ruoyi-quartz / ruoyi-generator | Quartz、代码生成器 | 定时任务与代码生成模块(业务表即通过生成器导入) |
20250320-出租车公司管理系统-web | Vue 2.6.12、Element UI 2.15.14、ECharts 5.4.0、vue-count-to、vuex | 管理后台;src/views/taxi 七个 CRUD 页面 + 改造后的首页数据驾驶舱 src/views/index.vue |
20250320-3.sql / sql/taxi_20240320.sql | MySQL | 全量库脚本与业务表脚本;7 张 taxi_ 业务表 + 框架表 + 字典/菜单/测试数据 |
domain 层同时标注两套注解——MyBatis-Plus 的 @TableName/@TableId 与 EasyQuery 的 @Table/@EntityProxy,通过 @EntityProxy 在编译期生成 TaxiXxxProxy 代理类,配合 easyEntityQuery.queryable(TaxiOrder.class).where(x -> x.orderId().eq(...)) 写类型安全的链式查询,字段名写错编译期就会报错。每个 Controller 都有一段 buildQuery 方法,把 domain 上非空的查询条件逐一拼进 where,再 .orderBy(x -> x.createTime().desc());分页仍复用若依 BaseController.startPage() + PageHelper。订单列表还演示了 EasyQuery 的联表能力:leftJoin(TaxiDriver.class, ...).leftJoin(TaxiVehicle.class, ...).select(... Select.of(t1.FETCHER.allFields(), t2.driverName(), t3.plateNumber())),把驾驶员姓名、车牌号直接塞进订单实体(driverName、plateNumber 两个字段用 @Column(exist = false) 标记为非持久化字段)。
核心功能
车辆与驾驶员档案。 taxi_vehicle 记录车牌号、车辆类型(字典 taxi_vehicle_type:经济性轿车/舒适性轿车/豪华型轿车/商务车/SUV)、品牌型号、购买日期、行驶里程、GPS 设备号、保险到期日、年检到期日、车辆照片 image 与状态(0 正常/1 维修中/2 报废);taxi_driver 记录身份证号、驾驶证号/类型(字典 C1/C2/A1)、联系电话、出生日期、入职日期、驾驶证到期时间与在职状态(在职/休假/离职)。两表都提供 listForSelect 精简接口,供订单等页面的下拉选择器加载全部档案。
订单管理与联查。 taxi_order 字段非常贴合出租车业务:乘客姓名/电话、起点位置、终点位置、开始/结束时间、行驶距离、车费、订单状态(进行中/已完成/已取消)、支付方式(现金/微信/支付宝)与支付状态。列表页除了按乘客、起终点、车费、支付方式等条件过滤,还通过上面提到的 leftJoin 直接显示车牌号与驾驶员姓名列;export 接口用若依 ExcelUtil 把订单数据导出成 Excel(含驾驶员姓名、车牌号两个非持久化字段)。评价表 taxi_evaluation 以 order_id + driver_id 挂接订单与驾驶员,记录 1-5 星评分、评价内容与评价时间。
维护、事故与收费标准。 taxi_maintenance 按车辆记录维护类型(定期保养/故障维修/事故维修)、维护描述、费用、维护时里程与下次维护日期;taxi_accident 记录事故时间地点、严重程度(轻微/一般/严重)、损失金额、责任认定(全责/主责/同责/次责/无责)与处理状态(未处理/处理中/已处理),两张表的列表同样联查车牌号。taxi_fare_rule 是计价基础数据:按车辆类型 × 时间段(白天/夜间)维护起步价、起步里程、单价(元/km)与等待费(元/分钟),带启用状态与生效日期——SQL 种子数据里就有一条”起步价 6 元、起步里程 5 公里、单价 1.8 元/km、等待费 2 元/分钟”的白天规则。
数据驾驶舱。 首页 src/views/index.vue 被整体替换为运营看板:四个数字卡片(车辆总数、驾驶员数量、订单数量、营收总额)用 vue-count-to 做数字滚动,数据来自 /system/big-screen/count(营收总额即 taxi_order.fare 求和);下方四张 ECharts 图表分别对应车辆类型分布饼图(按字典分组计数并配固定色板)、近 12 个月订单趋势柱状图(startTime 按月格式化后统计)、1-5 星评分分布柱状图、以及近 6 个月”定期保养/故障维修/事故维修”三类维护记录的堆叠柱状图。所有统计都在 BigScreenController 里用 EasyQuery 的 count()/sumOrDefault() 即时聚合,不需要额外建统计表。
SQL 备份与恢复。 BackupController 提供两个有意思的接口:/system/backup/export 先查 information_schema.tables 拿到当前库全部表名,再逐表 SELECT * 并把每条记录拼成 INSERT 语句流式写回响应,生成 backup_yyyyMMddHHmmss.sql 下载;/system/backup/import 接收上传的 .sql 文件,按分号切分后逐条 easyEntityQuery.sqlExecute() 执行,失败即中断报错。数据库的整库导出/导入被封装成了后台页面里的两个按钮。
功能截图
暂无运行截图。
快速上手
-
初始化数据库:先执行根目录
20250320-3.sql(全量库,含框架表、7 张taxi_业务表、菜单、字典与测试数据;业务表脚本也可单独使用sql/taxi_20240320.sql),再修改ruoyi-admin/src/main/resources/application.yml中的 MySQL、Redis 连接配置。 -
启动后端与前端:
cd "20250320-出租车公司管理系统-api"
mvn clean package -DskipTests
java -jar ruoyi-admin/target/ruoyi-admin.jar # 端口 8080
cd ../20250320-出租车公司管理系统-web
npm install
npm run dev # http://localhost:80,默认账号 admin / admin123
- 体验完整流程:登录后首页即数据驾驶舱(四张卡片 + 四张图表)→ “业务管理”下先维护车辆信息、驾驶员信息(或在订单页下拉中选择种子数据里的”京A00001 大众”、“驾驶员A1”)→ 在订单信息页新增订单,选择车辆与驾驶员后填写乘客、起终点、车费、支付方式 → 依次体验驾驶员评价(1-5 星)、车辆维护记录(定期保养/故障维修/事故维修)、事故记录与收费标准页面的增删改查与导出 → 最后可用”数据备份”下载整库 SQL,再用”数据恢复”把导出的文件传回去验证备份闭环。
总结
这个项目是”若依脚手架 + 代码生成器 + 少量手工业务”路线的完整样本,值得借鉴的点有三个:一是数据访问层的 EasyQuery 化——业务代码没写一行 XML Mapper,全部通过 EasyEntityQuery 类型安全链式查询完成,代理类在编译期校验字段,配合代码生成器产出的 domain 注解,CRUD 接口的写法高度一致(每个 Controller 一个 buildQuery + 五个标准方法),二次开发时非常好复制;二是看板与业务解耦的统计方式——大屏所有聚合都在 Controller 里实时 count/sum,用字典驱动分组,不需要物化统计表,对中小规模数据足够简单直接;三是把运维能力做进页面——SQL 备份导出/导入封装成后台功能,对非专业运维的部署场景很实用。当然也能看到真实项目的痕迹:大屏 count 接口返回的 vehicle/driver 字段与前端首页卡片取值刚好对调(车辆总数卡片绑的是 driver 计数),BookInfoServiceImpl.java 是一个残留的空文件,删除接口用 disableLogicDelete() 走物理删除——这些细节说明它是在脚手架基础上快速迭代出来的学习型项目。对想用若依搭一套”档案 + 台账 + 看板”类管理系统的开发者来说,这份代码的目录组织与 EasyQuery 写法很有参考价值。