一、个人简介
💖💖作者:计算机编程果茶熊
💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
💛💛想说的话:感谢大家的关注与支持!
💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
开发语言:Java+Python
数据库:MySQL
系统架构:B/S
后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django
前端:Vue+HTML+CSS+JavaScript+jQuery
交通旅游订票系统是一款基于B/S架构的综合服务平台,采用Java/Python双语言支持,分别搭配Spring Boot(Spring+SpringMVC+Mybatis)和Django框架作为后端技术栈,前端则统一使用Vue+ElementUI+HTML技术实现。该系统以MySQL数据库为基础,构建了完整的旅游服务生态,涵盖用户管理、景区类型管理、客房类型管理、景区信息管理、酒店信息管理、预约购票管理、预订房间管理、航班机票管理、订票信息管理、旅行计划管理、反馈投诉管理、社区交流管理、轮播图管理以及用户个人信息等十四大核心功能模块。系统设计理念注重用户体验,通过统一的界面风格和便捷的操作流程,让用户能够一站式完成从景点门票预订、酒店入住安排到航班机票购买的全方位旅游规划,同时社区交流功能促进用户间信息分享,反馈投诉管理确保服务质量持续改进,为用户提供从出行计划制定到旅途结束的全流程数字化解决方案。
三、交通旅游订票系统-视频解说
担心毕设做不出来?这份交通旅游订票系统教程让你轻松掌握Vue+SpringBoot开发|计算机毕业设计
四、交通旅游订票系统-功能展示
首页
前台个人信息
前台公告
支付
航班预订
酒店预订
景区预订
后台首页
后台航班管理
后台预订酒店管理
五、交通旅游订票系统-代码展示
```
// 核心功能1: 预约购票管理
@Service
public class TicketReservationService {
@Autowired
private TicketReservationRepository ticketReservationRepository;
@Autowired
private ScenicSpotRepository scenicSpotRepository;
@Autowired
private UserRepository userRepository;
@Transactional
public ReservationResult reserveTicket(TicketReservationRequest request) {
// 检查景区是否存在
ScenicSpot scenicSpot = scenicSpotRepository.findById(request.getScenicSpotId())
.orElseThrow(() -> new ResourceNotFoundException("景区不存在"));
// 检查用户是否存在
User user = userRepository.findById(request.getUserId())
.orElseThrow(() -> new ResourceNotFoundException("用户不存在"));
// 检查景区门票库存
if (scenicSpot.getAvailableTickets() < request.getTicketCount()) {
throw new InsufficientResourceException("门票库存不足");
}
// 计算总价
BigDecimal totalPrice = scenicSpot.getTicketPrice().multiply(
new BigDecimal(request.getTicketCount()));
// 应用折扣策略
if (request.getTicketCount() >= 5) {
totalPrice = totalPrice.multiply(new BigDecimal("0.9")); // 5张以上9折
}
// 创建预约记录
TicketReservation reservation = new TicketReservation();
reservation.setUser(user);
reservation.setScenicSpot(scenicSpot);
reservation.setReservationDate(request.getReservationDate());
reservation.setTicketCount(request.getTicketCount());
reservation.setTotalPrice(totalPrice);
reservation.setStatus(ReservationStatus.PENDING);
reservation.setCreateTime(LocalDateTime.now());
// 更新景区门票库存
scenicSpot.setAvailableTickets(scenicSpot.getAvailableTickets() - request.getTicketCount());
scenicSpotRepository.save(scenicSpot);
// 保存预约记录
TicketReservation savedReservation = ticketReservationRepository.save(reservation);
// 生成预约凭证
String reservationCode = generateReservationCode(savedReservation.getId());
savedReservation.setReservationCode(reservationCode);
ticketReservationRepository.save(savedReservation);
return new ReservationResult(savedReservation.getId(), reservationCode, totalPrice);
}
private String generateReservationCode(Long reservationId) {
return "TKT" + String.format("%010d", reservationId) +
LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE);
}
}
// 核心功能2: 预订房间管理
@Service
public class RoomReservationService {
@Autowired
private RoomReservationRepository roomReservationRepository;
@Autowired
private HotelRepository hotelRepository;
@Autowired
private RoomTypeRepository roomTypeRepository;
@Autowired
private UserRepository userRepository;
@Transactional
public BookingResult bookRoom(RoomBookingRequest request) {
// 验证用户信息
User user = userRepository.findById(request.getUserId())
.orElseThrow(() -> new ResourceNotFoundException("用户不存在"));
// 验证酒店信息
Hotel hotel = hotelRepository.findById(request.getHotelId())
.orElseThrow(() -> new ResourceNotFoundException("酒店不存在"));
// 验证房间类型
RoomType roomType = roomTypeRepository.findById(request.getRoomTypeId())
.orElseThrow(() -> new ResourceNotFoundException("房间类型不存在"));
// 检查入住日期和退房日期的有效性
if (request.getCheckInDate().isAfter(request.getCheckOutDate())) {
throw new InvalidParameterException("入住日期不能晚于退房日期");
}
// 计算入住天数
long stayDays = ChronoUnit.DAYS.between(request.getCheckInDate(), request.getCheckOutDate());
if (stayDays <= 0) {
throw new InvalidParameterException("入住至少一晚");
}
// 检查所选日期的房间可用性
List<RoomAvailability> availabilities = checkRoomAvailability(
request.getHotelId(),
request.getRoomTypeId(),
request.getCheckInDate(),
request.getCheckOutDate(),
request.getRoomCount()
);
if (availabilities.stream().anyMatch(a -> !a.isAvailable())) {
throw new ResourceUnavailableException("所选日期房间不足");
}
// 计算总价
BigDecimal dailyRate = roomType.getPrice();
BigDecimal totalPrice = dailyRate.multiply(new BigDecimal(stayDays * request.getRoomCount()));
// 应用长住折扣
if (stayDays >= 7) {
totalPrice = totalPrice.multiply(new BigDecimal("0.85")); // 7天以上85折
} else if (stayDays >= 3) {
totalPrice = totalPrice.multiply(new BigDecimal("0.95")); // 3天以上95折
}
// 创建预订记录
RoomReservation reservation = new RoomReservation();
reservation.setUser(user);
reservation.setHotel(hotel);
reservation.setRoomType(roomType);
reservation.setCheckInDate(request.getCheckInDate());
reservation.setCheckOutDate(request.getCheckOutDate());
reservation.setRoomCount(request.getRoomCount());
reservation.setTotalPrice(totalPrice);
reservation.setSpecialRequests(request.getSpecialRequests());
reservation.setStatus(BookingStatus.CONFIRMED);
reservation.setBookingTime(LocalDateTime.now());
// 保存预订记录
RoomReservation savedReservation = roomReservationRepository.save(reservation);
// 更新房间可用性
updateRoomAvailability(
request.getHotelId(),
request.getRoomTypeId(),
request.getCheckInDate(),
request.getCheckOutDate(),
request.getRoomCount()
);
// 生成预订号
String bookingNumber = generateBookingNumber(savedReservation.getId());
savedReservation.setBookingNumber(bookingNumber);
roomReservationRepository.save(savedReservation);
return new BookingResult(savedReservation.getId(), bookingNumber, totalPrice);
}
private String generateBookingNumber(Long reservationId) {
return "BK" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) +
String.format("%06d", reservationId);
}
}
// 核心功能3: 航班机票管理
@Service
public class FlightTicketService {
@Autowired
private FlightRepository flightRepository;
@Autowired
private FlightTicketRepository flightTicketRepository;
@Autowired
private UserRepository userRepository;
@Autowired
private PassengerRepository passengerRepository;
@Transactional
public TicketBookingResult bookFlightTicket(FlightTicketRequest request) {
// 验证用户信息
User user = userRepository.findById(request.getUserId())
.orElseThrow(() -> new ResourceNotFoundException("用户不存在"));
// 验证航班信息
Flight flight = flightRepository.findById(request.getFlightId())
.orElseThrow(() -> new ResourceNotFoundException("航班不存在"));
// 检查航班日期是否有效
if (flight.getDepartureTime().isBefore(LocalDateTime.now())) {
throw new InvalidParameterException("无法预订已起飞的航班");
}
// 检查航班座位可用性
Map<SeatClass, Integer> availableSeats = checkSeatAvailability(flight.getId());
// 验证乘客信息并检查座位
List<PassengerTicketInfo> passengerTickets = new ArrayList<>();
BigDecimal totalPrice = BigDecimal.ZERO;
for (PassengerRequest passengerRequest : request.getPassengers()) {
// 验证乘客信息
Passenger passenger = validatePassengerInfo(passengerRequest);
// 检查所选座位类型是否有足够座位
SeatClass seatClass = SeatClass.valueOf(passengerRequest.getSeatClass());
if (availableSeats.getOrDefault(seatClass, 0) <= 0) {
throw new ResourceUnavailableException(
"所选座位类型 " + seatClass + " 已售罄");
}
// 计算票价
BigDecimal basePrice = getBasePrice(flight, seatClass);
BigDecimal finalPrice = applyPricingRules(basePrice, passenger, flight);
totalPrice = totalPrice.add(finalPrice);
// 减少可用座位数
availableSeats.put(seatClass, availableSeats.get(seatClass) - 1);
// 添加到乘客票信息列表
passengerTickets.add(new PassengerTicketInfo(passenger, seatClass, finalPrice));
}
// 创建订票记录
String bookingReference = generateBookingReference();
List<FlightTicket> tickets = new ArrayList<>();
for (PassengerTicketInfo info : passengerTickets) {
FlightTicket ticket = new FlightTicket();
ticket.setFlight(flight);
ticket.setUser(user);
ticket.setPassenger(info.getPassenger());
ticket.setSeatClass(info.getSeatClass());
ticket.setPrice(info.getPrice());
ticket.setBookingReference(bookingReference);
ticket.setStatus(TicketStatus.CONFIRMED);
ticket.setBookingTime(LocalDateTime.now());
// 随机分配座位号
String seatNumber = assignSeatNumber(flight.getId(), info.getSeatClass());
ticket.setSeatNumber(seatNumber);
tickets.add(ticket);
}
// 批量保存机票
List<FlightTicket> savedTickets = flightTicketRepository.saveAll(tickets);
// 更新航班座位可用性
updateFlightSeatAvailability(flight.getId(), passengerTickets);
// 构建返回结果
return new TicketBookingResult(
bookingReference,
savedTickets.stream().map(FlightTicket::getId).collect(Collectors.toList()),
totalPrice
);
}
private BigDecimal getBasePrice(Flight flight, SeatClass seatClass) {
// 根据座位类型获取基础票价
switch (seatClass) {
case FIRST_CLASS:
return flight.getFirstClassPrice();
case BUSINESS:
return flight.getBusinessClassPrice();
case ECONOMY:
return flight.getEconomyClassPrice();
default:
throw new IllegalArgumentException("未知的座位类型");
}
}
private BigDecimal applyPricingRules(BigDecimal basePrice, Passenger passenger, Flight flight) {
BigDecimal finalPrice = basePrice;
// 应用提前预订折扣
long daysBeforeFlight = ChronoUnit.DAYS.between(
LocalDate.now(),
flight.getDepartureTime().toLocalDate()
);
if (daysBeforeFlight > 30) {
finalPrice = finalPrice.multiply(new BigDecimal("0.85")); // 提前30天以上85折
} else if (daysBeforeFlight > 15) {
finalPrice = finalPrice.multiply(new BigDecimal("0.9")); // 提前15天以上90折
} else if (daysBeforeFlight > 7) {
finalPrice = finalPrice.multiply(new BigDecimal("0.95")); // 提前7天以上95折
}
// 应用特殊乘客折扣
if (passenger.getAge() < 12) {
finalPrice = finalPrice.multiply(new BigDecimal("0.5")); // 儿童半价
} else if (passenger.getAge() >= 65) {
finalPrice = finalPrice.multiply(new BigDecimal("0.85")); // 老人85折
}
return finalPrice;
}
private String generateBookingReference() {
return "FL" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyMMdd")) +
RandomStringUtils.randomAlphanumeric(4).toUpperCase();
}
}
```
六、交通旅游订票系统-文档展示
部分文档
七、END
致谢
💕💕文末获取源码联系计算机编程果茶熊