简介:
编写一个点餐服务器,能够支持顾客在浏览器上查阅菜单信息,并且可以下单点餐。
该设计分为三者模块进行设计:
- 数据管理模块:菜单数据、订单数据…
- 业务逻辑模块:接收浏览器的请求,进行处理。
- 界面视图模块:界面显示。
功能描述:
顾客:查看菜品,点击下单。
老板:上传菜品,修改菜品,查看订单,修改订单。
详细设计:
数据管理模块:
基于MySQL设计数据。
数据库的基本操作
- 数据表的设计:
- 菜品数据:菜品ID,菜品名称,菜品单价,上传时间。
- 订单数据:订单ID,订单桌号,菜品信息,订单状态,订单时间。
创建数据库:create database if not exists db_order_sys;
创建菜单:
create table tb_dishes(id int primary key auto_increment ,
name varchar(32) comment("菜品名称"),
price int comment("单价,单位为分"),
uptime datetime comment("修改时间"));
创建订单信息表:
create table tb_order(id int primary key auto_increment ,
table_id int comment("订单桌号"),
dishes varchar(32) comment("当前订单的菜品ID")
status tinyint comment("订单状态"));
我们使用数据管理模块进行管理,向外提供接口即可。
菜品数据管理主要接口:
- 插入菜品信息。
- 查看单个菜品信息。
- 查看全部菜品信息。
- 修改菜品信息。
- 删除菜品信息。
订单数据管理主要接口:
- 下单操作。
- 查询单个订单。
- 查询全部订单。
- 修改订单。
- 删除订单。
业务管理模块
实现浏览器与服务器之间的网络通信,服务器对客户端的请求进行业务处理。
管理员具体操作
- 访问页面。
- 上传、查看、修改、删除菜品信息。
- 查看、修改、删除订单信息。
搭建http服务器
通过第三方库httplib实现http服务器的搭建,客户端与服务器之间进行通信。
使用Restful风格的通信接口。Restful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。我们这里使用JSON格式进行定义。
在Restful中,GET用于请求资源,POST用于新增资源,PUT用于修改资源,DELETE用于删除资源。
接口设计:
- 获取所有菜品信息:GET /dishes
GET /dishes HTTP/1.1\r\n //Get表示获取信息,/dishes表示获取的是菜品信息,HTTP/1.1表示HTTP版本号 \r\n结尾标志
Content-length:0\r\n //表示获取的长度信息
- 获取单个菜品信息:GET /dish?id = 1
GET /dish?id HTTP/1.1\r\n // dish?id用于返回指定的id信息
Content-length:0\r\n
- 更新菜品信息:PUT /dish
PUT /dish HTTP/1.1\r\n
Content-length:正文长度\r\n
{...正文内容}
- 删除菜品信息:DELETE /dish?id
DELETE /dish?id=1 HTTP/1.1\r\n
Content-length:0\r\n
- 增加订单信息:POST /order HTTP/1.1
- 查看所有订单信息:GET /order HTTP/1.1
- 查看指定订单信息:GET /order?id = 1 HTTP/1.1
- 修改订单信息:PUT /order?id = 1 HTTP/1.1
- 删除订单信息:DELETE /order?id = 1 HTTP/1.1
httplib搭建http服务器的简单原理:
- 先搭建一个Tcp服务器,等待客户端连接请求。
- 将新连接抛到线程池中,线程进行业务处理。
线程的处理方式:- 接收客户端的请求数据,并解析数据。
- 根据解析得到的请求方法与路径,进行业务处理。
- 组织http响应数据,发送给客户端。
注意:在Restful中,GET用于请求资源,POST用于新增资源,PUT用于修改资源,DELETE用于删除资源。这些方法在服务端使用时是用来更新路由信息,在客户端中使用是用来对应方法。
JSON序列化与反序列化
中午肚子饿了,到餐厅点餐。向服务员点了几个菜,厨师根据用户的需求,开始烹饪食物,食物烹饪好后,怎么将食物呈现给用户呢?这时就需要用到盛放食物的碗了用户拿到盛放食物的碗,就可以获得点的餐了这个碗就充当了数据交换的容器了。
客户端与服务器建立请求,服务器如何将客户需要的信息返回给客户端呢?这时就有了两种数据传输的方式(XML和Json),但是.XML解析比较复杂,所以采用JSON比较合适。
- Json序列化
Json::StyledWriter
与Json::FastWriter
FastWriter序列化的数据串的阅读性较差,主要是用于传输。
StyledWriter序列化的数据串阅读性较高,主要用于阅读。 - Json 反序列化
Json::Reader
#include<stdio.h>
#include<iostream>
#include<string>
#include<jsoncpp/json/json.h> //头文件
int main()
{
std::string name = "小明";
std::string sex = "男";
int age = 26;
Json::Value value; //Json容器对象,直接通过key,value进行赋值
value["姓名"] = name;
value["性别"] = sex;
value["年龄"] = age;
Json::StyledWriter writer; //Json序列化对象
std::string src = writer.write(value); //将value进行序列化
printf("%s\n",src.c_str());
Json::Value value2;
Json::Reader reader; //Json反序列化的对象,将Json数据串解析成为各个数据对象
reader.parse(src,value2);
std::cout<<"name"<<value2["姓名"]<<std::endl;
std::cout<<"sex"<<value2["性别"]<<std::endl;
std::cout<<"age"<<value2["年龄"]<<std::endl;
return 0;
}