点餐系统项目
作者:互联网
项目名称:点餐系统
代码链接:https://github.com/fangbaorui/Linux/tree/master/sys_order
1. 项目描述
- 使用户可以通过访问浏览器与服务器进行交互,获取菜品信息并进行点餐,以及可以使管理员通过浏览访问服务器实现订单和菜品的管理。
2.市场调研
- 给毕设准备的项目。
3.技术调研
- 线程、socket、http、stl、MySQL、HTML、CSS、Vue.js、Ajax。
4.项目实现
- 整体框架采用了不太严谨的MVC框架,将项目实现整体分为三个模块:数据管理、业务管理、前端页面。
4.1数据管理模块:
- 基于MySQL数据库实现数据存储管理,并且封装数据库访问类,向外提供与业务分离的数据信息。
4.2业务处理模块:
- 基于http协议使用httplib库搭建http服务器与前端交互进行菜品以及订单的数据业务处理功能。
4.3.前端界面模块:
- 基于简单的HTML与CSS和Vue.js以及Ajax实现前端界面的静态页面展示和动态数据获取渲染功能。
5.详细设计
5.1.数据管理模块
- 数据的存储: MySQL数据库(MySQL–免费,Oracle–收费)
- 数据库表的设计
- 菜品信息表:菜品ID,菜品名称,菜品单价,添加时间
- 订单信息表:订单ID,订单菜品,订单状态,修改时间
- 数据管理模块代码的设计
- 菜品数据类:添加菜品,删除菜品,修改菜品,获取菜品(所有,单个)
- 订单数据类:添加订单,删除订单,修改订单(菜品,状态)
获取订单(所有,指定id)
- 业务控制模块:接收客户端请求,进行处理满足用户需求
- 搭建服务器: HTTP服务器(采用httplib库搭建)
- 通信接口设计:什么样的请求对应什么样的业务处理和响应
1.静态页面请求: html页面(以及依赖的css/js文件)
index.htmI–菜品信息的展示以及下单界面
GET /index.html HTTP/1.1
HTTP/1.1200 OK
…
Content-Type: textml
Content-Length:文件长度
/index.html文件数据
2.动态数据请求:菜品数据,订单数据
通信接口采用restful风格接口设计:
基于http协议,使用xml或者json格式定义正文序列化方式
定义操作类型:新增- POST;删除- DELETE;修改- PUT;获取-GET
- 新增菜品:
POST /dish HTTP/1.1
HTTP/1.1 200 OK .
\r\n .
HTTP/1.1 500
{“name”:“红烧肉”, “price”: 2850} {result:false, reason:"} - 删除菜品:
DELETE /dish/THTTP/1.1
HTTP/1.1 200 OK .
\r\n - 修改菜品:
PUT /dish/0HTTP/1.1
HTTP/1.1 200 OK
\r\n
{name: “蚂蚁上树”, price: 38} - 获取所有菜品:
GET /dish HTTP/1.1
HTTP/1.1 200 OK
\r\n
[{id:1, name:“红烧肉”,price:28},
{id:2, name:“盐煎肉”, price:28}] - 获取单个菜品
GET /dish{J
HTTP/1.1
HTTP/1.1200 OK
\r\n
{id:1, name:“红烧肉” ,price:28}
6.前端界面模块
html的编写渲染
实现: html+css+js
- jsoncpp基本应用认识:
- Json:Value类: json 与外界进行数据中转的一个对象类
重载了大量的操作符:赋值运算符
包含了大量的类型转换函数: . - Json::Reader类:实现反序列化,
将json格式字符串转换为多个数据对象,存储在Json::Value对象中
.parse(std::string &buf, Json::Value &val) - Json::Writer类:实现序列化
基类–子类: Json::FastWriter / Json::StyledWriter
将Json:Value对象中的数据序列化成为json格式的字符串
std::string write(Json::Value &val)
7.MySQL数据库的基本操作: SQL
7.1库的操作:
-
创建数据库: create database if not exists dbname;
-
查看数据库: show databases;
-
选择所使用的数据库: use dbname;
-
删除数据库: drop database dbname;
7.2表的操作:
- 常用数据类型:
int-整形,decimal(m, d)-浮点型,varchar(字符长度), datetime - 创建表:
create table if not exists tbname(id int, name varchar(32),
sex bit, score decimal(4, 2), birth datetime); - 查看所有表: show tables;
- 查看指定表结构: desc tbname;
- 删除指定表: drop table tbname;
- 表中字段约束:
primary key主键约束约束指定字段的值-非空且唯一
unique key唯一约束约束指定字段必须唯一
not null非空约束约束指定字段的值不能为NULL
auto_ increment 自增属性(只能用于整形的主键字段)
create table if not exists tbname(id int primary key auto_ increment,
name varchar(32) not null unique, sex bit, score decimal(4, 2) , birth
datetime); - 表中数据的操作:增删改查
1.新增:
insert tbname(id, name, sex) values(null, “张三”, 0);
insert tbname values(null, “李四”, 1, 88.88, “2020-10-8 12:00:00”);
2.删除:
delete from tbname where id=2;
3.修改:
update tbname set score=66.78, birth=" 2020-8-621:00:00"
where id=1;
4.查询: .查询表中所有数据: select * from tbname;
MySQL操作:
- 初始化操作:
1.初始化操作句柄
2.通过句柄连接MySQL服务器
3.设置客户端字符集(utf8)
4.选择使用的数据库
5.执行语句:
5.1增删改:执行语句–执行语句成功即可
5.2查询:执行语句-
5.3将查询结果获取到本地
5.4获取结果中数据条数、列数
5.5遍历结果集获取每一条数据的每一-列
5.6释放本地结果集
6.关闭句柄释放资源
7.获取接口执行失败原因 - 接口介绍:
MYSQL *mysq| = NULL;
MYSQL *mysql init(MYSQL mysq);
MYSQL mysql real connect(MYSQL *mysq|, char *host, char *user,
char *passwd, char *dbname, int port, char *sock, int flag)
mysql:初始化完成的句柄;
host: mysql服务器IP地址
username:用户名;
passwd:密码
dbname:默认所选择使用的数据库名称
port: mysql服务端口-0-默认3306;
flag:客户端标志–通常置0
返回值:成功返回句柄地址,失败返回NULL
int mysql set character set(MYSQL *mysql, char *name);
mysql:句柄; name: 字符集名称-utf8
返回值:成功返回0;失败返回非0;
int mysql select db(MYSQL *mysql, char *dbname)
mysql:句柄;
dbname:要切换的数据库名称
返回值:成功返回0;失败返回非0;
int mysql query(MYSQL *mysql, char *sql);
mysql:句柄;
sql:要执行的sql语句
返回值:成功返回0;失败返回非0
MYSQL RES *mysql store result(MYSQL *mysq|);
mysql:句柄
特殊说明: mysql query与mysql store_ result存在线程安全问题
返回值:成功返回结果集的地址;失败返回NULL;
int mysql_ num_ rows(MYSQL_ RES *res); --获取行数
int mysql num_ fields(MYSQL_ RES *res); --获取列数
MYSQL_ ROW mysql fetch_ row(MYSQL_ RES *res);
MYSQL_ RES res中会记录当前获取的位置,逐条取出
MYSQL_ ROW:就是一 个char **
8线程他
client:tcp服务器
当服务端收到一个客户端连接,则将新建连接抛入线程池,线程池中的线程负责与指定客户端进行通信(http通信)。
- 接收请求数据,按照http请求协议格式进行解析。
实例化httplib:.Request对象,将解析的信息填入其中
GET /hello HTTP/1.1
class Request{
Content-Length:0
→
string method=GET; 1
Connection: keep- alive
string path=/hello; d
…
version= HTTP/1.1
body= “”
<string, string> param
<string, string> headers
-
根据请求信息,在route路由表中查找针对这个请求有没有对应的处理函数
1.如果没有则直接返回404–请求的资源不存在
2.如果有,则使用对应函数指针执行这个处理函数(程序员自定义),传入请求信息。 -
实例化一个httplib::Response对象, 传入函数在处理函数内部,用户实现针对请求的业务处理,在业务处理完毕之后填充Response对象。
class Response{
int status; 200
string body;
<string, string> headers -
线程中执行完处理函数之后,得到了一个填充完毕的Response对象根据其中的数据(响应状态码,正文数据,头部字段)组织http响应协议格式的数据,回复给客户端。
-
等待还有没有请求需要处理(没有则关闭套接字)
hello(req, rp…根据req业务处理; 2. 填充sp…}j
Server
1.接收请求,解析请求
aet+ hi bell
req{
clien) 、
srv.Get(/hi, hello)
method=GET;
srv.listen(0.0.0.0, 8Q)|
path=/hi
GET /hi HTTP/1\1
tcp服务器
- 据请求找处理函数,线程池
- 执行函数hello (req, rsp)
- 根据rsp组织响应
注册路由成员函数Server.Get()/Post()/Put()/Delete()
设置静态资源默认路径接口:设置了这个路径之后,当前端在请求静态资源的时候/index.html,就会自动的先到这个路径下查找有没有对应静态资源文件,如果有则自动读取文件数据进行回复
Server.set_ base_ _dir(char *path)
9.渲染
- httplib库主要是搭建http服务器或者客户端-实现http协议网络通信
而使用库的目的就是把重心放到了业务处理上而不是服务器搭建上
前端界面模块: html+css +js - html:完成页面的布局
- CSS:样式语言–对标签容器进行样式修饰,让简单的html页面更加好看
- js: javascript脚本语言,让页面动态渲染展示
标签:HTTP,1.1,项目,mysql,菜品,系统,int,MYSQL,点餐 来源: https://blog.csdn.net/qq_45975614/article/details/118674585