SpringBoot+Vue+MySQL:篮球馆预约系统毕业设计项目实战

60 阅读3分钟

一、个人简介

  • 💖💖作者:计算机编程果茶熊
  • 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长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

💕💕文末获取源码联系计算机编程果茶熊