一、个人简介
- 💖💖作者:计算机编程果茶熊
- 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
- 💛💛想说的话:感谢大家的关注与支持!
- 💜💜
- 网站实战项目
- 安卓/小程序实战项目
- 大数据实战项目
- 计算机毕业设计选题
- 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
- 开发语言:Java+Python
- 数据库:MySQL
- 系统架构:B/S
- 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django
- 前端:Vue+HTML+CSS+JavaScript+jQuery
基于SpringBoot的篮球馆预约系统是一个采用前后端分离架构的Web应用项目,该系统运用SpringBoot作为后端核心框架,结合SpringMVC处理请求路由和MyBatis实现数据持久化操作,前端采用Vue.js框架配合ElementUI组件库构建用户交互界面,数据存储选择MySQL关系型数据库。系统主要包含用户管理、场地信息管理、场地预约管理、预约改期管理、取消预约管理等核心业务模块,同时集成在线论坛功能,支持论坛分类管理和举报记录处理,为篮球爱好者提供便捷的场地预约服务。整个系统采用B/S架构模式,用户通过浏览器即可访问所有功能,管理员可通过后台系统管理模块进行场地资源配置和用户行为监控,系统设计注重用户体验和管理效率,实现了场地预约的数字化管理和用户社交互动的有机结合。
三、视频解说
SpringBoot+Vue+MySQL:篮球馆预约系统毕业设计项目实战
四、部分功能展示
五、部分代码展示
import org.apache.spark.sql.SparkSession;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/api")
public class BasketballCourtController {
@Autowired
private CourtReservationService courtReservationService;
private SparkSession spark = SparkSession.builder()
.appName("BasketballCourtAnalysis")
.master("local[*]")
.getOrCreate();
@PostMapping("/reservation/create")
public ResponseResult createReservation(@RequestBody ReservationRequest request) {
if (request.getUserId() == null || request.getCourtId() == null) {
return ResponseResult.error("用户ID和场地ID不能为空");
}
if (request.getReservationDate() == null || request.getStartTime() == null || request.getEndTime() == null) {
return ResponseResult.error("预约时间信息不完整");
}
LocalDateTime currentTime = LocalDateTime.now();
if (request.getReservationDate().isBefore(currentTime.toLocalDate())) {
return ResponseResult.error("不能预约过去的日期");
}
List<Reservation> conflictReservations = courtReservationService.findConflictReservations(
request.getCourtId(), request.getReservationDate(), request.getStartTime(), request.getEndTime());
if (!conflictReservations.isEmpty()) {
return ResponseResult.error("该时间段已被预约,请选择其他时间");
}
User user = userService.findById(request.getUserId());
if (user == null) {
return ResponseResult.error("用户不存在");
}
Court court = courtService.findById(request.getCourtId());
if (court == null || !court.getStatus().equals("AVAILABLE")) {
return ResponseResult.error("场地不可用");
}
Reservation reservation = new Reservation();
reservation.setUserId(request.getUserId());
reservation.setCourtId(request.getCourtId());
reservation.setReservationDate(request.getReservationDate());
reservation.setStartTime(request.getStartTime());
reservation.setEndTime(request.getEndTime());
reservation.setStatus("PENDING");
reservation.setCreateTime(currentTime);
reservation.setContactPhone(request.getContactPhone());
reservation.setRemark(request.getRemark());
courtReservationService.save(reservation);
court.setReservedCount(court.getReservedCount() + 1);
courtService.update(court);
return ResponseResult.success("预约成功", reservation);
}
@PutMapping("/reservation/reschedule/{reservationId}")
public ResponseResult rescheduleReservation(@PathVariable Long reservationId, @RequestBody RescheduleRequest request) {
Reservation existingReservation = courtReservationService.findById(reservationId);
if (existingReservation == null) {
return ResponseResult.error("预约记录不存在");
}
if (!existingReservation.getStatus().equals("PENDING") && !existingReservation.getStatus().equals("CONFIRMED")) {
return ResponseResult.error("当前预约状态不允许改期");
}
LocalDateTime currentTime = LocalDateTime.now();
if (existingReservation.getReservationDate().isBefore(currentTime.toLocalDate())) {
return ResponseResult.error("过期预约无法改期");
}
if (request.getNewReservationDate().isBefore(currentTime.toLocalDate())) {
return ResponseResult.error("不能改期到过去的日期");
}
List<Reservation> conflictReservations = courtReservationService.findConflictReservations(
existingReservation.getCourtId(), request.getNewReservationDate(),
request.getNewStartTime(), request.getNewEndTime());
for (Reservation conflict : conflictReservations) {
if (!conflict.getId().equals(reservationId)) {
return ResponseResult.error("目标时间段已被占用");
}
}
existingReservation.setReservationDate(request.getNewReservationDate());
existingReservation.setStartTime(request.getNewStartTime());
existingReservation.setEndTime(request.getNewEndTime());
existingReservation.setUpdateTime(currentTime);
existingReservation.setRescheduleReason(request.getReason());
existingReservation.setStatus("RESCHEDULED");
courtReservationService.update(existingReservation);
RescheduleRecord rescheduleRecord = new RescheduleRecord();
rescheduleRecord.setReservationId(reservationId);
rescheduleRecord.setOriginalDate(existingReservation.getReservationDate());
rescheduleRecord.setOriginalStartTime(existingReservation.getStartTime());
rescheduleRecord.setOriginalEndTime(existingReservation.getEndTime());
rescheduleRecord.setNewDate(request.getNewReservationDate());
rescheduleRecord.setNewStartTime(request.getNewStartTime());
rescheduleRecord.setNewEndTime(request.getNewEndTime());
rescheduleRecord.setReason(request.getReason());
rescheduleRecord.setCreateTime(currentTime);
rescheduleService.save(rescheduleRecord);
return ResponseResult.success("改期成功", existingReservation);
}
@DeleteMapping("/reservation/cancel/{reservationId}")
public ResponseResult cancelReservation(@PathVariable Long reservationId, @RequestBody CancelRequest request) {
Reservation reservation = courtReservationService.findById(reservationId);
if (reservation == null) {
return ResponseResult.error("预约记录不存在");
}
if (reservation.getStatus().equals("CANCELLED")) {
return ResponseResult.error("预约已经被取消");
}
if (reservation.getStatus().equals("COMPLETED")) {
return ResponseResult.error("已完成的预约无法取消");
}
LocalDateTime currentTime = LocalDateTime.now();
LocalDateTime reservationDateTime = LocalDateTime.of(reservation.getReservationDate(), reservation.getStartTime());
long hoursUntilReservation = java.time.Duration.between(currentTime, reservationDateTime).toHours();
if (hoursUntilReservation < 2) {
return ResponseResult.error("预约开始前2小时内无法取消");
}
reservation.setStatus("CANCELLED");
reservation.setUpdateTime(currentTime);
reservation.setCancelReason(request.getReason());
courtReservationService.update(reservation);
Court court = courtService.findById(reservation.getCourtId());
if (court != null) {
court.setReservedCount(Math.max(0, court.getReservedCount() - 1));
courtService.update(court);
}
CancelRecord cancelRecord = new CancelRecord();
cancelRecord.setReservationId(reservationId);
cancelRecord.setUserId(reservation.getUserId());
cancelRecord.setCourtId(reservation.getCourtId());
cancelRecord.setOriginalDate(reservation.getReservationDate());
cancelRecord.setOriginalStartTime(reservation.getStartTime());
cancelRecord.setOriginalEndTime(reservation.getEndTime());
cancelRecord.setCancelTime(currentTime);
cancelRecord.setCancelReason(request.getReason());
cancelRecord.setRefundStatus("PROCESSING");
cancelService.save(cancelRecord);
if (hoursUntilReservation >= 24) {
cancelRecord.setRefundAmount(reservation.getPaymentAmount());
cancelRecord.setRefundStatus("FULL_REFUND");
} else if (hoursUntilReservation >= 12) {
cancelRecord.setRefundAmount(reservation.getPaymentAmount().multiply(new BigDecimal("0.8")));
cancelRecord.setRefundStatus("PARTIAL_REFUND");
} else {
cancelRecord.setRefundAmount(BigDecimal.ZERO);
cancelRecord.setRefundStatus("NO_REFUND");
}
cancelService.update(cancelRecord);
return ResponseResult.success("取消成功", cancelRecord);
}
}
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊