酒店管理系统

@TOC

springboot221酒店管理系统

课题背景与问题来源

计算机类的管理系统可以帮助人们的工作管理以及生活管理,目前各种管理系统已布满人们的整个生活。计算机类的管理系统还需要网络的支持,近年来,网络发展非常成熟,网速可以达到5G。无论街边小贩还是高档商场都布置了无线网络,网络可以实现信息接收、传递。管理系统和网络相辅相成,减少了工作量,实现了信息的自动化管理。但现在,还有很多事务采用传统的人工手段进行办公管理,有些行业离不开传统方式,比如对于重要事务还需要面对面商讨,所以现在企业中大部分采用传统方式+新型方式的办公手段。

酒店为生活中最常见的设施,来预定酒店的人为全世界各地人世,酒店做为东道主更需要严格管理酒店的所有事项,保证来入住用户的人身安全以及带给他们享受。由于酒店的工作非常多,固定的管理方式根本满足不了需求,需要引入新的管理方式来协助,为了保证安全,对入住人员管控也需要严格把关。大量的入住人员如何才能保证有序安排,如何才能快速审核用户的预定信息是负责酒店管理人员的最大的问题。

1.2课题现状和研究意义

现在管理工作的方式一般为一层分给一层的方式,也就是由第一级的负责人员把工作分配给下一级的人员,再由下一级人员分配给下下一级的人员,实现把工作细分给不同的工作人员,责任到人,一旦出现问题就可以快速的追究到根源。这种方式虽然可以把大的工作量简化成小的工作量,但对于高级管理人员来说信息统计、信息分析以及统管安排还是不好把控。

我国计算机技术和网络技术已发展非常先进,计算机类的管理系统可以帮助人们的工作,提供更专业的办公服务。计算机类的管理系统可以快速收集信息、根据用户命令快速完成要求,并且正确率高。把计算机技术应用到酒店的日常管理工作中去,可以实现用户自主预定酒店,本系统可以快速把预定信息传送到负责人手中,负责人只需要浏览信息完成审核就可以登记用户的入住。解决用户预定的问题,解决用户选择客房的问题,本系统的开发非常有意义。

1.3课题研究内容

  本酒店管理系统使用用户为用户、游客和管理员、员工。用户为游客注册后产生的,管理员为负责酒店管理的领导,游客为非注册人员。员工为酒店的工作人员。游客可以在系统的前台通过填写资料注册成用户,用户可以浏览客房信息、公告信息,实现在线预定。预定后可以管理客房预定信息。管理员在后台可以管理用户信息、审核客房预定、发布公告信息、客房信息以及安排用户的入住等。员工同样可以安排用户的入住以及管理客房的预定。本系统的内容涉及到酒店管理工作中的方方面面,提高用户预定酒店速度以及审核预定的速度。

1.4论文结构安排

  论文的结构安排为论文的章节安排。本论文的章节分为五部分,分别为前导部分、调研部分、设计部分、实现部分和测试部分。前导部分为第一章的绪论,描述了本系统的开发背景、问题来源等内容。调研部分为第二章和第三章,第二章为开发技术的选择分析,第三章为课题的全面分析。设计部分为第四章,包括界面方面、功能方面、数据库方面的设计。实现部分为第五章,描述了具体的界面。测试部分相当于系统的检查,可以检测系统的错误。在论文章节结束后加入总结、致谢和参考文献部分。

第2章 系统开发的核心技术和运行环境选择

2.1技术、环境对比

目前流行的技术为微信小程序、SpringBoot框架、MVC框架、Java语言、App技术等,调试环境热门的有Idea、Mysql、Sqlsever、MyEclipse、Eclipse等。因为本人大学主学SpringBoot框架,SpringBoot框架提供大量框架,可以加快项目的开发,所以本系统选择SpringBoot框架,语言采用和SpringBoot框架搭配的Java语言,在选择运行环境时,因为Idea软件综合性强,支付多种框架,所以选择Idea软件。具体的技术、环境特点下几节详细描述。

2.2 SpringBoot框架介绍

SpringBoot框架是集合了Spring+Cloud的一种集成框架模式。Spring是管理日志权限等各种事务,管理的时候是非常有条理性的,每个不同的层都是由Spring来进行管理的,不同的层之间还可以互相的进行调用,比如Handler可以调用service,service又可以直接调用mapper等,Cloud的工作原理是用JavaBean来完成所有的事情,不仅可以用来服务器端的开发,还可以用在各种应用中,非常的简单好用,而且兼容性非常的好,是一个标准的控制反转和面向切面的标准型容器框架。Cloud负责的是接收外部的数据请求,然后进行安排和处理,首先是服务器先发送访问请求,然后控制器收到请求后可以在配置好的数据文件中进行解析,然后调用处理器进行数据处理,最后把处理好的数据信息进行返回。Spring主要是负责业务代码和数据库表之间进行关联起来,是一个基于Java持久层的框架,去掉了所有的代码参数的手动设置和检索方式,直接通过映射自动来完成,然后生成数据库记录。

2.3 Tomcat服务器介绍

Tomcat是一个免费的轻量的应用服务器,一般是应用在web服务中,常用来Java语言的开发和调试。属于一个优秀的Servlet容器,收到客户端的访问请求时,可以进行加载并处理程序代码,然后进行信息显示。Servlet可以不用浏览器直接运行在服务端上,不光可以在HTTP协议上运行,还可以在其他协议的服务器上运行,非常适合一些中小型项目的开发和使用。

2.4 Mysql数据库介绍

Mysql是一个可以跨平台使用的,非常高效的 数据库系统,可以搭配java,php等语言使用,因为体积小,处理速度非常的快,所以成本也非常的低,而且还是开源的项目,每个企业都可以根据自己的需求进行个性化定制,因为是免费的,所以受到很多开发者的喜爱。Mysql可以提供很多种不同的数据库引擎,能应用在不同的开发场景中,用户可以根据自己的需求选择不同的场景,从而达到最高的性能。还支持跨平台使用,不同的平台直接进行使用,不需要进行任何修改,处理速度快是mysql最大的特征,因为采用了索引压缩和 B树磁盘表,可以很快的进行扫描连接,使sql函数可以得到最大的优化,从而提高处理速度,效率也更高。安全性也是非常的高,登录主机的时候需要基本的密码验证,而且在连接服务器的过程中,都是采用加密的形式,数据信息也有更好的安全保障,存储量也是非常的大,完全能满足一般用户的需求。

2.5 B/S架构介绍

B/S架构是通过www浏览器来实现用户访问,是从c/s架构上进行改进的结构,随着网络技术的发展,各种框架结构都在不停的升级。只需要维护服务器就行了,客户端可以直接通过浏览器运行。c/s一般只能用在局域网上,使用范围非常的小,只适合企业内部使用,B/S只需要有网络就行,可以应用在各种环境,各种平台上,不受时间地点的限制,只要有操作系统安装的有浏览器就可以直接访问,非常的方便。但是c/s安全性更高,因为只能局域网内使用,所以其他人是不能进行访问的,所以更适合企业内部管理使用。而B/S架构相对是开发的,所以安全性相对较低,所以开发的时候可以根据自己的需求选择适合的框架。

第3章 系统分析

3.1系统需求分析

需求分析就是对课题的主题进行是否需要的分析。目前,管理系统的应用已非常广泛,给人们的生活、工作带来了巨大的帮助。管理系统可以减化信息收集、信息统计、信息分析的时间,可以提高人们的工作效率,愉快工作人员的身心,提供服务帮助。本酒店管理系统提供客房信息、公告信息给想要预定酒店的人,可以加快用户找酒店的效率,也可以提供安全有保证的审核机制。

3.2系统可行性分析

系统的可行性关系着系统开发后的成功,如果没有做好系统可行性分析将会很有可能导致系统的淘汰。在开发系统时需要充分考虑到经济方面、操作方面和技术方面、法律方面的可行性。通过搜集相关的资料和进行市场调研分析本系统在经济方面、操作方面、操作方面和法律方面的可行性,下几节进行详细阐述。

3.2.1经济可行性分析

经济可行性主要是从开发这个系统所需要的投入进行分析,对开发好以后的后期维护费用分析,然后对开发完成后是能带来多大的经济效益等方面进行分析。开发这个系统所需要的投入主要是硬件和软件方面,硬件只需要一台计算机设备就行,软件方面采用的编程软件和数据库软件全部都是开源免费的,直接就能网上下载,所以在开发上不需要过多的投入。由于本息系统采用B/S框架开发,所以后期维护的时候只需要在服务端就能完成,非常的简单方便。而本系统开发完成以后,可以帮助企业提高工作效率,减少人工方面的开支,减少企业的管理运营成本,而且通过网络可以帮助企业进行更好的宣传。所以开发本系统在经济上是可行的。

3.2.2 技术可行性分析

技术可行性要先分析所采用的技术是否能满足开发本系统的需求,而且还要多方面的进行考虑。开发本系统采用Java语言,兼容性非常的好,不同的操作系统都可以直接使用,数据库采用Mysql,有很好的安全性,而且处理速度非常的快,完成能满足本系统的数据存储。

3.2.3 法律可行性

开发本系统所用到的技术都是老师上课所教的,所翻阅的相关的资料都是图书馆借阅的,开发所用到的编程软件都是开源免费的,都是从官网下载的。而且开发过程中都是自己原创的,没有抄袭任何其他系统。

3.3系统性能分析

系统性能方面一般指系统的运行、安全、扩展性、兼容性、实用性等方面的问题。考虑到系统除了功能方面以外的所有问题才可以使系统的分析完整,也是保证系统可以顺利开发的基础。

  1. 在开发技术、语言、环境方面的选择上要注意先进性。因为现在科技发展的速度很快,为了延长系统的生命就需要选择更热门的开发语言、技术和环境。本系统采用SpringBoot框架,SpringBoot框架可以支持多种运行环境、兼容性强,可以使系统在运行中选择多种运行软件;
  2. 在保证系统的安全上要注意权限问题和个人资料的问题。不同权限只能管理属于自己权限的功能,这种情况下就需要做好权限划分,所有权限都不能越权操作,管理员为最高权限可以负责所有信息的管理、审核;
  3. 在系统的扩展性上来说要注意接口的预留。由于时间、能力、技术水平等问题,现阶段开发的系统考虑不到更长远的事情,所以预留接口可以保证后期系统的升级,也可以方便后期开发人员进行功能扩展;
  4. 在系统的运行上来说需要注意运行的稳定问题。多人访问系统和单人访问系统效果肯定不一样,当多人在同时操作系统时要注意系统的稳定不出错和不会出现Bug的问题;
  5. 在系统的实用性问题上要注意系统功能的设计。系统要实用还要功能丰富,所以就需要在市场上多次调研,多次参考用户的需求和建议设计更符合用户要求的系统。

3.4系统功能分析

对系统的功能进行分析可以为系统的实现提供基础,也可以保证系统功能的完整,在分析系统功能时需要进行市场调研,本人实际参加酒店的管理工作,并了解工作人员、用户的需求以及了解管理工作的流程,咨询老师、学生的建议完成本次系统功能分析。

本系统的功能分为客房信息管理、公告信息管理、预定信息管理、客房类型管理以及用户信息管理、入住安排管理、酒店简介管理。客房信息功能为用户浏览和预定,公告信息管理功能为管理员发布、用户浏览,预定功能为用户发布,管理员、员工审核和管理,酒店简介管理功能为用户查询、管理员设置,用户信息管理功能为用户和管理员共同管理,系统管理则是管理员负责的。

3.5系统操作流程分析 

一个受欢迎的系统必然有一个好的系统操作流程,简单、友好的操作流程才可以使用户更快速的满足自己的要求。系统的操作流程正确系统的数据才可以被正确调用。从数据的来源到去处进行分析形成数据的闭环。本系统的操作流程为游客注册为用户,用户浏览客房信息完成预定,管理员发布客房和审核用户的预定,用户浏览客房预定结果。员工也可以管理预定信息和安排用户的入住。本系统的操作流程图如下图3.1所示:

图3.1系统操作流程图

3.6角色用例分析

本系统设计的角色为管理员和用户、员工,根据系统功能分析总结角色的用例。

(1)管理员可以管理个人中心信息、公告信息、酒店简介信息、客房类型信息、用户信息、客房信息、入住安排等。管理员的用例图如下图3.2所示:

图3.2管理员用例图

(2)用户可以查询客房信息、公告信息、客房类型信息、预定客房和管理预定信息、个人资料信息等。用户用例图如下图3.3所示:

图3.3用户用例图

(3)员工可以管理酒店客房和客房预定以及安排用户的入住。员工用例图如下图3.4所示:

图3.4员工用例图

第4章 系统设计

4.1系统功能结构设计

功能结构为系统功能的展示,一般采用树形图进行系统功能的结构描述。第一层为系统的名称,第二层为划分的功能界面,第三层为功能界面里的详细功能。本系统的功能结构图第一层为酒店管理系统,第二层为前台、用户、管理员、员工,第三层为相对应的具体功能。本系统的功能结构图如下图4.1所示:

  

图4.1系统功能结构图

4.2数据库设计

任何一个系统中,数据库都是非常重要的一部分,因为数据库做为系统的数据存储,保障着系统的安全,如果数据库出错,那系统肯定也就出错。所以要选择适合自己系统的数据库,然后建立表结构,使系统有更好的关联性,保密性,和完整性。用户进行数据访问时候只能通过正规的通道获取信息,防止非法获取用户数据,必须保证用户的数据安全,这就需要设计数据库的时候进行安全验证。

4.2.1数据ER图设计

数据库ER图设计又称为数据库逻辑结构设计,数据库逻辑结构主要是确定物理架构,然后对数据结构进行构造,建立实体和表之间的关系。数据库ER图是采用不同的图形来描述数据和数据的字段。数据库ER图设计是数据库设计的第一步,只有划分好系统的数据以及数据的字段才可以建立正确的数据库。本系统的数据主要为管理员信息、客房信息、预定信息、用户信息、类型信息等。

  1. 用户需要游客注册后才可以形成,用户信息的ER图如下图4.2所示:

图4.2用户信息ER图

(2) 管理员为系统开发者设置的。管理员信息ER图如下图4.3所示:

图4.3管理员信息ER图

(3)客房信息需要管理员添加后才会展示。客房信息ER图如下图4.4所示:

图4.4客房信息ER图

(4)预定信息为用户预定客房后展示的。预定信息ER图如下图4.5所示:

图4.5预定信息ER图

(5)系统关系ER图如下图4.6所示:

图4.6系统关系ER图

4.2.2数据库表设计

数据库的最终呈现形式为数据库表,数据库表中记录了系统中的所有数据,为了使用户在操作中数据可以正确流动,就需要设置正确的数据库表的关系。本系统的数据库表为用户信息表、客房信息表、客房预定信息表、公告信息表等。本系统的数据库表如下表4.1-4.7所示:

表4.1 config

表4.2 discussjiudianjianjie

表4.3 discussjiudiankefang

表4.4 jiudianjianjie

表4.5 jiudiankefang

表4.6 kefangleixing

表4.7 kefangyuding

表4.8 news

表4.9 ruzhuanpai

表4.10 storeup

表4.11 token

表4.12 users

表4.13 yonghu

表4.14 yuangong

第5章 系统详细实现

5.1前台功能模块的界面实现

系统在运行后进入的第一个页面就是前台首页,前台里的信息可以让任意身份的人员浏览。没有登录的游客也可以使用搜索功能进行信息的搜索。在前台里展示公告信息、客房信息、酒店简介信息以及用户中心功能,后台管理功能、用户登录功能等。前台功能界面实现如下图5.1所示:

图5.1系统前台功能模块的实现界面

5.1.1客房信息功能模块的界面实现

点击客房信息功能后可以进入客房界面,客房界面里展示了查询框,客房信息列表。在查询框里按要求填写关键字点击查询就可以展现相对应的客房信息。客房信息功能的实现界面如下图5.2所示:

图5.2客房信息界面的实现效果

5.1.2客房详情界面实现

本界面是用户点击具体的客房后跳转进入的界面,在客房详情界面里,用户可以预定。客房详情信息的实现界面如下图5.3所示:

图5.3客房详情界面

5.1.3用户登录功能的界面实现

此功能设置在前台的上方,游客通过登录后可以成为用户,在登录时需要选择权限并输入用户名和密码。在此功能里输入的每一种信息都会自动判断,在用户登录时需要三种信息都核对正确才可以登录成功。用户登录功能的实现界面如下图5.4所示:

图5.4用户登录功能的实现界面

5.1.4客房预定功能模块的界面实现

用户登录成功后可以预定客房,客房预定功能的实现界面如下图5.5所示:

图5.5用户预定客房的实现界面

5.1.5酒店简介功能的界面实现

用户通过此功能可以了解酒店信息,酒店简介信息的设计运行界面如下图5.6所示:

图5.6酒店简介信息展现界面

5.1.6在线评价功能的实现

用户可以评价酒店客房。用户在线评价的实现界面如下图5.7所示:

图5.7用户在线评价功能的实现界面

5.1.7用户中心功能的实现

在用户中心里可以修改个人资料和查询客房预定的申请结果以及管理入住安排。用户中心的实现界面如下图5.8所示:

图5.8用户中心功能的实现界面

5.2后台管理员角色的功能界面实现

管理员在后台里可以更新前台的信息,如公告信息、客房分类信息、客房信息,还可以管理用户信息、审核客房预定信息和安排用户的入住,进行酒店简介设置等。后台管理员角色的功能实现界面如下图5.9所示:

图5.9后台管理员的功能实现界面

5.3员工角色功能的实现界面

员工可以管理个人资料和酒店客房预定信息以及对用户安排入住。员工角色功能的实现界面如下图5.10所示:

图5.10员工角色功能的实现界面

第6章 系统测试

系统测试

JiudiankefangController.java
package com.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;

import com.entity.JiudiankefangEntity;
import com.entity.view.JiudiankefangView;

import com.service.JiudiankefangService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;
import com.service.StoreupService;
import com.entity.StoreupEntity;

/**
 * 酒店客房
 * 后端接口
 * @author 
 * @email 
 * @date 2022-04-04 00:20:04
 */
@RestController
@RequestMapping("/jiudiankefang")
public class JiudiankefangController {
    @Autowired
    private JiudiankefangService jiudiankefangService;

    @Autowired
    private StoreupService storeupService;

    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,JiudiankefangEntity jiudiankefang,
		HttpServletRequest request){
        EntityWrapper<JiudiankefangEntity> ew = new EntityWrapper<JiudiankefangEntity>();
		PageUtils page = jiudiankefangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, jiudiankefang), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,JiudiankefangEntity jiudiankefang, 
		HttpServletRequest request){
        EntityWrapper<JiudiankefangEntity> ew = new EntityWrapper<JiudiankefangEntity>();
		PageUtils page = jiudiankefangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, jiudiankefang), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( JiudiankefangEntity jiudiankefang){
       	EntityWrapper<JiudiankefangEntity> ew = new EntityWrapper<JiudiankefangEntity>();
      	ew.allEq(MPUtil.allEQMapPre( jiudiankefang, "jiudiankefang")); 
        return R.ok().put("data", jiudiankefangService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(JiudiankefangEntity jiudiankefang){
        EntityWrapper< JiudiankefangEntity> ew = new EntityWrapper< JiudiankefangEntity>();
 		ew.allEq(MPUtil.allEQMapPre( jiudiankefang, "jiudiankefang")); 
		JiudiankefangView jiudiankefangView =  jiudiankefangService.selectView(ew);
		return R.ok("查询酒店客房成功").put("data", jiudiankefangView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        JiudiankefangEntity jiudiankefang = jiudiankefangService.selectById(id);
		jiudiankefang.setClicknum(jiudiankefang.getClicknum()+1);
		jiudiankefangService.updateById(jiudiankefang);
        return R.ok().put("data", jiudiankefang);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        JiudiankefangEntity jiudiankefang = jiudiankefangService.selectById(id);
		jiudiankefang.setClicknum(jiudiankefang.getClicknum()+1);
		jiudiankefangService.updateById(jiudiankefang);
        return R.ok().put("data", jiudiankefang);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody JiudiankefangEntity jiudiankefang, HttpServletRequest request){
    	jiudiankefang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(jiudiankefang);
        jiudiankefangService.insert(jiudiankefang);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody JiudiankefangEntity jiudiankefang, HttpServletRequest request){
    	jiudiankefang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(jiudiankefang);
        jiudiankefangService.insert(jiudiankefang);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody JiudiankefangEntity jiudiankefang, HttpServletRequest request){
        //ValidatorUtils.validateEntity(jiudiankefang);
        jiudiankefangService.updateById(jiudiankefang);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        jiudiankefangService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<JiudiankefangEntity> wrapper = new EntityWrapper<JiudiankefangEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = jiudiankefangService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	







}

DiscussjiudiankefangController.java
package com.controller;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;

import com.utils.ValidatorUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
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.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.annotation.IgnoreAuth;

import com.entity.DiscussjiudiankefangEntity;
import com.entity.view.DiscussjiudiankefangView;

import com.service.DiscussjiudiankefangService;
import com.service.TokenService;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.CommonUtil;
import java.io.IOException;

/**
 * 酒店客房评论表
 * 后端接口
 * @author 
 * @email 
 * @date 2022-04-04 00:20:05
 */
@RestController
@RequestMapping("/discussjiudiankefang")
public class DiscussjiudiankefangController {
    @Autowired
    private DiscussjiudiankefangService discussjiudiankefangService;


    


    /**
     * 后端列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,DiscussjiudiankefangEntity discussjiudiankefang,
		HttpServletRequest request){
        EntityWrapper<DiscussjiudiankefangEntity> ew = new EntityWrapper<DiscussjiudiankefangEntity>();
		PageUtils page = discussjiudiankefangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussjiudiankefang), params), params));

        return R.ok().put("data", page);
    }
    
    /**
     * 前端列表
     */
	@IgnoreAuth
    @RequestMapping("/list")
    public R list(@RequestParam Map<String, Object> params,DiscussjiudiankefangEntity discussjiudiankefang, 
		HttpServletRequest request){
        EntityWrapper<DiscussjiudiankefangEntity> ew = new EntityWrapper<DiscussjiudiankefangEntity>();
		PageUtils page = discussjiudiankefangService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, discussjiudiankefang), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/lists")
    public R list( DiscussjiudiankefangEntity discussjiudiankefang){
       	EntityWrapper<DiscussjiudiankefangEntity> ew = new EntityWrapper<DiscussjiudiankefangEntity>();
      	ew.allEq(MPUtil.allEQMapPre( discussjiudiankefang, "discussjiudiankefang")); 
        return R.ok().put("data", discussjiudiankefangService.selectListView(ew));
    }

	 /**
     * 查询
     */
    @RequestMapping("/query")
    public R query(DiscussjiudiankefangEntity discussjiudiankefang){
        EntityWrapper< DiscussjiudiankefangEntity> ew = new EntityWrapper< DiscussjiudiankefangEntity>();
 		ew.allEq(MPUtil.allEQMapPre( discussjiudiankefang, "discussjiudiankefang")); 
		DiscussjiudiankefangView discussjiudiankefangView =  discussjiudiankefangService.selectView(ew);
		return R.ok("查询酒店客房评论表成功").put("data", discussjiudiankefangView);
    }
	
    /**
     * 后端详情
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") Long id){
        DiscussjiudiankefangEntity discussjiudiankefang = discussjiudiankefangService.selectById(id);
        return R.ok().put("data", discussjiudiankefang);
    }

    /**
     * 前端详情
     */
	@IgnoreAuth
    @RequestMapping("/detail/{id}")
    public R detail(@PathVariable("id") Long id){
        DiscussjiudiankefangEntity discussjiudiankefang = discussjiudiankefangService.selectById(id);
        return R.ok().put("data", discussjiudiankefang);
    }
    



    /**
     * 后端保存
     */
    @RequestMapping("/save")
    public R save(@RequestBody DiscussjiudiankefangEntity discussjiudiankefang, HttpServletRequest request){
    	discussjiudiankefang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(discussjiudiankefang);
        discussjiudiankefangService.insert(discussjiudiankefang);
        return R.ok();
    }
    
    /**
     * 前端保存
     */
    @RequestMapping("/add")
    public R add(@RequestBody DiscussjiudiankefangEntity discussjiudiankefang, HttpServletRequest request){
    	discussjiudiankefang.setId(new Date().getTime()+new Double(Math.floor(Math.random()*1000)).longValue());
    	//ValidatorUtils.validateEntity(discussjiudiankefang);
        discussjiudiankefangService.insert(discussjiudiankefang);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody DiscussjiudiankefangEntity discussjiudiankefang, HttpServletRequest request){
        //ValidatorUtils.validateEntity(discussjiudiankefang);
        discussjiudiankefangService.updateById(discussjiudiankefang);//全部更新
        return R.ok();
    }
    

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        discussjiudiankefangService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
    
    /**
     * 提醒接口
     */
	@RequestMapping("/remind/{columnName}/{type}")
	public R remindCount(@PathVariable("columnName") String columnName, HttpServletRequest request, 
						 @PathVariable("type") String type,@RequestParam Map<String, Object> map) {
		map.put("column", columnName);
		map.put("type", type);
		
		if(type.equals("2")) {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
			Calendar c = Calendar.getInstance();
			Date remindStartDate = null;
			Date remindEndDate = null;
			if(map.get("remindstart")!=null) {
				Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
				c.setTime(new Date()); 
				c.add(Calendar.DAY_OF_MONTH,remindStart);
				remindStartDate = c.getTime();
				map.put("remindstart", sdf.format(remindStartDate));
			}
			if(map.get("remindend")!=null) {
				Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
				c.setTime(new Date());
				c.add(Calendar.DAY_OF_MONTH,remindEnd);
				remindEndDate = c.getTime();
				map.put("remindend", sdf.format(remindEndDate));
			}
		}
		
		Wrapper<DiscussjiudiankefangEntity> wrapper = new EntityWrapper<DiscussjiudiankefangEntity>();
		if(map.get("remindstart")!=null) {
			wrapper.ge(columnName, map.get("remindstart"));
		}
		if(map.get("remindend")!=null) {
			wrapper.le(columnName, map.get("remindend"));
		}


		int count = discussjiudiankefangService.selectCount(wrapper);
		return R.ok().put("count", count);
	}
	







}

MD5Util.java
package com.utils;

import cn.hutool.crypto.digest.DigestUtil;

public class MD5Util {
    
	/**
	 * @param text明文
	 * @param key密钥
	 * @return 密文
	 */
	// 带秘钥加密
	public static String md5(String text) {
		// 加密后的字符串
		String md5str = DigestUtil.md5Hex(text);
		return md5str;
	}

}

register.vue
<template>
  <div>
        <div class="container">
      <div class="login-form">
        <h1 class="h1">酒店管理系统注册</h1>
		<el-form ref="rgsForm" class="rgs-form" :model="rgsForm">
			<!-- <div v-if="tableName=='yuangong'" class="input-group">
			   <div class="label">员工工号</div>
			   <div class="input-container">
			     <input v-model="ruleForm.yuangonggonghao" class="input" type="text" placeholder="员工工号">
			   </div>
			 </div> -->
			<el-form-item label="员工工号" class="input" v-if="tableName=='yuangong'">
			  <el-input v-model="ruleForm.yuangonggonghao" autocomplete="off" placeholder="员工工号"  />
			</el-form-item>
			<!-- <div v-if="tableName=='yuangong'" class="input-group">
			   <div class="label">员工姓名</div>
			   <div class="input-container">
			     <input v-model="ruleForm.yuangongxingming" class="input" type="text" placeholder="员工姓名">
			   </div>
			 </div> -->
			<el-form-item label="员工姓名" class="input" v-if="tableName=='yuangong'">
			  <el-input v-model="ruleForm.yuangongxingming" autocomplete="off" placeholder="员工姓名"  />
			</el-form-item>
			<!-- <div v-if="tableName=='yuangong'" class="input-group">
			   <div class="label">密码</div>
			   <div class="input-container">
			     <input v-model="ruleForm.mima" class="input" type="text" placeholder="密码">
			   </div>
			 </div> -->
			<el-form-item label="密码" class="input" v-if="tableName=='yuangong'">
			  <el-input v-model="ruleForm.mima" autocomplete="off" placeholder="密码" type="password"#elsetype="text" />
			</el-form-item>
			<el-form-item label="确认密码" class="input" v-if="tableName=='yuangong'">
			  <el-input v-model="ruleForm.mima2" autocomplete="off" placeholder="确认密码" type="password"/>
			</el-form-item>

			<!-- <div v-if="tableName=='yuangong'" class="input-group">
			   <div class="label">联系电话</div>
			   <div class="input-container">
			     <input v-model="ruleForm.lianxidianhua" class="input" type="text" placeholder="联系电话">
			   </div>
			 </div> -->
			<el-form-item label="联系电话" class="input" v-if="tableName=='yuangong'">
			  <el-input v-model="ruleForm.lianxidianhua" autocomplete="off" placeholder="联系电话"  />
			</el-form-item>
			<!-- <div v-if="tableName=='yonghu'" class="input-group">
			   <div class="label">用户名</div>
			   <div class="input-container">
			     <input v-model="ruleForm.yonghuming" class="input" type="text" placeholder="用户名">
			   </div>
			 </div> -->
			<el-form-item label="用户名" class="input" v-if="tableName=='yonghu'">
			  <el-input v-model="ruleForm.yonghuming" autocomplete="off" placeholder="用户名"  />
			</el-form-item>
			<!-- <div v-if="tableName=='yonghu'" class="input-group">
			   <div class="label">姓名</div>
			   <div class="input-container">
			     <input v-model="ruleForm.xingming" class="input" type="text" placeholder="姓名">
			   </div>
			 </div> -->
			<el-form-item label="姓名" class="input" v-if="tableName=='yonghu'">
			  <el-input v-model="ruleForm.xingming" autocomplete="off" placeholder="姓名"  />
			</el-form-item>
			<!-- <div v-if="tableName=='yonghu'" class="input-group">
			   <div class="label">密码</div>
			   <div class="input-container">
			     <input v-model="ruleForm.mima" class="input" type="text" placeholder="密码">
			   </div>
			 </div> -->
			<el-form-item label="密码" class="input" v-if="tableName=='yonghu'">
			  <el-input v-model="ruleForm.mima" autocomplete="off" placeholder="密码" type="password"#elsetype="text" />
			</el-form-item>
			<el-form-item label="确认密码" class="input" v-if="tableName=='yonghu'">
			  <el-input v-model="ruleForm.mima2" autocomplete="off" placeholder="确认密码" type="password"/>
			</el-form-item>

			<!-- <div v-if="tableName=='yonghu'" class="input-group">
			   <div class="label">年龄</div>
			   <div class="input-container">
			     <input v-model="ruleForm.nianling" class="input" type="text" placeholder="年龄">
			   </div>
			 </div> -->
			<el-form-item label="年龄" class="input" v-if="tableName=='yonghu'">
			  <el-input v-model="ruleForm.nianling" autocomplete="off" placeholder="年龄"  />
			</el-form-item>
			<!-- <div v-if="tableName=='yonghu'" class="input-group">
			   <div class="label">手机号</div>
			   <div class="input-container">
			     <input v-model="ruleForm.shoujihao" class="input" type="text" placeholder="手机号">
			   </div>
			 </div> -->
			<el-form-item label="手机号" class="input" v-if="tableName=='yonghu'">
			  <el-input v-model="ruleForm.shoujihao" autocomplete="off" placeholder="手机号"  />
			</el-form-item>
			<div style="display: flex;flex-wrap: wrap;width: 100%;justify-content: center;">
				<el-button class="btn" type="primary" @click="login()">注册</el-button>
				<el-button class="btn close" type="primary" @click="close()">取消</el-button>
			</div>
		</el-form>
      </div>
      <!-- <div class="nk-navigation">
        <a href="#">
          <div @click="login()">注册</div>
        </a>
      </div> -->
    </div>
  </div>
</template>
<script>


export default {
  data() {
    return {
      ruleForm: {
      },
      tableName:"",
      rules: {},
    };
  },
  mounted(){
    let table = this.$storage.get("loginTable");
    this.tableName = table;
      },
  created() {
    
  },
  methods: {
    // 获取uuid
    getUUID () {
      return new Date().getTime();
    },
    close(){
	this.$router.push({ path: "/login" });
    },
    // 注册
    login() {
	var url=this.tableName+"/register";
      if((this.ruleForm.mima!=this.ruleForm.mima2) && `yuangong` == this.tableName){
	    this.$message.error(`两次密码输入不一致`);
	    return
      }
      if(`yuangong` == this.tableName && this.ruleForm.lianxidianhua&&(!this.$validate.isMobile(this.ruleForm.lianxidianhua))){
        this.$message.error(`联系电话应输入手机格式`);
        return
      }
      if((!this.ruleForm.yonghuming) && `yonghu` == this.tableName){
        this.$message.error(`用户名不能为空`);
        return
      }
      if((!this.ruleForm.xingming) && `yonghu` == this.tableName){
        this.$message.error(`姓名不能为空`);
        return
      }
      if((!this.ruleForm.mima) && `yonghu` == this.tableName){
        this.$message.error(`密码不能为空`);
        return
      }
      if((this.ruleForm.mima!=this.ruleForm.mima2) && `yonghu` == this.tableName){
	    this.$message.error(`两次密码输入不一致`);
	    return
      }
      if(`yonghu` == this.tableName && this.ruleForm.nianling&&(!this.$validate.isIntNumer(this.ruleForm.nianling))){
        this.$message.error(`年龄应输入整数`);
        return
      }
      if(`yonghu` == this.tableName && this.ruleForm.shoujihao&&(!this.$validate.isMobile(this.ruleForm.shoujihao))){
        this.$message.error(`手机号应输入手机格式`);
        return
      }
      this.$http({
        url: url,
        method: "post",
        data:this.ruleForm
      }).then(({ data }) => {
        if (data && data.code === 0) {
          this.$message({
            message: "注册成功",
            type: "success",
            duration: 1500,
            onClose: () => {
              this.$router.replace({ path: "/login" });
            }
          });
        } else {
          this.$message.error(data.msg);
        }
      });
    }
  }
};
</script>
<style lang="scss" scoped>
	.el-radio__input.is-checked .el-radio__inner {
		border-color: #00c292;
		background: #00c292;
	}

	.el-radio__input.is-checked .el-radio__inner {
		border-color: #00c292;
		background: #00c292;
	}

	.el-radio__input.is-checked .el-radio__inner {
		border-color: #00c292;
		background: #00c292;
	}

	.el-radio__input.is-checked+.el-radio__label {
		color: #00c292;
	}

	.el-radio__input.is-checked+.el-radio__label {
		color: #00c292;
	}

	.el-radio__input.is-checked+.el-radio__label {
		color: #00c292;
	}

	.h1 {
		margin-top: 10px;
	}

	body {
		padding: 0;
		margin: 0;
	}

	// .container {
 //    min-height: 100vh;
 //    text-align: center;
 //    // background-color: #00c292;
 //    padding-top: 20vh;
 //    background-image: url(../assets/img/bg.jpg);
 //    background-size: 100% 100%;
 //    opacity: 0.9;
 //  }

	// .login-form:before {
	// 	vertical-align: middle;
	// 	display: inline-block;
	// }

	// .login-form {
	// 	max-width: 500px;
	// 	padding: 20px 0;
	// 	width: 80%;
	// 	position: relative;
	// 	margin: 0 auto;

	// 	.label {
	// 		min-width: 60px;
	// 	}

	// 	.input-group {
	// 		max-width: 500px;
	// 		padding: 20px 0;
	// 		width: 80%;
	// 		position: relative;
	// 		margin: 0 auto;
	// 		display: flex;
	// 		align-items: center;

	// 		.input-container {
	// 			display: inline-block;
	// 			width: 100%;
	// 			text-align: left;
	// 			margin-left: 10px;
	// 		}

	// 		.icon {
	// 			width: 30px;
	// 			height: 30px;
	// 		}

	// 		.input {
	// 			position: relative;
	// 			z-index: 2;
	// 			float: left;
	// 			width: 100%;
	// 			margin-bottom: 0;
	// 			box-shadow: none;
	// 			border-top: 0px solid #ccc;
	// 			border-left: 0px solid #ccc;
	// 			border-right: 0px solid #ccc;
	// 			border-bottom: 1px solid #ccc;
	// 			padding: 0px;
	// 			resize: none;
	// 			border-radius: 0px;
	// 			display: block;
	// 			width: 100%;
	// 			height: 34px;
	// 			padding: 6px 12px;
	// 			font-size: 14px;
	// 			line-height: 1.42857143;
	// 			color: #555;
	// 			background-color: #fff;
	// 		}

	// 	}
	// }

	.nk-navigation {
		margin-top: 15px;

		a {
			display: inline-block;
			color: #fff;
			background: rgba(255, 255, 255, .2);
			width: 100px;
			height: 50px;
			border-radius: 30px;
			text-align: center;
			display: flex;
			align-items: center;
			margin: 0 auto;
			justify-content: center;
			padding: 0 20px;
		}

		.icon {
			margin-left: 10px;
			width: 30px;
			height: 30px;
		}
	}

	.register-container {
		margin-top: 10px;

		a {
			display: inline-block;
			color: #fff;
			max-width: 500px;
			height: 50px;
			border-radius: 30px;
			text-align: center;
			display: flex;
			align-items: center;
			margin: 0 auto;
			justify-content: center;
			padding: 0 20px;

			div {
				margin-left: 10px;
			}
		}
	}

	.container {
		height: 100vh;
		background-position: center center;
		background-size: cover;
		background-repeat: no-repeat;
    				background-image: url(http://codegen.caihongy.cn/20211104/2c72d2e0209e4c9697912268f466e083.jpg);
		    
		.login-form {
			right: 50%;
			top: 50%;
			transform: translate3d(50%, -50%, 0);
			border-radius: 10px;
			background-color: rgba(255,255,255,.5);
			font-size: 14px;
			font-weight: 500;
      box-sizing: border-box;

			width: 450px;
			height: auto;
			padding: 0;
			margin: 0;
			border-radius: 50px;
			border-width: 3px;
			border-style: solid;
			border-color: rgba(36, 139, 146, 1);
			background-color: rgba(255, 255, 255, 0.9);
			box-shadow: 0 0 0px 15px rgba(255, 255, 255, 1);

			.h1 {
				width: 400px;
				height: 80px;
				line-height:80px;
				color: #000;
				font-size: 18px;
				padding: 0;
				margin: 10px 0px 20px 10px;
				border-radius: 0;
				border-width: 0;
				border-style: solid;
				border-color: rgba(237, 237, 237, 1);
				background-color: rgba(255, 69, 0, 0);
				box-shadow: 0 0 6px rgba(255,0,0,0);
				text-align: center;
			}

			.rgs-form {
				display: flex;
				flex-direction: column;
				justify-content: center;
				align-items: center;

        .el-form-item {
          width: 100%;
          display: flex;

          & /deep/ .el-form-item__content {
            flex: 1;
            display: flex;
          }
        }

				.input {
          width: 360px;
          height:40px;
          padding: 0;
          margin: 0px 0px 10px 50px;
          border-radius: 0;
          border-width: 0;
          border-style: solid;
          border-color: rgba(255,0,0,0);
          background-color: rgba(144, 238, 144, 0);
          box-shadow: 0 0 6px rgba(255,0,0,0);

					& /deep/ .el-form-item__label {
            width: 80px;
            line-height:40px;
            color: rgba(0, 0, 0, 1);
            font-size: 16px;
            padding: 0px 0px 0px 0px;
            margin: 0px 0px 0px -15px;
            border-radius: 0;
            border-width: 0;
            border-style: solid;
            border-color: rgba(255,0,0,0);
            background-color: rgba(144, 238, 144, 0);
            box-shadow: 0 0 6px rgba(255,0,0,0);
					}

					& /deep/ .el-input__inner {
            width: 200px;
            height: 40px;
            line-height:40px;
            color: #606266;
            font-size: 14px;
            padding: 0px  0px 0px 10px;
            margin: 0px 0px 0px 10px;
            border-radius: 20px;
            border-width: 3px;
            border-style: solid;
            border-color: rgba(28, 129, 137, 1);
            background-color: rgba(255, 255, 255, 1);
            box-shadow: 0 0 6px rgba(255,0,0,0);
            text-align: left;
					}
				}

        .send-code {
          & /deep/ .el-input__inner {
            width: 120px;
            height: 40px;
            line-height:40px;
            color: #606266;
            font-size: 14px;
            padding: 0px 12px 0px 0px;
            margin: 0px 0px 0px 10px;
            border-radius: 20px 0px 0px 20px;
            border-width: 3px;
            border-style: solid;
            border-color: rgba(36, 139, 146, 1);
            background-color: rgba(255, 255, 255, 0.8);
            box-shadow: 0 0 6px rgba(255,0,0,0);
            text-align: left;
          }

          .register-code {
            margin: 0px 0px 0px 0px;
            padding: 5px;
            width: 80px;
            height: 40px;
            line-height:40px;
            color: #fff;
            font-size: 14px;
            border-width: 0;
            border-style: solid;
            border-color: rgba(255,0,0,0);
            border-radius: 0 20px 20px 0;
            background-color: rgba(96, 98, 102, 1);
            box-shadow: 0 0 6px rgba(255,0,0,0);
          }
        }

				.btn {
					margin: 10px 60px 40px 0px ;
          padding: 0;
					width: 88px;
					height: 32px;
          line-height:32px;
					color: #fff;
					font-size: 14px;
					border-width: 0;
					border-style: solid;
					border-color: #409EFF;
					border-radius: 20px;
					background-color: rgba(255, 215, 0, 1);
          box-shadow: 0 0 0px 4px rgba(255,255,255,1);
				}

				.close {
          margin: 10px 20px 40px 0px;
          padding: 0;
          width: 88px;
          height: 32px;
          line-height:32px;
          color: rgba(255, 255, 255, 1);
          font-size: 14px;
          border-width: 0;
          border-style: solid;
          border-color: #409EFF;
          border-radius: 20px;
          background-color: rgba(36, 139, 146, 1);
          box-shadow: 0 0 0px 5px rgba(255,255,255,1);
				}

			}
		}
	}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值