基于Java+Springboot+Bootstrap+mybatis实现的酒店管理系统


🍅文末评论区获取联系🍅

技术组成

SpringBoot
MyBatis
Shiro
Thymeleaf
Bootstrap + jQuery

部署环境

JDK1.8+Maven3.6+Mysql5.7+IDEA/Eclipse

系统功能设计

本人采用了Java语言和MySQL数据库技术,基于Springboot框架设计并实现了酒店管理系统。系统分为:管理员、顾客、酒店工作人员三个角色。

管理员功能包括:客房类型管理、客房管理、订单管理、入住登记、退房登记、客房清洁管理、留言管理、财务管理、人员管理、角色管理、权限管理。

顾客功能包括:客房浏览、房间预定、支付宝沙箱支付 、房间续订、退房、在线留言、我的订单、个人资料、修改密码等功能模块。

酒店工作人员功能包括:订单管理、入住登记管理、退房登记管理、客房清洁管理、留言管理、财务管理。

本系统界面友好、操作方便,系统功能完善、运行稳定、数据安全可靠。

线上访问地址

点击此连接,线上访问,在线浏览操作

系统功能框图

管理员功能框图

在这里插入图片描述

顾客功能框图

在这里插入图片描述

酒店工作人员功能框图

在这里插入图片描述

功能截图

前台首页

在这里插入图片描述

在这里插入图片描述

房间预定

在这里插入图片描述

结算支付

在这里插入图片描述

支付完成

在这里插入图片描述

在线留言

在这里插入图片描述

订单管理

在这里插入图片描述

入住登记

在这里插入图片描述
在这里插入图片描述

退房登记

在这里插入图片描述
在这里插入图片描述

客房清洁管理

在这里插入图片描述

财务管理

在这里插入图片描述

角色管理

在这里插入图片描述

权限管理

在这里插入图片描述

个人信息

在这里插入图片描述

退房&续订

在这里插入图片描述
在这里插入图片描述

论文部分截图

目录1

在这里插入图片描述

目录2

在这里插入图片描述

数据流分析

在这里插入图片描述

实体属性图

在这里插入图片描述

系统ER图

在这里插入图片描述

表结构设计

在这里插入图片描述

系统实现

在这里插入图片描述

测试用例

在这里插入图片描述

部分功能实现代码

订单模块

@Controller
@RequestMapping(value = "/admin/order")
public class OrderController extends BaseController {

    private static final Logger log = org.slf4j.LoggerFactory.getLogger(OrderController.class);
    @Autowired
    private OrderService orderService;

    @Autowired
    private RecordService recordService;

    @Autowired
    private PostService postService;

    @Autowired
    private CleanService cleanService;

    /**
     * 查询所有订单并渲染order页面
     *
     * @return 模板路径admin/admin_order
     */
    @GetMapping
    public String orders(@RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                         @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                         @RequestParam(value = "sort", defaultValue = "id") String sort,
                         @RequestParam(value = "order", defaultValue = "desc") String order,
                         @RequestParam(value = "keywords", defaultValue = "") String keywords,
                         @RequestParam(value = "status", defaultValue = "-1") Integer status,
                         Model model) {
        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        if (StringUtils.isNotEmpty(keywords)) {
            queryWrapper.and(wrapper -> wrapper.like("code", keywords).or().like("name", keywords)
                    .or().like("id_card", keywords).like("phone", keywords));
        }
        if (status != -1) {
            queryWrapper.eq("status", status);
        }
        Boolean isCustomer = loginUserIsCustomer();
        if (isCustomer) {
            queryWrapper.eq("user_id", getLoginUserId());

        }
        Page<Order> orderPage = orderService.findAll(page, queryWrapper);
        model.addAttribute("orders", orderPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));
        model.addAttribute("keywords", keywords);
        model.addAttribute("status", status);

        model.addAttribute("isCustomer", isCustomer);
        return "admin/admin_order";
    }


    /**
     * 删除订单
     *
     * @param id 订单Id
     * @return JsonResult
     */
    @PostMapping(value = "/delete")
    @ResponseBody
    public JsonResult delete(@RequestParam("id") Long id) {
        Order order = orderService.get(id);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }

        orderService.delete(id);


        Long postId = order.getPostId();
        Long userId = order.getUserId();
        List<String> dateList = DateUtil.getBetweenDates(order.getStartDate(), order.getQuantity());

        // 释放预定
        recordService.delete(postId, userId, dateList);
        return JsonResult.success("删除成功");
    }


    /**
     * 完结订单
     *
     * @param id 订单Id
     * @return JsonResult
     */
    @PostMapping(value = "/finish")
    @ResponseBody
    public JsonResult finish(@RequestParam("id") Long id) {
        User user = getLoginUser();

        Order order = orderService.get(id);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }

        order.setStatus(OrderStatusEnum.FINISHED.getCode());
        orderService.update(order);

        Post post = postService.get(order.getPostId());
        if (post != null) {
            // 创建清洁通知
            Clean clean = new Clean();
            clean.setCreateTime(new Date());
            clean.setUpdateTime(new Date());
            clean.setCreateBy(user.getCreateBy());
            clean.setPostTitle(post.getPostTitle());
            clean.setNumber(post.getNumber());
            clean.setStatus(0);
            clean.setOrderId(id);
            clean.setPostId(post.getId());
            cleanService.insert(clean);
        }

        Long postId = order.getPostId();
        Long userId = order.getUserId();
        List<String> dateList = DateUtil.getBetweenDates(order.getStartDate(), order.getQuantity());

        // 释放预定
        recordService.delete(postId, userId, dateList);
        return JsonResult.success("退房成功");
    }

    /**
     * 取消订单
     *
     * @param id 订单Id
     * @return JsonResult
     */
    @PostMapping(value = "/cancel")
    @ResponseBody
    @Transactional
    public JsonResult close(@RequestParam("id") Long id) {
        // 修改订单状态
        Order order = orderService.get(id);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }

        order.setStatus(OrderStatusEnum.CANCEL.getCode());
        orderService.update(order);

        Long postId = order.getPostId();
        Long userId = order.getUserId();
        List<String> dateList = DateUtil.getBetweenDates(order.getStartDate(), order.getQuantity());

        // 释放预定
        recordService.delete(postId, userId, dateList);
        return JsonResult.success("关闭成功");
    }

    /**
     * 财务页面
     *
     * @param model
     * @return
     */
    @GetMapping("/finance")
    public String finance(@RequestParam(value = "startDate", defaultValue = "") String startDate,
                          @RequestParam(value = "endDate", defaultValue = "") String endDate,
                          @RequestParam(value = "page", defaultValue = "0") Integer pageNumber,
                          @RequestParam(value = "size", defaultValue = "10") Integer pageSize,
                          @RequestParam(value = "sort", defaultValue = "id") String sort,
                          @RequestParam(value = "order", defaultValue = "desc") String order,
                          Model model) {

        Page page = PageUtil.initMpPage(pageNumber, pageSize, sort, order);
        Page<Order> orderPage = orderService.findAll(startDate, endDate, page);
        model.addAttribute("orders", orderPage.getRecords());
        model.addAttribute("pageInfo", PageUtil.convertPageVo(page));

        model.addAttribute("startDate", startDate);
        model.addAttribute("endDate", endDate);

        Integer totalPrice = orderService.getTotalPriceSum(startDate, endDate);
        model.addAttribute("totalPrice", totalPrice == null ? 0 : totalPrice);
        return "admin/admin_finance";
    }

    /**
     * 续订
     *
     * @param id 订单Id
     * @return JsonResult
     */
    @PostMapping(value = "/extend")
    @ResponseBody
    public JsonResult extend(@RequestParam("id") Long id,
                             @RequestParam("endDate") String end) throws ParseException {
        User user = getLoginUser();

        Order order = orderService.get(id);
        if (order == null) {
            return JsonResult.error("订单不存在");
        }

        // 判断离店日期是否合法
        DateFormat dateFormat = new SimpleDateFormat(DateUtil.FORMAT);
        Date endDate = dateFormat.parse(end);

        Date oldEndDate = dateFormat.parse(order.getEndDate());

        if (!endDate.after(oldEndDate)) {
            return JsonResult.error("新的退房日期不能小于等于之前的退房日期");
        }


        int quantity = DateUtil.differentDays(oldEndDate, endDate);
        if (quantity < 1) {
            return JsonResult.error("至少需要续订一天");
        }


        // 查询日期列表
        List<String> dateList = DateUtil.getBetweenDates(order.getEndDate(), quantity);
        // 判断客房是否可以预定
        List<Record> recordList = recordService.findByPostIdAndRecordDate(order.getPostId(), dateList);
        if (recordList.size() > 0) {
            Record record = recordList.get(0);
            return JsonResult.error("该房间" + record.getRecordDate() + "已被人预定,请重新选择续订日期");
        }

        order.setQuantity(order.getQuantity() + quantity);
        order.setEndDate(dateFormat.format(endDate));
        order.setTotalPrice(order.getPrice() * quantity + order.getTotalPrice());
        orderService.update(order);

        // 添加预定记录
        for (String recordDate : dateList) {
            Record record = new Record();
            record.setPostId(order.getPostId());
            record.setUserId(user.getId());
            record.setRecordDate(recordDate);
            recordService.insert(record);
        }
        return JsonResult.success("续订成功");
    }


}

源码获取

评论区【有偿】

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值