系统说明
前段时间做的一个智能点餐系统,从0开始,用时3天,其中调bug(内存拷贝)调了一天,囧,现记一些架构文档
这个系统涉及到的知识点还是挺多的
- 典型的c/s模式,socket通信
- 多线程操作
- 数据库操作
- 临界资源的互斥操作
其它的就是功能架构上的一些细节问题,具体问题具体分析,分析过程已经全部留在源代码中了
前期分析的各种流程图,架构文档,分析过程就不传了,免得误导别人,只传最终版的
这里上传之后有些代码和文字没有对齐,在本地是全部对齐的,由于不影响阅读,所以就不改了
终版_模拟现实模型
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/***************************************** * @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.服务端可以统计具体的营利情况,可以了解哪些菜比较好卖嘛
终版_源代码结构说明
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/***************************************** * @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.1,select * 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.2,select * 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);/*查找结账时是否还有待炒订单,有则将其删除*/
终版_系统架构功能说明
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/***************************************** * @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.查看订单队列
终版_功能使用说明
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
/***************************************** * @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.其它操作,请自行测试