微服务项目|基于SpringCloud微服务技术的旅游信息平台的设计与实现

简介: 微服务项目|基于SpringCloud微服务技术的旅游信息平台的设计与实现


一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

后台开发技术:springcloud微服务架构体系

前台开发技术:vue+elementui

二,项目简介

2.1 绪论

旅游业作为服务也的一个重要的模块,对推动我国经济发展有着重大作用,近几年的疫情影响导致旅游行业的全面停滞,对国家经济发展产生了极大的影响,因此加快旅游产业的恢复,多方面协同助力促进旅游业的发展,对推动国家的经济健康稳定发展可以形成巨大助力。IT行业实现助力旅游行业的发展,可以采用现有的成熟技术,打造一个用户交互性和友好型的旅游信息平台,解决用户与旅游之间的矛盾,实现用户与旅游之间到的信息可视化,信息安全化,服务个性化等特点,给用户带来更友好,舒适的旅游体验。

本文设计并实现了一款基于SpringCloud微服务架构旅游信息平台系统,根据市场上现有的相关平台,通过分析和总结它们的优缺点,确定本系统的功能结构。本系统更注重用户的友好性以及用户的交互性,将系统分为基础服务,订单服务,定时任务,用户中心,支付服务等微服务模块。该旅游信息平台UI界面美观化设计,页面整洁,增强用户的视觉舒适度;系统功能俱全,操作简单,增加平台的可用性和通用型。另外,使用SpringCloud微服务架构开发,增加平台的可扩展性。

2.2 需求分析

该系统由十个模块组成,每个模块拆分成能够独立运行的微服务系统模块,即后台管理系统模块、前台系统模块、用户系统模块、订单系统模块、单点登录系统模块、酒店系统模块、机票系统模块、火车票系统模块、攻略与景点模块。

后台管理系统模块:前台展示管理、用户管理、管理员管理、酒店管理、机票管理、火车票管理、攻略景点管理、订单管理、系统统计、管理员管理等功能。它包括对用户前台、用户信息、管理员信息、酒店信息、机票信息、攻略与景点信息、系统数据信息、订单信息的管理。

前台系统模块:包含前台展示、用户模块、酒店模块、机票模块、火车票模块、攻略景点模块、订单模块等,主要有用户与游客可以在前台系统中注册账号、登录系统、浏览所有商品(包括酒店、机票、火车票、景点门票)信息、购买商品,查看订单等操作。会员系统模块:用户可以查询系统中的订单、管理订单、优惠券等信息。

用户系统模块:用户可以注册账号、登录账号、修改个人信息比如密码,头像等,未登录的用户只能享受系统的部分功能,如酒店信息的查询,无法进行酒店房间预定服务。

订单系统模块:系统用户可以在本系统构面或预定酒店、机票、火车票、景区门票等,购买或预定完成会有相应的订单信息,用户可以通过订单或者根据账号信息查看或者修改订单信息。

单点登录系统模块:在本多个应用系统中,用户只需要登录一次就可以访问本平台所有的系统。

酒店系统模块:用户可以查看酒店信息,包括按城市、名称、评分、位置等搜索自己想要的酒店信息,同时还提供酒店信息排行榜,帮助用户快速的找到自己想要的酒店信息。酒店系统先通过查找酒店,再通过酒店查找所属的房间信息,完成房间的预定。

机票系统模块:用户可以按日期、出发城市以及目的地城市作为查询条件查询机票信息。

火车票系统模块:用户可以按日期、出发城市以及目的地城市作为查询条件查询火车票信息。

攻略与景点模块:该模块包括景点门票的购买以及攻略的分享。景点门票可通过城市、景点名称进行模糊查询。同时设置了一个景点热度榜,显示最近比较热度的景点,吸引用户打卡。

其主要功能模块图如图1所示

图1功能模块图

2.3  系统架构

本旅游信息平台基于spring cloud微服务技术部署的Web项目,根据预计的需求,开发难度和性能需求等采用的架构形式是分层架构。系统的具体分层架构部署如图2所示。

图2系统部署图

系统分为前后台用户,前台用户主要是普通用户,普通用户包括登录用户和未登录用户。根据是否登录状态,用户访问的范围以及能够使用的功能都是不同的。后台用户主要是后台维护人员和后台管理员用户。前后台的用户访问范围资源如图3、图4所示。

图3旅游信息平台前台用例图

图4旅游信息平台后台

三,系统展示

前端用户注册登录

酒店模块管理

机票信息展示

火车票模块

景点信息模块

攻略模块

后台管理

其它略

四,核心代码展示

package com.lypt.controller;
import com.lypt.api.CommonResult;
import com.lypt.pojo.springcloud_graduation.User;
import com.lypt.pojo.vo.PhoneCode;
import com.lypt.service.UserService;
import com.lypt.uitls.RandomUtil;
import com.lypt.uitls.SMSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    public UserService userService;
    @Autowired
    SMSUtils smsUtils;
    /**
     * 登录
     * @param user
     * @return
     */
    @RequestMapping(value = "/login")
    public CommonResult login( User user) {
        System.out.println(user.toString());
        User user1 = userService.userByUsernameUserPass(user);
        if (user1 != null)
            return CommonResult.success(user1);
        else
            return CommonResult.validateFailed();
    }
    /**
     * 获取所有用户信息
     * @return
     */
    @RequestMapping("/getAll")
    public List<User> getAll(){
        List<User> list = userService.getAll();
        return list;
    }
    /**
     * 根据用户uid查询用户信息
     * @return
     */
    @RequestMapping("/getUserByUid")
    public CommonResult getUserByUid(Integer uid){
        User userByUid = userService.getUserByUid(uid);
        return CommonResult.success(userByUid);
    }
    /**
     * 修改用户信息
     * @return
     */
    @RequestMapping("/updateUser")
    public CommonResult updateUser(User user){
        User user1 = userService.updateUser(user);
        if (user1 != null){
            return CommonResult.success(user1);
        }else {
            return CommonResult.failed();
        }
    }
    /**
     * 添加用户信息
     * @return
     */
    @RequestMapping("/addUser")
    public CommonResult addUser(User user){
        User user1 = userService.addUser(user);
        if (user1 != null){
            return CommonResult.success(user1);
        }else {
            return CommonResult.failed();
        }
    }
    /**
     * 发送短信验证码
     * @param phone
     * @return
     */
    @RequestMapping("/code")
    public CommonResult code(String phone){
        //获取长度为四的验证码
        String getcode = RandomUtil.getcode(4);
        //发送短信验证码
        smsUtils.sendMsg(phone,getcode);
        PhoneCode phoneCode = new PhoneCode();
        phoneCode.setCode(getcode);
        phoneCode.setPhone(phone);
        //讲手机号和验证码发送给前台
        return CommonResult.success(phoneCode);
    }
}
package com.lypt.controller.admin;
import com.lypt.api.CommonResult;
import com.lypt.pojo.vo.*;
import com.lypt.service.*;
import com.lypt.uitls.ComparatorSort;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@RestController
@RequestMapping("/admin/echarts")
public class AdminEchartsController {
    @Autowired
    TrainOrderService trainOrderService;
    @Autowired
    ScenicOrderService scenicOrderService;
    @Autowired
    PlaneOrderService planeOrderService;
    @Autowired
    BookOrderService bookOrderService;
    @Autowired
    UserService userService;
    @RequestMapping("/topData")
    public CommonResult topData(){
        AdminTopData adminTopData = new AdminTopData();
        //用户数量
        adminTopData.setUserNumber(userService.AllUserNumber());
        //一周销售额
        Double totalPrice = 0.00;
        totalPrice+= trainOrderService.weekData();
        totalPrice+= scenicOrderService.weekData();
        totalPrice+=planeOrderService.weekData();
        totalPrice+= bookOrderService.weekData();
        adminTopData.setWeekSalesVolume(totalPrice);
        AllTypeOrderData allTypeOrderData1 = trainOrderService.allOrderData();
        AllTypeOrderData allTypeOrderData2 = scenicOrderService.allOrderData();
        AllTypeOrderData allTypeOrderData3 = planeOrderService.allOrderData();
        AllTypeOrderData allTypeOrderData4 = bookOrderService.allOrderData();
        //所有订单数量
        int totalNumber = 0;
        totalNumber+=allTypeOrderData1.getTotal();
        totalNumber+=allTypeOrderData2.getTotal();
        totalNumber+=allTypeOrderData3.getTotal();
        totalNumber+=allTypeOrderData4.getTotal();
        adminTopData.setAllOrderNumber(totalNumber);
        //总销售额
        Double allOrderPrice = 0.00;
        allOrderPrice+=allTypeOrderData1.getTotalPrice();
        allOrderPrice+=allTypeOrderData2.getTotalPrice();
        allOrderPrice+=allTypeOrderData3.getTotalPrice();
        allOrderPrice+=allTypeOrderData4.getTotalPrice();
        adminTopData.setAllSalesVolume(allOrderPrice);
        return CommonResult.success(adminTopData);
    }
    @RequestMapping("/weekBuyRanking")
    public CommonResult weekBuyRanking(){
        WeekSalesVolume weekSalesVolume1 = new WeekSalesVolume();
        WeekSalesVolume weekSalesVolume2 = new WeekSalesVolume();
        WeekSalesVolume weekSalesVolume3 = new WeekSalesVolume();
        WeekSalesVolume weekSalesVolume4 = new WeekSalesVolume();
        weekSalesVolume1.setTypeName("酒店");
        weekSalesVolume1.setMoney(bookOrderService.weekData());
        weekSalesVolume2.setTypeName("机票");
        weekSalesVolume2.setMoney(planeOrderService.weekData());
        weekSalesVolume3.setTypeName("火车票");
        weekSalesVolume3.setMoney(trainOrderService.weekData());
        weekSalesVolume4.setTypeName("景点门票");
        weekSalesVolume4.setMoney(scenicOrderService.weekData());
        ArrayList<Object> list = new ArrayList<>();
        list.add(weekSalesVolume1);
        list.add(weekSalesVolume2);
        list.add(weekSalesVolume3);
        list.add(weekSalesVolume4);
        ComparatorSort comparatorSort = new ComparatorSort();
        Collections.sort(list,comparatorSort);
        return CommonResult.success(list);
    }
    @RequestMapping("/allBuyTotal")
    public CommonResult allBuyTotal(){
        ArrayList<Object> list = new ArrayList<>();
        AllSalesVolume allSalesVolume1 = new AllSalesVolume();
        AllSalesVolume allSalesVolume2 = new AllSalesVolume();
        AllSalesVolume allSalesVolume3 = new AllSalesVolume();
        AllSalesVolume allSalesVolume4 = new AllSalesVolume();
        allSalesVolume1.setName("酒店");
        allSalesVolume1.setValue(bookOrderService.allOrderData().getTotalPrice());
        allSalesVolume2.setName("机票");
        allSalesVolume2.setValue(planeOrderService.allOrderData().getTotalPrice());
        allSalesVolume3.setName("火车票");
        allSalesVolume3.setValue(trainOrderService.allOrderData().getTotalPrice());
        allSalesVolume4.setName("景区门票");
        allSalesVolume4.setValue(scenicOrderService.allOrderData().getTotalPrice());
        list.add(allSalesVolume1);
        list.add(allSalesVolume2);
        list.add(allSalesVolume3);
        list.add(allSalesVolume4);
        return CommonResult.success(list);
    }
    @RequestMapping("/weekScenicDay")
    public CommonResult weekScenicDay(){
        WeekOnDay weekOnDay = scenicOrderService.weekOrderNumber();
        return CommonResult.success(weekOnDay);
    }
}
package com.lypt.controller.admin;
import com.github.pagehelper.PageInfo;
import com.lypt.api.CommonResult;
import com.lypt.pojo.springcloud_graduation.Manage;
import com.lypt.pojo.vo.Page;
import com.lypt.pojo.vo.Users;
import com.lypt.pojo.vo.Users2;
import com.lypt.service.ManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
@PropertySource("classpath:nginxconfig.properties")
@RestController
@RequestMapping("/admin")
public class AdminManageController {
    @Value("${pichost}")
    private String pichost;
    @Autowired
    ManageService manageService;
    @RequestMapping("/userInfo")
    public CommonResult userInfo(){
        ArrayList<String> list = new ArrayList<>();
        list.add("admin");
        Users user = new Users();
        user.setUsername("admin");
        user.setAvatar("https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif");
        user.setPermissions(list);
        return CommonResult.success(user);
    }
    @RequestMapping("/login")
    public CommonResult login(){
        Users2 users2 = new Users2();
        users2.setAccessToken("admin");
        return CommonResult.success(users2);
    }
    @RequestMapping("/manage/getAllList")
    public CommonResult getAllList(Page page,Manage manage){
        List<Manage> allList = manageService.getAllList(page, manage);
        PageInfo pageInfo = new PageInfo(allList);
        return CommonResult.success(pageInfo);
    }
    /**
     * 上传图片
     * @param tupian
     * @return
     */
    @RequestMapping("/manage/uploadImg")
    public CommonResult uploadFile(MultipartFile tupian){
        System.out.println("nihao");
        String url=null;
        if(tupian!=null&&!tupian.isEmpty()){
            String name= UUID.randomUUID().toString();//生成随机的uuid作为文件名
            int pos=tupian.getOriginalFilename().lastIndexOf(".");//后缀的位置
            String fileName=name+tupian.getOriginalFilename().substring(pos);//得到文件名
            try {
                tupian.transferTo(new File("D:\\date\\images\\bysj\\user\\"+fileName));
            } catch (IOException e) {
                e.printStackTrace();
            }
            url=pichost+"bysj/user/"+fileName;
            System.out.println(url);
        }
        return CommonResult.success(url);
    }
    /**
     * 添加/修改管理员
     * @param manage
     * @return
     */
    @RequestMapping("/manage/addManage")
    public CommonResult addManage(Manage manage){
        Boolean aBoolean = manageService.addManage(manage);
        if (aBoolean){
            return CommonResult.success("添加/修改管理员成功");
        }else {
            return CommonResult.failed();
        }
    }
}

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统

相关文章
|
8月前
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
692 126
|
8月前
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
460 0
|
9月前
|
应用服务中间件 Nacos nginx
黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
本文为 Mac 用户介绍微服务项目环境搭建,含阿里云服务器用 Docker 装 Nacos 1.2.0,本地通过 brew 装 OpenJDK 8、Maven 3.6.1、Redis,Docker 部署 MySQL 5.7 并配字符集,及 Nginx 安装与反向代理设置,附命令与配置步骤。
559 4
黑马头条_SpringCloud项目阶段一:环境搭建(Mac版本)
|
8月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
9月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
556 1
|
9月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
1061 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
9月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
762 0
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
3256 13
Spring Cloud Alibaba:一站式微服务解决方案