基于Nodejs+vue开发实现酒店管理系统
作者主页:编程千纸鹤
作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师
主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享
项目编号:BS-QD-KS-002
一,项目简介
本项目使用纯前端技术开发实现一个酒店管理系统,前端采用VUE开发实现,后台通过NODEJS作为服务器开发实现,主要实现了酒店管理系统中的:房型管理、房间管理、顾客管理、订单管理等,用户可以注册并登陆后进行相应的管理操作。主要说明
- 前后端分离技术
- 前端使用vuejs,ElementUI,axios前后端通信,图标使用了ElementUI自带的图标还有font-awesome.css的图标库, 阿里的iconfont图标库也不错,这里没用。
- 后端使用了nodejs,nodejs采用了Express框架,orm采用的是Sequelize操作数据库(效率极高),restful风格的Api, 跨域是由后端解决的,采用的是nodejs的cors模块(比较方便)。
- 数据库采用了mysql5.2(建议大家换成最新的mysql版本)
- 使用jsonwebtoken验证用户调用api的权限,增加接口的安全性,防止恶意攻击接口,串改数据。
- 主要界面里面的图片主要使用的是网上的图片,免费而且美观。
二,环境介绍
语言环境:nodejs
数据库: mysql5.7
应用服务器:nodejs
开发工具:IDEA或vscode
开发技术:nodejs+vue+elementUI
三,系统展示
用户注册
用户登陆
房间管理
房型管理
订单管理
订单管理
四,核心代码展示
const { Op } = require('sequelize')//nodejs的sequelize模块
const express = require('express')//express框架
const admin = require('../crud/table/admin.js')//引入管理员信息表
const token = require('../comment/token.js')//引入token模块
const adminRouter = express.Router()//express路由adminRouter.post('/register',(req,res) =>{//管理员注册const { adminId, adminName, adminPassword } = req.body;admin.findOne({where:{adminId:adminId}}).then(data =>{if(data){res.status(200).json({msg:'该用户已经注册',success:false})return new Promise(() =>{})}else{return admin.create({adminId, adminName, adminPassword})}}).then(data =>{res.status(200).json({success:true,msg:'管理员注册成功!',admin:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器错误!'})})})adminRouter.get('/login',(req,res) =>{//登录const { adminId, adminPassword } = req.query;let adminInfo;admin.findOne({where:{adminId}}).then(data =>{if(data){if(data.get().adminPassword==adminPassword){adminInfo = data.get();return token.setToken(data.get())}else{res.status(200).json({success:false,msg:'用户密码错误!'}); return new Promise(() =>{})}}else{res.status(200).json({success:false,msg:'该用户还未注册!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,admin:adminInfo,token:data,msg:'登录成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器出错!'})})
})adminRouter.put('/update',(req,res) =>{//修改管理员信息const { adminId, adminName, adminPassword, adminSex, adminAge } = req.body;admin.findOne({where:{adminId,adminPassword}}).then(data =>{if(data){return admin.update({adminName,adminSex,adminAge},{where:{adminId,adminPassword}})}else{res.status(200).json({success:false,msg:'管理员账号或者密码错误!'})return new Promise(() =>{})}}).then(data =>{return admin.findOne({where:{adminId,adminPassword}})}).then(data =>{res.status(200).json({success:true,msg:'管理员信息修改成功!',admin:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})adminRouter.delete('/del',(req,res) =>{const { adminId } = req.body || req.query;admin.destroy({where:{adminId}}).then(data =>{res.status(200).json({success:true,msg:'删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'删除失败!'})})
})module.exports = adminRouter;
const { Op } = require('sequelize')//nodejs的sequelize模块
const express = require('express')//express框架
const customer = require('../crud/table/customer.js')//引入用户表const customerRouter = express.Router()//express路由customerRouter.post('/add',(req,res) =>{//用户注册const { customerIdCard, customerName, customerSex, customerPhoneNumber } = req.body;customer.findOne({where:{customerIdCard}}).then(data =>{if(data){res.status(200).json({success:false,msg:'该用户已经注册!'})return new Promise(() =>{})}else{return customer.create({customerIdCard, customerName, customerSex, customerPhoneNumber})}}).then(data =>{res.status(200).json({success:true,msg:'用户信息录入成功!',customer:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器错误!'})})
})// customerRouter.get('/login',(req,res) =>{//用户登录
// const { customerIdCard, cust}
// })customerRouter.put('/update',(req,res) =>{//用户基本信息修改const { customerIdCard, customerName, customerSex, customerPhoneNumber } = req.body;customer.findOne({where:{customerIdCard:{[Op.eq]:customerIdCard}}}).then(data =>{if(data){return customer.update({customerName, customerSex, customerPhoneNumber},{where:{customerIdCard:{[Op.eq]:customerIdCard}}})}else{res.status(200).json({success:false,msg:'该用户还未注册!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,msg:'用户信息修改成功!',customer:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
}) customerRouter.delete('/del',(req,res) =>{//删除用户const { customerIdCard } = req.body;customer.destroy({where:{customerIdCard}}).then(data =>{res.status(200).json({success:true,msg:'用户删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})customerRouter.put('/updatevip',(req,res) =>{//购买会员const { customerIdCard, level } = req.body;customer.findOne({where:{customerIdCard}}).then(data =>{if(data){return customer.update({level},{where:{customerIdCard}})}else{res.status(200).json({success:false,msg:'该用户未注册!'})return new Promise(() =>{})}}).then(data =>{return customer.findOne({where:{customerIdCard}})}).then(data =>{res.status(200).json({success:true,msg:'vip更改成功!',customer:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})})customerRouter.put('/updatemoney',(req,res) =>{//修改用户总消费金额const { customerIdCard, money} = req.body;customer.findOne({where:{customerIdCard}}).then(data =>{if(data){let oldMoney = data.get().totalAmount;let newMoney = oldMoney + money;return customer.update({totalAmount: newMoney},{where:{customerIdCard}})}else{res.status(200).json({success:false,msg:'该用户为注册!'})}}).then(data =>{return customer.findOne({where:{customerIdCard}})}).then(data =>{res.status(200).json({success:true,msg:'用户消费金额修改成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})})customerRouter.get('/getAllCustomer',(req,res) =>{//查询所有顾客customer.findAndCountAll().then(data =>{res.status(200).json({success:true,msg:'顾客信息查询成功!',customerList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
})customerRouter.get('/queryCustomer',(req,res) =>{//模糊查询顾客信息const { queryName } = req.query;customer.findAndCountAll({where:{customerName:{[Op.like]:'%'+queryName+'%'}}}).then(data =>{res.status(200).json({success:true,msg:'顾客信息查询成功!',customerList:data.rows.map(item =>{return item.get()}),count:data.count})}).then(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
})module.exports = customerRouter;
const express = require('express')//express框架
const { Op } = require('sequelize')//nodejs的sequelize模块
const order = require('../crud/table/myorder.js')//引入订单信息表
const customer = require('../crud/table/customer.js')//引入顾客信息表
const room = require('../crud/table/room.js')//引入房间信息表order.hasOne(customer,{ sourceKey:'customerIdCard', foreignKey:'customerIdCard' })
order.hasOne(room,{ sourceKey:'roomNumber', foreignKey:'roomNumber' })const orderRouter = express.Router()orderRouter.post('/add',(req,res) =>{//创建订单console.log(req.body)const { orderNumber, orderStatus,customerIdCard,roomNumber,checkInTime,checkOutTime,totalMoney,remarks} = req.body;order.findOne({where:{orderNumber}}).then(data =>{if(data){res.status(200).json({success:false,msg:'该订单已经存在!'})return new Promise(() =>{})}else{return customer.findOne({where:{customerIdCard}})}}).then(data =>{if(data){return room.update({roomStatus:'已入住'},{where:{roomNumber}})}else{res.status(200).json({success:false,msg:'该用户还未注册!'});return new Promise(() =>{});}}).then(data =>{return order.create({orderNumber, orderStatus,customerIdCard,roomNumber,checkInTime,checkOutTime,totalMoney,remarks})}).then(data =>{res.status(200).json({success:'true',msg:'订单创建成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'内部服务器出错!'})})
})orderRouter.delete('/del',(req,res) =>{//删除订单const { orderNumber } = req.body;order.findOne({where:{orderNumber}}).then(data =>{if(data){return order.destroy({where:{orderNumber}})}else{res.status(200).json({success:false,msg:'该订单不存在!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,msg:'删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.put('/update',(req,res) =>{//修改订单状态const { orderStatus, orderNumber,totalMoney,roomNumber } = req.body;order.findOne({where:{orderNumber}}).then(data =>{if(data){return room.update({roomStatus:'未入住'},{where:{roomNumber}})}else{res.status(200).json({success:false,msg:'该订单不存在!' })return new Promise(() =>{})}}).then(data =>{return order.update({orderStatus,totalMoney},{where:{orderNumber}})}).then(data =>{return order.findOne({where:{orderNumber}})}).then(data =>{res.status(200).json({success:true,msg:'订单修改成功!',order:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})})orderRouter.get('/getAllOrder',(req,res) =>{//查询所有订单const { pageSize, offset } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type','remarks']}]}).then(data =>{res.status(200).json({success:true,msg:'所有订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.get('/getAllNotPayOrder',(req,res) =>{//查询所有未支付的订单const { pageSize, offset } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,where:{orderStatus:{[Op.eq]:'未支付'}},include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type']}]}).then(data =>{res.status(200).json({success:true,msg:'未支付订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count,pageSize:pageSize,offset:offset})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.get('/getAllPayOrder',(req,res) =>{//查询所有已支付的订单const { pageSize, offset } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,where:{orderStatus:{[Op.eq]:'已支付'}},include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type']}]}).then(data =>{res.status(200).json({success:true,msg:'未支付订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count,pageSize:pageSize,offset:offset})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})orderRouter.get('/getStatusOrder',(req,res) =>{//查询所有该状态的订单const { pageSize, offset, orderStatus } = req.query;order.findAndCountAll({limit:pageSize,offset:offset,where:{orderStatus:{[Op.eq]:orderStatus}},include:[{model:customer,foreignKey:'customerIdCard',attributes:['customerName','customerSex','customerVipLevel','customerPhoneNumber','totalAmount']},{model:room,foreignKey:'roomNumber',attributes:['type']}]}).then(data =>{res.status(200).json({success:true,msg:'状态订单查询成功!',orderList:data.rows.map(item =>{return item.get()}),count:data.count,pageSize:pageSize,offset:offset})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})
module.exports = orderRouter;
const express = require('express')//express框架
const { Op } = require('sequelize')//nodejs的sequelize模块
const room = require('../crud/table/room.js')//引入放假信息表
const roomType = require('../crud/table/roomType.js')//引入所有房间类型表room.hasOne(roomType,{ sourceKey:'type',foreignKey:'type'})//每个房间都有一个房间类型const roomRouter = express.Router()roomRouter.post('/add',(req,res) =>{//添加房间const { roomNumber, type, roomStatus, remarks } = req.body;room.findOne({where:{roomNumber}}).then(data =>{if(data){res.status(200).json({success:false,msg:'该房间已经存在!'})return new Promise(() =>{})}else{return room.create({roomNumber, type, roomStatus, remarks})}}).then(data =>{return room.findOne({where:{roomNumber},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]})}).then(data =>{res.status(200).json({success:true,msg:'房间添加成功!',room:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.delete('/del',(req,res) =>{const { roomNumber } = req.body;room.findOne({where:{roomNumber}}).then(data =>{if(data){return room.destroy({where:{roomNumber}})}else{res.status(200).json({success:false,msg:'房间删除失败!'})return new Promise(() =>{})}}).then(data =>{res.status(200).json({success:true,msg:'该房间删除成功!'})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.put('/update',(req,res) =>{//修改房间信息const { roomNumber, type, roomStatus,remarks } = req.body;room.findOne({where:{roomNumber}}).then(data =>{if(data){return room.update({type, roomStatus,remarks},{where:{roomNumber}})}else{res.status(200).json({success:false,msg:'该房间不存在!'})return new Promise(() =>{})}}).then(data =>{return room.findOne({where:{roomNumber}})}).then(data =>{res.status(200).json({success:true,msg:'房间信息修改成功!',room:data.get()})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误'})})
})roomRouter.get('/getAllRoom',(req,res) =>{//获取所有房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset}).then(data =>{let roomList = data.rows.map(item =>{return item.get()})res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:roomList,count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getOneRoom',(req,res) =>{//获取某个房间号的房间信息const { roomNumber } = req.query;room.findOne({where:{roomNumber}}).then(data =>{if(data){res.status(200).json({success:true,msg:'房间查询成功!',room:data.get()})}else{res.status(200).json({success:false,msg:'未查询到该房间信息'})}}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getNotInRoom',(req,res) =>{//获取未入住房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'未入住'}}}).then(data =>{res.status(200).json({success:true,msg:'未入住房间查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getInRoom',(req,res) =>{//查询已入住房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'已入住'}}}).then(data =>{res.status(200).json({success:true,msg:'已入住房间查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getAllRoomPrice',(req,res) =>{//查询所有的房间以及价格const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器内部错误!'})})
})roomRouter.get('/getAllNotINRoomPrice',(req,res) =>{//获取所有未入住的房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'未入住'}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})})
})roomRouter.get('/getAllINRoomPrice',(req,res) =>{//获取所有已入住的房间信息const { pageSize, offset } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:'已入住'}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})})
})roomRouter.get('/getAllRoomTypePrice',(req,res) =>{const { pageSize, offset, type } = req.query;room.findAndCountAll({where:{type:{[Op.eq]:type}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房型查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})}).catch(err =>{res.status(200).json({success:false,msg:'服务器出错!'})})
})roomRouter.get('/getAllStatusRoom',(req,res) =>{//获取所有该状态的房间信息const { pageSize, offset, roomStatus } = req.query;room.findAndCountAll({limit:pageSize,offset:offset,where:{roomStatus:{[Op.eq]:roomStatus}},include:[{model:roomType,foreignKey:'type',attributes:['price','url']}]}).then(data =>{res.status(200).json({success:true,msg:'房间信息查询成功!',roomList:data.rows.map(item =>{return item.get()}),count:data.count})})
})module.exports = roomRouter
五,项目总结
基于Nodejs+vue开发实现酒店管理系统相关推荐
- 基于springboot+Vue的智慧酒店管理系统
真正的大师,永远都怀着一颗学徒的心! 一.项目简介 基于springboot+Vue的智慧酒店管理系统 二.实现功能 支持多端 支持用户管理 支持酒店前台管理 支持酒店管理 支持订单管理 支持系统管理 ...
- 基于SpringBoot+Vue实现的酒店管理系统
[简介] 基于springboot+vue实现的酒店管理系统,用于酒店客房业务管理与酒店内部管理. [功能结构] [技术架构] 后端:springboot+mybatis 前端:vue + eleme ...
- 基于Nodejs+vue开发实现高校学院网站系统
作者主页:编程千纸鹤 作者简介:Java.前端.Pythone开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发.毕业设计开发.面试技术整理.最新技术分享 项目编号:BS-QD-KS-0 ...
- 前端项目:基于Nodejs+vue开发实现高校学院网站系统
作者主页:编程指南针 作者简介:Java领域优质创作者.CSDN博客专家 .掘金特邀作者.多年架构师设计经验.腾讯课堂常驻讲师 主要内容:Java项目.毕业设计.简历模板.学习资料.面试题库.技术互助 ...
- 基于nodejs+vue的平面设计课程管理系统vscode
后台由管理员,教师和学生三个角色,其主要功能包括首页,个人中心,学生管理,教师管理,课程类型管理,课程学习管理,试题讲解管理,作业信息管理,作业提交管理,作业批改管理,在线测试管理,试题管理,我的收藏 ...
- 基于Sprngboot+Vue的分布式酒店管理系统
使用技术:dubbo+zookeeper实现分布式 开发技术:springboot+springmvc+mybatis+shiro(权限管理) 开发工具:IDEA.ECLIPSE 数据库:MYSQL ...
- 基于nodejs+vue驾校预约网站管理系统
系统分为用户和管理员,教练三个角色 目 录 第1章 绪论 1 1.1课题背景 1 1.2 背景意义 1 1.3 研究的内容 2 第2章 相关技术 3 第3章 系统分析 ...
- nodejs+vue+elementui在线日程管理系统php java python
基于nodejs+vue+elementui在线日程管理系统的设计基于现有的浏览器,可以实现首页.个人中心.用户管理.日程安排管理.提醒信息管理.用户统计管理.论坛管理.系统管理等功能.方便用户对首页 ...
- java计算机毕业设计springboot+vue度假山庄酒店管理系统
项目介绍 随着计算机技术的发展,带来社会各行业的进步,信息化逐渐运用到人们的生活中.传统模式的酒店管理满足不了现代人的生活追求,服务质量.服务速度,之前的很多酒店由于人力.物理.财力等原因,一些网站无 ...
- java基于SpringBoot+Vue的高校招生管理系统 element 前后端分离
我们生活的各个领域都涉及到计算机的应用,其中包括招生管理系统的网络应用,在外国招生管理系统已经是很普遍的方式,不过国内的管理网站可能还处于起步阶段.招生管理系统具有招生公告信息管理功能的选择.招生管理 ...
最新文章
- 堆排序怎么建立初始堆_学习笔记-详解堆排序
- [译] Facebook杯2013年编程挑战赛——第一轮题目及答案
- 课堂练习——最大联通之数组
- Jmeter插件-dubbo
- OpenFlow网络中处理正常流量的工作流程
- 数组——询问学号(洛谷 P3156)
- OpenShift 4 之 GitOps(3)用Helm+ArgoCD部署应用,并保持配置同步
- linux 任务计划 cron
- 《Ray Tracing in One Weekend》——Chapter 4: Adding a sphere
- HDU1166-ZKW树
- 关于java多线程堆和栈的共享问题
- 【常识】常用RGB颜色对照表
- 应用数学软件测试题,数学与应用数学专业试题.doc
- 今天来看一下云测平台的测试实验
- 波束赋形技术lms算法在matlab仿真,自适应波束成形算法LMS、RLS、VSSLMS分解
- Altium Designer 网表导入常见问题 网表导入教程 同步原理图与PCB
- js 鼠标拖拽改变div宽度高度
- 计算机程序设计员技能试题,计算机程序设计员理论试题库
- 工具赋能|Python环境搭建
- 【ML】Mean-Shift 原理 + 实践(基于sklearn)
热门文章
- vmware workstation 14 密钥
- 视频应用在区块链上的应用
- stm32f103rbt6基本介绍
- 机器学习成长之路——开篇引题
- 交叉编译 openwrt 平台上的开源 H3C iNode 客户端 njit-client
- java 解析dex_将DEX反编译成Java源代码
- 拯救我们的健康:戒烟应用大盘点
- uniapp 小程序列表懒加载
- 安装,激活(不更新升级)Navicat premium12.0.24(12.0.18)
- abaqus帮助文档html,2534-VUMAT用户子程序翻译ABAQUS帮助手册.doc