SpingBoot+LayUI 实现酒店管理系统编写

news2024/11/24 9:37:32

在这里插入图片描述

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。
🍎个人主页:Java Fans的博客
🍊个人信条:不迁怒,不贰过。小知识,大智慧。
💞当前专栏:Java案例分享专栏
✨特色专栏:国学周更-心性养成之路
🥭本文内容:如何入门Python——学习Python的指南针

文章目录

    • 1、整体分析
    • 2、客房模块
    • 3、订单模块
    • 4、财务模块

1、整体分析

首先,需要明确酒店管理系统的功能需求,包括但不限于客房管理、订单管理、财务管理等。然后,根据需求设计数据库表结构,并使用Springboot框架搭建后端服务,实现数据的增删改查等操作。最后,使用layui框架编写前端页面,与后端服务进行交互,实现完整的酒店管理系统。

以下是具体步骤及代码编写:

1.1、设计数据库表结构

根据需求,设计数据库表结构,包括但不限于以下表:

  • 客房表(room):包括客房编号、客房类型、客房状态等字段。
  • 订单表(order):包括订单编号、客房编号、入住时间、离店时间、订单状态等字段。
  • 财务表(finance):包括财务编号、订单编号、收入、支出等字段。

1.2、使用Springboot框架搭建后端服务

使用Springboot框架搭建后端服务,实现数据的增删改查等操作。具体步骤如下:

  • 创建Springboot项目,引入相关依赖。
  • 创建实体类,对应数据库表结构。
  • 创建DAO层接口,定义数据操作方法。
  • 创建Service层接口及实现类,实现业务逻辑。
  • 创建Controller层接口,处理HTTP请求,调用Service层方法,返回JSON数据。

2、客房模块

2.1 后端实现

实体类:

@Entity
@Table(name = "room")
public class Room {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String roomNo;
    private String roomType;
    private String status;
    // getter/setter方法省略
}

DAO层接口:

public interface RoomRepository extends JpaRepository<Room, Long> {
}

Service层接口及实现类:

public interface RoomService {
    List<Room> findAll();
    Room findById(Long id);
    Room save(Room room);
    void deleteById(Long id);
}
@Service
public class RoomServiceImpl implements RoomService {
    @Autowired
    private RoomRepository roomRepository;

    @Override
    public List<Room> findAll() {
        return roomRepository.findAll();
    }

    @Override
    public Room findById(Long id) {
        return roomRepository.findById(id).orElse(null);
    }

    @Override
    public Room save(Room room) {
        return roomRepository.save(room);
    }

    @Override
    public void deleteById(Long id) {
        roomRepository.deleteById(id);
    }
}

Controller层接口:

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

    @GetMapping("/list")
    public List<Room> findAll() {
        return roomService.findAll();
    }

    @GetMapping("/{id}")
    public Room findById(@PathVariable Long id) {
        return roomService.findById(id);
    }

    @PostMapping("/")
    public Room save(@RequestBody Room room) {
        return roomService.save(room);
    }

    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable Long id) {
        roomService.deleteById(id);
    }
}

2.2 使用layui框架编写前端页面

使用layui框架编写前端页面,与后端服务进行交互,实现完整的酒店管理系统。具体步骤如下:

  • 引入layui框架及相关依赖。
  • 编写HTML页面,包括表格、表单等组件。
  • 编写JavaScript代码,使用jQuery库与后端服务进行交互,实现数据的增删改查等操作。

以下是示例代码:

HTML页面:

<table id="roomTable" lay-filter="roomTable"></table>

<script type="text/html" id="toolbar">
  <div class="layui-btn-container">
    <button class="layui-btn layui-btn-sm" lay-event="add">添加客房</button>
  </div>
</script>

<script type="text/html" id="statusTpl">
  {{# if(d.status === '0'){ }}
    <span class="layui-badge layui-bg-gray">未入住</span>
  {{# } else if(d.status === '1'){ }}
    <span class="layui-badge layui-bg-green">已入住</span>
  {{# } else if(d.status === '2'){ }}
    <span class="layui-badge layui-bg-orange">已预订</span>
  {{# } else if(d.status === '3'){ }}
    <span class="layui-badge layui-bg-red">已退房</span>
  {{# } }}
</script>

JavaScript代码:

layui.use(['table', 'layer'], function() {
  var table = layui.table;
  var layer = layui.layer;

  // 渲染表格
  table.render({
    elem: '#roomTable',
    url: '/room/list',
    toolbar: '#toolbar',
    cols: [[
      {type: 'checkbox'},
      {field: 'id', title: 'ID', width: 80},
      {field: 'roomNo', title: '客房编号', width: 120},
      {field: 'roomType', title: '客房类型', width: 120},
      {field: 'status', title: '客房状态', width: 120, templet: '#statusTpl'},
      {fixed: 'right', title: '操作', width: 120, toolbar: '#operateBar'}
    ]],
    page: true
  });

  // 监听工具条
  table.on('toolbar(roomTable)', function(obj) {
    if (obj.event === 'add') {
      layer.open({
        type: 2,
        title: '添加客房',
        content: '/room/add',
        area: ['500px', '400px']
      });
    }
  });

  // 监听行工具条
  table.on('tool(roomTable)', function(obj) {
    var data = obj.data;
    if (obj.event === 'edit') {
      layer.open({
        type: 2,
        title: '编辑客房',
        content: '/room/edit?id=' + data.id,
        area: ['500px', '400px']
      });
    } else if (obj.event === 'delete') {
      layer.confirm('确定删除该客房吗?', function(index) {
        $.ajax({
          url: '/room/delete/' + data.id,
          type: 'DELETE',
          success: function(res) {
            if (res.code === 0) {
              layer.msg('删除成功');
              obj.del();
            } else {
              layer.msg('删除失败');
            }
          }
        });
        layer.close(index);
      });
    }
  });
});

3、订单模块

3.1 设计数据库表结构

根据需求,设计订单表(order)的数据库表结构,包括但不限于以下字段:

  • 订单编号(id):主键,自增长。
  • 客房编号(room_id):外键,关联客房表的客房编号字段。
  • 入住时间(checkin_time):入住时间。
  • 离店时间(checkout_time):离店时间。
  • 订单状态(status):订单状态,包括未入住、已入住、已预订、已退房等。

3.2 后端实现

  • 创建Order实体类,对应订单表的数据库表结构。
  • 创建OrderRepository接口,继承JpaRepository,定义数据操作方法。
  • 创建OrderService接口及实现类,实现业务逻辑。
  • 创建OrderController接口,处理HTTP请求,调用Service层方法,返回JSON数据。

以下是示例代码:

Order实体类:

@Entity
@Table(name = "order")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @ManyToOne
    @JoinColumn(name = "room_id")
    private Room room;
    @Column(name = "checkin_time")
    private Date checkinTime;
    @Column(name = "checkout_time")
    private Date checkoutTime;
    private Integer status;
    // getter/setter方法省略
}

OrderRepository接口:

public interface OrderRepository extends JpaRepository<Order, Long> {
}

OrderService接口及实现类:

public interface OrderService {
    List<Order> findAll();
    Order findById(Long id);
    Order save(Order order);
    void deleteById(Long id);
}
@Service
public class OrderServiceImpl implements OrderService {
    @Autowired
    private OrderRepository orderRepository;

    @Override
    public List<Order> findAll() {
        return orderRepository.findAll();
    }

    @Override
    public Order findById(Long id) {
        return orderRepository.findById(id).orElse(null);
    }

    @Override
    public Order save(Order order) {
        return orderRepository.save(order);
    }

    @Override
    public void deleteById(Long id) {
        orderRepository.deleteById(id);
    }
}

OrderController接口:

@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderService orderService;

    @GetMapping("/list")
    public List<Order> findAll() {
        return orderService.findAll();
    }

    @GetMapping("/{id}")
    public Order findById(@PathVariable Long id) {
        return orderService.findById(id);
    }

    @PostMapping("/")
    public Order save(@RequestBody Order order) {
        return orderService.save(order);
    }

    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable Long id) {
        orderService.deleteById(id);
    }
}

3.3 前端实现

在HTML页面中添加订单表格,包括订单编号、客房编号、入住时间、离店时间、订单状态等字段。
在JavaScript代码中使用jQuery库与后端服务进行交互,实现数据的增删改查等操作。

以下是示例代码:

HTML页面:

<table id="orderTable" lay-filter="orderTable"></table>

<script type="text/html" id="toolbar">
  <div class="layui-btn-container">
    <button class="layui-btn layui-btn-sm" lay-event="add">添加订单</button>
  </div>
</script>

<script type="text/html" id="statusTpl">
  {{# if(d.status === 0){ }}
    <span class="layui-badge layui-bg-gray">未入住</span>
  {{# } else if(d.status === 1){ }}
    <span class="layui-badge layui-bg-green">已入住</span>
  {{# } else if(d.status === 2){ }}
    <span class="layui-badge layui-bg-orange">已预订</span>
  {{# } else if(d.status === 3){ }}
    <span class="layui-badge layui-bg-red">已退房</span>
  {{# } }}
</script>

JavaScript代码:

layui.use(['table', 'layer'], function() {
  var table = layui.table;
  var layer = layui.layer;

  // 渲染表格
  table.render({
    elem: '#orderTable',
    url: '/order/list',
    toolbar: '#toolbar',
    cols: [[
      {type: 'checkbox'},
      {field: 'id', title: 'ID', width: 80},
      {field: 'room.roomNo', title: '客房编号', width: 120},
      {field: 'checkinTime', title: '入住时间', width: 180},
      {field: 'checkoutTime', title: '离店时间', width: 180},
      {field: 'status', title: '订单状态', width: 120, templet: '#statusTpl'},
      {fixed: 'right', title: '操作', width: 120, toolbar: '#operateBar'}
    ]],
    page: true
  });

  // 监听工具条
  table.on('toolbar(orderTable)', function(obj) {
    if (obj.event === 'add') {
      layer.open({
        type: 2,
        title: '添加订单',
        content: '/order/add',
        area: ['500px', '400px']
      });
    }
  });

  // 监听行工具条
  table.on('tool(orderTable)', function(obj) {
    var data = obj.data;
    if (obj.event === 'edit') {
      layer.open({
        type: 2,
        title: '编辑订单',
        content: '/order/edit?id=' + data.id,
        area: ['500px', '400px']
      });
    } else if (obj.event === 'delete') {
      layer.confirm('确定删除该订单吗?', function(index) {
        $.ajax({
          url: '/order/delete/' + data.id,
          type: 'DELETE',
          success: function(res) {
            if (res.code === 0) {
              layer.msg('删除成功');
              obj.del();
            } else {
              layer.msg('删除失败');
            }
          }
        });
        layer.close(index);
      });
    }
  });
});

4、财务模块

4.1 设计数据库表结构

根据需求,设计财务表的数据库表结构,包括但不限于以下字段:

  • 财务编号(id):主键,自增长。
  • 订单编号(orderId):外键,关联订单表的订单编号字段。
  • 收入(income):财务收入金额。
  • 支出(expense):财务支出金额。

4.2 后端实现

  • 创建财务表的实体类,对应数据库表结构。
  • 创建财务表的DAO层接口,继承JpaRepository接口,实现数据的增删改查等操作。
  • 创建财务表的Service层接口,定义业务逻辑。
  • 创建财务表的Controller层接口,实现对外提供的RESTful API。

以下是示例代码:

实体类:

@Entity
@Table(name = "finance")
public class Finance {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long orderId;
    private BigDecimal income;
    private BigDecimal expense;
    // getter and setter
}

DAO层接口:

public interface FinanceRepository extends JpaRepository<Finance, Long> {
}

Service层接口:

public interface FinanceService {
    List<Finance> findAll();
    Finance findById(Long id);
    Finance save(Finance finance);
    void deleteById(Long id);
}

Controller层接口:

@RestController
@RequestMapping("/finances")
public class FinanceController {
    @Autowired
    private FinanceService financeService;

    @GetMapping("")
    public List<Finance> findAll() {
        return financeService.findAll();
    }

    @GetMapping("/{id}")
    public Finance findById(@PathVariable Long id) {
        return financeService.findById(id);
    }

    @PostMapping("")
    public Finance save(@RequestBody Finance finance) {
        return financeService.save(finance);
    }

    @DeleteMapping("/{id}")
    public void deleteById(@PathVariable Long id) {
        financeService.deleteById(id);
    }
}

4.3 前端实现

  • 在HTML页面中添加财务表的展示组件,如表格。
  • 使用jQuery或者axios等库,与后端服务进行交互,实现数据的展示、增删改查等操作。
    以下是示例代码:

HTML页面:

<table id="financeTable" lay-filter="financeTable"></table>

<script>
  layui.use(['table', 'layer'], function() {
    var table = layui.table;
    var layer = layui.layer;

    table.render({
      elem: '#financeTable',
      url: '/finances',
      cols: [[
        {field: 'id', title: 'ID', width: 80},
        {field: 'orderId', title: '订单编号', width: 120},
        {field: 'income', title: '收入', width: 120},
        {field: 'expense', title: '支出', width: 120},
        {fixed: 'right', title: '操作', toolbar: '#operateBar', width: 120}
      ]],
      page: true
    });

    table.on('tool(financeTable)', function(obj) {
      var data = obj.data;
      if (obj.event === 'edit') {
        layer.open({
          type: 2,
          title: '编辑财务',
          content: '/finance/edit?id=' + data.id,
          area: ['500px', '400px']
        });
      } else if (obj.event === 'delete') {
        layer.confirm('确定删除该财务吗?', function(index) {
          $.ajax({
            url: '/finance/delete?id=' + data.id,
            type: 'DELETE',
            success: function(res) {
              if (res.code === 0) {
                layer.msg('删除成功');
                obj.del();
              } else {
                layer.msg('删除失败');
              }
            }
          });
          layer.close(index);
        });
      }
    });
  });
</script>

  码文不易,本篇文章就介绍到这里,如果想要学习更多Java系列知识点击关注博主,博主带你零基础学习Java知识。与此同时,对于日常生活有困扰的朋友,欢迎阅读我的第四栏目:《国学周更—心性养成之路》,学习技术的同时,我们也注重了心性的养成。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

晚上12点接到面试邀约电话,待业一个月的我却拒绝了....

前言 一位测试朋友最近一直在找工作&#xff0c;前两天刚拒绝了一个面试。那天晚上12点多&#xff0c;他接到一个HR的面试电话&#xff0c;让他第二天早上10点去公司面试。朋友和HR聊了两句&#xff0c;了解到这位HR经常加班&#xff0c;于是果断拒绝了这个面试。 我还为他可惜…

AHB-to-APB Bridge——06testbench、env、base_test、scb

框架&#xff1a; testbench&#xff1a; HCLK_PCLK_RATIO&#xff1a;随机定义hclk pclk比率&#xff1b;各个接口clk、rst连接&#xff1b;生成满足相应比率的pclk&#xff1b;与DUT的连接&#xff1b;将vif set到agt中去&#xff1b;agt在set到底层 关于rest_if&#xff…

如何保证三个线程按顺序执行?不会我教你

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a;CSDN、掘金、infoQ、51CTO等 &#x1f389;简介&#xff1a;CSDN|阿里云|华为云|51CTO等社区博客专家&#xff0c;历届博客之星Top30&#xff0c;掘金年度人气作者Top40&#xff0c;51CTO年度博主Top12…

仪表板展示 | DataEase看世界:数据呈现世界油价变化

背景介绍 最近几个月&#xff0c;全球能源市场一直处于动荡不安的状态&#xff0c;与石油相关的新闻也非常频繁。2023年2月10日&#xff0c;面对西方多轮限价举措&#xff0c;俄罗斯副总理亚历山大诺瓦克宣布&#xff0c;俄罗斯将在3月把每日原油产量下调50万桶。目前&#xf…

FOFA-攻防挑战

记录一下中途短暂的辉煌时刻 辉煌一刻谁都有,别拿一刻当永久 在昨天初尝战果之后&#xff0c;今天又习惯性的打开 https://vulfocus.cn/ 发现今天还有挑战赛&#xff0c;按捺不住躁动的心&#xff0c;又开始了学习。今天主要拿下的是这四个镜像&#xff0c;同时我也会对我了解…

前端SKU一站式解决方案 - Geek-SKU

因为业务需要且市场上的UI框架与插件市场内没有简易的用法并且不够全面萌生便了自己写一个SKU组件的想法&#xff0c;于是Geek-SKU便应运而生。 现在的SKU组件已支持vue、uniapp&#xff0c;支持带图SKU、主题色设置、自动选择低价SKU、自动展示价格区间等&#xff0c;让您更便…

浏览器自动填充但是数据为空的问题

问题背景 公司项目中登录页为了方便&#xff0c;需要允许浏览器自动填充账号密码。这个在很多项目都很常见&#xff0c;但是测试中出现了这样一个问题&#xff1a;视觉上已经自动填充账号密码&#xff0c; 但是当点击密码的小眼睛或者点击登录时&#xff0c;会清空掉填充的数据…

火爆全网,性能测试-全链路压测实战总结,从需求到实战...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 流程导图 梳理阶段…

SpringBoot+Vue 的家政服务管理平台+数据库(附源码)

文章目录 1. 背景2.主要技术3. 可行性分析4.系统设计5系统的详细设计与实现5.1前台模块设计5.2后台功能模块 源码下载地址 1. 背景 本系统主要是设计出家政服务管理平台&#xff0c;基于B/S构架&#xff0c;后台数据库采用了Mysql&#xff0c;可以使数据的查询和存储变得更加有…

Linux函数库管理

文章目录 Linux函数库管理动态与静态函数库静态函数库动态函数库 ldconfig与 /etc/ld.so.confldconfig使用案例 程序的动态函数库解析&#xff1a;lddldd使用案例 校验软件的正确性常见的校验软件有哪些&#xff1f;使用案例 Linux函数库管理 在 Linux 操作系统中&#xff0c;…

【算法竞赛进阶指南】141.周期 题解 KMP 最小循环节

题目描述 一个字符串的前缀是从第一个字符开始的连续若干个字符&#xff0c;例如 abaab 共有 5 5 5 个前缀&#xff0c;分别是 a&#xff0c;ab&#xff0c;aba&#xff0c;abaa&#xff0c;abaab。 我们希望知道一个 N N N 位字符串 S S S 的前缀是否具有循环节。 换言之…

7.Ansible Modules介绍

什么是Ansible Modules? Ansible模块根据其功能分为不同的组&#xff0c;每个模块提供了一些功能&#xff0c;可以直接使用。 模块官方文档: https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html 系统模块是要在系统级别执行的操作,例如修改系统上的用户…

Springboot +spring security,认证方式---Form表单认证的实现(三)

一.简介 这篇文章来学习下security的认证方式其中的Form表单认证 二.Spring Security的认证方式 2.1什么是认证 认证: 就是用来判断系统中是否存在某用户&#xff0c;并判断该用户的身份是否合法的过程&#xff0c;解决的其实是用户登录的问题。认证的存在&#xff0c;是为…

Spring Boot 如何实现异步消息处理

Spring Boot异步消息处理 在现代应用程序中&#xff0c;异步消息处理是一项至关重要的任务。它可以提高应用程序的性能、可伸缩性和可靠性&#xff0c;同时也可以提供更好的用户体验。Spring Boot提供了多种方式来实现异步消息处理&#xff0c;包括使用Spring AMQP、Spring Ka…

【斯歌X捷普】优秀体验官活动:全民开发的样板企业是这样炼成的

3月22日&#xff0c;上海斯歌与捷普共同举办了一场别出心裁的活动——“产品优秀体验官”颁奖典礼&#xff0c;以表彰对业务流程开发做出突出贡献的捷普员工。值得注意的是&#xff0c;获奖的14名流程开发人员中&#xff0c;有7人并非是专业的IT人员&#xff0c;而是来自业务岗…

搜索引擎变天了!谷歌宣布开放「生成式搜索平台」!AI 大模型颠覆搜索体验

作者 | 小戏、兔子酱 搜索引擎&#xff0c;可能真的要变天了&#xff01; Google 终于要迎来它 25 年来最大的改变&#xff0c;谷歌宣布了开始内测开放【生成式搜索平台&#xff08;Search Generative Experience&#xff0c;SGE&#xff09;】&#xff0c;并逐步舍弃那些甚至是…

Linux中与中断相关的内核数据结构

【摘要】本文树妖详细讲解了Linux中与中断相关的内核数据结构及其内部联系。 八、中断相关的数据结构 8.1 irq_desc 用于表示IRQ描述符的结构定义如下&#xff1a;\linux-2.6.32.63\include\linux\irq.h struct irq_desc {unsigned int irq; //中断号unsigned int …

ipad可以使用其他品牌的手写笔吗?2023年电容笔推荐

现在&#xff0c;人们的生活越来越智能化&#xff0c;有些人已经用平板电脑取代了传统的笔记本。我发现用ipad不管是用来画画还是做笔记非常方便&#xff0c;但是苹果Pencil对于大多数人来说都是昂贵的。据我所知&#xff0c;如果仅仅是为了记录&#xff0c;而不是为了画画的话…

他是98年的卷王,我真的玩不过他····

现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里…

PKI 基础知识

摘要 本白皮书介绍了加密和公钥基本结构(PKI)的概念和使用 Microsoft Windows 2000 Server 操作系统中的证书服务的基础知识。如果您还不熟悉加密和公钥技术&#xff0c;先阅读本白皮书将有助于理解 Windows 2000 Web 站点上有关这些主题的其它技术白皮书。 引言 Microsoft …