【计算机毕业设计】基于SpringBoot+Vue贵州旅游系统的设计与实现

2023-09-20 10:52:01

博主主页:一季春秋
博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。
主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题库、技术咨询。

🍅文末获取联系🍅

精彩专栏推荐订阅👇🏻👇🏻 不然下次找不到哟

SpringBoot+Vue项目持续更新中

http://t.csdn.cn/1mgm8

目录

一、项目介绍 

二、项目主要技术 

三、系统设计

3.1 系统总体功能设计

3.2 管理员模块

四、系统实现

4.1 前台用户功能实现

4.2 管理员模块实现

五、实现代码

5.1 协同算法关键代码

5.2 订单统计关键代码


一、项目介绍 

本系统结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用JAVA语言,结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。本贵州旅游系统主要包括个人中心、用户管理、商品分类管理、风景名胜管理、酒店信息管理、车辆信息管理、食文化管理等多个模块。它帮助贵州旅游管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了贵州旅游管理数据资源,有效的减少了贵州旅游管理的经济投入,大大提高了贵州旅游管理的效率。

二、项目主要技术 

开发语言:Java

使用框架:spring boot

前端技术:JavaScript、Vue 、css3

开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code

数据库:MySQL 5.7/8.0

数据库管理工具:phpstudy/Navicat

JDK版本:jdk1.8

Maven: apache-maven 3.8.1-bin

三、系统设计

在系统分析的基础上,本章首先介绍了系统的总体功能设计,详细描述了系统的不同模块,然后对系统的数据库设计进行了E-R图的转换,并且给出了各个功能模块的表设计。

3.1 系统总体功能设计

通过软件的需求分析已经获得了系统的基本功能需求,根据需求,将贵州旅游系统功能模块主要分为管理员模块。管理员添加个人中心、用户管理、商品分类管理、风景名胜管理、酒店信息管理、车辆信息管理、食文化管理、黔之味管理、门票预订管理、酒店预订管理、租车预订管理、酒店取消管理、门票取消管理、取消租车管理、在线留言、系统管理、订单管理等操作。如图是系统的功能结构图。 

3.2 管理员模块

管理员模块可以进行个人中心,对其进行增删改查操作,系统用户的属性包括用户名、密码、权限、添加时间;对进行用户管理,可以添加用户,将信息记录表中,经过添加后,此用户可以被用户管理查看,可以对信息进行更新,将信息从表中进行删除;对进行商品分类管理,可以添加商品分类信息,对商品分类信息列表进行查询,对商品分类信息进行修改以及将商品分类信息从列表删除。可以管理风景名胜,并对风景名胜信息列表进行查询,对风景名胜信息进行修改以及删除。对进行酒店信息管理,可以添加酒店信息管理,对酒店信息管理列表进行查询,对酒店信息管理进行修改以及将酒店信息管理从列表删除。可以管理车辆信息管理,并对车辆信息管理列表进行查询,对车辆信息管理进行修改以及删除。对进行食文化管理,可以添加食文化信息,对食文化列表进行查询,对食文化进行修改以及将食文化信息从列表删除。可以管理黔之味,并对黔之味列表进行查询,对黔之味进行修改以及删除;对进行门票预订管理,可以添加门票预订,对门票预订列表进行查询,对门票预订进行修改以及将门票预订管理从列表删除。可以管理酒店预订,并对酒店预订列表进行查询,对酒店预订进行修改以及删除

如图是以对用户管理为例的活动图。

四、系统实现

4.1 前台用户功能实现

首页界面

风景名胜推荐界面

酒店信息界面

酒店信息

车辆信息

黔之味界面

4.2 管理员模块实现

管理员输入用户名和密码,下拉选择框,选择用户权限,然后点击立即登录,系统与保存在数据库的数据进行匹配,如果用户名与密码与数据库存放数据匹配,系统跳转到用户页面,否则提示错误重新跳转到登录页面。

系统登录界面

用户管理是可以进行添加用户信息操作。在文本框输入所要添加的用户管理,然后提交即可,输入错误可以点击重置按钮对文本框重置。

用户管理界面

风景名胜管理是可以进行添加风景名胜信息操作。添加风景名胜信息时,需要设置风景名胜信息,然后提交即可,输入错误可以点击重置按钮对文本框重置。

风景名胜管理界面

查询所有酒店信息列表,查询酒店信息,并对酒店信息进行修改,可以对列表中酒店信息进行删除。

酒店信息查询界面

黔之味管理是可以列表中进行添加黔之味管理信息操作。添加黔之味管理信息时,需要设置黔之味管理基本信息,然后提交即可,输入错误可以点击重置按钮对文本框重置。

黔之味管理信息界面

询所有门票预订管理信息列表,查询门票预订管理信息,并对门票预订管理信息进行修改,可以对列表中门票预订管理信息进行删除。

门票预订管理信息界面

订单管理界面

五、实现代码

5.1 协同算法关键代码

    /**
     * 协同算法(按用户购买推荐)
     */
    @RequestMapping("/autoSort2")
    public R autoSort2(@RequestParam Map<String, Object> params,QianzhiweiEntity qianzhiwei, HttpServletRequest request){
        String userId = request.getSession().getAttribute("userId").toString();
        String goodtypeColumn = "shangpinfenlei";
        List<OrdersEntity> orders = ordersService.selectList(new EntityWrapper<OrdersEntity>().eq("userid", userId).eq("tablename", "qianzhiwei").orderBy("addtime", false));
        List<String> goodtypes = new ArrayList<String>();
        Integer limit = params.get("limit")==null?10:Integer.parseInt(params.get("limit").toString());
        List<QianzhiweiEntity> qianzhiweiList = new ArrayList<QianzhiweiEntity>();
	//去重
    	List<OrdersEntity> ordersDist = new ArrayList<OrdersEntity>();
    	for(OrdersEntity o1 : orders) {
    		boolean addFlag = true;
    		for(OrdersEntity o2 : ordersDist) {
    			if(o1.getGoodid()==o2.getGoodid() || o1.getGoodtype().equals(o2.getGoodtype())) {
    				addFlag = false;
    				break;
    			}
    		}
    		if(addFlag) ordersDist.add(o1);
    	}
        if(ordersDist!=null && ordersDist.size()>0) {
                for(OrdersEntity o : ordersDist) {
                        qianzhiweiList.addAll(qianzhiweiService.selectList(new EntityWrapper<QianzhiweiEntity>().eq(goodtypeColumn, o.getGoodtype())));
                }
        }
        EntityWrapper<QianzhiweiEntity> ew = new EntityWrapper<QianzhiweiEntity>();
        params.put("sort", "id");
        params.put("order", "desc");
        PageUtils page = qianzhiweiService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, qianzhiwei), params), params));
        List<QianzhiweiEntity> pageList = (List<QianzhiweiEntity>)page.getList();
        if(qianzhiweiList.size()<limit) {
                int toAddNum = (limit-qianzhiweiList.size())<=pageList.size()?(limit-qianzhiweiList.size()):pageList.size();
                for(QianzhiweiEntity o1 : pageList) {
                    boolean addFlag = true;
                    for(QianzhiweiEntity o2 : qianzhiweiList) {
                        if(o1.getId().intValue()==o2.getId().intValue()) {
                            addFlag = false;
                            break;
                        }
                    }
                    if(addFlag) {
                        qianzhiweiList.add(o1);
                        if(--toAddNum==0) break;
                    }   
                }
        } else if(qianzhiweiList.size()>limit) {
            qianzhiweiList = qianzhiweiList.subList(0, limit);
        }
        page.setList(qianzhiweiList);
        return R.ok().put("data", page);
    }



}

5.2 订单统计关键代码

   /**
     * (按值统计)
     */
    @RequestMapping("/value/{xColumnName}/{yColumnName}")
    public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("yColumn", yColumnName);
        EntityWrapper<OrdersEntity> ew = new EntityWrapper<OrdersEntity>();
            ew.in("status", new String[]{"已支付","已发货","已完成"});
        List<Map<String, Object>> result = ordersService.selectValue(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }

    /**
     * (按值统计)时间统计类型
     */
    @RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
    public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("xColumn", xColumnName);
        params.put("yColumn", yColumnName);
        params.put("timeStatType", timeStatType);
        EntityWrapper<OrdersEntity> ew = new EntityWrapper<OrdersEntity>();
            ew.in("status", new String[]{"已支付","已发货","已完成"});
        List<Map<String, Object>> result = ordersService.selectTimeStatValue(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }

    /**
     * 分组统计
     */
    @RequestMapping("/group/{columnName}")
    public R group(@PathVariable("columnName") String columnName,HttpServletRequest request) {
        Map<String, Object> params = new HashMap<String, Object>();
        params.put("column", columnName);
        EntityWrapper<OrdersEntity> ew = new EntityWrapper<OrdersEntity>();
            ew.in("status", new String[]{"已支付","已发货","已完成"});
        List<Map<String, Object>> result = ordersService.selectGroup(params, ew);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for(Map<String, Object> m : result) {
            for(String k : m.keySet()) {
                if(m.get(k) instanceof Date) {
                    m.put(k, sdf.format((Date)m.get(k)));
                }
            }
        }
        return R.ok().put("data", result);
    }



}
更多推荐

malloc与free

目录前提须知:malloc:大意:头文件:申请空间:判断是否申请成功:使用空间:结果:整体代码:malloc申请的空间怎么回收呢?注意事项:free:前提须知:为什么要有动态内存分配?我们已经掌握的内存开辟⽅式有:intval=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节

postgresql-索引与优化

postgresql-索引与优化索引简介索引类型B-树索引哈希索引GiST索引SP-GiST索引GIN索引BRIN索引创建索引唯一索引多列索引函数索引部分索引覆盖索引查看索引维护索引删除索引索引简介索引(Index)可以用于提高数据库的查询性能;但是索引也需要进行读写,同时还会占用更多的存储空间;因此了解并适当利用索引

Web 3.0 发展到什么水平了?

最初,有互联网:电线和服务器的物理基础设施,让计算机和它们前面的人相互交谈。美国政府的阿帕网在1969年发出了第一条消息,但我们今天所知道的网络直到1991年才出现,当时HTML和URL使用户可以在静态页面之间导航。将此视为只读Web或Web1。在2000年代初期,情况开始发生变化。首先,互联网的互动性越来越强;这是一

金融投资公司如何实现创新, 盛创汇凭借人工智能站上硬科技C位

作为硬科技产业的重要组成部分,近年人工智能受到了国家政策的高度重视。在《“十四五”规划和2035年远景目标纲要》中,人工智能被摆放在科技前沿领域攻关方面的首要位置,先后八次被提及。《规划》指出,对新一代人工智能,要在前沿基础理论突破,专用芯片研发,深度学习框架等开源算法平台构建,学习推理与决策、图像图形、语音视频、自然

深入思考redis面经

1redission分布式锁1.1为了保证数据一致性,引入了redission的锁,你是为了抗住高并发而去为了引入这个锁还是说为了保证数据一致性去引入的答:主要是为了抗住高并发问题,解决redis的缓存击穿问题,但是也能解决一定的数据一致性问题。是的,当我们谈到“击穿”问题时,通常指的是缓存击穿,即当某个热点缓存失效时

C++ PrimerPlus 复习 第一章 命令编译链接文件 make文件

第一章命令编译链接文件C++有什么呢?C++源代码文件后缀运行C++过程可执行代码:编译语法:makeMakefile基础语法编写完make只要和将要编译的文件放一起就行然后在该目录使用make命令,就将自动运行;基础的Makefile版本现在的缺点也大\^-\^更加健全的Makefile但还是有不小的缺点常用版本C+

C++设计模式_04_Strategy 策略模式

接上篇,本篇将会介绍C++设计模式中的Strategy策略模式,和上篇模板方法TemplateMethod一样,仍属于“组件协作”模式,它与TemplateMethod有着异曲同工之妙。文章目录1.动机(Motivation)2.代码演示Strategy策略模式2.1传统方法处理2.2怎么用扩展的方式来支持未来的变化呢

PROB: Probabilistic Objectness for Open World Object Detection(论文解析)

PROB:ProbabilisticObjectnessforOpenWorldObjectDetection摘要2相关工作摘要开放世界目标检测(OWOD)是一个新的、具有挑战性的计算机视觉任务,它弥合了传统的目标检测(OD)基准和现实世界中的目标检测之间的差距。除了检测和分类已知/标记的对象外,OWOD算法还应该能够

【论文阅读】Untargeted Backdoor Attack Against Object Detection(针对目标检测的无目标后门攻击)

文章目录一.论文信息二.论文内容0.摘要1.论文概述2.背景介绍3.作者贡献4.重点图表一.论文信息论文题目:UntargetedBackdoorAttackAgainstObjectDetection(针对目标检测的无目标后门攻击)发表年份:2023-ICASSP(CCF-B)作者信息:ChengxiaoLuo(清华

为什么JWT要结合Redis使用

JWT解决了什么问题存储token的情况:校验token需要重复调用数据库耗时的问题JWT本身缺陷alg不要指定为none算法不要指定数组,只使用一种算法令牌长度可能会超过允许的URL长度,和cookie长度如果需要跟踪用于速率限制和IP白名单的API这些功能,那么使用无状态是不现实的以上都是容易避免的问题,JWT最大

Java实现截取视频第一帧

目录前言一、通过Java借助第三方库实现1.引用ffmpeg使用maven,导入pom依赖:工具类2.引用jcodec二、使用第三方存储自带的方法实现(如阿里云OSS、华为云OBS)前言在实际项目中,会遇到上传视频后,需要截取视频的首帧或指定帧为图片,作为展示使用的需求。这个需求本身并不难,而且网上一搜一大把,今天就针

热文推荐