项目:点餐系统1

项目简介:实现一个http点餐系统服务器,能够支持用户在浏览器访问服务器获取餐馆首页,进行菜品以及订单管理。

具体模型如下:

用户分类:

管理员:进行订单以及菜品管理(菜品&订单的增删改查)

用户:选择菜品和下单功能

一、产品开发流程

1.产品需求

2.市场调研

3.需求定版

4.技术调研

5.概要设计&框架设计

采用MVC框架:

M-model:数据管理模块-将数据与业务分类,这个模块专门进行数据的管理

C-controller:业务处理模块-接收用户请求,调用模型与视图完成用户的请求

V-view:前端界面模块-与用户交互的界面

6.详细设计每个模块具体实现

数据管理模块:

1.管理什么数据

菜品信息:菜品ID,菜品价格,菜品名称,描述信息,添加时间&最后一次修改时间

订单信息:订单ID,菜品ID,订单状态(已完成&未完成),订单创建时间,订单完成时间

2.如何管理

使用MySQL数据库进行数据管理(MySQL数据库是一个C/S模式)

实现自己的MySQL客户端,访问服务器对指定的数据进行指定的操作

业务处理模块:接收请求,完成请求

1.搭建网络通信服务器,接收客户端请求

搭建HTTP服务器,供用户通过浏览器能够访问服务器进行对应的请求操作

2.进行业务处理

订单业务:新增订单,删除订单(不能提供),修改订单(修改状态),获取订单信息

菜品业务:新增菜品,删除菜品,修改菜品,修改价格,获取菜品信息

前端界面模块:展示与交互

编写前端html页面,能够展示菜品&订单,并且进行用户交互(html+css+js)

技术特点:mvc框架,http服务器搭建,MySQL数据库,json序列化,restful风格接口设计

html+css+js+ajax

json序列化:数据的组织格式

restful风格接口设计:一种网络通信接口规范

二、开发环境的搭建

  1. 升级高版本的编译器

sudo yum install centos-release-scl-rh centos-release-scl

sudo yum install devtoolset-7-gcc devtoolset-7-gcc-c++

source /opt/rh/devtoolset-7/enable

echo "source /opt/rh/devtoolset-7/enable">>~/.bashrc

  1. 安装jsoncpp库

sudo yum -y install epel-release

sudo yum install jsoncpp-devel

3.安装httplib库

git clone https://github.com/yhirose/cpp-httplib.git

  1. 安装Mysql服务器&客户端&开发包

https://zhuanlan.zhihu.com/p/49046496

三、第三方库&工具使用介绍

1.json

是一种简单的数据交换格式,简单说就是一种数据组织格式,将多个数据对象组织成为指定格式的字符串。里面有各种数据类型:对象,数组,字符串,数字

对象:{};

数组:[];

字符串:""

数字:直接使用

{

"姓名":"张三",

"年龄":18,

"成绩":[12,21,12,23]

}

value: pair<"姓名", "张三">,type = stringValue

value: pair<"年龄", 18>,type = intValue

value: pair<"成绩", vector<float>>,type = arryValue append()

jsoncpp:三个类(了解)

*json::Value

中间数据存储类,要对哪个数据进行序列化,就要把那些数据放到Value实例化对象中

在对json格式字符串反序列化的时候,会将解析后的各个数据对象放到一个Value实例化对象中

*json::Writer

这是一个基类,实际上是使用FastWriter StyledWriter类

这个类是对json::Writer对象中的数据进行序列化,组成一个json格式的字符串

std::string writer(Json::Value &val);

*json::Reader

这个类是进行反序列化的,将json格式的字符串进行反序列化,将解析后的数据放到Value实例化对象中

bool parse (std::sting &str,Json::Value &val);

代码实现:

cpp 复制代码
#include<iostream>
#include<string>
#include<jsoncpp/json/json.h>

void Serialize() {
	const char* name = "张三";
	int age = 1;
	float score[] = { 11,11,11 };

	json::Value val;
	val["姓名"] = name;
	val["年龄"] = age;
	val["成绩"].append(score[0]);
	val["成绩"].append(score[1]);
	val["成绩"].append(score[2]);

	json::Value root;//这是定义一个新的Value对象
	root.append(val);//将val作为一个子对象,添加到Value

	std::string str = writer.writer(root);
	std::cout << str << std::endl;
}

void UnSerialize() {
	std::string str - R"({"姓名":"李四","年龄":1,"成绩":[1,1,1]})";
	json::Reader reader;
	json::Value val;
	bool ret = reader.parse(str, val);
	if (ret == false) {
		std::cout << "error\n";
		return;
	}

	std::cout << val["姓名"].asString() << std::endl;
	std::cout << val["年龄"].asInt() << std::endl;

	if (val["成绩"].isArray()) {//严谨判断成绩是否是数组
		int sz = val["成绩"].size();
		for (int i = 0; i < sz; i++) {
			std::cout << val["成绩"][i].asFlaot() << std::endl;
		}
	}
}

int main() {
	Serialize();
	UnSerialize();
	return 0;
}

2.httplib

cpp 复制代码
#include"httplib.h"

void Hello(const httplib::Request& req, httplib::Response& rsp) {
	rsp.body = "hello";
	rsp.status = 200;
	return;
}

void Numbers(const httplib::Request& req, httplib::Response& rsp) {
	std::string num = req.matches[1];
	rsp.body = num;
	rsp.status = 200;
}

void Dish(const httplib::Request& req, httplib::Response& rsp) {
	rsp.body = req.body;
	rsp.status = 200;
}
int main() {
	httplib::Server srv;

	//当客户端请求的是一个静态的实体文件资源的时候,就会直接读取文件数据进行响应
	srv.set_mount_point("/", "./wwwroot");
	//设置静态资源根目录/index.html->./wwwroot/index.html

	srv.Get("/hi", Hello);
	srv.Get(R"(/numbers/(\d+)", Numbers);
	srv.Post("/dish", Dish);

	//搭建tcp服务器,开始监听,获取新连接,接收http请求数据,进行解析,调用对应处理函数,组织响应
	srv.listen("0.0.0.0", 10000);
	return 0;
}
相关推荐
二十雨辰26 分钟前
[python]-循环语句
服务器·python
wypywyp1 小时前
2.虚拟机一直显示黑屏,无法打开,可能是分配的硬盘空间不够
linux·运维·服务器
SongYuLong的博客1 小时前
TL-WR710N-V2.1 硬改刷机OpenWRT源码编译固件
linux·物联网·网络协议
m0_737302581 小时前
碳足迹精准计量,华为FusionSolar助力云服务器绿色运维
服务器
Howrun7775 小时前
Linux_C++网络编程四种CS模型
linux·运维·服务器
vortex55 小时前
如何快速删除 Linux 中的海量小文件:告别rm命令的缓慢困境
linux·运维·服务器
AUTOSAR组织6 小时前
深入解析AUTOSAR框架下的TCP/IP协议栈
网络协议·tcp/ip·汽车·autosar·软件架构·软件·培训
googleccsdn7 小时前
ENSP Pro LAB笔记:配置M-LAG双归接入三层网络(V-STP + Monitor Link + OSPF)
网络·笔记·网络协议
RisunJan7 小时前
Linux命令-ldd(查看可执行程序或共享库所依赖的动态链接库)
linux·运维·服务器
实心儿儿7 小时前
Linux —— 进程概念 - 进程运行、阻塞、挂起状态
linux·运维·服务器