N-128基于springboot,vue酒店管理系统

news2024/11/17 23:55:41

开发工具:IDEA

服务器:Tomcat9.0, jdk1.8

项目构建:maven

数据库:mysql5.7

系统分前后台,项目采用前后端分离

前端技术:vue+elementUI

服务端技术:springboot+mybatis

本系统功能包括: 

一、前台功能: 

1、用户注册模块:用户可以输入用户名、密码、昵称、姓名、手机来 进行注册。

2、用户登录模块:用户可以根据用户名、密码进行登录。

3、前台首页模块:包括广告、房间信息、酒店新闻。

4、酒店新闻模块:展示酒店标题,创建时间,详情。

5、酒店预订模块:展示了客房的详情以及评价,用户输入入住日期以及入住天数进行预订。

6、用户信息模块:展示了用户的头像、昵称、姓名、手机号码、性别并可进行修改。

7、个人订单模块:展示了全部订单、待付款订单、待入住、已入住,已退房的客房信息。

二、后台功能: 

1、管理员登录模块:管理员可以根据用户名、密码进行登录。

2、统计分析模块:管理员可以直观的查看近一周的客房数量、订单数量、用户数量。

3、会员管理模块:管理员可以查看用户的基本信息。

4、广告管理模块:管理员可以对酒店广告进行新增修改删除。

5、分类管理模块:管理员可以对客房的分类进行新增修改删除。

6、客房管理模块: 管理员可以对客房信息行增删改查。

7、房间管理模块:管理员可以查看目前所有房间的状态并对其进行增删改查。

8、订单管理模块:管理员可以找到用户提交的预订信息并进行开房和退房、查看的操作。

9、评价管理模块:管理员可以对用户的评价进行查询删除。

10、新闻管理模块:管理员可以对用户端新闻进行增删改查。

11、管理员管理模块:管理员可以对管理员的账号行增删改查。

文档截图: 

前台截图: 

后台截图:

package com.wfuhui.modules.order.service.impl;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.wfuhui.modules.room.dao.HouseDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.wfuhui.common.utils.NumberUtil;
import com.wfuhui.modules.member.dao.MemberDao;
import com.wfuhui.modules.order.dao.OrderDao;
import com.wfuhui.modules.order.dao.OrderHouseDao;
import com.wfuhui.modules.order.entity.OrderEntity;
import com.wfuhui.modules.order.entity.OrderHouseEntity;
import com.wfuhui.modules.order.service.OrderService;
import com.wfuhui.modules.room.dao.RoomDao;
import com.wfuhui.modules.room.dao.RoomRecordDao;
import com.wfuhui.modules.room.entity.RoomEntity;
import com.wfuhui.modules.room.entity.RoomRecordEntity;


@Service("orderService")
public class OrderServiceImpl implements OrderService {
	@Autowired
	private OrderDao orderDao;
	@Autowired
	private OrderHouseDao orderHouseDao;
	@Autowired
	private RoomDao roomDao;
	@Autowired
	private RoomRecordDao roomRecordDao;
	@Autowired
	private MemberDao memberDao;
	@Autowired
	private HouseDao houseDao;
	
	@Override
	public OrderEntity queryObject(Integer id){
		OrderEntity order = orderDao.queryObject(id);
		order.setMember(memberDao.queryObject(order.getMemberId()));
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("orderId", order.getId());
		List<OrderHouseEntity> orderHouseList = orderHouseDao.queryList(params);
		order.setOrderHouseList(orderHouseList);
		return order;
	}
	
	@Override
	public List<OrderEntity> queryList(Map<String, Object> map){
		List<OrderEntity> orderList = orderDao.queryList(map);
		for (OrderEntity orderEntity : orderList) {
			Map<String, Object> params = new HashMap<String, Object>();
			params.put("orderId", orderEntity.getId());
			List<OrderHouseEntity> orderHouseList = orderHouseDao.queryList(params);
			orderEntity.setOrderHouseList(orderHouseList);
		}
		return orderList;
	}
	
	@Override
	public int queryTotal(Map<String, Object> map){
		return orderDao.queryTotal(map);
	}
	
	@Override
	public void save(OrderEntity order){
		orderDao.save(order);
	}
	
	@Override
	public void update(OrderEntity order){
		orderDao.update(order);
	}
	
	@Override
	public void delete(Integer orderId){
		orderDao.delete(orderId);
	}
	
	@Override
	public void deleteBatch(Integer[] orderIds){
		orderDao.deleteBatch(orderIds);
	}

	@Override
	@Transactional
	public void createOrder(OrderEntity order) {
		order.setOrderNumber(NumberUtil.getOrderNumber());
		orderDao.save(order);
		List<OrderHouseEntity> orderHouseList = order.getOrderHouseList();
		for (OrderHouseEntity orderHouseEntity : orderHouseList) {
			orderHouseEntity.setOrderId(order.getId());
			orderHouseDao.save(orderHouseEntity);
		}
	}

	@Override
	public void updateByOrderNumber(OrderEntity order) {
		orderDao.updateByOrderNumber(order);
	}

	@Override
	public List<Map<String, String>> queryOrderCount() {
		return orderDao.queryOrderCount();
	}

	@Override
	@Transactional
	public void orderRoom(OrderEntity order) {
		orderDao.update(order);
		RoomEntity room = new RoomEntity();
		room.setRoomNumber(order.getRoomNumber());
		room.setStatus(2);
		roomDao.updateByRoomNumber(room);
		RoomRecordEntity roomRecord = new RoomRecordEntity();
		roomRecord.setCreateTime(new Date());
		roomRecord.setRoomNumber(order.getRoomNumber());
		roomRecord.setMemberId(orderDao.queryObject(order.getId()).getMemberId());
		roomRecord.setStartTime(new Date());
		roomRecord.setOrderId(order.getId());
		roomRecordDao.save(roomRecord);
	}

	@Override
	@Transactional
	public void returnRoom(OrderEntity order) {
		orderDao.update(order);
		RoomEntity room = new RoomEntity();
		room.setRoomNumber(order.getRoomNumber());
		room.setStatus(1);
		RoomRecordEntity roomRecord = roomRecordDao.queryByOrderId(order.getId());
		room.setRoomNumber(roomRecord.getRoomNumber());
		roomDao.updateByRoomNumber(room);
		roomRecord.setEndTime(new Date());
		roomRecordDao.update(roomRecord);
	}

	@Override
	public void delHouseVolume(Integer oid) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("orderId", oid);
		List<OrderHouseEntity> orderHouseList = orderHouseDao.queryList(map);
		if(orderHouseList!=null && !orderHouseList.isEmpty()){
			OrderHouseEntity houseEntity = orderHouseList.get(0);
			Integer houseId = houseEntity.getHouseId();
			houseDao.delVolume(houseId,1);
		}
	}

}

 

<template>
    <div>
        <el-container>
            <el-header><mainHeader></mainHeader>
            </el-header>
            <el-container>
                <mainSidebar :active="active"></mainSidebar>
                <el-main>
                    <el-row :gutter="12">
                      <el-col :span="8">
                        <el-card shadow="always">
                          客房数量
                          <div class="statistics">{{statistics.houseTotal}}</div>
                        </el-card>
                      </el-col>
                      <el-col :span="8">
                        <el-card shadow="always">
                          用户数量
                          <div class="statistics">{{statistics.userTotal}}</div>
                        </el-card>
                      </el-col>
                      <el-col :span="8">
                        <el-card shadow="always">
                          订单数量
                          <div class="statistics">{{statistics.orderTotal}}</div>
                        </el-card>
                      </el-col>
                    </el-row>
                  <el-row>
                    <div id="main" style="width: 100%;height:400px;"></div>
                  </el-row>
                </el-main>
            </el-container>
        </el-container>
    </div>
</template>
<script>
import echarts from 'echarts'
import mainHeader from '../../components/admin-main-header'
import mainSidebar from '../../components/admin-main-sidebar'
export default {
  name: "AdminIndex",
  data() {
    return {
      statistics: {},
      user: null,
      asideStyle: {
        height: '500px'
      },
      active: '1'
    };
  },
  components: {
    mainHeader,
    mainSidebar
  },
  methods:{
    logout: function(){
      localStorage.removeItem("auser");
      this.$router.push("admin_login");
    },
    query: function() {
      var that = this;
      this.$axios.get(this.domain + "/statistics/query", {headers: {
            'token': localStorage.getItem("atoken")
        }}).then(
        function(res){
          var r = res.data;
          //console.log(r)
          if(r.code == 0){
            that.statistics = r.statistics;
            // 基于准备好的dom,初始化echarts实例
            var myChart = echarts.init(document.getElementById('main'));

            // 指定图表的配置项和数据
            var option = {
                title: {
                    text: ''
                },
                tooltip: {},
                legend: {
                    data:['销量']
                },
                xAxis: {
                    data: r.statistics.orderCountList.map(function(v){return v.createTime})
                },
                yAxis: {
                    minInterval: 1,
                },
                series: [{
                    name: '订单数量',
                    type:'line',
                    data: r.statistics.orderCountList.map(function(v){return v.count})
                }]
            };

            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(option);
          }
        }
      )
		}
  },
  created(){
    var docHeight = document.documentElement.clientHeight;
    this.asideStyle.height = docHeight - 76 + "px";
    var user = localStorage.getItem("auser");
    if(user){
        this.user = JSON.parse(user);
    }else{
        this.$router.push("admin_login");
    }
    this.query();
    
  }
};
</script>

<style scoped>
.statistics{
  font-size: 20px; 
  margin-top: 10px; 
  font-weight: blod
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Web前端开发——新年倒计实时刷新

Web前端开发——年倒计实时刷新 H5(HTML5)前端开发是指使用HTML5、CSS3和JavaScript等技术进行网页和移动应用的开发。HTML5是最新的HTML标准,提供了丰富的语义化标签和功能,使得网页可以更加优雅和多样化。CSS3是用于样式表的升级版本,提供了更多的样式效果和布局控制能…

【企业级SpringBoot单体项目模板 】—— 项目代码管理

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot项目模版、企业级、模版、代码管理☀️每日 一言&#xff1a;生命力顽强的种子&#xff0c;从不对瘠土唱诅咒的歌。 文章目录 一、第一种&#xff1a;先创建仓库1.1 创建仓库1.2 clone…

驱动点灯

#include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include "head.h" unsigned int major; char kbuf[128] {}; // 定义三个指针指向映射后的虚拟内存 u…

【LeetCode】59. 螺旋矩阵 II

1 问题 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a; 输入&#xff1a;n…

若依 ruoyi 新增每页分页条数

ruoyi-ui/src/components/Pagination/index.vue 下&#xff0c;找到pageSizes 数组中新增想要分页的数据量 &#xff1a;

Leetcode 202 快乐数(HashSet,环形链表思想)

Leetcode 202 快乐数&#xff08;HashSet&#xff09; 解法1 &#xff1a; 用HashSet来检测循环:star:为什么说数字n的位数由log n给定呢&#xff1f;解法2 &#xff1a; 链表的思想[出现循环表示链表出现环]&#xff0c;使用快慢指针法 题目链接>>>>>>>&…

Nginx介绍,nginx高级应用,nginx虚拟主机配置

HTTP介绍 在应用层 : HTTP&#xff0c;FTP&#xff0c;ssh&#xff0c;SMTP&#xff0c;POP3 网络层&#xff1a; TCP&#xff0c;UDP TCP:可靠的&#xff0c; UDP&#xff1a;不可靠的&#xff0c;直播&#xff0c;视频 qq 微信 HTTP协议是Hyper Text Transfer Protocol&#…

【多线程、单线程、异步编程】三个版本--在爬虫中的应用

并发编程在爬虫中的应用 之前的课程&#xff0c;我们已经为大家介绍了 Python 中的多线程、多进程和异步编程&#xff0c;通过这三种手段&#xff0c;我们可以实现并发或并行编程&#xff0c;这一方面可以加速代码的执行&#xff0c;另一方面也可以带来更好的用户体验。爬虫程…

2023阿里云双十一到底有没有活动?去年就没有

2023阿里云双十一到底有没有活动&#xff1f;根据以往经验&#xff0c;阿里云双11是一次大型促销活动&#xff0c;但是去年好像就没有&#xff0c;印象里去年阿里云没推出双十一活动&#xff0c;因为阿里云一直都活动&#xff0c;没有单独推出双11优惠&#xff0c;阿里云百科给…

投稿时如何上传匿名源码

1 参考博客&#xff1a; how to disclose data for double-blind review and make it archived open data upon acceptance 2 查看DOI&#xff1a; 3 然后在论文参考文献前面放入DOI链接&#xff1a; 7 DATA AVAILABILITY The artifacts and experimental files are archive…

内核初始化的过程

内核的启动从入口函数 start_kernel() 开始。在 init/main.c 文件中&#xff0c;start_kernel 相当于内核的 main 函数。打开这个函数&#xff0c;你会发现&#xff0c;里面是各种各样初始化函数 XXXX_init。 在操作系统里面&#xff0c;先要有个创始进程&#xff0c;有一行指令…

Quartus调用FIFO-IP核verilog,DE1开发板,代码和视频

名称&#xff1a;Quartus调用FIFO-IP核&#xff0c;完成数据的求和 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码功能&#xff1a; 题目&#xff1a;FIFO-IP核的调用 主要内容&#xff1a;调用两个FIFO-IP核&#xff0c;完成2行数据的求和 技术参数&#xff1a…

前言:自动化框架的设计模式

1、UI自动化框架的设计模式 自动化测试框架有很多种&#xff0c;常见的自动化框架分类如下&#xff1a; 在使用上面的自动化框架时&#xff0c;通常会结合使用分层思想&#xff0c;也就是一些自动化框架设计模式&#xff0c;今天重点分享一下UI自动化框架设计使用比较多的一种…

基于yolov5的目标检测和双目测距

目录 一.简介 1.双目视觉 2 YOLOv5 二.双目准备 1双目矫正 2.测距部分代码和函数 三.yolov5部分代码代码展示 效果展示 一.简介 1.双目视觉 双目视觉是通过两个摄像机同时拍摄同一场景&#xff0c;通过计算两幅图像的差异来获取深度信息的一种计算机视觉技术。在双目视…

文心一言 VS 讯飞星火 VS chatgpt (117)-- 算法导论10.3 2题

二、用go语言&#xff0c;对一组同构对象用单数组表示法实现&#xff0c;写出过程ALLOCATE-OBJECT和FREE-OBJECT。 文心一言&#xff1a; 在Go语言中&#xff0c;我们通常使用指针和结构体来表示和操作复杂的数据结构。对于一组同构对象&#xff0c;我们可以使用一个数组来存…

SQL INSERT INTO 语句(在表中插入)

SQL INSERT INTO 语句 INSERT INTO 语句用于向表中插入新的数据行。 SQL INSERT INTO 语法 INSERT INTO 语句可以用两种形式编写。  第一个表单没有指定要插入数据的列的名称&#xff0c;只提供要插入的值&#xff0c;即可添加一行新的数据&#xff1a; INSERT INTO table_n…

【马蹄集】—— 概率论专题:排列组合

概率论专题&#xff1a;排列组合 目录 MT2226 抽奖概率MT2227 饿饿&#xff01;饭饭&#xff01;MT2228 甜甜花的研究MT2229 赌石MT2230 square MT2226 抽奖概率 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 小码哥正在进行抽奖…

积极开拓北美市场,泡泡玛特在美国的首家直营门店正式开业

近几年&#xff0c;随着年轻人在消费市场的声量越来越大&#xff0c;潮玩便像一阵风似地席卷新消费空间&#xff0c;形成一种独特的流行趋势。作为中国领先的潮流文化娱乐公司&#xff0c;泡泡玛特除了深耕潮玩产品本身&#xff0c;也在不断拓展业务版图&#xff0c;推进国际化…

P1664 每日打卡心情好 题解

文章目录 题目背景题目描述输入格式输出格式样例样例输入样例输出 数据范围与提示思路及部分实现完整代码文章小结 题目背景 在洛谷中&#xff0c;打卡不只是一个简单的鼠标点击动作&#xff0c;通过每天在洛谷打卡&#xff0c;可以清晰地记录下自己在洛谷学习的足迹。通过每天…

测试Android webview 加载本地html

最近开发一个需要未联网功能的App, 不熟悉使用Java原生开发界面&#xff0c;于是想使用本地H5做界面&#xff0c;本文测试了使用本地html加载远程数据。直接上代码&#xff1a; MainActivity.java package com.alex.webviewlocal;import androidx.appcompat.app.AppCompatAct…