业务逻辑模块

目录

业务逻辑模块


httplib工作流程:

httplib::Server,httplib::Request,httplib::Response

请求与处理路由表:

map<pair<string,string>,function>类型

(1)Get(“资源路径”,函数地址):根据资源路径找到对应功能函数发起请求

key value
(Get+ /资源路径) function函数地址(0X00F414F5)

(2)listen(“ip地址”,端口):搭建一个监听当前主机所有IP+端口的TCP服务器

其功能如下:

当服务端收到一个客户端连接,则将新建连接(新建socket句柄)抛入线程池,线程池中的线程负责与指定客户端进行通信(http通信)

http通信过程中:

  1. 接收请求数据,按照http请求协议格式进行解析(请求方法,资源路径,查询字符串,头部字段,正文...)
  2. 实例化httplib::Request对象,将解析的信息填入其中

3 .根据请求信息,在路由表中查找针对此请求是否存在处理函数

如果没有则直接返回404 请求资源不存在

如果有则使用对应函数指针执行这个处理函数

自定义处理函数(参数1:传入请求信息(httplib::Request&),参数2:实例化一个response对象传入,业务处理完成填充response对象(httplib::Response&),将处理结果带出)

4,根据response对象中的数据(响应状态码,正文数据,头部字段)组织http响应格式数据回复客户端

5,等待还有没有请求需要处理(没有则关闭套接字)

具体流程如下图:

注册路由成员函数:

  • Server.Get(char* path,function(Server.Request& res,Server.Response&rsp))
  • Server.Post(char* path,function(Server.Request& res,Server.Response&rsp))
  • Server.Put(char* path,function(Server.Request& res,Server.Response&rsp))
  • Server.Delete(char* path,function(Server.Request& res,Server.Response&rsp))

设置静态资源默认路径接口:

Server.set_base_dir(char* path)

目的&功能:去对应路径下查找是否有对应静态资源文件,如果有咋自动读取文件数据进行回复或响应

测试:

#include"dp.hpp"
#include"httplib.h"#define WWWROOT "./wwwroot"
using namespace httplib;order_sys::TableDish *tb_dish=NULL;
order_sys::TableOrder *tb_order=NULL;void DishInsert(const Request &req,Response &rsp)
{/** 1,业务处理 解析正文(json反序列化string转对象)得到菜品信息  将菜品信息插入数据库** 2,设置响应信息* */Json::Value dish;Json::Reader reader;bool ret=reader.parse(req.body,dish);//从body解析到dish对象存储if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="dish info parse failed";rsp.status=400;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}ret=tb_dish->Insert(dish);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql insert failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}rsp.status=200;return;
}void DishDelete(const Request &req,Response &rsp)
{int dish_id=std::stoi(req.matches[1]);bool ret=tb_dish->Delete(dish_id);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql delete failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}rsp.status=200;return;
}void DishUpdate(const Request &req,Response &rsp)
{int dish_id=std::stoi(req.matches[1]);Json::Value dish;Json::Reader reader;bool ret=reader.parse(req.body,dish);//从body解析到dish对象存储if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="dish info parse failed";rsp.status=400;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}dish["id"]=dish_id;//设置需要更改的对应dish对象的idret=tb_dish->Update(dish);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql Update failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}return;
}
void DishGetAll(const Request &req,Response &rsp)
{Json::Value dishes;//创建新对象 接收获取菜品信息bool ret=tb_dish->SelectAll(&dishes);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql Selectall failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}Json::FastWriter writer;rsp.status=200;rsp.body=writer.write(dishes);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;
}
void DishGetOne(const Request &req,Response &rsp)
{int dish_id=std::stoi(req.matches[1]);Json::Value dish;//创建新对象 接收获取菜品信息bool ret=tb_dish->SelectOne(dish_id,&dish);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql Selectone failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}Json::FastWriter writer;rsp.status=200;rsp.body=writer.write(dish);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;
}
void OrderInsert(const Request &req,Response &rsp)
{Json::Value order;Json::Reader reader;bool ret=reader.parse(req.body,order);//从body解析到order对象存储if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="order info parse failed";rsp.status=400;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}ret=tb_order->Insert(order);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql insert failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}rsp.status=200;return;
}
void OrderDelete(const Request &req,Response &rsp)
{int order_id=std::stoi(req.matches[1]);bool ret=tb_order->Delete(order_id);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql delete failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}rsp.status=200;return;
}
void OrderUpdate(const Request &req,Response &rsp)
{int order_id=std::stoi(req.matches[1]);Json::Value order;Json::Reader reader;bool ret=reader.parse(req.body,order);//从body解析到order对象存储if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="order info parse failed";rsp.status=400;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}order["id"]=order_id;//设置需要更改的对应dish对象的idret=tb_order->Update(order);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql Update failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}return;
}
void OrderGetAll(const Request &req,Response &rsp)
{Json::Value orderes;//创建新对象 接收获取订单信息bool ret=tb_order->SelectAll(&orderes);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql Selectall failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}Json::FastWriter writer;rsp.status=200;rsp.body=writer.write(orderes);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;
}
void OrderGetOne(const Request &req,Response &rsp)
{int order_id=std::stoi(req.matches[1]);Json::Value order;//创建新对象 接收获取订单信息bool ret=tb_order->SelectOne(order_id,&order);if(ret==false){//回复客户端错误Json::Value reason;Json::FastWriter writer;reason["result"]=false;reason["reason"]="mysql Selectone failed";rsp.status=500;rsp.body=writer.write(reason);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;}Json::FastWriter writer;rsp.status=200;rsp.body=writer.write(order);//反序列化  转为json格式的string存储在body中rsp.set_header("Content-Type","application/json");return;
}int main()
{tb_dish=new order_sys::TableDish();tb_order=new order_sys::TableOrder();//定义全局变量指针,操作数据库,而每一个函数都可使用,更改同步Server server;server.set_base_dir(WWWROOT);server.Post("/dish",DishInsert);server.Delete(R"(/dish/(\d+))",DishDelete);server.Put(R"(/dish/(\d+))",DishUpdate);server.Get(R"(/dish)",DishGetAll);server.Get(R"(/dish/(\d+))",DishGetOne);server.Post("/order",OrderInsert);server.Delete(R"(/order/(\d+))",OrderDelete);server.Put(R"(/order/(\d+))",OrderUpdate);server.Get(R"(/order)",OrderGetAll);server.Get(R"(/order/(\d+))",OrderGetOne);server.listen("0.0.0.0",9000);return 0;
}

添加:

修改:

删除:

获取全部菜品信息:

获取特定菜品信息:

插入订单:

修改订单:

删除订单:

查看所有订单:

查看特定订单:

项目实践(一)点餐系统——业务逻辑模块相关推荐

  1. Java毕设项目餐饮掌上设备点餐系统计算机(附源码+系统+数据库+LW)

    Java毕设项目餐饮掌上设备点餐系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  2. SSM米米商城项目笔笔记二(登录业务逻辑实现)

    米米商城项目笔笔记二(登录业务逻辑实现) Service层业务逻辑实现 由于在笔记一中已经完成了底层的搭建,所以可以直接上手service层代码的编写 在service包下创建AdminService ...

  3. 业务场景是什么意思_深度思考:麦乐积分兑换商城系统业务逻辑

    假设企业提出会员在积分兑换商城系统中用积分兑换了商品,那么这整套流程下来的逻辑设计是怎么样的呢? 会员用户通过平台购买产品且评论晒单可以不断累积积分,当积分累积到一定量后,可以在积分兑换商品的界面中, ...

  4. 系统业务逻辑书籍_新年福利 | 架构的“一小步”,业务的一大步

    作者:闲鱼技术-绛曲 前言: 谈到"架构"这两个字,会有好多的名词闪现,比如:分层架构.事件驱动架构.DDD.CQRS等.亦或者一堆的软件设计原则,如:KISS原则(Keep it ...

  5. 系统业务逻辑书籍_Python框架:Django写图书管理系统(LMS)

    今天我会带大家真正写一个Django项目,对于入门来说是有点难度的,因为逻辑比较复杂,但是真正的知识就是函数与面向对象,这也是培养用Django思维写项目的开始 Django文件配置 Django模版 ...

  6. 项目实践--广告排期系统

    在对各种媒体广告进行投放时,投放系统中必备的就是一个广告的排期系统. 如CNZZ广告管家 我也参考此种展示方式开发了一套广告排期系统,如图 我的广告排期,与其他网上成型的有些不同,网站上的都对广告位进 ...

  7. node.js+Vue计算机毕设项目的网上点餐系统(程序+LW+部署)

    该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程.欢迎交流 项目运行 环境配置: Node.js+ Vscode + Mysql5.7 + HBuilderX+Navicat11+Vue ...

  8. 手把手教你云相册项目建议开发day3-上传下载业务逻辑之上传业务

    工具类等完整代码都可以去github上获取,地址:https://github.com/kkoneone11/cloud-photo 图片上传流程图 流程解释(粗体的都是要写的大致接口方法): 用户要 ...

  9. 系统业务逻辑书籍_数字IC设计前端推荐书籍

    数字IC设计前端必读书籍 本文将从简单到复杂的顺序依次列出数字IC设计需要阅读的书籍. 数字电子基础类书籍 1.<数字电子技术电路基础> 数字IC设计最基础的书籍了,相关书籍比较多,可以随 ...

最新文章

  1. 什么叫「真的理解」?我们对 AI 的要求或许有点过分
  2. textview的基本设置
  3. linux iscsi
  4. ios找不到信任证书_ios信任苹果企业级应用
  5. 在Linux下如何安装QQ?
  6. jpa和hibernate_使用JPA和Hibernate有效删除数据
  7. kcbzps oracle_Oracle 11g DRCP配置与使用(上)
  8. 论文浅尝 | 知识库问答中关系检测的学习表示映射
  9. 理解TCP/IP协议
  10. java 绘图 打印_java调用本地打印机,绘制打印模板,小票模板
  11. C++编程问题--注意指针参数的传递
  12. oracle ebs form视频,Oracle EBS教学视频
  13. android for armeabi,【我的Android进阶之旅】解决错误ABIs [armeabi] are not supported for platform....
  14. 基于贝叶斯决策理论的分类方法
  15. 寻找回文素数python
  16. 解决CesiumForUnreal加入CesiumSunSky并调整设置后场景仍然纯白的问题
  17. excel工具栏隐藏了怎么办_你会用 Excel照相机吗?
  18. 3-基于51单片机的篮球计分器
  19. vmware上pfSense安装说明
  20. ftp文件服务器与nas性能,nas和ftp服务器的区别

热门文章

  1. 【大数据】中国工程院院士何友:工业大数据及其应用
  2. 从0开始,你真的做好成为自媒体人的准备了吗?
  3. DNS主从同步搭建测试
  4. ES 2.4 java API aggregation API
  5. python还房贷_宝妈玩转Python做出房贷计算系统,只因为……
  6. 中文汉字html(立→超文本)用汉字写网页代码
  7. Slik-Subversion使用命令行或者Ant获得本地svn的版本号码
  8. 在webstorm中使用SlikSvn
  9. 计算机主机红灯不闪硬盘工作,电脑开机后黑屏,硬盘和键盘指示灯不亮.主机无自检信息,该如何检修?...
  10. android系统r类,了解Android中的R类