【socket】小项目-智能点餐系统

时间:2024-02-23 10:49:59

系统说明

  前段时间做的一个智能点餐系统,从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 成鹏致远远)