💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目
智慧旅游平台设计与实现介绍
智慧旅游平台是一个基于Java SpringBoot框架和Python Django框架开发的综合性旅游服务系统,采用C/S与B/S混合架构模式,前端通过uni-app、微信小程序和安卓应用为用户提供多端访问体验。系统以MySQL作为核心数据库,实现了完整的旅游产业链服务功能。平台涵盖景点信息展示与门票预订、酒店客房管理与预订、美食信息发布与预订、旅游路线规划等主要业务模块,同时提供门票退订、酒店退订、美食退订等售后服务功能。系统设计了完善的用户管理体系和个人中心,支持景点类型、美食类型、酒店类型等分类管理,通过轮播图管理功能实现首页内容的动态展示。整个平台旨在为游客提供一站式的旅游服务体验,涵盖从行程规划到实际消费的完整旅游服务链条,通过数字化手段提升旅游服务效率和用户体验质量。
智慧旅游平台设计与实现演示视频
智慧旅游平台设计与实现演示图片
智慧旅游平台设计与实现代码展示
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@Service
public class TourismService {
@Autowired
private TicketMapper ticketMapper;
@Autowired
private HotelMapper hotelMapper;
@Autowired
private RouteMapper routeMapper;
private SparkSession spark = SparkSession.builder().appName("SmartTourismPlatform").config("spark.master", "local").getOrCreate();
public Map<String, Object> processTicketBooking(Long userId, Long scenicSpotId, Integer ticketNum, LocalDateTime visitDate) {
Map<String, Object> result = new HashMap<>();
ScenicSpot scenicSpot = ticketMapper.getScenicSpotById(scenicSpotId);
if (scenicSpot == null) {
result.put("success", false);
result.put("message", "景点信息不存在");
return result;
}
if (scenicSpot.getAvailableTickets() < ticketNum) {
result.put("success", false);
result.put("message", "门票库存不足");
return result;
}
Dataset<Row> historicalData = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "ticket_orders").option("user", "root").option("password", "password").load();
Dataset<Row> userBookingHistory = historicalData.filter("user_id = " + userId + " AND scenic_spot_id = " + scenicSpotId);
long bookingCount = userBookingHistory.count();
double discountRate = 1.0;
if (bookingCount >= 5) {
discountRate = 0.9;
} else if (bookingCount >= 3) {
discountRate = 0.95;
}
double totalPrice = scenicSpot.getTicketPrice() * ticketNum * discountRate;
TicketOrder order = new TicketOrder();
order.setUserId(userId);
order.setScenicSpotId(scenicSpotId);
order.setTicketNum(ticketNum);
order.setTotalPrice(totalPrice);
order.setVisitDate(visitDate);
order.setOrderStatus("CONFIRMED");
order.setCreateTime(LocalDateTime.now());
ticketMapper.insertTicketOrder(order);
scenicSpot.setAvailableTickets(scenicSpot.getAvailableTickets() - ticketNum);
ticketMapper.updateScenicSpot(scenicSpot);
result.put("success", true);
result.put("orderId", order.getId());
result.put("totalPrice", totalPrice);
result.put("discountRate", discountRate);
return result;
}
public Map<String, Object> processHotelBooking(Long userId, Long hotelRoomId, LocalDateTime checkInDate, LocalDateTime checkOutDate) {
Map<String, Object> result = new HashMap<>();
HotelRoom hotelRoom = hotelMapper.getHotelRoomById(hotelRoomId);
if (hotelRoom == null) {
result.put("success", false);
result.put("message", "酒店客房不存在");
return result;
}
if (!hotelRoom.getIsAvailable()) {
result.put("success", false);
result.put("message", "客房已被预订");
return result;
}
Dataset<Row> hotelBookingData = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "hotel_orders").option("user", "root").option("password", "password").load();
Dataset<Row> conflictOrders = hotelBookingData.filter("hotel_room_id = " + hotelRoomId + " AND order_status = 'CONFIRMED' AND ((check_in_date <= '" + checkInDate + "' AND check_out_date > '" + checkInDate + "') OR (check_in_date < '" + checkOutDate + "' AND check_out_date >= '" + checkOutDate + "'))");
if (conflictOrders.count() > 0) {
result.put("success", false);
result.put("message", "选择日期与现有预订冲突");
return result;
}
long daysBetween = java.time.temporal.ChronoUnit.DAYS.between(checkInDate.toLocalDate(), checkOutDate.toLocalDate());
if (daysBetween <= 0) {
result.put("success", false);
result.put("message", "入住和退房日期设置错误");
return result;
}
Dataset<Row> userHotelHistory = hotelBookingData.filter("user_id = " + userId);
long hotelBookingCount = userHotelHistory.count();
double roomDiscountRate = 1.0;
if (hotelBookingCount >= 10) {
roomDiscountRate = 0.85;
} else if (hotelBookingCount >= 5) {
roomDiscountRate = 0.9;
}
double totalRoomPrice = hotelRoom.getDailyPrice() * daysBetween * roomDiscountRate;
HotelOrder hotelOrder = new HotelOrder();
hotelOrder.setUserId(userId);
hotelOrder.setHotelRoomId(hotelRoomId);
hotelOrder.setCheckInDate(checkInDate);
hotelOrder.setCheckOutDate(checkOutDate);
hotelOrder.setTotalPrice(totalRoomPrice);
hotelOrder.setOrderStatus("CONFIRMED");
hotelOrder.setCreateTime(LocalDateTime.now());
hotelMapper.insertHotelOrder(hotelOrder);
hotelRoom.setIsAvailable(false);
hotelMapper.updateHotelRoom(hotelRoom);
result.put("success", true);
result.put("orderId", hotelOrder.getId());
result.put("totalPrice", totalRoomPrice);
result.put("days", daysBetween);
return result;
}
public Map<String, Object> generatePersonalizedRoute(Long userId, String preferences, Integer travelDays) {
Map<String, Object> result = new HashMap<>();
Dataset<Row> userBehaviorData = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "user_behavior_log").option("user", "root").option("password", "password").load();
Dataset<Row> userPreferenceData = userBehaviorData.filter("user_id = " + userId);
Dataset<Row> preferredCategories = userPreferenceData.groupBy("category").count().orderBy(org.apache.spark.sql.functions.desc("count"));
Dataset<Row> allRoutes = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "travel_routes").option("user", "root").option("password", "password").load();
Dataset<Row> matchedRoutes = allRoutes.filter("duration_days <= " + travelDays + " AND category LIKE '%" + preferences + "%'");
if (matchedRoutes.count() == 0) {
matchedRoutes = allRoutes.filter("duration_days <= " + travelDays);
}
Dataset<Row> routePopularity = spark.read().format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism").option("dbtable", "route_bookings").option("user", "root").option("password", "password").load();
Dataset<Row> popularRoutes = routePopularity.groupBy("route_id").count().orderBy(org.apache.spark.sql.functions.desc("count"));
Dataset<Row> recommendedRoutes = matchedRoutes.join(popularRoutes, matchedRoutes.col("id").equalTo(popularRoutes.col("route_id")), "left").orderBy(org.apache.spark.sql.functions.desc("count")).limit(5);
java.util.List<Row> routeList = recommendedRoutes.collectAsList();
java.util.List<TravelRoute> routes = new java.util.ArrayList<>();
for (Row row : routeList) {
TravelRoute route = new TravelRoute();
route.setId(row.getLong("id"));
route.setRouteName(row.getString("route_name"));
route.setDurationDays(row.getInt("duration_days"));
route.setPrice(row.getDouble("price"));
route.setCategory(row.getString("category"));
route.setDescription(row.getString("description"));
routes.add(route);
}
UserPreference userPref = new UserPreference();
userPref.setUserId(userId);
userPref.setPreferredCategories(preferences);
userPref.setTravelDays(travelDays);
userPref.setRecommendationTime(LocalDateTime.now());
routeMapper.saveUserPreference(userPref);
result.put("success", true);
result.put("recommendedRoutes", routes);
result.put("totalRecommendations", routes.size());
return result;
}
}
智慧旅游平台设计与实现文档展示
💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目