这个车辆管理系统是一个典型的全栈Web应用项目,采用目前最流行的前后端分离架构。后端基于SpringBoot框架,前端使用Vue.js,数据库选用MySQL。整套系统开箱即用,源码完整可运行,非常适合作为企业级管理系统的学习案例或二次开发基础。
我在实际开发这类系统时发现,一个完善的车辆管理系统需要处理的核心业务包括:车辆档案管理、使用记录跟踪、维修保养计划、费用统计等模块。这套技术栈的选择既考虑了开发效率(SpringBoot的快速启动),又兼顾了前端用户体验(Vue的响应式特性),同时MySQL作为关系型数据库能很好地满足结构化数据存储需求。
SpringBoot 2.x作为后端框架,其自动配置特性大幅减少了XML配置工作量。我通常会采用以下典型依赖:
数据库连接池推荐使用HikariCP,这是SpringBoot默认的也是目前性能最好的连接池实现。在application.properties中配置示例如下:
properties复制spring.datasource.url=jdbc:mysql://localhost:3306/vehicle_db?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.hikari.maximum-pool-size=10
Vue 2.x作为前端框架,配合以下核心插件:
项目结构通常如下:
code复制src/
├── api/ # 接口定义
├── assets/ # 静态资源
├── components/ # 公共组件
├── router/ # 路由配置
├── store/ # Vuex状态
├── utils/ # 工具函数
└── views/ # 页面组件
MySQL数据库设计需要考虑车辆管理的主要业务实体和关系。核心表包括:
sql复制CREATE TABLE `vehicle` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`plate_number` varchar(20) NOT NULL COMMENT '车牌号',
`vehicle_type` varchar(50) DEFAULT NULL COMMENT '车辆类型',
`brand` varchar(50) DEFAULT NULL COMMENT '品牌',
`model` varchar(50) DEFAULT NULL COMMENT '型号',
`purchase_date` date DEFAULT NULL COMMENT '购置日期',
`status` tinyint(4) DEFAULT '1' COMMENT '状态(1:可用,0:不可用)',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_plate_number` (`plate_number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
其他重要表还包括:driver(驾驶员)、maintenance(维修记录)、usage(使用记录)等,通过外键关联形成完整的数据关系。
后端Controller示例:
java复制@RestController
@RequestMapping("/api/vehicle")
public class VehicleController {
@Autowired
private VehicleService vehicleService;
@GetMapping
public Result list(@RequestParam(required = false) String keyword,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize) {
PageInfo<Vehicle> pageInfo = vehicleService.list(keyword, pageNum, pageSize);
return Result.success(pageInfo);
}
@PostMapping
public Result add(@Valid @RequestBody Vehicle vehicle) {
vehicleService.add(vehicle);
return Result.success();
}
}
前端Vue组件关键代码:
javascript复制export default {
data() {
return {
tableData: [],
searchForm: {
keyword: '',
status: ''
},
pagination: {
pageNum: 1,
pageSize: 10,
total: 0
}
}
},
methods: {
async fetchData() {
const { data } = await getVehicleList({
...this.searchForm,
...this.pagination
})
this.tableData = data.list
this.pagination.total = data.total
},
handleAdd() {
this.$refs.addDialog.show()
}
}
}
使用记录需要处理复杂的业务逻辑,包括:
我通常会使用状态模式来处理审批流程:
java复制public interface UsageState {
void approve(UsageRecord record);
void reject(UsageRecord record);
void cancel(UsageRecord record);
}
@Component
@Scope("prototype")
public class PendingState implements UsageState {
@Override
public void approve(UsageRecord record) {
record.setState(new ApprovedState());
// 发送通知...
}
// 其他方法实现...
}
维修保养需要处理定期提醒功能,我推荐使用Quartz实现:
java复制public class MaintenanceJob implements Job {
@Override
public void execute(JobExecutionContext context) {
// 查询需要保养的车辆
List<Vehicle> vehicles = vehicleMapper.selectNeedMaintenance();
vehicles.forEach(vehicle -> {
// 创建维修工单
MaintenanceRecord record = new MaintenanceRecord();
record.setVehicleId(vehicle.getId());
record.setType("定期保养");
// 保存记录并发送通知...
});
}
}
后端需要配置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);
}
}
前端axios配置示例:
javascript复制const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API,
timeout: 5000
})
// 请求拦截器
service.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers['Authorization'] = 'Bearer ' + getToken()
}
return config
},
error => {
return Promise.reject(error)
}
)
推荐使用Docker容器化部署,docker-compose.yml示例:
yaml复制version: '3'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: vehicle_db
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
backend:
build: ./backend
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
后端Dockerfile示例:
dockerfile复制FROM openjdk:8-jdk-alpine
VOLUME /tmp
COPY target/vehicle-system.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
这套系统在实际部署时,我建议先在小规模环境测试所有业务流程。特别是车辆使用审批流程,需要模拟各种异常情况,确保状态转换的正确性。数据库方面,随着数据量增长,可能需要考虑分表策略,比如按年份拆分使用记录表。