zoukankan      html  css  js  c++  java
  • 【socket】小项目-智能点餐系统

    系统说明

      前段时间做的一个智能点餐系统,从0开始,用时3天,其中调bug(内存拷贝)调了一天,囧,现记一些架构文档

      这个系统涉及到的知识点还是挺多的

    1. 典型的c/s模式,socket通信
    2. 多线程操作
    3. 数据库操作
    4. 临界资源的互斥操作

      其它的就是功能架构上的一些细节问题,具体问题具体分析,分析过程已经全部留在源代码中了

      前期分析的各种流程图,架构文档,分析过程就不传了,免得误导别人,只传最终版的

      这里上传之后有些代码和文字没有对齐,在本地是全部对齐的,由于不影响阅读,所以就不改了

    终版_模拟现实模型

    /*****************************************
    *    @author  成鹏致远
    *    @net     http://infodown.tap.cn
    *    @qq          552158509
    *    @mail     infodownzert@gmial.coml
    *****************************************/
    
    ---<项目名称:餐厅智能点菜系统>---
    
    ---<模拟现实模型>---<从现实中找需求>---
    
    --->现实模型
        
        --->1.有<客户到来>
        --->2.客户就是上帝,服务端主动为客户端<分配座位>,并分配一个专门的服务员([接收线程])
        --->3.此时客户可以<查看菜谱>,也可以<直接退出>,当然也可以<点菜>,或者戏剧性的<买单>
        --->4.然后服务员就得根据客户的选择进行相应的处理
            --->4.1.客户非法退出,回收座位
            --->4.2.判断点菜是否合法
        --->5.客户点了菜,服务端就得处理,但是可能很多客户下了很多订单,所以需要维护一个[订单队列]
            --->5.1.从订单队列中取出订单进行<处理>
            --->5.2.处理完了就是上菜了,然后<通知客户>
            --->5.3.上了菜,客户消费完了就得付款,所以需要把帐单保存起来,并置为未付款
        --->6.客户吃饱了,然后就要买单了
            --->6.1.可能开始客户点菜点多了,还有未上完的菜,此时不要了,所以这部分不需要付款
            --->6.2.客户付款可以看到所有的消费详单
            --->6.3.客户离开,回收座位,服务员返回
    
    
        --->7.库存信息是面向客户端与服务端的,即服务端与客户端共享数据库
            --->7.1.客户端与服务端都可以查看数据库
            --->7.2.所以更改数据库操作都只能在服务端,并且是互斥操作
        --->8.服务端可以更新库存数据,不然两下就得关门了
        --->9.服务端可以添加新菜,得扩大基业嘛
        --->10.服务端可以统计具体的营利情况,可以了解哪些菜比较好卖嘛
        
    智能点餐系统_模拟现实模型(By 成鹏致远远)

    终版_源代码结构说明

    /*****************************************
    *    @author  成鹏致远
    *    @net     http://infodown.tap.cn
    *    @qq          552158509
    *    @mail     infodownzert@gmial.coml
    *****************************************/
    
    ---<项目名称:餐厅智能点菜系统>---
    
    ---<源代码结构说明>---<最终版>---
    
    
    --->1.客户端
        
        ├── client            --->客户端执行文件
        ├── client.c                --->客户端主函数文件
        ├── client_func.c        --->客户端主函数实现文件
        ├── client.h                --->客户端头文件
        ├── client_rev.c            --->客户端接收子线程实现文件
    
    --->2.服务端
    
        ├── server                --->服务端执行文件
        ├── server.c                --->服务端主函数文件
        ├── server_func.c        --->服务端主函数实现文件
        ├── server.h                --->服务端头文件
        ├── server_manage.c        --->服务端管理子线程实现文件
        └── server_rev.c            --->服务端接收子线程实现文件
    
    --->3.其它文件
    
        ├── database.txt            --->数据库操作临时文件
        ├── debug.h                --->代码调试头文件
        ├── diet.db                --->数据库文件
        ├── kernel_list.h        --->内核链表头文件
        ├── Makefile                --->Makefile文件
    
    
    --->4.数据库结构
    
        --->4.1select * from store;(库存表,dishid是主键)
            ----------------------------------------------------------------
            dishid    |dishname    |num    |price
            1        |宫爆鸡丁    |65        |20
            2        |红烧全鱼    |31        |30
            3        |日本豆腐    |42        |10
            4        |香菇炒鸡    |45        |40
            5        |乌江鱼片    |50        |50
            6        |农家炒肉    |50        |25
            7        |土豆回锅    |50        |12
            55        |黄瓜炒肉    |55        |55
            ----------------------------------------------------------------
        --->4.2select * from order_table;(订单表)
            ----------------------------------------------------------------
            expense_time    |dishname    |    tableid    |dishid    |price    |state
            Aug 10 21:09    |红烧全鱼    |    0        |2        |30        |0
            Aug 10 21:09    |宫爆鸡丁    |    1        |1        |20        |0
            Aug 10 21:13    |宫爆鸡丁    |    1        |1        |20        |0
            Aug 10 21:13    |红烧全鱼    |    1        |2        |30        |0
            Aug 10 21:13    |日本豆腐    |    0        |3        |10        |0
            ----------------------------------------------------------------
    
    --->5.消息类型
        enum msg_type        /*消息类型*/
        {
            order_msg = 2,    /*订单*/
            checkout_msg,    /*买单*/
            prompt_msg        /*提示*/
        };
    
    --->6.订单表结构体
        typedef struct order_table/*订单表*/
        {
            int tableid;                    /* 餐桌号 */
            int dishid;                        /*菜编号*/
            char dishname[20];                /*菜名*/
            int price;                        /*价格*/
            int fd;                            /*通信接口*/
            char time[20];                    /*订单时间*/
            int state;                        /*订单状态,-1为待炒,1为已完成,0为已买单*/
            struct list_head list;            /*订单消息队列*/
        }order_table;
    
    --->7.通用消息结构
        typedef struct msg_t            /*通用消息结构体*/
        {
            int type;                    /* 消息类型 */        
            int fd;                        /*通信接口*/
            char buf[BUFFER_LEN];        /*附加信息*/
            order_table order;            /*订单表*/
        }msg;
    
    --->8.全局座位表
        int seat[SEAT_NUM]; /*20个座位,0为无人,1为占用*/
    
    --->9.客户端函数说明
        extern int client_menu();/*客户选择菜单*/
        extern void show_store();/*显示库存*/
        extern void send_order(int cli_fd);/*客户端发出订单*/
        extern void send_checkout(int cli_fd);/*发出买单消息*/
        extern void gettime(char *s);//获取系统当前时间
        extern void view_order(int client_tableid);/*查看订单详细情况*/
        extern void *rcv_pthread(void *arg);/*线程接收函数*/
        extern void message_from_server(msg rcv_msg);/*显示来自服务端的提示信息*/
        extern void rcv_checkout(msg rcv_msg);/*服务端发送的帐单消息*/
    
    --->10.服务端函数说明
        extern void init_queue(p_order *head);/*初始化待处理消息队列*/
        extern bool seat_handle(int cli_fd);/*入座处理*/
        extern void show_store();/*显示库存*/
        extern void *srv_manage();/*服务器维护线程*/
        extern int manage_menu();/*服务器功能选择菜单*/
        extern void tra_order(p_order head);/*打印待处理订单信息*/
        extern void store_manage();/*库存管理*/
        extern void deal_with_order(p_order head);/*处理订单*/
        extern void update_diet();/*更新库存数量*/
        extern void add_diet();/*添加新菜*/
        extern void check_out();/*盘点营利情况*/
        extern void *rcv_pthread(void *arg);/*线程接收函数*/
        extern void reply_order(msg rcv_msg,int fd,p_order head);/*回复订单*/
        extern void reply_checkout(msg rcv_msg,int fd);/*响应买单消息*/
        extern void check_order(msg rcv_msg, p_order head);/*查找结账时是否还有待炒订单,有则将其删除*/
    智能点餐系统_源代码结构说明(By 成鹏致远远)

     终版_系统架构功能说明

    /*****************************************
    *    @author  成鹏致远
    *    @net     http://infodown.tap.cn
    *    @qq          552158509
    *    @mail     infodownzert@gmial.coml
    *****************************************/
    
    
    ---<项目名称:餐厅智能点菜系统>---
    
    ---<系统架构功能说明>---<最终版>---
    
    --->1.客户端
        --->1.主线程
            --->1.读菜谱
            --->2.下订单
                --->1.菜谱中无此订单(失败)
                --->2.库存数量不足(失败)
                --->3.订单合法(发送)
            --->3.买单
                --->1.未下单(退出)
                --->2.已下单,但是部分订单未完成(只对完成订单进行付款)
                --->3.查看消费订单详细信息(时间,菜名,价格,总消费)
            --->4.非法退出
                --->1.根据现实模型,只允许未下订单时非法退出(ctrl+c)
                --->2.服务器回收座位
        --->2.接收线程
            --->1.服务端提示信息
                --->1.订单完成信息
            --->2.服务端发送的帐单信息
                --->1.接受消费总额信息
                --->2.退出程序
    
    --->2.服务端
        --->1.主线程
            --->1.座位分配
                --->1.有座位(继续)
                --->2.无座位(关闭)
            --->2.监听连接
                --->1.为新连接分配接收线程
        --->2.接收线程
            --->1.订单回复
                --->1.减少数据库的库存(互斥操作)
                --->2.将订单表加入服务端工作队列(队列操作)
                --->3.提示客户正在处理订单
            --->2.买单回复
                --->1.客户未进行消费
                    --->1.通知客户
                    --->2.收回座位号
                --->2.客户有进行消费
                    --->1.计算客户消费总额
                    --->2.更改订单状态为付款(互斥操作)
                    --->3.检查工作队列中否有客户对应的未完成订单
                        --->1.有未完成订单
                            --->1.取消订单,从工作队列中删除
                            --->2.恢复2.2.1.1操作中减少的库存(互斥操作)
                    --->4.收回座位号
                    --->5.向客户发送帐单消息
        --->3.维护线程
            --->1.处理订单
                --->1.订单队列为空(返回)
                --->2.订单队列不为空
                    --->1.从队列头取出一个订单
                    --->2.通知相应客户订单完成
                    --->3.将相应订单从队列中删除
                    --->4.置订单为已完成但未付款状态
                    --->5.将此订单加入到订单数据库
            --->2.库存管理
                --->1.更新库存
                    --->1.没有此类菜(失败)
                    --->2.输入正确(成功)
                --->2.添加新菜
                    --->1.菜id重复(失败)
                    --->2.输入正确(成功)
            --->3.盘点清单
                --->1.盘点所有消费历史帐单
                --->2.统计历史营利总额
            --->4.查看订单队列
                
        
    智能点餐系统_系统架构功能说明(By 成鹏致远远)

      

    终版_功能使用说明

    /*****************************************
    *    @author  成鹏致远
    *    @net     http://infodown.tap.cn
    *    @qq          552158509
    *    @mail     infodownzert@gmial.coml
    *****************************************/
    
    ---<项目名称:餐厅智能点菜系统>---
    
    ---<功能使用说明>---<部分版>---<目前尚未发现bug>---
    
    --->1.服务端
    
        ^_^ Server on !!!                                                    --->服务端启动提示
    
        ---------------------------------------------------
                Welcome ! Today's menu                                        --->今日最新菜谱
        ---------------------------------------------------
        dishid  dishname        num     price
        1       宫爆鸡丁        65      20
        2       红烧全鱼        31      30
        3       日本豆腐        42      10
        4       香菇炒鸡        45      40
        5       乌江鱼片        50      50
        6       农家炒肉        50      25
        7       土豆回锅        50      12
        55      黄瓜炒肉        55      55
    
    
        ---------manage-----------                                            --->服务端功能选择
        1)deal order                                                        --->1.处理订单,对应架构功能说明的2.3.1
        2)store manage                                                        --->2.库存管理,对应架构功能说明的2.3.2
        3)profit sum                                                        --->3.营利统计,对应架构功能说明的2.3.3
        4)print order                                                        --->4.查看队列,对应架构功能说明的2.3.4
        5)exit                                                                --->5.退出
        ------------------------
        Pls choice:
    
    --->2.客户端
        connect success                                                        --->连接到服务端
        From Server : Hello,your seat is 0,Pls follow the menu,happy diet!    --->接受服务端分配的座位号
    
    
        ---------menu-----------                                            --->客户端功能选择
        1)print menu                                                        --->1.查看最新菜谱
        2)order                                                                --->2.下订单
        3)check out                                                            --->3.买单
        ------------------------
        Pls choice:
    
    --->3.服务端查看队列
        ---------manage-----------
        1)deal order
        2)store manage
        3)profit sum
        4)print order
        5)exit
        ------------------------
        Pls choice:4                                                        --->选择查看队列
    
        --------------------  queue  --------------------                    --->显示队列订单
        --->tableid:0(宫爆鸡丁)                                                --->0号桌有两个菜待炒
        --->tableid:0(日本豆腐)
    
    --->4.服务端处理订单
        --->4.1.服务端
            ---------manage-----------
            1)deal order
            2)store manage
            3)profit sum
            4)print order
            5)exit
            ------------------------
            Pls choice:1                                                    --->服务端选择处理订单
        --->4.2.客户端
            --------------------  Notice  --------------------                --->收到来看服务端的提示
    
            --------------------------------------------------
            ^_^ Hello,your 宫爆鸡丁(20$) is ok,have fun !                    --->队列第一份菜已炒好,20$
    
            --------------------------------------------------
    
    --->5.客户端买单
        --->5.1.客户端
            ---------menu-----------
            1)print menu
            2)order
            3)check out
            ------------------------
            Pls choice:3                                                    --->选择买单
    
            ---------------------------------------------------
                    Hello,this is your bill                                    --->消费详情,下了两个单,但是只消费了一个
            ---------------------------------------------------
            expense_time    dishname        price
            Aug 11 10:47    宫爆鸡丁        20
    
    
            --------------------  Notice  --------------------
            ^_^ Your tableid is 0,and should pay 20$                        --->只付款已消费的单,20$
    
            -------------------  Bye--Bye  -------------------
            ^_^ welcome next time !                                            --->友情提示
    
            --------------------------------------------------
        --->5.2.服务端
            --->tableid(0) should pay:20$                                    --->计算0号桌需要付款20$
            ---<Notice>---tableid:0(dishname:日本豆腐) cancel !                --->0号桌的其余菜被取消
    
    --->6.服务端查看营利情况
        ---------manage-----------
        1)deal order
        2)store manage
        3)profit sum
        4)print order
        5)exit
        ------------------------
        Pls choice:3                                                        --->选择营利统计
        ---------------------------------------------------
                Hello,this is sell bill                                        --->营利详单
        ---------------------------------------------------
        expense_time    dishname        price                                --->包括消费时间,菜名,价格
        Aug 10 21:09    红烧全鱼        30
        Aug 10 21:09    宫爆鸡丁        20
        Aug 10 21:13    宫爆鸡丁        20
        Aug 10 21:13    红烧全鱼        30
        Aug 10 21:13    日本豆腐        10
        Aug 11 10:47    宫爆鸡丁        20
    
        ^_^ Income:130                                                --->统计今日收入
    
    --->7.其它操作,请自行测试
    智能点餐系统_功能使用说明(By 成鹏致远远)
  • 相关阅读:
    mysqlsla 分析mysql慢查询日志
    MyBatis-DynamicSQL 动态SQL
    MyBatis-resultType 与 resultMap 中的几种返回类型
    MyBatis-${}与#{}
    MyBatis-parameterType 入参封装 Map 流程
    MyBatis-parameterType 取出入参值
    MyBatis-CURD
    第二十四篇-用VideoView制作一个简单的视频播放器
    第二十三篇-ubuntu18.04怎么下载播放器以及如何设置默认播放器
    第二十二篇-Guideline基准线
  • 原文地址:https://www.cnblogs.com/lcw/p/3251154.html
Copyright © 2011-2022 走看看