基于ThinkPHP+MySQL+HTML的酒店管理系统设计与实现

目 录
摘 要: 1
1项目背景 3
1.1项目背景 3
1.2项目开发的必要性 3
2可行性分析 3
2.1技术可行性 4
2.1.1 ThinkPHP框架 4
2.1.2 Ngnix技术 5
2.1.3 MySQL数据库 5
2.2操作可行性 5
2.2.1房间入住功能 5
2.2.2换房功能 5
2.2.3退房功能 6
2.3经济可行性 6
2.3.1成本估算 6
2.3.2 Gantt图 8
3需求分析 8
3.1系统数据的需求 8
3.2系统用例图 9
3.2.1用例分析 9
3.2.2 UML动态建模时序图的分析 10
3.3系统性能的需求 12
3.3.1易用性 12
3.3.2可扩展性 12
3.3.3安全性 13
3.4系统的安全性需求分析 13
3.4.1产生的资产清单 13
3.4.2面临的威胁 13
3.4.3存在的脆弱性 14
3.4.4安全性需求确定 14
3.5系统功能性需求分析 15
3.6非功能性需求分析 17
4系统总体设计 17
4.1系统总体活动分析 18
4.2系统功能的设计 18
4.2.1酒店前台功能设计 18
4.2.2酒店管理员功能设计 18
4.2.3房间管理模块功能设计 19
4.2.4优惠活动模块功能设计 19
4.2.5预定者预定酒店模块功能设计 19
4.2.6商品管理模块功能设计 19
4.3数据库的设计 19
4.3.1数据库设计特点 20
4.3.2数据库概念设计 20
4.3.3E-R图 20
4.3.4逻辑模式的设计 21
4.3.5物理模式的设计 21
5系统实现 27
5.1前台服务功能模块实现 27
5.1.1登录模块 27
5.1.2房间动态显示模块 28
5.1.3优惠活动制定显示模块 29
5.1.4预定信息显示模块 30
5.1.5商品信息显示模块 32
5.2后台管理员功能账户管理模块实现 33
6酒店管理系统测试及分析 34
6.1测试方法 34
6.2测试用例 35
6.2.1用户登录模块测试 35
6.2.2房间动态修改模块测试 35
6.2.3商品管理模块测试 35
6.2.4优惠活动模块测试 36
6.2.5酒店前台交班管理模块测试 36
6.2.6顾客会员办理模块测试 37
6.3测试结果分析 37
7总结与展望 37
7.1设计工作总结 37
7.2后续工作展望 38
参考文献 39
致 谢 40

4系统总体设计
经过需求分析阶段的工作,现已明确系统功能模块的详细设计与分析,接下来进行数据库的设计,其中包括实体的确立,各实体之间关系的确立,数据表的创建及每个表各种字段的属性的确立等。
4.1系统总体活动分析
酒店管理系统可由酒店前台服务人员、酒店管理人员和顾客预约三种操作系统。其中在管理员登录系统后可以进行客房管理、员工信息管理、修改房型信息、营销价格制定以及官网价格制定等权限和功能。而前台服务人员可以管理顾客信息、房间信息、操作顾客入住、换房、退房等操作,除此之外,前台服务人员还可以查看当前营销数据,核对账单以及交接班管理等功能和权限。顾客具有注册、登录、浏览客房信息、预定房间以及退订房间等操作和权限。
酒店管理系统功能结构图如图4-1所示。
在这里插入图片描述

图4-1 酒店管理系统功能结构图
4.2系统功能的设计
4.2.1酒店前台功能设计
前台服务员功能只有登录操作。因为前台服务员的信息应该由管理员审核过后并注册相关信息,然后通过给定账号进行登录,通常情况下管理人员只有一个,而前台服务人员有多个。前台服务员通过登录该账号才会有对房间客人信息所操作的权限。而管理员页面是可以自己注册添加其他管理员的。
4.2.2酒店管理员功能设计
酒店管理员可以增加酒店员工、查询员工信息、修改员工信息,以及删除离职员工这些操作。被离职的员工就不能再登录本系统进行相关功能操作。添加员工需输入员工的姓名、手机号、性别、登录名、密码等关键信息。酒店管理员具有最高的权限,可以管理物品以及房间价格制定等权限。

<?php
namespace app\home\controller;

use app\home\validate\Into;
use app\index\controller\Basics;
use think\facade\Db;

class Index extends Basics
{
    /*
     * 前台首页
     * */
    public function index()
    {
        $list =  Db::table('admin')
                    ->alias('a')
                    ->field('a.*,b.building')
                    ->join('building b','a.building_id = b.id')
                    ->where('a.username',session('admin'))
                    ->find();
        session('building_id',$list['building_id']);
        return view('index',['list' => $list]);
    }
    /*
     * 房间动态
     * */
    public function welcome(){
        $list =  Db::table('room')
            ->alias('a')
            ->field('a.*,b.type_name,b.price,b.deposit,c.building,d.storey')
            ->join('layout b','a.type_id = b.id')
            ->join('building c','a.building_id = c.id')
            ->join('storey d','a.storey_id = d.id')
            ->where('a.building_id',session('building_id'))
            ->select();
//        dump($list);
        if(request()->isAjax()){
            return json($list);
        }
        return view('welcome',['list' => $list]);
    }


    /*
     * 办理入住
     * */
    public function handle(){
        //办理入住
        if(request()->isAjax()){
            $validate = new Into();
            if (!$validate->check(input('param.'))) {
                return $this->return_json($validate->getError(),'0');
            }

            if($this->select_find('member',['id'=> input('member_id')])){
                $data = input('param.');
                $data['status'] = '3';
                $data['create_time'] = time();
            }else{
                $data = input('param.');
                $data['create_time'] = time();
            }
            //保存数据记录
            $this->record($data);

            if( Db::name('room')->update($data)){
//                Db::name('income')->insert($datas);
                return $this->return_json('入住成功','100');
            }else{
                return $this->return_json('入住失败','0');
            }
        }
        $id  = input('id');
        $activity = $this->select_all('activitys');//促销活动
        $identity = $this->select_all('identity');//证件类型
        $guest = $this->select_all('guest');//宾客来源
        $payment = $this->select_all('payment');//支付方式
        $member = Db::name('member')->where(['building_id'=>session('building_id')])->paginate('10');
//        dump($member);
        $list = $this->select_find('room',['id'=>$id]);

        //查询追加的房间
        $map = [
            ['a.building_id','=',session('building_id')],
            ['a.room_id','=',$id],
            ['a.id','<>',$id]
        ];
        $show =  Db::table('room')
            ->alias('a')
            ->field('a.*,b.type_name,b.price,b.deposit,c.building,d.storey')
            ->join('layout b','a.type_id = b.id')
            ->join('building c','a.building_id = c.id')
            ->join('storey d','a.storey_id = d.id')
            ->where($map)
            ->select();
//        dump( Db::table('room')->getLastSql());
        return view('handle',['activity' => $activity,'identity' => $identity,'guest' => $guest,'payment' => $payment,'list' => $list,'member' => $member,'show' => $show]);
    }


    /*
     * 入住房间价格和记录收入信息
     * */
    public function record($data){

        if(isset($data['room_id'])){
           $datas['superior_id'] = $data['room_id'];
        }
        //先查询今日的价格
        $list = $this->select_find('week',['layout_id' => $data['id']]);
        $datas['income_details'] = $list['monday'];
        $datas['room_id'] = $data['id'];
        //查询押金
        $show =  Db::table('room')
            ->alias('a')
            ->field('a.*,b.type_name,b.price,b.deposit')
            ->join('layout b','a.type_id = b.id')
            ->where(['a.id' => $data['id']])
            ->find();
        $datas['deposit_record'] = $show['deposit'] ;
        $datas['create_time'] = time();
        //查询优惠活动
        if(isset($data['activity_id'])){
            $list = $this->select_find('activitys',['id' => $data['activity_id']]);
            if(strtotime($list['start']) <= time() && strtotime($list['end']) <= time() ){
                $datas['activity_price'] = $list['price'];
            }else{
                $datas['activity_price'] = '1';
            }
        }

        //会员折扣
        if(isset($data['member_id']) && $data['member_id'] != 0){
            $member =  Db::table('member')
                ->alias('a')
                ->field('a.*,b.price')
                ->join('viptype b','a.type = b.id')
                ->where(['a.id' => $data['member_id']])
                ->find();
            $datas['member_price'] = $member['price'];
        }else{
            $datas['member_price'] = '1';
        }
        Db::name('income')->save($datas);

    }

    /*
     * 追加房间
     * */
    public function addroom(){
        if(request()->isAjax()){
            $res =  Db::name('room')
                    ->where('id', input('id'))
                    ->update(['room_id' => input('room_id'),'status' => 2,'create_time' => time()]);
            $this->record(input('param.'));
            if($res){
                return $this->return_json('新增成功','100');
            }else{
                return $this->return_json('新增失败','0');
            }
        }

        $map = [
            ['a.building_id','=',session('building_id')],
            ['a.room_id','=','no'],
            ['a.id','<>',input('room_id')]
        ];
        $list =  Db::table('room')
            ->alias('a')
            ->field('a.*,b.type_name,b.price,b.deposit,c.building,d.storey')
            ->join('layout b','a.type_id = b.id')
            ->join('building c','a.building_id = c.id')
            ->join('storey d','a.storey_id = d.id')
            ->where($map)
            ->select();
//        dump( Db::table('room')->getLastSql());
//        dump($list);
        return view('addroom',['list' => $list,'room_id' =>  input('room_id')]);
    }

    /*
     * 移除房间
     * */
    public function remove(){
        if(request()->isAjax()){
            $data = [
                'status' => 1,
                'room_id' => 'no',
                'guest_name' => '',
                'activity_id' => '',
                'credentials' => '',
                'guest_sex' =>'',
                'guest_source' =>'',
                'guest_number' =>'',
                'move_duration' =>'',
                'move_time' => ''
            ];
            $res =  Db::name('room')
                ->where('id', input('id'))
                ->update($data);
            if($res){
                Db::name('income')->where('room_id', input('id'))->delete();
                return $this->return_json('移除成功','100');
            }else{
                return $this->return_json('移除失败','0');
            }
        }
    }

    /*
     * 随客管理
     * */
    public function peers(){
        $map = [
            ['a.building_id','=',session('building_id')],
            ['a.room_id','=',input('room_id')],
            ['a.id','<>',input('room_id')]
        ];
        $list =  Db::table('room')
            ->alias('a')
            ->field('a.*,b.type_name,b.price,b.deposit,c.building,d.storey')
            ->join('layout b','a.type_id = b.id')
            ->join('building c','a.building_id = c.id')
            ->join('storey d','a.storey_id = d.id')
            ->where($map)
            ->select();
        $identity = $this->select_all('identity');//证件类型
        return view('peers',['list' => $list,'identity' => $identity]);
    }

    /*
     * 随客资料添加
     * */
    public function addpeers(){
        if(request()->isAjax()){
            if( Db::name('room')->update(input('param.'))){
                return $this->return_json('入住成功','100');
            }else{
                return $this->return_json('入住失败','0');
            }
        }
        return view('addpeers',['id' => input('id')]);
    }

    /*
     * 会员选择
     * */
    public function select_member(){
        $data = $this->select_find('member',['id' => input('id')]);
        return json($data);
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值