点餐系统项目

2021/7/14 23:11:17

本文主要是介绍点餐系统项目,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

项目名称:点餐系统

代码链接: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–收费)
  • 数据库表的设计
  1. 菜品信息表:菜品ID,菜品名称,菜品单价,添加时间
  2. 订单信息表:订单ID,订单菜品,订单状态,修改时间
  • 数据管理模块代码的设计
  1. 菜品数据类:添加菜品,删除菜品,修改菜品,获取菜品(所有,单个)
  2. 订单数据类:添加订单,删除订单,修改订单(菜品,状态)
    获取订单(所有,指定id)
  • 业务控制模块:接收客户端请求,进行处理满足用户需求
  1. 搭建服务器: HTTP服务器(采用httplib库搭建)
  2. 通信接口设计:什么样的请求对应什么样的业务处理和响应
    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基本应用认识:
  1. Json:Value类: json 与外界进行数据中转的一个对象类
    重载了大量的操作符:赋值运算符
    包含了大量的类型转换函数: .
  2. Json::Reader类:实现反序列化,
    将json格式字符串转换为多个数据对象,存储在Json::Value对象中
    .parse(std::string &buf, Json::Value &val)
  3. 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通信)。

  1. 接收请求数据,按照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服务器

  1. 据请求找处理函数,线程池
  2. 执行函数hello (req, rsp)
  3. 根据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脚本语言,让页面动态渲染展示


这篇关于点餐系统项目的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程