• (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、管理员管理模块:管理员可以对管理员的账号行增删改查。

    文档截图: 

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

    前台截图: 

    后台截图:

    1. package com.wfuhui.modules.order.controller;
    2. import java.util.ArrayList;
    3. import java.util.Date;
    4. import java.util.HashMap;
    5. import java.util.List;
    6. import java.util.Map;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.web.bind.annotation.GetMapping;
    9. import org.springframework.web.bind.annotation.PathVariable;
    10. import org.springframework.web.bind.annotation.RequestBody;
    11. import org.springframework.web.bind.annotation.RequestMapping;
    12. import org.springframework.web.bind.annotation.RequestParam;
    13. import org.springframework.web.bind.annotation.RestController;
    14. import com.wfuhui.common.utils.DateUtils;
    15. import com.wfuhui.common.utils.Query;
    16. import com.wfuhui.common.utils.R;
    17. import com.wfuhui.modules.room.service.HouseService;
    18. import com.wfuhui.modules.member.service.MemberService;
    19. import com.wfuhui.modules.order.entity.OrderEntity;
    20. import com.wfuhui.modules.order.service.OrderService;
    21. /**
    22. * 订单
    23. *
    24. */
    25. @RestController
    26. @RequestMapping("/order")
    27. public class OrderController {
    28. @Autowired
    29. private OrderService orderService;
    30. @Autowired
    31. private HouseService roomService;
    32. @Autowired
    33. private MemberService memberService;
    34. /**
    35. * 列表
    36. */
    37. @RequestMapping("/list")
    38. public R list(@RequestParam Map params){
    39. //查询列表数据
    40. Query query = new Query(params);
    41. List orderList = orderService.queryList(query);
    42. int total = orderService.queryTotal(query);
    43. return R.ok().put("rows", orderList).put("total", total);
    44. }
    45. /**
    46. * 信息
    47. */
    48. @RequestMapping("/info/{id}")
    49. public R info(@PathVariable("id") Integer id){
    50. OrderEntity order = orderService.queryObject(id);
    51. return R.ok().put("order", order);
    52. }
    53. /**
    54. * 保存
    55. */
    56. @RequestMapping("/save")
    57. public R save(@RequestBody OrderEntity order){
    58. orderService.save(order);
    59. return R.ok();
    60. }
    61. /**
    62. * 修改
    63. */
    64. @RequestMapping("/update")
    65. public R update(@RequestBody OrderEntity order){
    66. orderService.update(order);
    67. return R.ok();
    68. }
    69. /**
    70. * 删除
    71. */
    72. @RequestMapping("/delete")
    73. public R delete(@RequestBody Integer[] ids){
    74. orderService.deleteBatch(ids);
    75. return R.ok();
    76. }
    77. /**
    78. * 预订房间
    79. * @param orderId
    80. * @param roomNumber
    81. * @return
    82. */
    83. @RequestMapping("/orderRoom/{id}")
    84. public R orderRoom(@PathVariable("id")Integer id, String roomNumber) {
    85. OrderEntity order = new OrderEntity();
    86. order.setId(id);
    87. order.setOrderStatus(3);
    88. order.setRoomNumber(roomNumber);
    89. orderService.orderRoom(order);
    90. return R.ok();
    91. }
    92. /**
    93. * 退房
    94. * @param orderId
    95. * @param roomNumber
    96. * @return
    97. */
    98. @RequestMapping("/returnRoom/{id}")
    99. public R returnRoom(@PathVariable("id")Integer id) {
    100. OrderEntity order = new OrderEntity();
    101. order.setId(id);
    102. order.setOrderStatus(4);
    103. orderService.returnRoom(order);
    104. //减少已售
    105. orderService.delHouseVolume(order.getId());
    106. return R.ok();
    107. }
    108. }
    1. <template>
    2. <div>
    3. <el-container>
    4. <el-header><mainHeader>mainHeader>
    5. el-header>
    6. <el-container>
    7. <mainSidebar :active="active">mainSidebar>
    8. <el-main>
    9. <div v-if="showList">
    10. <el-form :inline="true" :model="q" class="demo-form-inline">
    11. <el-form-item label="客房名称">
    12. <el-input v-model="q.houseName" placeholder="客房名称">el-input>
    13. el-form-item>
    14. <el-form-item>
    15. <el-button type="primary" @click="query">查询el-button>
    16. <el-button type="success" @click="add">新增el-button>
    17. <el-button type="warning" @click="update">修改el-button>
    18. <el-button type="danger" @click="del">删除el-button>
    19. el-form-item>
    20. el-form>
    21. <el-table
    22. :data="houseList"
    23. style="width: 100%"
    24. @selection-change="handleSelectionChange">
    25. <el-table-column
    26. type="selection"
    27. width="55">
    28. el-table-column>
    29. <el-table-column
    30. prop="picUrl"
    31. label="图片"
    32. >
    33. <template slot-scope="scope">
    34. <el-image
    35. style="width: 100px; height: 80px"
    36. :src="scope.row.picUrl">el-image>
    37. template>
    38. el-table-column>
    39. <el-table-column
    40. prop="houseName"
    41. label="客房名称"
    42. >
    43. el-table-column>
    44. <el-table-column
    45. prop="category.categoryName"
    46. label="分类">
    47. el-table-column>
    48. <el-table-column
    49. prop="price"
    50. label="价格">
    51. el-table-column>
    52. <el-table-column
    53. prop="stock"
    54. label="房间数量">
    55. el-table-column>
    56. <el-table-column
    57. prop="createTime"
    58. label="创建时间">
    59. el-table-column>
    60. el-table>
    61. <el-pagination
    62. @size-change="handleSizeChange"
    63. @current-change="handleCurrentChange"
    64. :current-page="q.page"
    65. :page-sizes="[10, 50, 100]"
    66. :page-size="q.limit"
    67. layout="total, sizes, prev, pager, next, jumper"
    68. :total="total">
    69. el-pagination>
    70. div>
    71. <div v-if="!showList">
    72. <el-form :model="house" label-width="120px">
    73. <el-form-item label="图片">
    74. <el-upload
    75. class="avatar-uploader"
    76. action="http://127.0.0.1:10001/api/fileupload/upload"
    77. list-type="picture-card"
    78. multiple
    79. :file-list="fileList"
    80. :on-success="handleAvatarSuccess"
    81. :on-remove="imgRemove"
    82. :before-upload="beforeAvatarUpload">
    83. <i class="el-icon-plus avatar-uploader-icon">i>
    84. el-upload>
    85. el-form-item>
    86. <el-form-item label="客房名称">
    87. <el-input v-model="house.houseName">el-input>
    88. el-form-item>
    89. <el-form-item label="分类">
    90. <el-select v-model="house.categoryId" placeholder="请选择">
    91. <el-option
    92. v-for="item in categoryList"
    93. :key="item.id"
    94. :label="item.categoryName"
    95. :value="item.id">
    96. el-option>
    97. el-select>
    98. el-form-item>
    99. <el-form-item label="价格">
    100. <el-input v-model="house.price">el-input>
    101. el-form-item>
    102. <el-form-item label="房间数量">
    103. <el-input v-model="house.stock">el-input>
    104. el-form-item>
    105. <el-form-item label="详情">
    106. <quill-editor ref="text" v-model="house.describe" :options="editorOption" style="height: 300px; margin-bottom: 50px;" />
    107. el-form-item>
    108. <el-form-item>
    109. <el-button type="primary" @click="onSubmit">保存el-button>
    110. <el-button @click="cancel">取消el-button>
    111. el-form-item>
    112. el-form>
    113. div>
    114. el-main>
    115. el-container>
    116. el-container>
    117. div>
    118. template>
    119. <script>
    120. import { quillEditor } from 'vue-quill-editor'
    121. import {quillRedefine} from 'vue-quill-editor-upload'
    122. import 'quill/dist/quill.core.css'
    123. import 'quill/dist/quill.bubble.css'
    124. import 'quill/dist/quill.snow.css'
    125. import mainHeader from '../../../components/admin-main-header'
    126. import mainSidebar from '../../../components/admin-main-sidebar'
    127. export default {
    128. name: "House",
    129. data() {
    130. return {
    131. total: 0,
    132. houseList: [],
    133. categoryList: [],
    134. q: {
    135. houseName: '',
    136. page: this.currentPage,
    137. limit: this.pageSize
    138. },
    139. asideStyle: {
    140. height: '500px'
    141. },
    142. house: {
    143. picUrl: ''
    144. },
    145. active: '5',
    146. showList: true,
    147. editorOption: {},
    148. fileList: [],
    149. ids: []
    150. };
    151. },
    152. components: {
    153. quillEditor,
    154. quillRedefine,
    155. mainHeader,
    156. mainSidebar
    157. },
    158. methods:{
    159. handleSizeChange(e){
    160. //console.log(e)
    161. this.q.limit = e;
    162. this.query();
    163. },
    164. handleCurrentChange(e){
    165. //console.log(e)
    166. this.q.page = e;
    167. this.query();
    168. },
    169. query(){
    170. var that = this;
    171. this.$axios.get(this.domain + '/house/list',
    172. { headers:{ token: localStorage.getItem("atoken") },
    173. params: that.q
    174. }).then(function(res){
    175. if(res.data.code == 0){//成功
    176. that.houseList = res.data.rows
    177. that.total = res.data.total
    178. }else{
    179. }
    180. })
    181. },
    182. queryCategory(){
    183. var that = this;
    184. this.$axios.get(this.domain + '/category/listAll',
    185. {
    186. headers:{ token: localStorage.getItem("atoken") }
    187. }).then(function(res){
    188. if(res.data.code == 0){//成功
    189. that.categoryList = res.data.categoryList
    190. }else{
    191. }
    192. })
    193. },
    194. queryHouse(id){
    195. var that = this;
    196. this.$axios.get(this.domain + '/house/info/'+id,
    197. {
    198. headers:{ token: localStorage.getItem("atoken") }
    199. }).then(function(res){
    200. if(res.data.code == 0){//成功
    201. that.house = res.data.house
    202. that.initImage(res.data.house.picUrls)
    203. }else{
    204. }
    205. })
    206. },
    207. initImage(picUrls){
    208. this.fileList=[];
    209. let urlList = picUrls.map(function(item, index){
    210. return {url: picUrls[index]}
    211. });
    212. for (let url in urlList){
    213. this.fileList.push(urlList[url]);
    214. }
    215. },
    216. onSubmit(e){
    217. var that = this;
    218. var data = this.house;
    219. data.picUrls = this.fileList.map(function(item, index){
    220. return item.url
    221. })
    222. data.picUrl = data.picUrls[0]
    223. var action = data.id == null ? "save" : "update";
    224. this.$axios.post(this.domain + '/house/'+action,
    225. data,
    226. {
    227. headers: {'token': localStorage.getItem("atoken")}
    228. }
    229. ).then(function(res){
    230. //console.log(res)
    231. if(res.data.code == 0){//成功
    232. that.showList = true;
    233. that.query();
    234. }else{
    235. that.errorMsg = res.data.msg;
    236. that.$message.error(res.data.msg);
    237. }
    238. })
    239. },
    240. add(){
    241. this.showList = false
    242. this.fileList = []
    243. this.house = {
    244. picUrls: []
    245. }
    246. },
    247. cancel(){
    248. this.showList = true
    249. },
    250. update(){
    251. if(this.ids.length != 1){
    252. this.$message.info("请选择一条数据");
    253. return;
    254. }
    255. this.showList = false;
    256. this.queryHouse(this.ids[0]);
    257. },
    258. del(){
    259. if(this.ids.length == 0){
    260. this.$message.info("请选择数据");
    261. return;
    262. }
    263. var that = this;
    264. this.$axios.post(this.domain + '/house/delete',
    265. that.ids, {
    266. headers: {'token': localStorage.getItem("atoken")}
    267. }).then(function(res){
    268. //console.log(res)
    269. if(res.data.code == 0){//成功
    270. that.query();
    271. }else{
    272. that.errorMsg = res.data.msg;
    273. that.$message.error(res.data.msg);
    274. }
    275. })
    276. },
    277. handleAvatarSuccess(e){
    278. this.fileList.push({
    279. url: e.url
    280. });
    281. },
    282. imgRemove(file, fileList){
    283. this.fileList = fileList;
    284. },
    285. beforeAvatarUpload(e){
    286. },
    287. handleSelectionChange(e){
    288. var ids = [];
    289. for(var i = 0; i < e.length; i++){
    290. ids.push(e[i].id)
    291. }
    292. this.ids = ids;
    293. }
    294. },
    295. created(){
    296. var docHeight = document.documentElement.clientHeight;
    297. this.asideStyle.height = docHeight - 76 + "px";
    298. var user = localStorage.getItem("auser");
    299. if(user){
    300. this.user = JSON.parse(user);
    301. }else{
    302. this.$router.push("admin_login");
    303. }
    304. this.query();
    305. this.queryCategory();
    306. this.editorOption = quillRedefine(
    307. {
    308. // 图片上传的设置
    309. uploadConfig: {
    310. action: this.domain + '/api/fileupload/upload', // 必填参数 图片上传地址
    311. size: 500, // 可选参数 图片限制大小,单位为Kb, 1M = 1024Kb
    312. accept: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon', // 可选参数 可上传的图片格式
    313. // 必选参数 res是一个函数,函数接收的response为上传成功时服务器返回的数据
    314. // 你必须把返回的数据中所包含的图片地址 return 回去
    315. res: (respnse) => {
    316. return respnse.url
    317. },
    318. name: 'file' // 图片上传参数名
    319. }
    320. }
    321. )
    322. //console.log(this.editorOption)
    323. }
    324. };
    325. script>
    326. <style scoped>
    327. style>

  • 相关阅读:
    【Tensorflow深度学习】优化算法、损失计算、模型评估、向量嵌入、神经网络等模块的讲解(超详细必看)
    微擎模块 啦啦外卖跑腿小程序最新版14.3 带最新跑腿前端+教学视频 完整包
    stm32cubemx hal学习记录:FreeRTOS信号量
    1696D. Permutation Graph 思维
    Python图像处理算法实战【1】超详细整理 | 新手入门实用指南 | 图像处理基础
    Linux 入门教程 by 程序员鱼皮
    PMP致命三问:考PMP需要报培训班吗?对于没有做过项目管理的人来说,考这个难度大吗?考试具体要准备什么资料?
    Pytorch 实战 LESSON 4 张量的线性代数运算
    SpringBoot整合MongoDB 并进行增删改查
    温故而知新一(C++)
  • 原文地址:https://blog.csdn.net/qq_35334787/article/details/133955681