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

开发工具: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.controller;import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import com.wfuhui.common.utils.DateUtils;
import com.wfuhui.common.utils.Query;
import com.wfuhui.common.utils.R;
import com.wfuhui.modules.room.service.HouseService;
import com.wfuhui.modules.member.service.MemberService;
import com.wfuhui.modules.order.entity.OrderEntity;
import com.wfuhui.modules.order.service.OrderService;/*** 订单* */
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderService orderService;@Autowiredprivate HouseService roomService;@Autowiredprivate MemberService memberService;/*** 列表*/@RequestMapping("/list")public R list(@RequestParam Map<String, Object> params){//查询列表数据Query query = new Query(params);List<OrderEntity> orderList = orderService.queryList(query);int total = orderService.queryTotal(query);return R.ok().put("rows", orderList).put("total", total);}/*** 信息*/@RequestMapping("/info/{id}")public R info(@PathVariable("id") Integer id){OrderEntity order = orderService.queryObject(id);return R.ok().put("order", order);}/*** 保存*/@RequestMapping("/save")public R save(@RequestBody OrderEntity order){orderService.save(order);return R.ok();}/*** 修改*/@RequestMapping("/update")public R update(@RequestBody OrderEntity order){orderService.update(order);return R.ok();}/*** 删除*/@RequestMapping("/delete")public R delete(@RequestBody Integer[] ids){orderService.deleteBatch(ids);return R.ok();}/*** 预订房间* @param orderId* @param roomNumber* @return*/@RequestMapping("/orderRoom/{id}")public R orderRoom(@PathVariable("id")Integer id, String roomNumber) {OrderEntity order = new OrderEntity();order.setId(id);order.setOrderStatus(3);order.setRoomNumber(roomNumber);orderService.orderRoom(order);return R.ok();}/*** 退房* @param orderId* @param roomNumber* @return*/@RequestMapping("/returnRoom/{id}")public R returnRoom(@PathVariable("id")Integer id) {OrderEntity order = new OrderEntity();order.setId(id);order.setOrderStatus(4);orderService.returnRoom(order);//减少已售orderService.delHouseVolume(order.getId());return R.ok();}}
<template><div><el-container><el-header><mainHeader></mainHeader></el-header><el-container><mainSidebar :active="active"></mainSidebar><el-main><div v-if="showList"><el-form :inline="true" :model="q" class="demo-form-inline"><el-form-item label="客房名称"><el-input v-model="q.houseName" placeholder="客房名称"></el-input></el-form-item><el-form-item><el-button type="primary" @click="query">查询</el-button><el-button type="success" @click="add">新增</el-button><el-button type="warning" @click="update">修改</el-button><el-button type="danger" @click="del">删除</el-button></el-form-item></el-form><el-table:data="houseList"style="width: 100%"@selection-change="handleSelectionChange"><el-table-columntype="selection"width="55"></el-table-column><el-table-columnprop="picUrl"label="图片"><template slot-scope="scope"><el-imagestyle="width: 100px; height: 80px":src="scope.row.picUrl"></el-image></template></el-table-column><el-table-columnprop="houseName"label="客房名称"></el-table-column><el-table-columnprop="category.categoryName"label="分类"></el-table-column><el-table-columnprop="price"label="价格"></el-table-column><el-table-columnprop="stock"label="房间数量"></el-table-column><el-table-columnprop="createTime"label="创建时间"></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="q.page":page-sizes="[10, 50, 100]":page-size="q.limit"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination></div><div v-if="!showList"><el-form :model="house" label-width="120px"><el-form-item label="图片"><el-uploadclass="avatar-uploader"action="http://127.0.0.1:10001/api/fileupload/upload"list-type="picture-card"multiple:file-list="fileList":on-success="handleAvatarSuccess":on-remove="imgRemove":before-upload="beforeAvatarUpload"><i class="el-icon-plus avatar-uploader-icon"></i></el-upload></el-form-item><el-form-item label="客房名称"><el-input v-model="house.houseName"></el-input></el-form-item><el-form-item label="分类"><el-select v-model="house.categoryId" placeholder="请选择"><el-optionv-for="item in categoryList":key="item.id":label="item.categoryName":value="item.id"></el-option></el-select></el-form-item><el-form-item label="价格"><el-input v-model="house.price"></el-input></el-form-item><el-form-item label="房间数量"><el-input v-model="house.stock"></el-input></el-form-item><el-form-item label="详情"><quill-editor ref="text" v-model="house.describe" :options="editorOption" style="height: 300px; margin-bottom: 50px;" /></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">保存</el-button><el-button @click="cancel">取消</el-button></el-form-item></el-form></div></el-main></el-container></el-container></div>
</template>
<script>
import { quillEditor } from 'vue-quill-editor'
import {quillRedefine} from 'vue-quill-editor-upload'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.bubble.css'
import 'quill/dist/quill.snow.css'
import mainHeader from '../../../components/admin-main-header'
import mainSidebar from '../../../components/admin-main-sidebar'
export default {name: "House",data() {return {total: 0,houseList: [],categoryList: [],q: {houseName: '',page: this.currentPage,limit: this.pageSize},asideStyle: {height: '500px'},house: {picUrl: ''},active: '5',showList: true,editorOption: {},fileList: [],ids: []};},components: {quillEditor,quillRedefine,mainHeader,mainSidebar},methods:{handleSizeChange(e){//console.log(e)this.q.limit = e;this.query();},handleCurrentChange(e){//console.log(e)this.q.page = e;this.query();},query(){var that = this;this.$axios.get(this.domain + '/house/list',{ headers:{ token: localStorage.getItem("atoken") },params: that.q}).then(function(res){if(res.data.code == 0){//成功that.houseList = res.data.rowsthat.total = res.data.total}else{}})},queryCategory(){var that = this;this.$axios.get(this.domain + '/category/listAll',{headers:{ token: localStorage.getItem("atoken") }}).then(function(res){if(res.data.code == 0){//成功that.categoryList = res.data.categoryList}else{}})},queryHouse(id){var that = this;this.$axios.get(this.domain + '/house/info/'+id,{headers:{ token: localStorage.getItem("atoken") }}).then(function(res){if(res.data.code == 0){//成功that.house = res.data.housethat.initImage(res.data.house.picUrls)}else{}})},initImage(picUrls){this.fileList=[];let urlList = picUrls.map(function(item, index){return {url: picUrls[index]}});for (let url in urlList){this.fileList.push(urlList[url]);}},onSubmit(e){var that = this;var data = this.house;data.picUrls = this.fileList.map(function(item, index){return item.url})data.picUrl = data.picUrls[0]var action = data.id == null ? "save" : "update";this.$axios.post(this.domain + '/house/'+action,data,{headers: {'token': localStorage.getItem("atoken")}}).then(function(res){//console.log(res)if(res.data.code == 0){//成功that.showList = true;that.query();}else{that.errorMsg = res.data.msg;that.$message.error(res.data.msg);}})},add(){this.showList = falsethis.fileList = []this.house = {picUrls: []}},cancel(){this.showList = true},update(){if(this.ids.length != 1){this.$message.info("请选择一条数据");return;}this.showList = false;this.queryHouse(this.ids[0]);},del(){if(this.ids.length == 0){this.$message.info("请选择数据");return;}var that = this;this.$axios.post(this.domain + '/house/delete',that.ids, {headers: {'token': localStorage.getItem("atoken")}}).then(function(res){//console.log(res)if(res.data.code == 0){//成功that.query();}else{that.errorMsg = res.data.msg;that.$message.error(res.data.msg);}})},handleAvatarSuccess(e){this.fileList.push({url: e.url});},imgRemove(file, fileList){this.fileList = fileList;},beforeAvatarUpload(e){},handleSelectionChange(e){var ids = [];for(var i = 0; i < e.length; i++){ids.push(e[i].id)}this.ids = ids;}},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();this.queryCategory();this.editorOption = quillRedefine({// 图片上传的设置uploadConfig: {action: this.domain + '/api/fileupload/upload',  // 必填参数 图片上传地址size: 500,  // 可选参数   图片限制大小,单位为Kb, 1M = 1024Kbaccept: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon',  // 可选参数 可上传的图片格式// 必选参数  res是一个函数,函数接收的response为上传成功时服务器返回的数据// 你必须把返回的数据中所包含的图片地址 return 回去res: (respnse) => {return respnse.url},name: 'file'  // 图片上传参数名}})//console.log(this.editorOption)}
};
</script><style scoped></style>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vueday02——使用NTableData

1.下载naivueui 2.按需导入&#xff0c;不要全局导入 注意不要导入错误组件或者写错组件名称 import { NDataTable } from naive-ui 3.定义表头和数据&#xff01;&#xff01;&#xff01; n-data-table标签必须要使用数据和数据 少一个都不能正确渲染&#xff01;&#xf…

ATA-M4功率放大器都有哪些具体特点及优势

我们的ATA-M系列功率放大器&#xff0c;旨在将它打造为超越ATA-L系列水声功率放大器高频限制的系列产品。其中ATA-M4功率放大器是一款理想的单通道功率放大器。最大输出345Vrms电压&#xff0c;400VA功率&#xff0c;可驱动0~100%的阻性或非阻性负载。输出阻抗匹配多个档位可选…

GCC优化相关

文章目录 优化选项博文链接 单独设置某段代码优化等级博文链接 优化选项 -O/-O0:无优化(默认)-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。该模式在编译大型程序的时候会花费更多的时间和内存。在-O1 下&#xff0c;编译会尝试减少代码体积和代码…

内核初始化的过程

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

JAVA发送消息到RabbitMq

项目中&#xff0c;作为生产者自定义消息发送到RabbitMq。 1.引入rmq依赖 <!-- rabbitmq 依赖 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version></dependen…

SystemVerilog Assertions应用指南 Chapter1.31 在属性中使用形参

可以用定义形参( formal arguments)的方式来重用一些常用的属性。属性“arb”使用了4个形参,并且根据这些形参进行检验。其中还定义了特定的时钟。SVA允许使用属性的形参来定义时钟。这样,属性可以应用在使用不同时钟的相似设计模块中。同样的,时序延迟也可以参数化,这使得属性…

cocos creator 在网页中调试的时候直接代码调试方法

cocos creator 在网页中调试的时候直接代码调试方法

Milvus 介绍

Milvus 介绍 Milvus 矢量数据库是什么&#xff1f;关键概念非结构化数据嵌入向量向量相似度搜索 为什么是 Milvus?支持哪些索引和指标&#xff1f;索引类型相似度指标(Similarity metrics) 应用示例Milvus 是如何设计的&#xff1f;开发者工具API访问Milvus 生态系统工具 本页…

算法专题:双指针

目录 题目1&#xff1a;移动零 题目2&#xff1a;复写零 题目3&#xff1a;快乐数 题目4&#xff1a;最多水的容器 题目5&#xff1a;有效三角形的个数 题目6&#xff1a;两数之和为s 题目1&#xff1a;移动零 给定一个数组nums&#xff0c;编写一个函数将所有的0移动到数…

VueRouter 源码解析

重要函数思维导图 路由注册 在开始之前&#xff0c;推荐大家 clone 一份源码对照着看。因为篇幅较长&#xff0c;函数间的跳转也很多。 使用路由之前&#xff0c;需要调用 Vue.use(VueRouter)&#xff0c;这是因为让插件可以使用 Vue export function initUse(Vue: GlobalAP…

Vue2使用定时器和闭包实现防抖和节流函数。将函数放入util.js中,供具体功能在methods中调用

Vue2使用定时器和闭包实现防抖和节流函数。将函数放入util.js中&#xff0c;供具体功能在methods中调用。<br/ 参考文档&#xff1a; 如何在Vue中优雅的使用防抖节流人类高质量JS防抖与节流机制Vue项目中使用防抖和节流vue2使用lodash中的防抖&#xff08;debounce&#xff…

Android端自定义铃声

随着移动应用竞争进入红海时代&#xff0c;如何在APP推送中别出心裁显得尤为重要。例如对自己的APP推送赋予独特的推送铃声&#xff0c;能够给用户更加理想的使用体验。 1、个性化提醒铃声有助于当收到特定类型的消息时&#xff0c;用户能够立刻识别出来。 2、不同的推送铃声…

性能测试的分类、区别以及特点这些你都知道了吗?

现在性能测试一个比较火的话题&#xff0c;究其原因是因为现在很多公司都要求测试人员会做性能测试&#xff0c;所以今天小编就来普及下性能测试的几种分类和其特点。 关于性能测试有几个名词&#xff1a;性能测试、负载测试、压力测试、并发测试&#xff0c;很多人都是混合使…

零基础制作预约小程序,微信小程序预约服务指南

随着互联网的发展&#xff0c;越来越多的服务开始转移到线上。预约服务也是其中之一。通过微信小程序&#xff0c;商家可以提供更加便捷的预约服务&#xff0c;让客户随时随地预约商品或服务。本文将介绍如何零基础制作预约小程序&#xff0c;包括使用第三方制作平台、选择合适…

可信执行环境简介:ARM 的 TrustZone

目录 可信执行环境安全世界与普通世界 - 上下文切换机制ARMv7 中的异常处理ARMv8 中的异常处理 信任区商业实施TrustZone 本身的漏洞高通Trustonic 信任区强化的弱点结论声明 可信执行环境 具有信任区的 ARM 处理器实现了架构安全性每个物理处理器内核提供两个虚拟的扩展 核心…

使用Spyder进行动态网页爬取:实战指南

导语 知乎数据的攀爬价值在于获取用户观点、知识和需求&#xff0c;进行市场调查、用户画像分析&#xff0c;以及发现热门话题和可能的新兴领域。同时&#xff0c;知乎上的问题并回答也是宝贵的学习资源&#xff0c;用于知识图谱构建和自然语言处理研究。爬取知乎数据为决策和…

扩散模型学习

第一章 1.1 的原理 给定一批训练数据X&#xff0c;假设其服从某种复杂的真实 分布p(x)&#xff0c;则给定的训练数据可视为从该分布中采样的观测样本x。 生成模型就是估计训练数据的真实分布&#xff0c;使得估计的分布q(x)和真实分布p(x)差距尽可能能的小。 使得所有训练…

Spring Security—Servlet 应用架构

目录 一、Filter&#xff08;过滤器&#xff09;回顾 二、DelegatingFilterProxy 三、FilterChainProxy 四、SecurityFilterChain 五、Security Filter 六、打印出 Security Filter 七、添加自定义 Filter 到 Filter Chain 八、处理 Security 异常 九、保存认证之间的…

hbase操作学习

1.namespace list_namespace 展示数据库 create_namespace 可以带属性名 属性值 create_namespace mydb,{author>hjp,ctime>2023-10-18}describe_namespace ‘库名’ 查看库的详细信息 alter_namespace ‘库名’ 修改表的详细信息 删除就是把method设置为unset dr…

pgbackrest归档目录满,清理后写入仍报错,分析及处理

一、 背景 pgbackrest配置的归档目录/backup被写满 归档报错 No space left on device&#xff0c;wal日志堆积 解决方法直接查看第三部分 二、 问题分析及处理 1. 目录清理 首先想到的就是清理/backup目录&#xff0c;清理后剩余6T空间 但发现pgbackrest归档依旧在报错 No …