基于Vue.js的厦门旅游电子商务预订系统的设计和实现

在这里插入图片描述
项目编号: S 030 ,文末获取源码。 \color{red}{项目编号:S030,文末获取源码。} 项目编号:S030,文末获取源码。


目录

  • 一、摘要
    • 1.1 项目介绍
    • 1.2 项目录屏
  • 二、功能模块
    • 2.1 景点类型模块
    • 2.2 景点档案模块
    • 2.3 酒店管理模块
    • 2.4 美食管理模块
  • 三、系统设计
    • 3.1 用例设计
    • 3.2 数据库设计
      • 3.2.1 学生表
      • 3.2.2 学生表
      • 3.2.3 学生表
      • 3.2.4 学生表
  • 四、系统展示
  • 五、核心代码
    • 5.1 新增景点类型
    • 5.2 查询推荐的景点
    • 5.3 查询单个景点
    • 5.4 查询评价前10的景点
    • 5.5 新增景点评价
  • 六、免责说明


一、摘要

1.1 项目介绍

基于Vue+SpringBoot+MySQL的厦门旅游电子商务预订系统包含景点类型模块、景点档案模块、景点评分模块、景点收藏模块、酒店模块、美食模块,拥有用户网页端和管理后台端,包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,厦门旅游电子商务预订系统基于角色的访问控制,给景点管理员、游客使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求,项目编号S030。

1.2 项目录屏

源码下载


二、功能模块

在这里插入图片描述

2.1 景点类型模块

景点类型模块是一个用于对旅游景点中不同类型的旅游景点进行分类和管理的模块,旅游景点类型模块允许用户按主题和类型组织和管理旅游景点,以便用户能够快速找到自己感兴趣的旅游景点,景点类型模块为用户提供个性化的推荐服务,并根据用户选择的类型和偏好推荐相应的旅游景点和路线。景点类型模块不同通过分析每种类型的旅游景点统计数据,可以了解每种类型旅游景点的流量和知名度,优化旅游资源的利用效率,旅游景点类型模块有助于旅游目的地更好地表达自身特色和品牌形象,从而提高旅游目的地的知名度和影响力,景点类型模块对于旅游网站和应用程序来说是非常必要的,通过景点类型模块,更容易搜索用户,提供个性化服务,优化旅游资源利用,更好地表达旅游地区的特色,提高用户体验和旅游电子商务预订管理系统的价值。

2.2 景点档案模块

景点档案模块是旅游电子商务预订管理系统中,用于管理和显示各种旅游目的地信息、历史背景、地理位置、交通路线等详细资料、旅游目的地介绍、书面信息、相关信息,以便您能够更好地了解和选择用户感兴趣的目的地,改善旅行体验,旅游景点档案模块为用户提供交通路线、周边食宿、票价等详细信息,用户可以制定出行计划和预算,旅游景点档案模块包含了大量的旅游信息和相关信息,可以为平台提供更全面、更丰富的内容,提高平台的信息量和可靠性。推介客源和景点,提升旅游知名度和影响力,促进旅游经济发展,了解各类旅游景点的流量和知名度,优化旅游资源利用效率。旅游景点模块有助于旅游目的地更好地表达自身特色和品牌形象,从而提高旅游目的地的知名度和影响力,景点模块对于旅游网站和应用程序来说是非常必要的,通过景点模块,更容易搜索用户,提供个性化服务,优化旅游资源利用,更好地表达旅游地区的特色,提高用户体验和平台价值。

2.3 酒店管理模块

酒店管理模块是用于旅游电子商务预订管理系统钟处理酒店预订和管理系统中的酒店订单、客房、服务等信息的模块,酒店管理模块可以通过向酒店提供订单管理、客户管理、客房管理、设备管理等自动化管理工具,提高酒店的管理效率,可以提供餐饮服务等更先进的服务系统。通过提高酒店的服务质量和用户满意度,酒店管理模块可以实现管理自动化,减少人力资源和物力消耗,更好地控制酒店的运营成本和风险,记录并分析酒店运营数据和运营状态,帮助酒店经理做出决策并优化运营。

2.4 美食管理模块

美食管理模块是旅游电子商务预订管理系统中用于管理和显示美食信息的模块,美食管理模块让用户更容易了解食物、价格、口味等信息,让用户吃得上。美食管理模块可以提高选择项目的满意度,美食管理模块可以展示餐厅的美食形象和介绍,吸引更多潜在顾客的兴趣和参与,美食管理模块可以对不同的菜肴进行分类和定价,可以执行确定和库存管理等操作,为了给餐饮企业提供更便捷的管理模式,美食管理模块可以通过分析客户偏好和订单记录,为餐饮企业制定科学准确的营销策略,提高市场竞争力和盈利能力。


三、系统设计

3.1 用例设计

在这里插入图片描述

3.2 数据库设计

3.2.1 学生表

在这里插入图片描述

3.2.2 学生表

在这里插入图片描述

3.2.3 学生表

在这里插入图片描述

3.2.4 学生表

在这里插入图片描述


四、系统展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


五、核心代码

5.1 新增景点类型

@RequestMapping(value = "/insert", method = RequestMethod.POST)
@ApiOperation(value = "新增景点类型")
public Result<ScenicSpotType> insert(ScenicSpotType scenicSpotType){
    if(scenicSpotType.getSortOrder() == null || Objects.equals(0,scenicSpotType.getSortOrder().compareTo(BigDecimal.ZERO))) {
        scenicSpotType.setSortOrder(BigDecimal.valueOf(iScenicSpotTypeService.count() + 1));
    }
    iScenicSpotTypeService.saveOrUpdate(scenicSpotType);
    return new ResultUtil<ScenicSpotType>().setData(scenicSpotType);
}

5.2 查询推荐的景点

@RequestMapping(value = "/getRecommendList2OnWeb", method = RequestMethod.GET)
@ApiOperation(value = "查询推荐的景点")
public Result<List<ScenicSpot>> getRecommendList2(){
    List<ScenicSpot> spotList = iScenicSpotService.list();
    int[] arr = new int[spotList.size()];
    for(int i = 1; i < spotList.size(); i ++) {
        arr[i - 1] = i;
    }
    int[] ints = selectM(arr, 10);
    List<ScenicSpot> ans = new ArrayList<>();
    for (int i : ints) {
        ans.add(spotList.get(i));
    }
    return new ResultUtil<List<ScenicSpot>>().setData(ans);
}

public static int[] selectM(int[] arr,int m){
    int len=arr.length;
    if(m>arr.length) {
        throw new RuntimeException("xxxxx");
    }
    int[] res=new int[m];
    for(int i=0;i<m;i++){
        int randomIndex=len-1-new Random().nextInt(len-i);
        res[i]=arr[randomIndex];
        int tmp=arr[randomIndex];
        arr[randomIndex]=arr[i];
        arr[i]=tmp;
    }
    return res;
}

5.3 查询单个景点

@RequestMapping(value = "/getOneOnWeb", method = RequestMethod.GET)
@ApiOperation(value = "查询单个景点")
public Result<ScenicSpot> getOneOnWeb(@RequestParam String id){
    ScenicSpot vo = iScenicSpotService.getById(id);
    if(vo == null) {
        return ResultUtil.error("景点不存在");
    }
    // 评分
    BigDecimal evaluateSum = BigDecimal.ZERO;
    QueryWrapper<Evaluate> evalQw = new QueryWrapper<>();
    evalQw.eq("spot_id",vo.getId());
    List<Evaluate> evaluateList = iEvaluateService.list(evalQw);
    for (Evaluate evaluate : evaluateList) {
        evaluateSum = evaluateSum.add(evaluate.getLevel());
    }
    if(evaluateList.size() > 0) {
        vo.setStar(evaluateSum.divide(BigDecimal.valueOf(evaluateList.size()),2, RoundingMode.DOWN));
    } else {
        vo.setStar(BigDecimal.valueOf(-1));
    }
    // 收藏
    QueryWrapper<Collection> coQw = new QueryWrapper<>();
    coQw.eq("spot_id",vo.getId());
    vo.setCollection(iCollectionService.count(coQw));
    String viewStr = redisTemplate.get("SPOT_VIEW:" + vo.getId());
    if(!ZwzNullUtils.isNull(viewStr)) {
        try {
            long viewNumber = Long.parseLong(viewStr);
            redisTemplate.set("SPOT_VIEW:" + vo.getId(),(viewNumber + 1) + "");
        } catch (Exception e) {}
    } else {
        redisTemplate.set("SPOT_VIEW:" + vo.getId(), "1");
    }
    return new ResultUtil<ScenicSpot>().setData(vo);
}

5.4 查询评价前10的景点

@RequestMapping(value = "/getTopEvaluate", method = RequestMethod.GET)
@ApiOperation(value = "查询评价前10的景点")
public Result<List<ScenicSpot>> getTopEvaluate(){
    List<ScenicSpot> spotList = iScenicSpotService.list();
    for (ScenicSpot vo : spotList) {
        BigDecimal evaluateSum = BigDecimal.ZERO;
        QueryWrapper<Evaluate> evalQw = new QueryWrapper<>();
        evalQw.eq("spot_id",vo.getId());
        List<Evaluate> evaluateList = iEvaluateService.list(evalQw);
        for (Evaluate evaluate : evaluateList) {
            evaluateSum = evaluateSum.add(evaluate.getLevel());
        }
        if(evaluateList.size() > 0) {
            vo.setStar(evaluateSum.divide(BigDecimal.valueOf(evaluateList.size()),2, RoundingMode.DOWN));
        } else {
            vo.setStar(BigDecimal.ZERO);
        }
    }
    Collections.sort(spotList, new Comparator<ScenicSpot>() {
        @Override
        public int compare(ScenicSpot o1, ScenicSpot o2) {
            return o2.getStar().compareTo(o1.getStar());
        }
    });
    if(spotList.size() > 10) {
        spotList = spotList.subList(0,10);
    }
    return new ResultUtil<List<ScenicSpot>>().setData(spotList);
}

5.5 新增景点评价

@RequestMapping(value = "/addEvaluate", method = RequestMethod.GET)
@ApiOperation(value = "新增评价")
public Result<Evaluate> addEvaluate(@RequestParam String id, @RequestParam BigDecimal level, @RequestParam String message){
    ScenicSpot ss = iScenicSpotService.getById(id);
    if(ss == null) {
        return ResultUtil.error("景点不存在");
    }
    User currUser = securityUtil.getCurrUser();
    QueryWrapper<Evaluate> qw = new QueryWrapper<>();
    qw.eq("spot_id",ss.getId());
    qw.eq("user_id",currUser.getId());
    qw.last("limit 1");
    Evaluate evaluate = iEvaluateService.getOne(qw);
    if(evaluate == null) {
        evaluate = new Evaluate();
        evaluate.setSpotId(ss.getId());
        evaluate.setSpotName(ss.getTitle());
        evaluate.setUserId(currUser.getId());
        evaluate.setUserName(currUser.getNickname());
    }
    evaluate.setLevel(level);
    evaluate.setMessage(message);
    evaluate.setTime(DateUtil.now());
    iEvaluateService.saveOrUpdate(evaluate);
    return ResultUtil.success();
}

六、免责说明

  • 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
  • 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
  • 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。

下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!

  1. 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
  2. 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
  3. 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
  4. 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/201847.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【开源视频联动物联网平台】视频AI智能分析部署方式

利用视频监控的AI智能分析技术&#xff0c;可以让视频监控发挥更大的作用&#xff0c;成为管理者的重要决策工具。近年来&#xff0c;基于视频监控的AI分析算法取得了巨大的发展&#xff0c;并在各种智慧化项目中得到了广泛应用&#xff0c;为客户提供更智能化的解决方案。 然…

【智能算法】季节优化算法Seasons optimization algorithm【2023最新智能优化算法合集】

本文介绍了一种基于成吉思汗鲨鱼(Genghis Khan shark&#xff0c;GKS)行为的自然启发的元启发式算法(MA)&#xff0c;称为成吉思汗鲨鱼优化器(Genghis Khan shark optimizer&#xff0c;GKSO)&#xff0c;用于数值优化和工程设计。GKSO的灵感来自于GKS的捕食和生存行为。该成果…

进程间通信基础知识【Linux】——上篇

目录 一&#xff0c;理解进程之间的通信 1. 进程间通信目的 2. 进程间通信的技术背景 3&#xff0c;常见的进程间通信 二&#xff0c;管道 1. 尝试建立一个管道 管道的特点&#xff1a; 管道提供的访问控制&#xff1a; 2. 扩展&#xff1a;进程池 阶段一&#xff1a…

【实验】配置用户自动获取IPv6地址的案例

热门IT课程-试听视频文章浏览阅读49次。认证课程介绍&#xff1a;华为HCIA试听课程 &#xff1a; 华为HCIA试听课程&#xff1a;华为HCIA试听课程&#xff1a;华为HCIP试听课程&#xff1a;思科CCNA试听课程&#xff1a;思科CCNA试听课程&#xff1a;思科CCNA试听课程&#xff…

回归预测 | MATLAB实现基于LightGBM算法的数据回归预测(多指标,多图)

回归预测 | MATLAB实现基于LightGBM算法的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现基于LightGBM算法的数据回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLA…

高效办公:如何使用视频剪辑工具批量转码,mp4视频到TS视频

在视频处理过程中&#xff0c;转码是一项常见的任务。将MP4视频转换为TS视频可以提供许多优势&#xff0c;包括更好的兼容性、更广泛的设备和平台支持以及更高的视频质量。然而&#xff0c;手动转码大量视频文件可能会非常耗时且效率低下。为了实现高效办公&#xff0c;可以使用…

内存函数​(memcpy、memmove、memset、memcmp)

目录 一、memcpy的使用和实现 使用&#xff1a; 模拟实现&#xff1a; 二、memmove 使用和模拟实现 模拟实现&#xff1a; 2.1难点&#xff1a; 覆盖拷贝所在的问题 memset的使用 memcmp的函数的使用​ 一、memcpy的使用和实现 memcpy 拷贝的就是不重叠的内存。 参数…

webpack如何处理浏览器的样式兼容问题postcss

一、准备工作 css/index.css添加样式 .word {color: red;user-select: none; } 为了兼容不同的浏览器我们需要添加前缀比如&#xff1a; -webkit-user-select: none; 这个工作可以通过postcss的插件postcss-preset-env处理 二、安装依赖 pnpm i -D postcss postcss-loader…

TCP 连接建立

1&#xff1a;TCP 三次握手过程是怎样的&#xff1f; 客户端和服务端都处于 CLOSE 状态&#xff0c;服务端主动监听某个端口&#xff0c;处于 LISTEN 状态 第一次握手&#xff1a;客户端带着序号和SYN为1&#xff0c;把第一个 SYN 报文发送给服务端&#xff0c;客户端处于 SYN-…

C库函数—sprintf

函数介绍&#xff1a; C 库函数 int sprintf(char *str, const char *format, ...) 发送格式化输出到 str 所指向的字符串。 参数&#xff1a; str -- 这是指向一个字符数组的指针&#xff0c;该数组存储了 C 字符串。format -- 这是字符串&#xff0c;包含了要被写入到字符串 …

[架构之路-254]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 全程概述

目录 一、软件架构概述 1.1 什么是软件架构 1.2 为什么需要软件架构设计 1.3 软件架构设计在软件设计中位置 &#xff08;1&#xff09;软件架构设计&#xff08;层次划分、模块划分、职责分工&#xff09;&#xff1a; &#xff08;2&#xff09;软件高层设计、概要设计…

JVM执行引擎以及调优

1.JVM内部的优化逻辑 1.1JVM的执行引擎 javac编译器将Person.java源码文件编译成class文件[我们把这里的编译称为前期编译]&#xff0c;交给JVM运行&#xff0c;因为JVM只能认识class字节码文件。同时在不同的操作系统上安装对应版本的JDK&#xff0c;里面包含了各自屏蔽操作…

LeetCode(36)旋转图像【矩阵】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 48. 旋转图像 1.题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在** 原地** 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 …

【数据挖掘】国科大刘莹老师数据挖掘课程作业 —— 第二次作业

Written Part 1. 给定包含属性&#xff5b;Height, Hair, Eye&#xff5d;和两个类别&#xff5b;C1, C2&#xff5d;的数据集。构建基于信息增益&#xff08;info gain&#xff09;的决策树。 HeightHairEyeClass1TallBlondBrownC12TallDarkBlueC13TallDarkBrownC14ShortDark…

基于Qt QChart和QChartView实现正弦、余弦、正切图表

# 源码地址 https://gitcode.com/m0_45463480/QChartView/tree/main# .pro QT += charts​​HEADERS += \ chart.h \ chartview.h​​SOURCES += \ main.cpp \ chart.cpp \ chartview.cpp​​target.path = $$[QT_INSTALL_EXAMPLES]/charts/zoomlinechartINSTAL…

用customize-cra+react-app-rewired配置less+css module

1. 安装 npm i less less-loader -D npm i customize-cra-less-loader -D2.添加配置项 //config-overrides.js const { override } require(customize-cra); const addLessLoader require("customize-cra-less-loader");module.exports {webpack: override(addL…

蓝桥杯每日一题2023.11.29

题目描述 #include <stdio.h> #include <string.h>void StringInGrid(int width, int height, const char* s) {int i,k;char buf[1000];strcpy(buf, s);if(strlen(s)>width-2) buf[width-2]0;printf("");for(i0;i<width-2;i) printf("-"…

三次握手和四次挥手

TCP 协议简述 TCP 提供面向有连接的通信传输&#xff0c;面向有连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。 无论哪一方向另一方发送数据之前&#xff0c;都必须先在双方之间建立一条连接。在TCP/IP协议中&#xff0c;TCP协议提供可靠的连接…

洛谷100题DAY8

36.P1416 攻击火星 此题找出规律即可 #include<bits/stdc.h> using namespace std; int n; int main() {cin >> n;cout << max(0, n - 2);return 0; } 37.P1551 亲戚 并查集模板题目 两个人如果使亲戚就合并建立联系&#xff0c;最后进行查找即可 #incl…

动态规划:解决复杂问题的利器(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…