海滨体育馆管理系统是一个基于SpringBoot+Vue.js技术栈的现代化体育场馆管理平台。作为一名参与过多个类似项目的开发者,我深知这类系统在实际运营中的痛点。传统体育馆管理往往依赖纸质登记和人工调度,不仅效率低下,还容易出现预约冲突、会员信息丢失等问题。这个项目正是为了解决这些实际需求而设计的。
系统采用前后端分离架构,后端使用SpringBoot框架提供RESTful API服务,前端采用Vue.js构建响应式用户界面,数据库选用稳定可靠的MySQL。这种技术组合在当前企业级应用中非常流行,既保证了系统的性能,又便于团队协作开发和后期维护。
后端技术栈:
前端技术栈:
提示:选择Vue 3而非Vue 2主要是考虑到其更好的性能、更小的体积以及Composition API带来的代码组织优势。
code复制┌───────────────────────────────────────────────────┐
│ 客户端层 │
│ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │
│ │ Web浏览器 │ │ 移动端H5 │ │ 微信小程序 │ │
│ └─────────────┘ └─────────────┘ └───────────┘ │
└───────────────────────────────────────────────────┘
▲
│ HTTPS
▼
┌───────────────────────────────────────────────────┐
│ API网关层 │
│ ┌─────────────────────────────────────────────┐ │
│ │ Nginx反向代理/负载均衡 │ │
│ └─────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────┘
▲
│
▼
┌───────────────────────────────────────────────────┐
│ 应用服务层 │
│ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │
│ │ 会员服务 │ │ 预约服务 │ │ 设备服务 │ │
│ └─────────────┘ └─────────────┘ └───────────┘ │
└───────────────────────────────────────────────────┘
▲
│
▼
┌───────────────────────────────────────────────────┐
│ 数据持久层 │
│ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │
│ │ MySQL │ │ Redis缓存 │ │ 文件存储 │ │
│ └─────────────┘ └─────────────┘ └───────────┘ │
└───────────────────────────────────────────────────┘
会员管理是体育馆系统的核心模块之一,需要处理会员注册、信息维护、状态管理等功能。在数据库设计上,我们采用了规范化的表结构:
sql复制CREATE TABLE `member` (
`member_id` varchar(20) NOT NULL COMMENT '会员编号',
`member_name` varchar(50) NOT NULL COMMENT '会员姓名',
`member_phone` varchar(15) NOT NULL COMMENT '联系电话',
`member_gender` char(1) DEFAULT NULL COMMENT '性别(M/F)',
`register_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',
`member_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '会员状态(0禁用/1正常)',
`password` varchar(100) NOT NULL COMMENT '密码(加密存储)',
`salt` varchar(50) NOT NULL COMMENT '加密盐值',
PRIMARY KEY (`member_id`),
UNIQUE KEY `idx_phone` (`member_phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员信息表';
关键实现细节:
场地预约是系统最复杂的模块,需要考虑并发预约、时间冲突检测等问题。数据库设计如下:
sql复制CREATE TABLE `reservation` (
`reserve_id` varchar(20) NOT NULL COMMENT '预约编号',
`member_id` varchar(20) NOT NULL COMMENT '会员编号',
`venue_id` varchar(20) NOT NULL COMMENT '场地编号',
`reserve_date` date NOT NULL COMMENT '预约日期',
`time_slot` varchar(20) NOT NULL COMMENT '时间段(如09:00-11:00)',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态(0待确认/1已确认/2已取消)',
`payment_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '支付状态(0未支付/1已支付)',
`amount` decimal(10,2) DEFAULT NULL COMMENT '金额',
PRIMARY KEY (`reserve_id`),
KEY `idx_member` (`member_id`),
KEY `idx_venue_date` (`venue_id`,`reserve_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='场地预约表';
并发控制方案:
设备管理模块记录体育馆设备的详细信息和使用状态:
sql复制CREATE TABLE `equipment` (
`equipment_id` varchar(20) NOT NULL COMMENT '设备编号',
`equipment_name` varchar(50) NOT NULL COMMENT '设备名称',
`equipment_type` varchar(30) NOT NULL COMMENT '设备类型',
`purchase_date` date NOT NULL COMMENT '采购日期',
`last_maintenance` datetime DEFAULT NULL COMMENT '最近维护时间',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态(0报废/1正常/2维修中)',
`location` varchar(100) DEFAULT NULL COMMENT '存放位置',
`warranty_period` int DEFAULT NULL COMMENT '保修期(月)',
PRIMARY KEY (`equipment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备信息表';
设备状态流转设计:
code复制正常(1) ←───┐
│ │
↓ │
维修中(2) ──┘
│
↓
报废(0)
系统采用JWT进行用户认证,避免传统的Session存储带来的服务器压力。核心实现代码如下:
java复制@Component
public class JwtTokenProvider {
@Value("${app.jwt.secret}")
private String jwtSecret;
@Value("${app.jwt.expiration-in-ms}")
private int jwtExpirationInMs;
public String generateToken(UserPrincipal userPrincipal) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);
return Jwts.builder()
.setSubject(Long.toString(userPrincipal.getId()))
.setIssuedAt(new Date())
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, jwtSecret)
.compact();
}
public Long getUserIdFromJWT(String token) {
Claims claims = Jwts.parser()
.setSigningKey(jwtSecret)
.parseClaimsJws(token)
.getBody();
return Long.parseLong(claims.getSubject());
}
public boolean validateToken(String authToken) {
try {
Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken);
return true;
} catch (SignatureException ex) {
logger.error("Invalid JWT signature");
} catch (MalformedJwtException ex) {
logger.error("Invalid JWT token");
} // 其他异常处理...
return false;
}
}
场地预约的核心是冲突检测,我们实现了一个高效的检测方法:
java复制public boolean checkReservationConflict(String venueId, LocalDate date, String timeSlot) {
// 将时间段转换为开始和结束时间
LocalTime[] slotTimes = parseTimeSlot(timeSlot);
LocalTime startTime = slotTimes[0];
LocalTime endTime = slotTimes[1];
// 查询该场地当天的所有预约
List<Reservation> reservations = reservationRepository
.findByVenueIdAndReserveDate(venueId, date);
// 检查时间冲突
for (Reservation res : reservations) {
if (res.getStatus() == 2) continue; // 跳过已取消的预约
LocalTime[] existingSlot = parseTimeSlot(res.getTimeSlot());
if (!(endTime.isBefore(existingSlot[0]) || startTime.isAfter(existingSlot[1]))) {
return true; // 存在冲突
}
}
return false; // 无冲突
}
private LocalTime[] parseTimeSlot(String timeSlot) {
String[] parts = timeSlot.split("-");
return new LocalTime[] {
LocalTime.parse(parts[0].trim()),
LocalTime.parse(parts[1].trim())
};
}
系统采用RESTful API设计风格,前后端交互遵循以下规范:
请求方法:
响应格式:
json复制{
"success": true,
"code": 200,
"message": "操作成功",
"data": {
// 实际数据
},
"timestamp": 1684567890123
}
json复制{
"success": false,
"code": 400,
"message": "参数验证失败",
"errors": [
{
"field": "phone",
"message": "手机号格式不正确"
}
],
"timestamp": 1684567890123
}
后端环境:
前端环境:
初始化步骤:
bash复制# 后端
mvn clean install
# 创建数据库
mysql -u root -p < db/schema.sql
# 启动应用
java -jar target/stadium-management.jar
# 前端
npm install
npm run serve
推荐使用Docker容器化部署,以下是docker-compose.yml示例:
yaml复制version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: stadium-mysql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: stadium
MYSQL_USER: stadium
MYSQL_PASSWORD: stadium123
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
restart: always
redis:
image: redis:6.2
container_name: stadium-redis
ports:
- "6379:6379"
volumes:
- redis_data:/data
restart: always
backend:
build: ./backend
container_name: stadium-backend
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/stadium
SPRING_DATASOURCE_USERNAME: stadium
SPRING_DATASOURCE_PASSWORD: stadium123
SPRING_REDIS_HOST: redis
depends_on:
- mysql
- redis
restart: always
frontend:
build: ./frontend
container_name: stadium-frontend
ports:
- "80:80"
restart: always
volumes:
mysql_data:
redis_data:
在实际开发过程中,我发现这个基础系统还可以进一步扩展:
微信小程序接入:
数据分析模块:
智能推荐系统:
物联网集成:
问题: 高峰期预约接口响应慢
解决方案:
问题: 如何防止恶意刷单
解决方案:
问题: 支付成功但预约状态未更新
解决方案:
在开发这个系统的过程中,我积累了一些有价值的经验:
数据库设计技巧:
前端性能优化:
团队协作建议:
测试策略:
这个体育馆管理系统项目涵盖了企业级应用开发的典型技术栈和常见业务场景,非常适合作为学习项目或毕业设计参考。在实际开发中,建议先从核心功能入手,逐步迭代完善,同时注意代码的可维护性和扩展性。