酒店管理系统

项目介绍

         随着中国经济的高速发展,很多民营企业逐渐取代了国有企业成为各个行业的龙头,酒店业就是其中的代表,现在越来越多的连锁酒店取代了传统的公有制招待所,成为了人们出行住宿的首选。

         该酒店管理系统,实现管理员通过后台管理酒店的员工信息,查看客人预定房间信息,进行楼层、房间等信息的管理。顾客通过此系统,可以查看酒店的房型,房间,并可以在线预定房间信息。

         本系统在开发过程中,按照软件开发流程进行开发,系统采用Java语言,选用SSM框架搭建系统代码,实现了前后端的数据分离,让整体逻辑更加清晰,数据库采用Mysql存储数据。

 项目运行截图

 

 

 

 

 

 

 

 

 

总结 :

         在此次项目的开发过程中收获了很多,不管结果如何,起码自己尽力了。在写项目的过程中学到了很多知识;尤其是思维、逻辑和搭档的沟通都有所提升。

         首先分析一下本次项目开发过程中遇到的问题:设计数据库考虑的不是很全面,以至于我们时不时的需要去修改数据库;一修改数据库牵扯了很多代码,后来花了好些时间解决;其次就是功能的实现。当我遇到bug时,会想办法去解决,去翻以前的代码和视频,当解决不了时会和组员们讨论。

         很庆幸坚持把项目做了下来,这其中有同学、组员、老师的帮助,感谢大家!

下面是大部分代码设计:

前台设计

 1、前台用户实现登录和注册

实体类User


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

/**
 * @Title: 客户
 * @ClassName: com.hqyj.pojo.User.java
 * @author: szs
 * @date:  22-09-02 12:52
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private Long id;
    private String loginName;
    private String password;
    private String realName;
    private String idCard;
    private String phone;
    private String email;
    private Integer status;
    private Date createDate;
    private String salt;
}

实体类Room 

public class Room {
    private Integer id;
    private String photo;
    private String roomnum;
    private Integer roomtypeid;
    private Integer floorid;
    //房间状态(1-已预订 2-已入住 3-可预订)
    private Integer status;
    private String roomrequirement;
    private String remark;
    private String roomdesc;

    //房型名称
    private String typeName;
    //楼层名称
    private String floorName;
    //状态字符串
    private String statusStr;

    //床位数
    private Integer bedNum;

    //房型价格
    private Double price;

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Integer getBedNum() {
        return bedNum;
    }

    public void setBedNum(Integer bedNum) {
        this.bedNum = bedNum;
    }

    public String getStatusStr() {
        //判断状态是否为空
        if(status!=null){
            switch (status){
                case 1:
                    statusStr = "已预订";
                    break;
                case 2:
                    statusStr = "已入住";
                    break;
                case 3:
                    statusStr = "可预订";
                    break;
            }
        }
        return statusStr;
    }
    public void setStatusStr(String statusStr) {
        this.statusStr = statusStr;
    }

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    public String getFloorName() {
        return floorName;
    }

    public void setFloorName(String floorName) {
        this.floorName = floorName;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public String getRoomnum() {
        return roomnum;
    }

    public void setRoomnum(String roomnum) {
        this.roomnum = roomnum;
    }

    public Integer getRoomtypeid() {
        return roomtypeid;
    }

    public void setRoomtypeid(Integer roomtypeid) {
        this.roomtypeid = roomtypeid;
    }

    public Integer getFloorid() {
        return floorid;
    }

    public void setFloorid(Integer floorid) {
        this.floorid = floorid;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getRoomrequirement() {
        return roomrequirement;
    }

    public void setRoomrequirement(String roomrequirement) {
        this.roomrequirement = roomrequirement;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public String getRoomdesc() {
        return roomdesc;
    }

    public void setRoomdesc(String roomdesc) {
        this.roomdesc = roomdesc;
    }
}

 实体类RoomType

public class RoomType {
    private Integer id;

    private String typename;

    private String photo;

    private Double price;

    private Integer livenum;

    private Integer bednum;

    private Integer roomnum;

    private Integer reservednum;

    private Integer avilablenum;

    private Integer livednum;

    private Integer status;

    private String remark;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTypename() {
        return typename;
    }

    public void setTypename(String typename) {
        this.typename = typename;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Integer getLivenum() {
        return livenum;
    }

    public void setLivenum(Integer livenum) {
        this.livenum = livenum;
    }

    public Integer getBednum() {
        return bednum;
    }

    public void setBednum(Integer bednum) {
        this.bednum = bednum;
    }

    public Integer getRoomnum() {
        return roomnum;
    }

    public void setRoomnum(Integer roomnum) {
        this.roomnum = roomnum;
    }

    public Integer getReservednum() {
        return reservednum;
    }

    public void setReservednum(Integer reservednum) {
        this.reservednum = reservednum;
    }

    public Integer getAvilablenum() {
        return avilablenum;
    }

    public void setAvilablenum(Integer avilablenum) {
        this.avilablenum = avilablenum;
    }

    public Integer getLivednum() {
        return livednum;
    }

    public void setLivednum(Integer livednum) {
        this.livednum = livednum;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

实体类Floor


public class Floor {
    private Integer id;
    private String name;
    private String remark;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

实体类Orders 

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;

public class Orders {
    private Integer id;//订单主键
    private String ordersno;//订单号
    private Integer accountid;//用户id
    private Integer roomtypeid;//房型ID
    private Integer roomid;//房间ID
    private String reservationname;//预订人姓名
    private String idcard;//身份证号码
    private String phone;//电话
    private Integer status;//订单状态 1-待确认 2-已确认 3-已入住
    //@JSONField(format = "yyyy-MM-dd HH:mm:ss") //阿里巴巴
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") //jackson
    private Date reservedate;//预订时间
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date arrivedate;//入住时间
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date leavedate;//离店时间
    private Double reserveprice;//预订房价
    private String remark;//备注


    //房间对象
    private Room room;
    //房型对象
    private RoomType roomType;

    public Room getRoom() {
        return room;
    }

    public void setRoom(Room room) {
        this.room = room;
    }

    public RoomType getRoomType() {
        return roomType;
    }

    public void setRoomType(RoomType roomType) {
        this.roomType = roomType;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getOrdersno() {
        return ordersno;
    }

    public void setOrdersno(String ordersno) {
        this.ordersno = ordersno;
    }

    public Integer getAccountid() {
        return accountid;
    }

    public void setAccountid(Integer accountid) {
        this.accountid = accountid;
    }

    public Integer getRoomtypeid() {
        return roomtypeid;
    }

    public void setRoomtypeid(Integer roomtypeid) {
        this.roomtypeid = roomtypeid;
    }

    public Integer getRoomid() {
        return roomid;
    }

    public void setRoomid(Integer roomid) {
        this.roomid = roomid;
    }

    public String getReservationname() {
        return reservationname;
    }

    public void setReservationname(String reservationname) {
        this.reservationname = reservationname;
    }

    public String getIdcard() {
        return idcard;
    }

    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Date getReservedate() {
        return reservedate;
    }

    public void setReservedate(Date reservedate) {
        this.reservedate = reservedate;
    }

    public Date getArrivedate() {
        return arrivedate;
    }

    public void setArrivedate(Date arrivedate) {
        this.arrivedate = arrivedate;
    }

    public Date getLeavedate() {
        return leavedate;
    }

    public void setLeavedate(Date leavedate) {
        this.leavedate = leavedate;
    }

    public Double getReserveprice() {
        return reserveprice;
    }

    public void setReserveprice(Double reserveprice) {
        this.reserveprice = reserveprice;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

 UserController.java 

import com.alibaba.fastjson.JSON;
import com.hqyj.pojo.User;
import com.hqyj.service.impl.UserServiceImpl;
import com.hqyj.utils.SystemConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserServiceImpl userService;

    /**
     * @param user
     * @Title: 注册
     * @MethodName: register
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-02 13:39
     */
    @RequestMapping("/register")
    @ResponseBody
    public String register(User user) {
        //创建Map集合,保存结果信息
        Map<String, Object> map = new HashMap<String, Object>();
        //调用注册方法
        if (userService.addUser(user) > 0) {
            map.put(SystemConstant.SUCCESS, true);
            map.put(SystemConstant.MESSAGE, "恭喜你注册成功!");
        } else {
            map.put(SystemConstant.SUCCESS, false);
            map.put(SystemConstant.MESSAGE, "注册失败,请重新注册!");
        }
        return JSON.toJSONString(map);
    }

    /**
     * @param loginName
     * @Title: 根据用户名查询用户
     * @MethodName: checkName
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-02 14:19
     */
    @RequestMapping("/checkName")
    @ResponseBody
    public String checkName(String loginName) {
        //创建Map集合,保存结果信息
        Map<String, Object> map = new HashMap<String, Object>();
        if (userService.findUserByName(loginName) != null) {
            map.put(SystemConstant.EXIST, true);
            map.put(SystemConstant.MESSAGE, "用户名已存在,请重新输入!");
        } else {
            map.put(SystemConstant.EXIST, false);
        }
        return JSON.toJSONString(map);
    }

    /**
     * @param loginName
     * @Title: 登录
     * @MethodName: login
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-02 15:22
     */
    @RequestMapping("/login")
    @ResponseBody
    public String login(String loginName, String password, HttpSession session) {
        //创建Map集合,保存结果信息
        Map<String, Object> map = new HashMap<String, Object>();
        //调用登录方法
        User currentUser = userService.login(loginName, password);
        //判断对象是否为空
        if (currentUser != null) {
            map.put(SystemConstant.SUCCESS, true);
            currentUser.setPassword(null);//清空密码
            //保存用户信息
            session.setAttribute(SystemConstant.FRONT_LOGIN_USER, currentUser);
        } else {
            map.put(SystemConstant.SUCCESS, false);
            map.put(SystemConstant.MESSAGE, "用户名或密码错误!");
        }
        return JSON.toJSONString(map);
    }
}

 UserMapper.java

/**
 * @Title: 添加用户
 * @ClassName: com.hqyj.mapper.UserMapper.java
 * @author: szs
 * @date:  22-09-02 12:54
 *
 */
public interface UserMapper {
    /**
     * @Title: 添加用户
     * @MethodName:  addUser
     * @param user
     * @Return int
     * @Exception
     * @Description:
     * @author: szs
     * @date:  22-09-02 14:12
     */
    int addUser(User user);
    /**
     * @Title: 根据用户名查询用户信息
     * @MethodName:  findUserByName
     * @param loginName
     * @Return com.hqyj.pojo.User
     * @Exception
     * @Description:
     * @author: szs
     * @date:  22-09-02 14:13
     */
    User findUserByName(String loginName);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hqyj.mapper.UserMapper">
    <insert id="addUser">
        insert into t_user(loginName,password,realName,idCard,phone,email,status,createDate,salt
        ) values (#{loginName},#{password},#{realName},#{idCard},#{phone},#{email},#{status},#{createDate},#{salt})
    </insert>

    <select id="findUserByName" resultType="user">
        select * from t_user where loginName = #{loginName}
    </select>
</mapper>

UserService.java

public interface UserService {

    //添加用户
    int addUser(User user);
    //根据用户名查询用户信息
    User findUserByName(String loginName);
    /**
     * @Title: 登录
     * @MethodName:  login
     * @param loginName
     * @param password
     * @Return com.hqyj.pojo.User
     * @Exception
     * @Description:
     * @author: szs
     * @date:  22-09-02 15:14
     */
    User login(String loginName,String password);
}

UserServiceImpl.java

import com.hqyj.mapper.UserMapper;
import com.hqyj.pojo.User;
import com.hqyj.service.UserService;
import com.hqyj.utils.PasswordUtil;
import com.hqyj.utils.SystemConstant;
import com.hqyj.utils.UUIDUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
   /**
    * @Title: 添加用户
    * @MethodName:  addUser
    * @param user
    * @Return int
    * @Exception
    * @Description:
    * @author: szs
    * @date:  22-09-02 13:20
    */
    public int addUser(User user) {
        //自动生成盐值
        user.setSalt(UUIDUtils.randomUUID());//shiro安全验证框架
        //密码加密
        user.setPassword(PasswordUtil.md5(user.getPassword(), user.getSalt(), SystemConstant.PASSWORD_COUNT));
        return userMapper.addUser(user);

    }
    /**
     * @Title: 根据用户名查询用户
     * @MethodName:  findUserByName
     * @param loginName
     * @Return com.hqyj.pojo.User
     * @Exception
     * @Description:
     * @author: szs
     * @date:  22-09-02 14:17
     */
    @Override
    public User findUserByName(String loginName) {
        return userMapper.findUserByName(loginName);
    }

    /**
     * @Title: 用户登录
     * @MethodName:  login
     * @param loginName
     * @param password
     * @Return com.hqyj.pojo.User
     * @Exception
     * @Description:
     * @author: szs
     * @date:  22-09-02 15:21
     */
    @Override
    public User login(String loginName, String password) {
        User loginUser = userMapper.findUserByName(loginName);
        //判断用户是否为空
        if (loginUser != null) {
            //密码加密
            String newPassword = PasswordUtil.md5(password, loginUser.getSalt(), SystemConstant.PASSWORD_COUNT);
            //比较密码是否相等
            if (loginUser.getPassword().equals(newPassword)) {
                return loginUser;
            }
        }return null;
    }
}

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="utf-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
    <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
    <title>酒店管理系统</title>
</head>
<body>
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
    <div class="layui-container">
        <a class="logo" href="index.html">
            <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
        </a>
        <div class="layui-form component" lay-filter="LAY-site-header-component"></div>
        <ul class="layui-nav" id="layui-nav-userinfo">
            <li data-id="index" class="layui-nav-item layui-hide-xs"><a class="fly-case-active" data-type="toTopNav"
                                                                        href="/index.html">首页</a></li>
            <li data-id="room" class="layui-nav-item layui-hide-xs"><a class="fly-case-active"
                                                                       data-type="toTopNav"
                                                                       href="/room/list.html">房间</a></li>
            <li data-id="login" class="layui-nav-item layui-hide-xs layui-this"><a class="fly-case-active"
                                                                                   data-type="toTopNav"
                                                                                   href="/login.jsp">登入</a></li>
            <li data-id="register" class="layui-nav-item layui-hide-xs "><a class="fly-case-active" data-type="toTopNav"
                                                                            href="/register.jsp">注册</a></li>
            <span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span></ul>
    </div>
</div>
<!-- 顶部end -->

<!-- 中间区域开始 -->
<div class="shop-nav shop-index">
    <!--搜索 start-->
    <div id="LAY-topbar" style="height: auto;">
        <form class="layui-form layuimini-form">
            <div class="input-search">
                <div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
                                            autocomplete="off" value="">
                    <button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom"
                            style="background-color: #009688"><i
                            class="layui-icon layui-icon-search"></i></button>
                </div>
                <div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
                        src="${pageContext.request.contextPath}/static/front/images/logo-1.png" alt="layui"> </a></div>
            </div>
        </form>
    </div>
    <!--搜索 end-->
</div>
<!-- 中间区域结束 -->

<!-- 登录start -->
<div class="layui-container shopdata">
    <div class="layui-card shopdata-intro">

        <div class=" login-content">
            <!--登录 start-->
            <div class="login-bg">
                <div class="login-cont w1200">
                    <div class="form-box">
                        <form class="layui-form" action="">
                            <legend>前台用户登录</legend>
                            <div class="layui-form-item">
                                <div class="layui-inline iphone">
                                    <div class="layui-input-inline">
                                        <i class="layui-icon layui-icon-user iphone-icon"></i>
                                        <input type="tel" name="loginName" id="phone" lay-verify="required"
                                               lay-reqText="请输入登录用户名" placeholder="请输入登录用户名" autocomplete="off"
                                               class="layui-input">
                                    </div>
                                </div>
                                <div class="layui-inline iphone">
                                    <div class="layui-input-inline">
                                        <i class="layui-icon layui-icon-password iphone-icon"></i>
                                        <input id="pnum" type="password" name="password" lay-verify="required"
                                               lay-reqText="请输入登录密码" placeholder="请输入登录密码" autocomplete="off"
                                               class="layui-input">
                                    </div>

                                </div>
                            </div>
                            <div class="layui-form-item login-btn">
                                <div class="layui-input-block">
                                    <button class="layui-btn" lay-submit="" lay-filter="login"
                                            style="background-color: #009688">登录
                                    </button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
            <!--登录 end-->

        </div>
    </div>

</div>
<!-- 登录end -->

<!-- 底部 -->
<div class="fly-footer">
    <p><a href="#">酒店系统</a> 2020 © <a href="#">test.cn</a></p>
    <p>
        友情链接
        <a href="http://java.goodym.cn" target="_blank">java项目源码分享网</a>
        <a href="http://www.goodym.cn/code/list/all/1/20.html" target="_blank">源码下载平台</a>
        <a href="http://www.goodym.cn/market/list/all/1/20.html" target="_blank">源码市场</a>
        <a href="http://www.goodym.cn/resumetemplate/list/1/20.html" target="_blank">简历制作</a>
        <a href="http://www.goodym.cn/forum/list/0/1/20.html" target="_blank">社区论坛</a></p>

</div>


<!-- 脚本开始 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
    layui.use(["form", "element", "carousel"], function () {
        var form = layui.form,
            layer = layui.layer,
            element = layui.element,
            carousel = layui.carousel,
            $ = layui.$;

        //渲染轮播图
        carousel.render({
            elem: '#LAY-store-banner'
            , width: '100%' //设置容器宽度
            , height: '460' //设置容器高度
            , arrow: 'always' //始终显示箭头
        });
        //登录
        form.on("submit(login)", function (data) {
            $.post("/user/login", data.field, function (result) {
                if (result.success) {
                    //跳转到首页
                    location.href = "/";
                } else {
                    layer.alert(result.message, {icon: 5});
                }
            }, "json");
            return false;
        });

    });
</script>
<!-- 脚本结束 -->
<ul class="layui-fixbar">
    <li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<div class="layui-layer-move"></div>

</body>
</html>

regisetr.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="utf-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
    <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
    <title>酒店管理系统</title>
</head>
<body>
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
    <div class="layui-container">
        <a class="logo" href="index.html">
            <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
        </a>
        <div class="layui-form component" lay-filter="LAY-site-header-component"></div>
        <ul class="layui-nav" id="layui-nav-userinfo">
            <li data-id="index" class="layui-nav-item layui-hide-xs"><a class="fly-case-active"
                                                                        data-type="toTopNav"
                                                                        href="/index.html">首页</a>
            </li>
            <li data-id="room" class="layui-nav-item layui-hide-xs"><a class="fly-case-active"
                                                                       data-type="toTopNav"
                                                                       href="/room/list.html">房间</a></li>
            <li data-id="login" class="layui-nav-item layui-hide-xs "><a class="fly-case-active" data-type="toTopNav"
                                                                         href="/login.jsp">登入</a></li>
            <li data-id="register" class="layui-nav-item layui-hide-xs layui-this"><a class="fly-case-active"
                                                                                      data-type="toTopNav"
                                                                                      href="/register.jsp">注册</a></li>
            <span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span></ul>
    </div>
</div>
<!-- 顶部end -->

<!-- 中间区域开始 -->
<div class="shop-nav shop-index">
    <!--搜索 start-->
    <div id="LAY-topbar" style="height: auto;">
        <form class="layui-form layuimini-form">
            <div class="input-search">
                <div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
                                            autocomplete="off" value="">
                    <button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom"
                            style="background-color: #009688"><i
                            class="layui-icon layui-icon-search"></i></button>
                </div>
                <div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
                        src="${pageContext.request.contextPath}/static/front/images/logo-1.png" alt="layui"> </a></div>
            </div>
        </form>
    </div>
    <!--搜索 end-->
</div>
<!-- 中间区域结束 -->

<!-- 注册start -->
<div class="layui-container shopdata">
    <div class="layui-card shopdata-intro">

        <div class=" login-content">
            <!--登录 start-->
            <div class="login-bg">
                <div class="login-cont w1200">
                    <div class="form-box">
                        <form class="layui-form" action="">
                            <legend>用户注册</legend>
                            <div class="layui-form-item">

                                <div class="layui-inline iphone">
                                    <div class="layui-input-inline">
                                        <i class="layui-icon layui-icon-user iphone-icon"></i>
                                        <input type="text" name="loginName" id="mNickname" lay-verify="required"
                                               lay-reqText="请输入昵称" placeholder="请输入昵称" autocomplete="off"
                                               class="layui-input">
                                    </div>
                                </div>

                                <div class="layui-inline iphone">
                                    <div class="layui-input-inline">
                                        <i class="layui-icon layui-icon-cellphone iphone-icon"></i>
                                        <input type="tel" name="phone" id="phone" lay-verify="required|phone"
                                               lay-reqText="请输入手机号" placeholder="请输入手机号" autocomplete="off"
                                               class="layui-input">
                                    </div>
                                </div>

                                <div class="layui-inline iphone">
                                    <div class="layui-input-inline">
                                        <i class="layui-icon layui-icon-password iphone-icon"></i>
                                        <input id="pnum" type="password" name="password" lay-verify="required"
                                               lay-reqText="请输入登录密码" placeholder="请输入登录密码" autocomplete="off"
                                               class="layui-input">
                                    </div>
                                </div>
                            </div>
                            <div class="layui-form-item login-btn">
                                <div class="layui-input-block">
                                    <button class="layui-btn" style="background-color: #009688" lay-submit=""
                                            lay-filter="register">提交
                                    </button>
                                </div>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
            <!--登录 end-->

        </div>
    </div>

</div>
<!-- 登注册end -->

<!-- 底部 -->
<div class="fly-footer">
    <p><a href="#">酒店系统</a> 2020 © <a href="#">test.cn</a></p>
    <p>
        友情链接
        <a href="http://java.goodym.cn" target="_blank">java项目源码分享网</a>
        <a href="http://www.goodym.cn/code/list/all/1/20.html" target="_blank">源码下载平台</a>
        <a href="http://www.goodym.cn/market/list/all/1/20.html" target="_blank">源码市场</a>
        <a href="http://www.goodym.cn/resumetemplate/list/1/20.html" target="_blank">简历制作</a>
        <a href="http://www.goodym.cn/forum/list/0/1/20.html" target="_blank">社区论坛</a></p>

</div>


<!-- 脚本开始 -->
<script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
<script>
    layui.use(["form", "element", "carousel"], function () {
        var form = layui.form,
            layer = layui.layer,
            element = layui.element,
            carousel = layui.carousel,
            $ = layui.$;

        //渲染轮播图
        carousel.render({
            elem: '#LAY-store-banner'
            , width: '100%' //设置容器宽度
            , height: '460' //设置容器高度
            , arrow: 'always' //始终显示箭头
        });

        var flag = false;//定义变量,用户是否存在
        //当用户名输入框失去焦点事件触发验证
        $("#mNickname").blur(function () {
            //获取用户名
            var loginName = $("#mNickname").val().trim();
            //判断用户名是否为空,不为空发送请求验证
            if (loginName.length>0) {
                $.get("/user/checkName", {"loginName": loginName}, function (result) {
                    if (result.exist) {
                        layer.alert(result.message, {icon: 5});
                        //修改状态为true,表示用户已经存在
                        flag = true;
                    }else {
                        flag = false;//用户不存在
                    }
                }, "json");
            }
        });
        //表单提交时间
        form.on("submit(register)", function (data) {
            //判断是否存在
            if (flag) {
                layer.alert("用户已经存在,请重新输入",{icon:5});
            }else {
                //发送请求
                $.post("/user/register", data.field, function (result) {
                    if (result.success) {
                        layer.alert(result.message, {icon: 6});
                    } else {
                        layer.alert(result.message, {icon: 5});
                    }
                }, "json");
            }
            return false;
        });
    });
</script>
<!-- 脚本结束 -->
<ul class="layui-fixbar">
    <li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
</ul>
<div class="layui-layer-move"></div>

</body>
</html>

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>

<body>
<script>
    location.href = "/index.html";
</script>
</body>
</html>

home.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en" class="fly-html-layui fly-html-store">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="renderer" content="webkit">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/layui/dist/css/layui.css">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global.css" charset="utf-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/global(1).css" charset="utf-8">
    <link rel="stylesheet" href="${pageContext.request.contextPath}/static/front/css/store.css" charset="utf-8">
    <link rel="icon" href="${pageContext.request.contextPath}/static/front/images/favicon.ico">
    <title>首页-酒店管理系统</title>
<body>
<!-- 顶部start -->
<div class="layui-header header header-store" style="background-color: #393D49;">
    <div class="layui-container">
        <a class="logo" href="index.html">
            <img src="${pageContext.request.contextPath}/static/front/images/logo.png" alt="layui">
        </a>
        <div class="layui-form component" lay-filter="LAY-site-header-component"></div>
        <ul class="layui-nav" id="layui-nav-userinfo">
            <li data-id="index" class="layui-nav-item layui-hide-xs layui-this"><a class="fly-case-active"
                                                                                   data-type="toTopNav"
                                                                                   href="/index.html">首页</a>
            </li>
            <li data-id="room" class="layui-nav-item layui-hide-xs"><a class="fly-case-active"
                                                                       data-type="toTopNav"
                                                                       href="/room/list.html">房间</a></li>
            <li data-id="login" class="layui-nav-item layui-hide-xs "><a class="fly-case-active" data-type="toTopNav"
                                                                         href="/login.jsp">登入</a></li>
            <li data-id="register" class="layui-nav-item layui-hide-xs "><a class="fly-case-active" data-type="toTopNav"
                                                                            href="/register.jsp">注册</a></li>
            <span class="layui-nav-bar" style="left: 560px; top: 55px; width: 0px; opacity: 0;"></span></ul>
    </div>
</div>
<!-- 顶部end -->

<!-- 中间区域开始 -->
<div class="shop-nav shop-index">
    <!--搜索 start-->
    <div id="LAY-topbar" style="height: auto;">
        <form class="layui-form layuimini-form">
            <div class="input-search">
                <div id="searchRoom"><input type="text" placeholder="搜索你需要的房间" name="keywords" id="searchKeywords"
                                            autocomplete="off" value="">
                    <button class="layui-btn layui-btn-shop" lay-submit="" lay-filter="searchHotelRoom"
                            style="background-color: #009688"><i
                            class="layui-icon layui-icon-search"></i></button>
                </div>
                <div class="layui-container layui-hide-xs"><a href="#" class="topbar-logo"> <img
                        src="${pageContext.request.contextPath}/static/front/images/logo-1.png" alt="layui"> </a></div>
            </div>
        </form>
    </div>
    <!--搜索 end-->
    <div class="shop-banner">
        <!-- 左侧导航开始 -->
        <div class="layui-container layui-hide-xs">
            <div class="product-list">
                <dl id="getIndexRoomType">
                    <dt style="background-color: #009688"><a href="lists.html" target="_blank">房间分类</a></dt>
                    <c:forEach var="roomType" items="${roomTypeList}">
                        <dd data-id="${roomType.id}">
                            <a class="fly-case-active" href="/room/list/${roomType.id}"
                               data-type="toRoomTypeList">${roomType.typename}</a>
                        </dd>
                    </c:forEach>
                </dl>
            </div>
        </div>
        <!-- 左侧导航结束 -->

        <!-- 轮播图开始 -->
        <div class="layui-carousel" lay-filter="LAY-store-banner" id="LAY-store-banner" lay-anim lay-indicator="inside">
            <div carousel-item>
                <div class="">
                    <div class="layui-container"><a href="javascript:;" target="_blank"> <img
                            src="${pageContext.request.contextPath}/static/front/images/2.jpg"
                            alt="酒店系统"> </a></div>
                </div>
                <div class="">
                    <div class="layui-container"><a href="javascript:;" target="_blank"> <img
                            src="${pageContext.request.contextPath}/static/front/images/3.jpg"
                            alt="酒店系统"> </a></div>
                </div>
                <div class="layui-this">
                    <div class="layui-container"><a href="javascript:;" target="_blank"> <img
                            src="${pageContext.request.contextPath}/static/front/images/4.jpg"
                            alt="酒店系统"> </a></div>
                </div>
                <div class="">
                    <div class="layui-container"><a href="javascript:;" target="_blank"> <img
                            src="${pageContext.request.contextPath}/static/front/images/5.jpg"
                            alt="酒店系统"> </a></div>
                </div>
                <div class="">
                    <div class="layui-container"><a href="javascript:;" target="_blank"> <img
                            src="${pageContext.request.contextPath}/static/front/images/1.jpg"
                            alt="酒店系统"> </a></div>
                </div>
                <div class="">
                    <div class="layui-container"><a href="javascript:;" target="_blank"> <img
                            src="${pageContext.request.contextPath}/static/front/images/6.jpg"
                            alt="酒店系统"> </a></div>
                </div>
            </div>


            <div class="layui-carousel-ind">
                <ul>
                    <li class=""></li>
                    <li class=""></li>
                    <li class="layui-this"></li>
                    <li class=""></li>
                    <li class=""></li>
                    <li class=""></li>
                </ul>
            </div>
            <button class="layui-icon layui-carousel-arrow" lay-type="sub"></button>
            <button class="layui-icon layui-carousel-arrow" lay-type="add"></button>
        </div>
        <!-- 轮播图结束 -->

        <!-- 酒店楼层开始 -->
        <div class="shop-temp" id="getIndexFloor">
            <c:forEach var="floor" items="${floorList}" varStatus="status">
                <%--判断当前下标是否是偶数行--%>
            <c:if test="${status.index%2==0}">
            <div class="temp-hot">
                </c:if>
                    <%--判断当前下标是否是奇数行--%>
                <c:if test="${status.index%2!=0}">
                <div class="temp-normal" style="background-color: #f2f2f2">
                    </c:if>
                    <div class="layui-container">
                        <p class="temp-title-cn"><span></span>酒店${floor.name}<span></span></p>
                        <div class="layui-row layui-col-space20">
                            <c:forEach var="room" items="${roomList}">
                                <c:if test="${room.floorid == floor.id}">
                                    <div data-id="${room.id}" class="layui-col-xs6 layui-col-md3">
                                        <a class="template store-list-box fly-case-active" href="/room/${room.id}.html"
                                           data-type="toRoomInfo">
                                            <img src="/hotel/show/${room.photo}"
                                                 class="store-list-cover">
                                            <h2 class="layui-elip">${room.typeName}</h2>
                                            <p class="price"><span title="金额"> ¥${room.price} </span> <span title="房号"
                                                                                                            style="color:  #fff;background: #0e88cc;padding: 3px;text-align: center;border: 1px solid #4cffb3;font-size: 13px;"> NO.${room.roomnum} </span>
                                            </p>
                                        </a>
                                    </div>
                                </c:if>
                            </c:forEach>
                        </div>
                    </div>
                </div>
                </c:forEach>
                <!-- 酒店楼层结束 -->
            </div>
        </div>
        <!-- 中间区域结束 -->

        <!-- 底部 -->
        <div class="fly-footer">
            <p><a href="#">酒店系统</a> 2020 © <a href="#">test.cn</a></p>
            <p>
                友情链接
                <a href="http://java.goodym.cn" target="_blank">java项目源码分享网</a>
                <a href="http://www.goodym.cn/code/list/all/1/20.html" target="_blank">源码下载平台</a>
                <a href="http://www.goodym.cn/market/list/all/1/20.html" target="_blank">源码市场</a>
                <a href="http://www.goodym.cn/resumetemplate/list/1/20.html" target="_blank">简历制作</a>
                <a href="http://www.goodym.cn/forum/list/0/1/20.html" target="_blank">社区论坛</a></p>

        </div>


        <!-- 脚本开始 -->
        <script src="${pageContext.request.contextPath}/static/front/layui/dist/layui.js"></script>
        <script>
            layui.use(["form", "element", "carousel"], function () {
                var form = layui.form,
                    layer = layui.layer,
                    element = layui.element,
                    carousel = layui.carousel,
                    $ = layui.$;

                //渲染轮播图
                carousel.render({
                    elem: '#LAY-store-banner'
                    , width: '100%' //设置容器宽度
                    , height: '460' //设置容器高度
                    , arrow: 'always' //始终显示箭头
                });
            });
        </script>
        <!-- 脚本结束 -->
        <ul class="layui-fixbar">
            <li class="layui-icon layui-fixbar-top" lay-type="top" style=""></li>
        </ul>
        <div class="layui-layer-move"></div>
    </div>
</div>
</body>
</html>

前台首页

IndexController.java

import com.hqyj.pojo.Floor;
import com.hqyj.pojo.Room;
import com.hqyj.pojo.RoomType;
import com.hqyj.service.FloorService;
import com.hqyj.service.RoomService;
import com.hqyj.service.RoomTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.ArrayList;
import java.util.List;

/**
 * @Title: 首页
 * @ClassName: com.hqyj.controllers.IndexController.java
 * @author: szs
 * @date: 22-09-02 16:19
 */
@Controller
public class IndexController {

    @Autowired
    private RoomTypeService roomTypeService;
    @Autowired
    private FloorService floorService;
    @Autowired
    private RoomService roomService;

    /**
     * @param model
     * @Title: 首页
     * @MethodName: index
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-02 16:19
     */
    @RequestMapping({"/","index.html"})
    public String index(Model model) {
        //调用查询房型列表的方法
        List<RoomType> roomTypeList = roomTypeService.findRoomTypeList(null);
        //调用查询所有楼层的方法
        List<Floor> floorList = floorService.findFloorList(null);
        //创建集合保存房间列表
        //调用查询每个楼层的房间列表
        List<Room> roomList = roomService.findRoomListByFloorId();
        model.addAttribute("roomList", roomList);
        //将数据放入到model中
        model.addAttribute("roomTypeList", roomTypeList);
        model.addAttribute("floorList", floorList);
        return "forward:/home.jsp";
    }

}

查看房间

RoomController.java

import com.hqyj.pojo.Room;
import com.hqyj.pojo.RoomType;
import com.hqyj.service.RoomService;
import com.hqyj.service.RoomTypeService;
import com.hqyj.vo.RoomVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;

@Controller
@RequestMapping("/room")
public class RoomController {
    @Autowired
    private RoomService roomService;
    @Autowired
    private RoomTypeService roomTypeService;

    /**
     * @param id
     * @Title: 查看房间详情
     * @MethodName: detail
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-02 22:12
     */
    @RequestMapping("/{id}.html")
    public String detail(@PathVariable Integer id, Model model) {
        Room room = roomService.findById(id);
        model.addAttribute("room", room);
        return "detail";
    }

    /**
     * @Title: 查询房间列表
     * @MethodName:  list
     * @param model
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date:  22-09-03 0:23
     */
    @RequestMapping("/list.html")
    public String list(Model model) {
        List<RoomType> roomTypeList = roomTypeService.findRoomTypeList(null);
        //创建查询条件类
        RoomVo roomVo = new RoomVo();
        roomVo.setStatus(3);//可以预定
        //查询房间列表
        List<Room> roomList = roomService.findRoomListByPage(null);
        //将数据放入到模型中
        model.addAttribute("roomTypeList", roomTypeList);
        model.addAttribute("roomList", roomList);
        model.addAttribute("typeId",null);
        return "hotelList";
    }

    /**
     * @param model
     * @param id
     * @Title: 根据房型查询房间列表
     * @MethodName: list
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-03 0:18
     */
    @RequestMapping("/list/{id}")
    public String list(Model model, @PathVariable Integer id) {
        List<RoomType> roomTypeList = roomTypeService.findRoomTypeList(null);
        //创建查询条件类
        RoomVo roomVo = new RoomVo();
        roomVo.setRoomtypeid(id);//房型id
        roomVo.setStatus(3);
        //查询房间列表
        List<Room> roomList = roomService.findRoomListByPage(roomVo);
        //将数据放入到模型中
        model.addAttribute("roomTypeList", roomTypeList);
        model.addAttribute("roomList", roomList);
        model.addAttribute("typeId",id);//将当前选中的房型id保存到模型中,目的是在页面中回显选中的文本
        return "hotelList";
    }
}

RoomMapper.java

import com.hqyj.pojo.Room;
import com.hqyj.vo.RoomVo;
import java.util.List;

public interface RoomMapper {

    /**
     * 查询房间列表
     * @param roomVo
     * @return
     */
    List<Room> findRoomListByPage(RoomVo roomVo);

    /**
     * 添加房间
     * @param room
     * @return
     */
    int addRoom(Room room);
    /**
     * 修改房间
     * @param room
     * @return
     */
    int updateRoom(Room room);

    /**
     * 删除房间
     * @param id
     * @return
     */
    int deleteById(int id);

    /**
     * 根据楼层查询房间列表
     * @return
     */
    List<Room> findRoomListByFloorId();

    /**
     * 查看房间详情
     * @param id
     * @return
     */
    Room findById(Integer id);
}

RoomMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hqyj.mapper.RoleMapper">

    <select id="findRoleList" resultType="role">
        select * from sys_role
        <where>
            <if test="roleName!=null and roleName!=''">
                and roleName like concat('%',#{roleName},'%')
            </if>
        </where>
    </select>

    <insert id="addRole">
        insert into sys_role (roleName,roleDesc) values(#{roleName},#{roleDesc})
    </insert>

    <update id="updateRole">
        update sys_role
        <set>
            <if test="roleName!=null and roleName!=''">
                roleName = #{roleName},
            </if>
            <if test="roleDesc!=null and roleDesc!=''">
                roleDesc = #{roleDesc},
            </if>
        </set>
        where id = #{id}
    </update>

    <delete id="deleteById">
        delete from sys_role where id = #{id}
    </delete>

    <select id="findRoleListByMap" resultType="map">
        select * from sys_role
    </select>

    <select id="findEmployeeRoleByEmployeeId" resultType="int">
        select rid from sys_role_employee where eid = #{employeeId}
    </select>

</mapper>

RoomServiceImpl.java

import com.hqyj.pojo.Room;
import com.hqyj.vo.RoomVo;

import java.util.List;

public interface RoomService {
    /**
     * 查询房间列表
     * @param roomVo
     * @return
     */
    List<Room> findRoomListByPage(RoomVo roomVo);
    /**
     * 添加房间
     * @param room
     * @return
     */
    int addRoom(Room room);

    /**
     * 修改房间
     * @param room
     * @return
     */
    int updateRoom(Room room);

    /**
     * 删除房间
     * @param id
     * @return
     */
    int deleteById(int id);

    /**
     * 根据楼层查询房间列表
     * @return
     */
    List<Room> findRoomListByFloorId();

    /**
     * 查看房间详情
     * @param id
     * @return
     */
    Room findById(Integer id);
}

RoomTypeMapper.java

import com.hqyj.pojo.RoomType;
import com.hqyj.vo.RoomTypeVo;
import org.apache.ibatis.annotations.Select;
import java.util.List;

public interface RoomTypeMapper {

    /**
     * 查询房型列表
     * @param roomTypeVo
     * @return
     */
    List<RoomType> findRoomTypeList(RoomTypeVo roomTypeVo);

    /**
     * 添加房型
     * @param roomType
     * @return
     */
    int addRoomType(RoomType roomType);
    /**
     * 修改房型
     * @param roomType
     * @return
     */
    int updateRoomType(RoomType roomType);

    /**
     * 根据房型ID查询房型信息
     * @param roomtypeid
     * @return
     */
    @Select("select * from t_room_type where id = #{id}")
    RoomType findById(Integer roomtypeid);
}

RoomTypeMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hqyj.mapper.RoomTypeMapper">

    <select id="findRoomTypeList" resultType="roomType">
        select * from t_room_type
        <where>
            <if test="typename!=null and typename!=''">
                and typename like concat('%',#{typename},'%')
            </if>
        </where>
    </select>

    <insert id="addRoomType">
        insert into t_room_type (typename,photo,price,livenum,bednum,roomnum,reservednum,avilablenum,livednum,status,remark)
        values(#{typename},#{photo},#{price},#{livenum},#{bednum},#{roomnum},#{reservednum},#{avilablenum},#{livednum},#{status},#{remark})
    </insert>

    <update id="updateRoomType">
        update t_room_type
        <set>
            <if test="typename!=null and typename!=''">
                typename = #{typename},
            </if>
            <if test="photo!=null and photo!=''">
                photo = #{photo},
            </if>
            <if test="price!=null">
                price = #{price},
            </if>
            <if test="livenum!=null">
                livenum = #{livenum},
            </if>
            <if test="bednum!=null">
                bednum = #{bednum},
            </if>
            <if test="roomnum!=null">
                roomnum = #{roomnum},
            </if>
            <if test="reservednum!=null">
                reservednum = #{reservednum},
            </if>
            <if test="avilablenum!=null">
                avilablenum = #{avilablenum},
            </if>
            <if test="livednum!=null">
                livednum = #{livednum},
            </if>
            <if test="status!=null">
                status = #{status},
            </if>
            <if test="remark!=null and remark!=''">
                remark = #{remark},
            </if>
        </set>
        where id = #{id}
    </update>
</mapper>

 RoomTypeService.java

import com.hqyj.pojo.RoomType;
import com.hqyj.vo.RoomTypeVo;

import java.util.List;

public interface RoomTypeService {
    /**
     * 查询房型列表
     * @param roomTypeVo
     * @return
     */
    List<RoomType> findRoomTypeList(RoomTypeVo roomTypeVo);

    /**
     * 添加房型
     * @param roomType
     * @return
     */
    int addRoomType(RoomType roomType);

    /**
     * 修改房型
     * @param roomType
     * @return
     */
    int updateRoomType(RoomType roomType);
}

RoomTypeServiceImpl.java

import com.hqyj.mapper.RoomTypeMapper;
import com.hqyj.pojo.RoomType;
import com.hqyj.service.RoomTypeService;
import com.hqyj.vo.RoomTypeVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
@Transactional
public class RoomTypeServiceImpl implements RoomTypeService {

    @Resource
    private RoomTypeMapper roomTypeMapper;

    /**
     * 查询房型列表
     *
     * @param roomTypeVo
     * @return
     */
    public List<RoomType> findRoomTypeList(RoomTypeVo roomTypeVo) {
        return roomTypeMapper.findRoomTypeList(roomTypeVo);
    }

    public int addRoomType(RoomType roomType) {
        //可用房间数默认是全部的房间数量
        roomType.setAvilablenum(roomType.getRoomnum());
        roomType.setLivednum(0);//已入住房间数量
        return roomTypeMapper.addRoomType(roomType);
    }

    public int updateRoomType(RoomType roomType) {
        //可用房间数默认是全部的房间数量
        roomType.setAvilablenum(roomType.getRoomnum()); // 10
        roomType.setLivednum(0);//已入住房间数量
        return roomTypeMapper.updateRoomType(roomType);
    }
}

房间预定

OrdersController.java

import com.alibaba.fastjson.JSON;
import com.hqyj.pojo.Orders;
import com.hqyj.service.OrdersService;
import com.hqyj.utils.SystemConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/orders")
public class OrdersController {

    @Autowired
    private OrdersService ordersService;

    /**
     * 添加订单
     * @param orders
     * @return
     */
    @RequestMapping("/addOrders")
    @ResponseBody
    public String addOrders(Orders orders){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用添加订单的方法
        if(ordersService.addOrders(orders)>0){
            map.put(SystemConstant.SUCCESS,true);
            map.put(SystemConstant.MESSAGE,"酒店预订成功");
        }else{
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"酒店预订失败,请重试!");
        }
        return JSON.toJSONString(map);
    }

}

OrdersMapper.java

import com.hqyj.pojo.Orders;
import com.hqyj.vo.OrdersVo;
import java.util.List;

public interface OrdersMapper {
    /**
     * 添加订单
     * @param orders
     * @return
     */
    int addOrders(Orders orders);

    /**
     * 查询订单列表
     * @param ordersVo
     * @return
     */
    List<Orders> findOrdersList(OrdersVo ordersVo);

    /**
     * 修改订单
     * @param orders
     * @return
     */
    int updateOrders(Orders orders);
}

OrdersMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hqyj.mapper.OrdersMapper">

    <!-- 定义基础的ResultMap -->
    <resultMap id="BaseResultMap" type="orders">
        <id column="id" property="id" />
        <result column="ordersNo"  property="ordersno" />
        <result column="accountId" property="accountid" />
        <result column="roomTypeId"  property="roomtypeid" />
        <result column="roomId"  property="roomid" />
        <result column="reservationName" property="reservationname" />
        <result column="idCard" property="idcard" />
        <result column="phone" property="phone" />
        <result column="status"  property="status" />
        <result column="reserveDate"  property="reservedate" />
        <result column="arriveDate"  property="arrivedate" />
        <result column="leaveDate" property="leavedate" />
        <result column="reservePrice"  property="reserveprice" />
        <result column="remark"  property="remark" />
    </resultMap>

    <resultMap id="ordersRoomAndTypeResultMap" type="orders" extends="BaseResultMap">
        <!-- 配置订单与房间关系 -->
        <association property="room" javaType="room">
            <id column="id" property="id"/>
            <result property="roomnum" column="roomnum"/>
        </association>
        <!-- 配置订单与房型关系 -->
        <association property="roomType" javaType="roomType">
            <id property="id" column="id"/>
            <result property="typename" column="typename"/>
        </association>
    </resultMap>


    <insert id="addOrders">
        insert into t_orders (ordersno,accountid,roomtypeid,roomid,reservationname,idcard,phone,status,reservedate,
        arrivedate,leavedate,reserveprice,remark)
        values (#{ordersno},#{accountid},#{roomtypeid},#{roomid},#{reservationname},#{idcard},#{phone},
        #{status},#{reservedate},#{arrivedate},#{leavedate},#{reserveprice},#{remark})
    </insert>

    <select id="findOrdersList" resultMap="ordersRoomAndTypeResultMap">
        select o.*,r.`roomNum`,t.`typeName` from t_orders o
        inner join t_room r on r.id = o.`roomId`
        inner join t_room_type t on t.id = r.`roomTypeId`
        <where>
            <if test="reservationname!=null and reservationname!=''">
                and o.reservationname like concat('%',#{reservationname},'%')
            </if>
            <if test="idcard!=null and idcard!=''">
                and o.idcard like concat('%',#{idcard},'%')
            </if>
            <if test="phone!=null and phone!=''">
                and o.phone like concat('%',#{phone},'%')
            </if>
            <if test="roomtypeid!=null">
                and o.roomtypeid = #{roomtypeid}
            </if>
            <if test="status!=null">
                and o.status = #{status}
            </if>
            <if test="startDate!=null">
                <![CDATA[ and o.reservedate >= #{startDate} ]]>
            </if>
            <if test="endDate!=null">
                <![CDATA[ and o.reservedate <= #{endDate }]]>
            </if>
        </where>
    </select>

    <update id="updateOrders" parameterType="orders">
        update t_orders
        <set>
            <if test="ordersno != null">
                ordersNo = #{ordersno,jdbcType=VARCHAR},
            </if>
            <if test="accountid != null">
                accountId = #{accountid,jdbcType=BIGINT},
            </if>
            <if test="roomtypeid != null">
                roomTypeId = #{roomtypeid,jdbcType=INTEGER},
            </if>
            <if test="roomid != null">
                roomId = #{roomid,jdbcType=BIGINT},
            </if>
            <if test="reservationname != null">
                reservationName = #{reservationname,jdbcType=VARCHAR},
            </if>
            <if test="idcard != null">
                idCard = #{idcard,jdbcType=VARCHAR},
            </if>
            <if test="phone != null">
                phone = #{phone,jdbcType=VARCHAR},
            </if>
            <if test="status != null">
                status = #{status,jdbcType=INTEGER},
            </if>
            <if test="reservedate != null">
                reserveDate = #{reservedate,jdbcType=TIMESTAMP},
            </if>
            <if test="arrivedate != null">
                arriveDate = #{arrivedate,jdbcType=TIMESTAMP},
            </if>
            <if test="leavedate != null">
                leaveDate = #{leavedate,jdbcType=TIMESTAMP},
            </if>
            <if test="reserveprice != null">
                reservePrice = #{reserveprice,jdbcType=DECIMAL},
            </if>
            <if test="remark != null">
                remark = #{remark,jdbcType=VARCHAR},
            </if>
        </set>
        where id = #{id,jdbcType=BIGINT}
    </update>

</mapper>

OrdersService.java

import com.hqyj.pojo.Orders;
import com.hqyj.vo.OrdersVo;
import java.util.List;

public interface OrdersService {
    /**
     * 添加订单
     * @param orders
     * @return
     */
    int addOrders(Orders orders);

    /**
     * 查询订单列表
     * @param ordersVo
     * @return
     */
    List<Orders> findOrdersList(OrdersVo ordersVo);

    /**
     * 修改订单
     * @param orders
     * @return
     */
    int updateOrders(Orders orders);
}

OrdersServiceImpl.java

import com.hqyj.mapper.OrdersMapper;
import com.hqyj.mapper.RoomMapper;
import com.hqyj.mapper.RoomTypeMapper;
import com.hqyj.pojo.Orders;
import com.hqyj.pojo.Room;
import com.hqyj.pojo.RoomType;
import com.hqyj.service.OrdersService;
import com.hqyj.utils.UUIDUtils;
import com.hqyj.vo.OrdersVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;

@Service
@Transactional
public class OrdersServiceImpl implements OrdersService {

    @Autowired
    private OrdersMapper ordersMapper;

    @Autowired
    private RoomMapper roomMapper;

    @Autowired
    private RoomTypeMapper roomTypeMapper;

    /**
     * 添加订单
     *
     * @param orders
     * @return
     */
    @Transactional(rollbackFor = RuntimeException.class)
    public int addOrders(Orders orders) {
        orders.setStatus(1);//1-待确认
        orders.setOrdersno(UUIDUtils.randomUUID());
        orders.setReservedate(new Date());//预订时间为当前系统时间
        int count = ordersMapper.addOrders(orders);
        //判断订单是否添加成功,添加成功操作房间及房型
        if(count>0){
            //修改房间状态为已预订(状态码为1)
            //查询房间信息
            Room room = roomMapper.findById(orders.getRoomid());
            room.setStatus(1);//修改房间状态为已预订(编号1)
            //调用修改房间信息的方法
            roomMapper.updateRoom(room);

            //修改房型(可用房间数-1,已预订数量+1)
            RoomType roomType = roomTypeMapper.findById(orders.getRoomtypeid());
            //修改可用房间数量
            roomType.setAvilablenum(roomType.getAvilablenum()-1);
            //修改已预订数量
            roomType.setReservednum(roomType.getReservednum()+1);
            //调用修改房型的方法
            roomTypeMapper.updateRoomType(roomType);
        }

        return count;
    }

    public List<Orders> findOrdersList(OrdersVo ordersVo) {
        return ordersMapper.findOrdersList(ordersVo);
    }

    public int updateOrders(Orders orders) {
        return ordersMapper.updateOrders(orders);
    }
}

后台设计

用户登录

实体类Employee

Employee.java

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

public class Employee {
    private Integer id;//员工编号
    private String loginName;//登录名称
    private String loginPwd;//登录密码
    private String name;//真实姓名
    private Integer sex;//性别 1-男 2-女
    private Integer deptId;//所属部门
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date hireDate;//入职日期
    private String salt;//加密盐值
    private Integer createdBy;//创建人
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date createDate;//创建时间
    private Integer modifyBy;//修改人
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
    private Date modifyDate;//修改时间
    private String remark;//备注

    //部门名称
    private String deptName;

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getLoginPwd() {
        return loginPwd;
    }

    public void setLoginPwd(String loginPwd) {
        this.loginPwd = loginPwd;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Integer getDeptId() {
        return deptId;
    }

    public void setDeptId(Integer deptId) {
        this.deptId = deptId;
    }

    public Date getHireDate() {
        return hireDate;
    }

    public void setHireDate(Date hireDate) {
        this.hireDate = hireDate;
    }

    public String getSalt() {
        return salt;
    }

    public void setSalt(String salt) {
        this.salt = salt;
    }

    public Integer getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(Integer createdBy) {
        this.createdBy = createdBy;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public Integer getModifyBy() {
        return modifyBy;
    }

    public void setModifyBy(Integer modifyBy) {
        this.modifyBy = modifyBy;
    }

    public Date getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

 实体类Dept

Dept.java

import com.fasterxml.jackson.annotation.JsonFormat;

import java.util.Date;

public class Dept {

    private Integer id;
    private String deptName;
    private String address;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createDate;
    private String remark;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDeptName() {
        return deptName;
    }

    public void setDeptName(String deptName) {
        this.deptName = deptName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }
}

实体类Role

Role.java


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Title: 权限管理
 * @ClassName: com.hqyj.pojo.Role.java
 * @author: szs
 * @date:  22-09-01 23:48
 *
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Role {
    private Integer id;
    private String roleName;
    private String roleDesc;
    @Override
    public String toString() {
        return "Role{" +
                "roleName='" + roleName + '\'' +
                '}';
    }
}

EmployeeController.java

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hqyj.dto.EmployeeDto;
import com.hqyj.pojo.Employee;
import com.hqyj.service.EmployeeService;
import com.hqyj.utils.DataGridViewResult;
import com.hqyj.utils.SystemConstant;
import com.hqyj.vo.EmployeeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/admin/employee")
public class EmployeeController {


    @Autowired
    private EmployeeService employeeService;

    /**
     * 员工登录
     *
     * @param username
     * @param password
     * @param session
     * @return
     */
    @RequestMapping("/login")
    public String login(String username, String password, HttpSession session, EmployeeDto dto) {
        Map<String, Object> map = new HashMap<String, Object>();
        //调用员工登录的方法
        Employee employee = employeeService.login(username, password, dto, session);
        //判断对象是否为空,不为空表示登录成功
        if (employee != null) {
            //保存当前登录用户
            session.setAttribute(SystemConstant.LOGINUSER, employee);
            map.put(SystemConstant.SUCCESS, true);//成功
        } else {
            map.put(SystemConstant.SUCCESS, false);//失败
            map.put(SystemConstant.MESSAGE, "账号密码或验证码错误,请重新登录!");
        }
        return JSON.toJSONString(map);
    }

    /**
     * 员工列表
     *
     * @param employeeVo
     * @return
     */
    @RequestMapping("/list")
    public DataGridViewResult list(EmployeeVo employeeVo) {
        //设置分页信息
        PageHelper.startPage(employeeVo.getPage(), employeeVo.getLimit());
        //调用查询的方法
        List<Employee> employeeList = employeeService.findEmployeeList(employeeVo);
        //创建分页对象
        PageInfo<Employee> pageInfo = new PageInfo<Employee>(employeeList);
        //返回数据
        return new DataGridViewResult(pageInfo.getTotal(), pageInfo.getList());
    }

    /**
     * 添加员工
     *
     * @param employee
     * @param session
     * @return
     */
    @RequestMapping("/addEmployee")
    public String addEmployee(Employee employee, HttpSession session) {
        Map<String, Object> map = new HashMap<String, Object>();
        //获取当前登录用户
        Employee loginUser = (Employee) session.getAttribute(SystemConstant.LOGINUSER);
        //设置创建人
        employee.setCreatedBy(loginUser.getId());
        //调用新增员工的方法
        if (employeeService.addEmployee(employee) > 0) {
            map.put(SystemConstant.SUCCESS, true);
            map.put(SystemConstant.MESSAGE, "添加成功");
        } else {
            map.put(SystemConstant.SUCCESS, false);
            map.put(SystemConstant.MESSAGE, "添加失败");
        }
        return JSON.toJSONString(map);
    }

    /**
     * 修改员工
     *
     * @param employee
     * @param session
     * @return
     */
    @RequestMapping("/updateEmployee")
    public String updateEmployee(Employee employee, HttpSession session) {
        Map<String, Object> map = new HashMap<String, Object>();
        //获取当前登录用户
        Employee loginUser = (Employee) session.getAttribute(SystemConstant.LOGINUSER);
        //设置修改人
        employee.setModifyBy(loginUser.getId());
        //调用新增员工的方法
        if (employeeService.updateEmployee(employee) > 0) {
            map.put(SystemConstant.SUCCESS, true);
            map.put(SystemConstant.MESSAGE, "修改成功");
        } else {
            map.put(SystemConstant.SUCCESS, false);
            map.put(SystemConstant.MESSAGE, "修改失败");
        }
        return JSON.toJSONString(map);
    }


    /**
     * 删除员工
     *
     * @param id
     * @return
     */
    @RequestMapping("/deleteById")
    public String deleteById(int id) {
        Map<String, Object> map = new HashMap<String, Object>();
        //调用删除员工的方法
        if (employeeService.deleteById(id) > 0) {
            map.put(SystemConstant.SUCCESS, true);
            map.put(SystemConstant.MESSAGE, "删除成功");
        } else {
            map.put(SystemConstant.SUCCESS, false);
            map.put(SystemConstant.MESSAGE, "删除失败");
        }
        return JSON.toJSONString(map);
    }


    /**
     * 重置密码
     *
     * @param id
     * @return
     */
    @RequestMapping("/resetPwd")
    public String resetPwd(int id) {
        Map<String, Object> map = new HashMap<String, Object>();
        //调用重置密码的方法
        if (employeeService.resetPwd(id) > 0) {
            map.put(SystemConstant.SUCCESS, true);
            map.put(SystemConstant.MESSAGE, "密码重置成功");
        } else {
            map.put(SystemConstant.SUCCESS, false);
            map.put(SystemConstant.MESSAGE, "密码重置失败");
        }
        return JSON.toJSONString(map);
    }

    /**
     * 分配角色
     *
     * @param roleIds
     * @param empId
     * @return
     */
    @RequestMapping("/saveEmployeeRole")
    public String saveEmployeeRole(String roleIds, Integer empId) {
        Map<String, Object> map = new HashMap<String, Object>();
        //调用保存员工角色关系的方法
        if (employeeService.saveEmployeeRole(roleIds, empId)) {
            map.put(SystemConstant.MESSAGE, "角色分配成功");
        } else {
            map.put(SystemConstant.MESSAGE, "角色分配失败");
        }
        return JSON.toJSONString(map);
    }

}

 EmployeeMapper.java

import com.hqyj.pojo.Employee;
import com.hqyj.vo.EmployeeVo;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import java.util.List;

public interface EmployeeMapper {

    /**
     * 根据登录账号查询员工信息
     * @param loginName
     * @return
     */
    Employee findEmployeeByLoginName(String loginName);

    /**
     * 根据部门编号查询员工数量
     * @param deptId
     * @return
     */
    int getEmployeeCountByDeptId(Integer deptId);

    /**
     * 根据角色编号查询员工数量
     * @param roleId
     * @return
     */
    int getEmployeeCountByRoleId(Integer roleId);


    /**
     * 查询员工列表
     * @param employeeVo
     * @return
     */
    List<Employee> findEmployeeList(EmployeeVo employeeVo);

    /**
     * 添加员工
     * @param employee
     * @return
     */
    int addEmployee(Employee employee);

    /**
     * 修改员工
     * @param employee
     * @return
     */
    int updateEmployee(Employee employee);

    /**
     * 删除员工
     * @param id
     * @return
     */
    int deleteById(Integer id);

    /**
     * 删除员工角色关系数据
     * @param id
     */
    void deleteEmployeeAndRole(Integer id);

    /**
     * 保存员工角色关系数据
     * @param roleId
     * @param empId
     */
    @Insert("insert into sys_role_employee (eid,rid) values(#{eid},#{rid})")
    void addEmployeeRole(@Param("rid") String roleId, @Param("eid") Integer empId);
}

EmployeeMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hqyj.mapper.EmployeeMapper">

    <!-- 根据登录账号查询员工信息 -->
    <select id="findEmployeeByLoginName" resultType="employee">
        select * from sys_employee where loginName = #{loginName}
    </select>

    <!-- 根据部门编号查询该部门下的员工数量 -->
    <select id="getEmployeeCountByDeptId" resultType="int">
        select count(1) from sys_employee where deptId = #{deptId}
    </select>


    <!-- 根据角色编号查询员工数量 -->
    <select id="getEmployeeCountByRoleId" resultType="int">
        select count(1) from sys_employee e
        inner join sys_role_employee re on e.id = re.`eid`
        where re.`rid` = #{roleId}
    </select>


    <!-- 查询员工列表 -->
    <select id="findEmployeeList" resultType="employee">
        select e.*,d.deptName from sys_employee e
        inner join sys_dept d on d.id = e.deptId
        <where>
            <if test="loginName!=null and loginName!=''">
                and e.loginName like concat('%',#{loginName},'%')
            </if>
            <if test="name!=null and name!=''">
                and e.name like concat('%',#{name},'%')
            </if>
            <if test="sex!=null">
                and e.sex = #{sex}
            </if>
            <if test="deptId!=null">
                and e.deptId = #{deptId}
            </if>
            <if test="startDate!=null">
                <![CDATA[ and e.hireDate >= #{startDate} ]]>
            </if>
            <if test="endDate!=null">
                <![CDATA[ and e.hireDate <= #{endDate} ]]>
            </if>
        </where>
        order by e.id
    </select>

    <insert id="addEmployee">
       insert into sys_employee (loginName,loginPwd,name,sex,deptId,hireDate,salt,createdBy,createDate,remark)
       values(#{loginName},#{loginPwd},#{name},#{sex},#{deptId},#{hireDate},#{salt},#{createdBy},#{createDate},#{remark})
    </insert>

    <update id="updateEmployee">
        update sys_employee
        <set>
            <if test="loginPwd!=null and loginPwd!=''">
                loginPwd = #{loginPwd},
            </if>
            <if test="name!=null and name!=''">
                name = #{name},
            </if>
            <if test="sex!=null">
                sex = #{sex},
            </if>
            <if test="deptId!=null">
                deptId = #{deptId},
            </if>
            <if test="hireDate!=null">
                hireDate = #{hireDate},
            </if>
            <if test="salt!=null and salt!=''">
                salt = #{salt},
            </if>
            <if test="remark!=null and remark!=''">
                remark = #{remark},
            </if>
            <if test="modifyBy!=null">
                modifyBy = #{modifyBy},
            </if>
            <if test="modifyDate!=null">
                modifyDate = #{modifyDate},
            </if>
        </set>
        where id = #{id}
    </update>

    <delete id="deleteById">
        delete from sys_employee  where id = #{id}
    </delete>

    <delete id="deleteEmployeeAndRole">
        delete from sys_role_employee where eid= #{eid}
    </delete>


</mapper>

EmployeeService.java

import com.hqyj.dto.EmployeeDto;
import com.hqyj.pojo.Employee;
import com.hqyj.vo.EmployeeVo;

import javax.servlet.http.HttpSession;
import java.util.List;

public interface EmployeeService {

    /**
     * 员工登录
     * @param loginName
     * @param loginPwd
     * @return
     */
    Employee login(String loginName, String loginPwd, EmployeeDto dto, HttpSession session);

    /**
     * 根据部门编号查询员工数量
     * @param deptId
     * @return
     */
    int getEmployeeCountByDeptId(Integer deptId);

    /**
     * 根据角色编号查询员工数量
     * @param roleId
     * @return
     */
    int getEmployeeCountByRoleId(Integer roleId);

    /**
     * 查询员工列表
     * @param employeeVo
     * @return
     */
    List<Employee> findEmployeeList(EmployeeVo employeeVo);

    /**
     * 添加员工
     * @param employee
     * @return
     */
    int addEmployee(Employee employee);

    /**
     * 修改员工
     * @param employee
     * @return
     */
    int updateEmployee(Employee employee);

    /**
     * 删除员工
     * @param id
     * @return
     */
    int deleteById(Integer id);

    /**
     * 重置密码
     * @param id
     * @return
     */
    int resetPwd(int id);

    /**
     * 保存员工角色关系
     * @param roleIds
     * @param empId
     * @return
     */
    boolean saveEmployeeRole(String roleIds, Integer empId);
}

EmployeeServiceImpl.java

import com.hqyj.dto.EmployeeDto;
import com.hqyj.mapper.EmployeeMapper;
import com.hqyj.pojo.Employee;
import com.hqyj.service.EmployeeService;
import com.hqyj.utils.PasswordUtil;
import com.hqyj.utils.SystemConstant;
import com.hqyj.utils.UUIDUtils;
import com.hqyj.vo.EmployeeVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Transactional
public class EmployeeServiceImpl implements EmployeeService {

    @Resource
    private EmployeeMapper employeeMapper;

    /**
     * 员工登录(验证码)
     *
     * @param loginName
     * @param loginPwd
     * @return
     */
    public Employee login(String loginName, String loginPwd, EmployeeDto dto, HttpSession session) {
        //定义一个存放数据的集合
        Map<String, Object> map = new HashMap<>();
        //验证验证码是否正确 --忽略大小写
        if ((dto.getCode().equalsIgnoreCase(session.getAttribute("code").toString()))) {
            Employee employee = employeeMapper.findEmployeeByLoginName(loginName);
            if (employee != null) {
                //将密码加密处理
                String newPassword = PasswordUtil.md5(loginPwd, employee.getSalt(), SystemConstant.PASSWORD_COUNT);
                System.out.println(newPassword);
                //比较密码是否一致
                if (employee.getLoginPwd().equals(newPassword)) {
                    return employee;//登录成功
                }
            }

        }
        return null;
    }
    //普通登录
//        //调用根据账号查询员工信息的方法
//        Employee employee = employeeMapper.findEmployeeByLoginName(loginName);
//        //判断对象是否为空
//        if(employee!=null){
//            //将密码加密处理
//            String newPassword = PasswordUtil.md5(loginPwd,employee.getSalt(), SystemConstant.PASSWORD_COUNT);
//            System.out.println(newPassword);
//            //比较密码是否一致
//            if(employee.getLoginPwd().equals(newPassword)){
//                return employee;//登录成功
//            }
//        }
//        //登录失败
//        return null;
//    }

    public int getEmployeeCountByDeptId(Integer deptId) {
        return employeeMapper.getEmployeeCountByDeptId(deptId);
    }

    public int getEmployeeCountByRoleId(Integer roleId) {
        return employeeMapper.getEmployeeCountByRoleId(roleId);
    }

    public List<Employee> findEmployeeList(EmployeeVo employeeVo) {
        return employeeMapper.findEmployeeList(employeeVo);
    }

    public int addEmployee(Employee employee) {
        employee.setSalt(UUIDUtils.randomUUID());//加密盐值
        employee.setCreateDate(new Date());//创建时间
        employee.setLoginPwd(PasswordUtil.md5(SystemConstant.DEFAULT_LOGIN_PWD, employee.getSalt(), SystemConstant.PASSWORD_COUNT));//密码
        return employeeMapper.addEmployee(employee);
    }

    public int updateEmployee(Employee employee) {
        //设置修改时间
        employee.setModifyDate(new Date());
        return employeeMapper.updateEmployee(employee);
    }

    public int deleteById(Integer id) {
        //删除员工角色关系表的数据
        employeeMapper.deleteEmployeeAndRole(id);
        //调用删除员工的方法
        return employeeMapper.deleteById(id);
    }

    /**
     * @param id
     * @Title: 重置密码
     * @MethodName: resetPwd
     * @Return int
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-05 23:08
     */
    public int resetPwd(int id) {
        Employee employee = new Employee();
        employee.setSalt(UUIDUtils.randomUUID());//必须先设置盐值,再给密码重新加密赋值
        employee.setLoginPwd(PasswordUtil.md5(SystemConstant.DEFAULT_LOGIN_PWD, employee.getSalt(), SystemConstant.PASSWORD_COUNT));
        employee.setId(id);//主键,员工编号
        return employeeMapper.updateEmployee(employee);
    }

    public boolean saveEmployeeRole(String roleIds, Integer empId) {
        try {
            //先删除员工角色关系表的数据
            employeeMapper.deleteEmployeeAndRole(empId);
            //再保存员工角色关系
            String[] idStr = roleIds.split(",");
            for (int i = 0; i < idStr.length; i++) {
                employeeMapper.addEmployeeRole(idStr[i], empId);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

DeptController.java

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hqyj.pojo.Dept;
import com.hqyj.service.DeptService;
import com.hqyj.service.EmployeeService;
import com.hqyj.utils.DataGridViewResult;
import com.hqyj.utils.SystemConstant;
import com.hqyj.vo.DeptVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/admin/dept")
public class DeptController {



    @Autowired
    private DeptService deptService;

    @Autowired
    private EmployeeService employeeService;


    /**
     * 查询部门列表
     * @param deptVo
     * @return
     */
    @RequestMapping("/list")
    public DataGridViewResult list(DeptVo deptVo){
        //设置分页信息
        PageHelper.startPage(deptVo.getPage(),deptVo.getLimit());
        //调用分页查询的方法
        List<Dept> deptList = deptService.findDeptListByPage(deptVo);
        //创建分页对象
        PageInfo<Dept> pageInfo = new PageInfo<Dept>(deptList);
        //返回数据
        return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList());
    }


    /**
     * 添加部门
     * @param dept
     * @return
     */
    @RequestMapping("/addDept")
    public String addDept(Dept dept){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用添加部门的方法
        if(deptService.addDept(dept)>0){
            map.put(SystemConstant.SUCCESS,true);//成功
            map.put(SystemConstant.MESSAGE,"添加成功");
        }else{
            map.put(SystemConstant.SUCCESS,false);//失败
            map.put(SystemConstant.MESSAGE,"添加失败");
        }
        //将map集合以JSON格式返回
        return JSON.toJSONString(map);
    }

    /**
     * 修改部门
     * @param dept
     * @return
     */
    @RequestMapping("/updateDept")
    public String updateDept(Dept dept){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用修改部门的方法
        if(deptService.updateDept(dept)>0){
            map.put(SystemConstant.SUCCESS,true);//成功
            map.put(SystemConstant.MESSAGE,"修改成功");
        }else{
            map.put(SystemConstant.SUCCESS,false);//失败
            map.put(SystemConstant.MESSAGE,"修改失败");
        }
        //将map集合以JSON格式返回
        return JSON.toJSONString(map);
    }


    /**
     * 检查该部门下是否存在员工信息
     * @param id
     * @return
     */
    @RequestMapping("/checkDeptHasEmployee")
    public String checkDeptHasEmployee(Integer id){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用根据部门编号查询员工数量的方法
        if(employeeService.getEmployeeCountByDeptId(id)>0){
            map.put(SystemConstant.EXIST,true);//存在
            map.put(SystemConstant.MESSAGE,"该部门存在员工信息,无法删除");
        }else{
            map.put(SystemConstant.EXIST,false);//不存在
        }
        return JSON.toJSONString(map);
    }

    /**
     * 删除部门
     * @param id
     * @return
     */
    @RequestMapping("/deleteById")
    public String deleteById(Integer id){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用删除部门的方法
        if(deptService.deleteById(id)>0){
            map.put(SystemConstant.SUCCESS,true);//成功
            map.put(SystemConstant.MESSAGE,"删除成功");
        }else{
            map.put(SystemConstant.SUCCESS,false);//失败
            map.put(SystemConstant.MESSAGE,"删除失败");
        }
        return JSON.toJSONString(map);
    }

    /**
     * 查询所有部门
     * @return
     */
    @RequestMapping("/deptList")
    public String deptList(){
        //调用查询所有部门信息的方法并返回到页面
        return JSON.toJSONString(deptService.findDeptList());
    }

}

DeptMapper.java

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hqyj.pojo.Dept;
import com.hqyj.service.DeptService;
import com.hqyj.service.EmployeeService;
import com.hqyj.utils.DataGridViewResult;
import com.hqyj.utils.SystemConstant;
import com.hqyj.vo.DeptVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/admin/dept")
public class DeptController {



    @Autowired
    private DeptService deptService;

    @Autowired
    private EmployeeService employeeService;


    /**
     * 查询部门列表
     * @param deptVo
     * @return
     */
    @RequestMapping("/list")
    public DataGridViewResult list(DeptVo deptVo){
        //设置分页信息
        PageHelper.startPage(deptVo.getPage(),deptVo.getLimit());
        //调用分页查询的方法
        List<Dept> deptList = deptService.findDeptListByPage(deptVo);
        //创建分页对象
        PageInfo<Dept> pageInfo = new PageInfo<Dept>(deptList);
        //返回数据
        return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList());
    }


    /**
     * 添加部门
     * @param dept
     * @return
     */
    @RequestMapping("/addDept")
    public String addDept(Dept dept){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用添加部门的方法
        if(deptService.addDept(dept)>0){
            map.put(SystemConstant.SUCCESS,true);//成功
            map.put(SystemConstant.MESSAGE,"添加成功");
        }else{
            map.put(SystemConstant.SUCCESS,false);//失败
            map.put(SystemConstant.MESSAGE,"添加失败");
        }
        //将map集合以JSON格式返回
        return JSON.toJSONString(map);
    }

    /**
     * 修改部门
     * @param dept
     * @return
     */
    @RequestMapping("/updateDept")
    public String updateDept(Dept dept){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用修改部门的方法
        if(deptService.updateDept(dept)>0){
            map.put(SystemConstant.SUCCESS,true);//成功
            map.put(SystemConstant.MESSAGE,"修改成功");
        }else{
            map.put(SystemConstant.SUCCESS,false);//失败
            map.put(SystemConstant.MESSAGE,"修改失败");
        }
        //将map集合以JSON格式返回
        return JSON.toJSONString(map);
    }


    /**
     * 检查该部门下是否存在员工信息
     * @param id
     * @return
     */
    @RequestMapping("/checkDeptHasEmployee")
    public String checkDeptHasEmployee(Integer id){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用根据部门编号查询员工数量的方法
        if(employeeService.getEmployeeCountByDeptId(id)>0){
            map.put(SystemConstant.EXIST,true);//存在
            map.put(SystemConstant.MESSAGE,"该部门存在员工信息,无法删除");
        }else{
            map.put(SystemConstant.EXIST,false);//不存在
        }
        return JSON.toJSONString(map);
    }

    /**
     * 删除部门
     * @param id
     * @return
     */
    @RequestMapping("/deleteById")
    public String deleteById(Integer id){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用删除部门的方法
        if(deptService.deleteById(id)>0){
            map.put(SystemConstant.SUCCESS,true);//成功
            map.put(SystemConstant.MESSAGE,"删除成功");
        }else{
            map.put(SystemConstant.SUCCESS,false);//失败
            map.put(SystemConstant.MESSAGE,"删除失败");
        }
        return JSON.toJSONString(map);
    }

    /**
     * 查询所有部门
     * @return
     */
    @RequestMapping("/deptList")
    public String deptList(){
        //调用查询所有部门信息的方法并返回到页面
        return JSON.toJSONString(deptService.findDeptList());
    }

}

 DeptMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hqyj.mapper.DeptMapper">
    <!--模糊查询-->
    <select id="findDeptListByPage" resultType="dept">
        select * from sys_dept
        <where>
            <if test="deptName!=null and deptName!=''">
                and deptName like concat('%',#{deptName},'%')
            </if>
        </where>
    </select>

    <!-- 添加部门 -->
    <insert id="addDept">
        insert into sys_dept (deptName,address,createDate,remark) values(#{deptName},#{address},#{createDate},#{remark})
    </insert>

    <update id="updateDept">
        update sys_dept
        <set>
            <if test="deptName!=null and deptName!=''">
                deptName = #{deptName},
            </if>
            <if test="address!=null and address!=''">
                address = #{address},
            </if>
            <if test="remark!=null and remark!=''">
                remark = #{remark},
            </if>
        </set>
        where id = #{id}
    </update>


    <delete id="deleteById">
        delete from sys_dept where id = #{id}
    </delete>

    <select id="findDeptList" resultType="dept">
        select * from sys_dept
    </select>

</mapper>

DeptService.java

import com.hqyj.pojo.Dept;
import com.hqyj.vo.DeptVo;

import java.util.List;

public interface DeptService {
    /**
     * 查询部门列表
     * @param deptVo
     * @return
     */
    List<Dept> findDeptListByPage(DeptVo deptVo);

    /**
     * 添加部门
     * @param dept
     * @return
     */
    int addDept(Dept dept);

    /**
     * 修改部门
     * @param dept
     * @return
     */
    int updateDept(Dept dept);

    /**
     * 删除部门
     * @param id
     * @return
     */
    int deleteById(Integer id);

    /**
     * 查询所有部门
     * @return
     */
    List<Dept> findDeptList();
}

DeptServiceImpl.java

import com.hqyj.mapper.DeptMapper;
import com.hqyj.pojo.Dept;
import com.hqyj.service.DeptService;
import com.hqyj.vo.DeptVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;

@Service
@Transactional
public class DeptServiceImpl implements DeptService {

    @Autowired
    private DeptMapper deptMapper;

    /**
     * 查询部门列表
     *
     * @param deptVo
     * @return
     */
    public List<Dept> findDeptListByPage(DeptVo deptVo) {
        return deptMapper.findDeptListByPage(deptVo);
    }

    public int addDept(Dept dept) {
        //保存创建时间
        dept.setCreateDate(new Date());
        return deptMapper.addDept(dept);
    }

    public int updateDept(Dept dept) {
        return deptMapper.updateDept(dept);
    }

    public int deleteById(Integer id) {
        return deptMapper.deleteById(id);
    }

    public List<Dept> findDeptList() {
        return deptMapper.findDeptList();
    }
}

工具类

CodeImgUtil.java

import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * @Title: 验证码
 * @ClassName: com.hqyj.utils.CodeImgUtil.java
 * @author: szs
 * @date: 22-09-01 14:08
 */
public class CodeImgUtil {
    /**
     * @param length
     * @Title: 随机生成一个指定长度的字符串
     * @MethodName: createCode
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-01 14:17
     */
    public static String createCode(int length) {
        //实例化对象,方便字符串拼接
        StringBuffer buffer = new StringBuffer();
        //随机数对象
        Random random = new Random();
        //循环生成每一位字符
        for (int i = 0; i < length; i++) {
            //随机生成类型
            int type = random.nextInt(3);//0,1,2
            switch (type) {
                case 0://数字
                    buffer.append(random.nextInt(10));
                    break;
                case 1://大写字母
                    buffer.append((char) (random.nextInt(26) + 65));
                    break;
                default:
                    buffer.append((char) (random.nextInt(26) + 97));
                    break;
            }
        }
        return buffer.toString();
    }

    /**
     * @param code
     * @Title: 生成验证码背景图
     * @MethodName: createImg
     * @Return java.awt.image.BufferedImage
     * @Exception
     * @Description:
     * @author: szs
     * @date: 22-09-01 14:17
     */
    public static BufferedImage createImg(String code) {
        //定义图片的高度和宽度
        int width = 60;
        int height = 20;
        //建立bufferedImage对象,制定图片的长度和宽度以及色彩
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
        //获取Graphics2D 绘制对象,开始绘制验证码
        Graphics2D g = bi.createGraphics();
        //画边框
        g.setColor(Color.BLUE);
        g.drawRect(0, 0, width - 1, height - 1);
        //画干扰线
        g.setColor(Color.GREEN);
        //设置文字的子图验证和大小
        Font font = new Font("微软雅黑", Font.PLAIN, 16);
        //设置字体的颜色
        Color color = new Color(20, 28, 100);
        //将颜色和字体放入
        g.setFont(font);
        g.setColor(color);
        g.setBackground(new Color(226, 226, 226));//背景颜色
        //开始绘制对象
        g.clearRect(0, 0, width, height);
        //绘制形状,获取距形对象
        FontRenderContext context = g.getFontRenderContext();//文字读取上下文
        Rectangle2D bounds = font.getStringBounds(code, context);//将生成的验证码放入
        //计算文字的坐标和间距
        double x = (width - bounds.getWidth()) / 2;
//        double y = (height - bounds.getHeight()) / 2;
        double y = 15;
        double ascent = bounds.getY();
        double baseY = y - ascent;
        g.drawString(code, (int) x, (int) y);
        //结束配置
        g.dispose();
        //将图片保存到制定地方,输出
        return bi;
    }
}

MD5Util.java

import org.apache.shiro.crypto.hash.SimpleHash;

public class MD5Util {
    /**
     * @Title: MD5加密
     * @MethodName:  md5
     * @param loginName
     * @param loginPwd
     * @Return java.lang.String
     * @Exception
     * @Description:
     * @author: szs
     * @date:  22-09-01 23:52
     */
    public static String md5(String loginName, String loginPwd) {
        /*
            algorithmName代表进行加密的算法名称、
            source代表需要加密的元数据,如密码、
            salt代表盐,需要加进一起加密的数据、
            hashIterations代表hash迭代次数。
        * */
        return new SimpleHash("MD5", loginName, loginPwd, 1024).toString();
    }

}

PasswordUtil.java

import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.Sha1Hash;

import java.util.UUID;

public class PasswordUtil {

    /**
     * 对密码加密 md5
     * @param source  要加密的明文
     * @param salt  盐
     * @param hashIterations  散列次数
     * @return
     */
    public static String md5(String source, Object salt, Integer hashIterations) {
        return new Md5Hash(source, salt, hashIterations).toString();
    }


    /**
     * 对密码加密sha1
     * @param source  要加密的明文
     * @param salt  盐
     * @param hashIterations  散列次数
     * @return
     */
    public static String sha1(String source, Object salt, Integer hashIterations) {
        return new Sha1Hash(source, salt, hashIterations).toString();
    }

    public static void main(String[] args) {
        String password = "123456";
        String salt = UUID.randomUUID().toString().replace("-","");
        System.out.println("加密盐值:"+salt);
        System.out.println("加密后的密码:"+ PasswordUtil.md5(password,salt,5));

    }

}

UUIDUtil.java

import java.util.UUID;

public class UUIDUtils {
    public static String randomUUID() {
       return UUID.randomUUID().toString().replace("-","");
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值