系统说明
前段时间做的一个智能点餐系统,从0开始,用时3天,其中调bug(内存拷贝)调了一天,囧,现记一些架构文档
这个系统涉及到的知识点还是挺多的
- 典型的c/s模式,socket通信
- 多线程操作
- 数据库操作
- 临界资源的互斥操作
其它的就是功能架构上的一些细节问题,具体问题具体分析,分析过程已经全部留在源代码中了
前期分析的各种流程图,架构文档,分析过程就不传了,免得误导别人,只传最终版的
这里上传之后有些代码和文字没有对齐,在本地是全部对齐的,由于不影响阅读,所以就不改了
终版_模拟现实模型
/*****************************************
* @author 成鹏致远
* @net http://infodown.tap.cn
* @qq 552158509
* @mail infodownzert@gmial.coml
*****************************************/ ---<项目名称:餐厅智能点菜系统>--- ---<模拟现实模型>---<从现实中找需求>--- --->现实模型 --->.有<客户到来>
--->.客户就是上帝,服务端主动为客户端<分配座位>,并分配一个专门的服务员([接收线程])
--->.此时客户可以<查看菜谱>,也可以<直接退出>,当然也可以<点菜>,或者戏剧性的<买单>
--->.然后服务员就得根据客户的选择进行相应的处理
--->4.1.客户非法退出,回收座位
--->4.2.判断点菜是否合法
--->.客户点了菜,服务端就得处理,但是可能很多客户下了很多订单,所以需要维护一个[订单队列]
--->5.1.从订单队列中取出订单进行<处理>
--->5.2.处理完了就是上菜了,然后<通知客户>
--->5.3.上了菜,客户消费完了就得付款,所以需要把帐单保存起来,并置为未付款
--->.客户吃饱了,然后就要买单了
--->6.1.可能开始客户点菜点多了,还有未上完的菜,此时不要了,所以这部分不需要付款
--->6.2.客户付款可以看到所有的消费详单
--->6.3.客户离开,回收座位,服务员返回 --->.库存信息是面向客户端与服务端的,即服务端与客户端共享数据库
--->7.1.客户端与服务端都可以查看数据库
--->7.2.所以更改数据库操作都只能在服务端,并且是互斥操作
--->.服务端可以更新库存数据,不然两下就得关门了
--->.服务端可以添加新菜,得扩大基业嘛
--->.服务端可以统计具体的营利情况,可以了解哪些菜比较好卖嘛
智能点餐系统_模拟现实模型(By 成鹏致远远)
终版_源代码结构说明
/*****************************************
* @author 成鹏致远
* @net http://infodown.tap.cn
* @qq 552158509
* @mail infodownzert@gmial.coml
*****************************************/ ---<项目名称:餐厅智能点菜系统>--- ---<源代码结构说明>---<最终版>--- --->.客户端 ├── client --->客户端执行文件
├── client.c --->客户端主函数文件
├── client_func.c --->客户端主函数实现文件
├── client.h --->客户端头文件
├── client_rev.c --->客户端接收子线程实现文件 --->.服务端 ├── server --->服务端执行文件
├── server.c --->服务端主函数文件
├── server_func.c --->服务端主函数实现文件
├── server.h --->服务端头文件
├── server_manage.c --->服务端管理子线程实现文件
└── server_rev.c --->服务端接收子线程实现文件 --->.其它文件 ├── database.txt --->数据库操作临时文件
├── debug.h --->代码调试头文件
├── diet.db --->数据库文件
├── kernel_list.h --->内核链表头文件
├── Makefile --->Makefile文件 --->.数据库结构 --->4.1,select * from store;(库存表,dishid是主键)
----------------------------------------------------------------
dishid |dishname |num |price
|宫爆鸡丁 | |
|红烧全鱼 | |
|日本豆腐 | |
|香菇炒鸡 | |
|乌江鱼片 | |
|农家炒肉 | |
|土豆回锅 | |
|黄瓜炒肉 | |
----------------------------------------------------------------
--->4.2,select * from order_table;(订单表)
----------------------------------------------------------------
expense_time |dishname | tableid |dishid |price |state
Aug : |红烧全鱼 | | | |
Aug : |宫爆鸡丁 | | | |
Aug : |宫爆鸡丁 | | | |
Aug : |红烧全鱼 | | | |
Aug : |日本豆腐 | | | |
---------------------------------------------------------------- --->.消息类型
enum msg_type /*消息类型*/
{
order_msg = , /*订单*/
checkout_msg, /*买单*/
prompt_msg /*提示*/
}; --->.订单表结构体
typedef struct order_table/*订单表*/
{
int tableid; /* 餐桌号 */
int dishid; /*菜编号*/
char dishname[]; /*菜名*/
int price; /*价格*/
int fd; /*通信接口*/
char time[]; /*订单时间*/
int state; /*订单状态,-1为待炒,1为已完成,0为已买单*/
struct list_head list; /*订单消息队列*/
}order_table; --->.通用消息结构
typedef struct msg_t /*通用消息结构体*/
{
int type; /* 消息类型 */
int fd; /*通信接口*/
char buf[BUFFER_LEN]; /*附加信息*/
order_table order; /*订单表*/
}msg; --->.全局座位表
int seat[SEAT_NUM]; /*20个座位,0为无人,1为占用*/ --->.客户端函数说明
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);/*服务端发送的帐单消息*/ --->.服务端函数说明
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
*****************************************/ ---<项目名称:餐厅智能点菜系统>--- ---<系统架构功能说明>---<最终版>--- --->.客户端
--->.主线程
--->.读菜谱
--->.下订单
--->.菜谱中无此订单(失败)
--->.库存数量不足(失败)
--->.订单合法(发送)
--->.买单
--->.未下单(退出)
--->.已下单,但是部分订单未完成(只对完成订单进行付款)
--->.查看消费订单详细信息(时间,菜名,价格,总消费)
--->.非法退出
--->.根据现实模型,只允许未下订单时非法退出(ctrl+c)
--->.服务器回收座位
--->.接收线程
--->.服务端提示信息
--->.订单完成信息
--->.服务端发送的帐单信息
--->.接受消费总额信息
--->.退出程序 --->.服务端
--->.主线程
--->.座位分配
--->.有座位(继续)
--->.无座位(关闭)
--->.监听连接
--->.为新连接分配接收线程
--->.接收线程
--->.订单回复
--->.减少数据库的库存(互斥操作)
--->.将订单表加入服务端工作队列(队列操作)
--->.提示客户正在处理订单
--->.买单回复
--->.客户未进行消费
--->.通知客户
--->.收回座位号
--->.客户有进行消费
--->.计算客户消费总额
--->.更改订单状态为付款(互斥操作)
--->.检查工作队列中否有客户对应的未完成订单
--->.有未完成订单
--->.取消订单,从工作队列中删除
--->.恢复2.2.1.1操作中减少的库存(互斥操作)
--->.收回座位号
--->.向客户发送帐单消息
--->.维护线程
--->.处理订单
--->.订单队列为空(返回)
--->.订单队列不为空
--->.从队列头取出一个订单
--->.通知相应客户订单完成
--->.将相应订单从队列中删除
--->.置订单为已完成但未付款状态
--->.将此订单加入到订单数据库
--->.库存管理
--->.更新库存
--->.没有此类菜(失败)
--->.输入正确(成功)
--->.添加新菜
--->.菜id重复(失败)
--->.输入正确(成功)
--->.盘点清单
--->.盘点所有消费历史帐单
--->.统计历史营利总额
--->.查看订单队列
智能点餐系统_系统架构功能说明(By 成鹏致远远)
终版_功能使用说明
/*****************************************
* @author 成鹏致远
* @net http://infodown.tap.cn
* @qq 552158509
* @mail infodownzert@gmial.coml
*****************************************/ ---<项目名称:餐厅智能点菜系统>--- ---<功能使用说明>---<部分版>---<目前尚未发现bug>--- --->.服务端 ^_^ Server on !!! --->服务端启动提示 ---------------------------------------------------
Welcome ! Today's menu --->今日最新菜谱
---------------------------------------------------
dishid dishname num price
宫爆鸡丁
红烧全鱼
日本豆腐
香菇炒鸡
乌江鱼片
农家炒肉
土豆回锅
黄瓜炒肉 ---------manage----------- --->服务端功能选择
)deal order --->.处理订单,对应架构功能说明的2.3.1
)store manage --->.库存管理,对应架构功能说明的2.3.2
)profit sum --->.营利统计,对应架构功能说明的2.3.3
)print order --->.查看队列,对应架构功能说明的2.3.4
)exit --->.退出
------------------------
Pls choice: --->.客户端
connect success --->连接到服务端
From Server : Hello,your seat is ,Pls follow the menu,happy diet! --->接受服务端分配的座位号 ---------menu----------- --->客户端功能选择
)print menu --->.查看最新菜谱
)order --->.下订单
)check out --->.买单
------------------------
Pls choice: --->.服务端查看队列
---------manage-----------
)deal order
)store manage
)profit sum
)print order
)exit
------------------------
Pls choice: --->选择查看队列 -------------------- queue -------------------- --->显示队列订单
--->tableid:(宫爆鸡丁) --->0号桌有两个菜待炒
--->tableid:(日本豆腐) --->.服务端处理订单
--->4.1.服务端
---------manage-----------
)deal order
)store manage
)profit sum
)print order
)exit
------------------------
Pls choice: --->服务端选择处理订单
--->4.2.客户端
-------------------- Notice -------------------- --->收到来看服务端的提示 --------------------------------------------------
^_^ Hello,your 宫爆鸡丁($) is ok,have fun ! --->队列第一份菜已炒好,$ -------------------------------------------------- --->.客户端买单
--->5.1.客户端
---------menu-----------
)print menu
)order
)check out
------------------------
Pls choice: --->选择买单 ---------------------------------------------------
Hello,this is your bill --->消费详情,下了两个单,但是只消费了一个
---------------------------------------------------
expense_time dishname price
Aug : 宫爆鸡丁 -------------------- Notice --------------------
^_^ Your tableid is ,and should pay $ --->只付款已消费的单,$ ------------------- Bye--Bye -------------------
^_^ welcome next time ! --->友情提示 --------------------------------------------------
--->5.2.服务端
--->tableid() should pay:$ --->计算0号桌需要付款20$
---<Notice>---tableid:(dishname:日本豆腐) cancel ! --->0号桌的其余菜被取消 --->.服务端查看营利情况
---------manage-----------
)deal order
)store manage
)profit sum
)print order
)exit
------------------------
Pls choice: --->选择营利统计
---------------------------------------------------
Hello,this is sell bill --->营利详单
---------------------------------------------------
expense_time dishname price --->包括消费时间,菜名,价格
Aug : 红烧全鱼
Aug : 宫爆鸡丁
Aug : 宫爆鸡丁
Aug : 红烧全鱼
Aug : 日本豆腐
Aug : 宫爆鸡丁 ^_^ Income: --->统计今日收入 --->.其它操作,请自行测试
智能点餐系统_功能使用说明(By 成鹏致远远)