智慧旅游平台设计与实现 | 智慧旅游平台毕设的矛盾:Java技术栈简单入门,MySQL数据库设计却是最大难点

48 阅读4分钟

💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长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等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目