项目Project—点餐系统
Posted 黑桃_K_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目Project—点餐系统相关的知识,希望对你有一定的参考价值。
项目:
项目名称:点餐系统
项目描述:使用户可以通过浏览器访问服务器获取菜品信息并点餐;
以及可以使管理员通过浏览器访问服务器实现订单以及菜品的管理;
市场调研:整合所学知识;校内实训做的项目;给毕设准备的项目;
技术调研:线程、socket、http、json、mysql、stl;
概要设计:框架的设计–不太严谨的MVC框架
model:数据管理模块——管理数据(菜品、订单),外界想要访问数据必须通过这个模块来访问,不能直接访问;
view:视图界面模块——浏览器前端界面,用户和管理员的操作都是通过前段界面完成的;
controller:业务控制模块——搭建服务器针对前端的请求
详细设计:
数据管理模块:
1.数据的存储:mysql数据库(免费,换台机子也可以)
2.数据库表的设计
菜品信息表:菜品id、菜品名称、菜品单价、添加时间
订单信息表:订单ID、订单菜品、订单状态、修改时间
3、数据管理模块代码的设计
菜品数据类:添加菜品、删除菜品、修改菜品、获取菜品(所有、单个)
订单数据类:添加订单、删除订单、修改订单(菜品、状态)、获取订单(所有,指定ID)
.
业务控制模块:
1.搭建服务器:HTTP服务器(采用httplib库)
2.通信接口设计:什么样的请求对应什么样的业务处理与响应
1.静态页面请求:html页面(以及依赖的css/js文件);
index.html——菜品信息的展示以及下单界面
GET /index.html HTTP/1.1 HTTP/1.1 200 OK
Content-Type:text/html
Content-Length:文件长度
..
..
/index.html文件数据
2.动态数据请求:菜品数据,订单数据;
通信接口采用restful风格接口设计
基于http协议,使用xml或者json格式定义正文序列化方式
定义操作类型:新增-POST;删除-DELETE;修改-PUT;获取-GET
method url version
......
\\r\\n
菜品名称,菜品单价
新增菜品:
POST /dish HTTP/1.1 HTTP/1.1 200 OK
... ...
\\r\\n HTTP/1.1 500
{"name":"红烧肉",”price“:180} {result:false,reason:""}
删除菜品
DELETE /dish/1 HTTP/1.1 HTTP/1.1 200 OK
...
\\r\\n
修改菜品:
PUT /dish/1 HTTP/1.1 HTTP/1.1 200 OK
...
\\r\\n
{name:"蚂蚁上树","price":22}
获取所有所有菜品:
GET /dish HTTP/1.1 HTTP/1.1 200 OK
... ...
\\r\\n \\r\\n
[{id:1,name:"红烧肉",price:23}
{id:2,name:"盐煎肉",price:24}]
获取单个菜品:
GET /dish/1 HTTP/1.1 HTTP/1.1 200 OK
... ...
\\r\\n \\r\\n
{id:1,name:"红烧肉",price:23}
.
前端界面模块:html的编写渲染
实现:html+css+js
vue.js
环境搭建:
1.mysql服务安装:按照博客一步步;
https://zhuanlan.zhihu.com/p/49046496
2.gcc/g++升级
sudo yum -y install epel-release
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
#最好将source加载配置这句指令,写到 ~/.bashrc 这个文件中
3.安装jsoncpp开发包
sudo yum install jsoncpp-devel
**jsoncpp基本应用认识:**
Json::Value类:json与外界进行数据中转的一个类对象
重载了大量的操作符:赋值运算符
包含了大量的类型转换函数;
Json::Reader类:实现反系列化,
将json格式字符串转换为多个数据对象,存储在json::Value对象中
.parse(std::string &buf,Json::Value &val)
Json::Write类:实现序列化
基类——子类:Json::FastWriter / Json::StyledWriter
将Json::Value对象中的数据序列化成为json格式的字符串
std::string write(Json::Value &val)
mysql数据库的基本操作:SQL
客户端操作:mysql -uroot -p(带密码)
注意事项:
1.sql语句中,都已“;"结尾;
2.sql语句中,不分大小写;
3.sql语句中,数据库名称,表名称,字段名称不能直接使用sql关键字;——``
库的操作:
创建数据库:create database dbname;/ create database if not exists dbname;
查看数据库:show databases;
选择所使用的数据库:use dbname; 查看所使用的: select database();
删除数据库:drop database dbname;
.
表的操作:
常用数据类型:
int-整形; decimal(m,d)-浮点数; varchar(可变字符长度);char(固定字符长度)
create table if not exists tbname();
查看表:desc tbname;
删除指定表:drop table tbname;
修改表结构:alter关键字;--课后
**表中字段约束**:
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);`
表中数据的操作:增删查改
新增:
intsert tbname(id,name,sex) values(null,"张三",0);
insert tbname values(null,"李四",1,22.33,"2021-6-10 12:00:12");
删除:
delete from tbname where id=2;
修改:
update tbname set score=66.54,birth="2021-10-2 12:20:22" where id=1;
查询:
查询表中所有数据:select * from tbname ;
指定列查询:select id, name, score from tbname;
按序查询:select id, name ,score from tbname order by id desc;降序
分页查找:select * from tbname order by id desc limit 3 offset 3;
limit count offset (page* count)
条件查询:where
导入数据库:
mysql uroot -p < db.sql
mysql 代码操作:
1.初始化做操句柄
2.通过句柄连接mysql服务器
3.设置客户端字符集(utf8)
4.选择使用的数据库
数据操作:
5.执行语句:
增删改:执行语句–执行语句成功即可
查询:执行语句-
将查询结果获取到本地
获取结果中数据条数、列数
遍历结果集获取每一条数据的每一列
释放本地结果集
6.关闭句柄释放资源
7.获取接口执行失败原因
接口介绍:
MYSQL *mysql=NULL;
MYSQL *mysql_init(MYSQL *mysql);
。
int mysql_real_connect(MYSQL *mysql,char *host,char *username,
char *passwd,char *dbname, int port(默认3306),char *sock,int flag);
mysql:初始化完成句柄;
host:mysql服务器ip地址
username:用户名
passwd:密码
dbname:默认所选择使用的数据库名称
port:mysql服务端口-0-默认3306;
sock:
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 *mysql);
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**
int mysql _free_result(MYSQL_RES *res);--释放结果集
void mysql_close(MYSQL *mysql);---关闭客户端连接
char *mysql_error(MYSQL *mysql);——获取mysql错误原因
mysql_query与mysql_store_result存在线程安全问题
srv文件下
db.hpp
//db.hpp
#include<iostream>
#include<string>
#include<mysql/mysql.h>
#include<jsoncpp/json/json.h>
#include<mutex>
namespace order_sys{
#define MYSQL_SERVER "172.2*.***.***"
#define MYSQL_USER "root"
#define MYSQL_PASSWD "***"
#define MYSQL_DBNAME "order_system"
static MYSQL* MysqlInit(){
//初始化句柄
//mysql_init(句柄地址)
MYSQL *mysql=NULL;
mysql=mysql_init(NULL);
if(mysql==NULL){
std::cout<<"mysql init failed\\n";
return NULL;
}
//连接服务器
//mysql_real_connect(句柄,服务器IP,用户名,密码,数据库名称,端口,套接字文件,客户端标志)
if(mysql_real_connect(mysql,MYSQL_SERVER,MYSQL_USER,MYSQL_PASSWD,MYSQL_DBNAME,3306,NULL,0)==NULL){
std::cout<<mysql_error(mysql)<<std::endl;
return NULL;
}
//设置字符集
//mysql_set_character_set(句柄,字符集名称)
if(mysql_set_character_set(mysql,"utf8")!=0){
std::cout<<mysql_error(mysql)<<std::endl;
return NULL;
}
//选择数据库
//mysql_select_db(句柄,数据库名称)
//if(mysql_select_db(mysql,MYSQL_DBNAME)!=0){
// std::cout<<mysql_error(mysql)<<std::endl;
// return NULL;
//}
return mysql;
}
static void MysqlRelease(MYSQL *mysql){
if(mysql!=NULL){
mysql_close(mysql);
}
return ;
}
static bool MysqlQuery(MYSQL *mysql,const std::string &sql){
//mysql_query(句柄,sql语句)
if(mysql_query(mysql,sql.c_str())!=0){
std::cout<<sql<<std::endl;
std::cout<<mysql_error(mysql)<<std::endl;
return false;
}
return true;
}
class TableDish{
private:
MYSQL *_mysql;
std::mutex _mutex;
public:
TableDish(){/*mysql 初始化*/
_mysql=MysqlInit();
if(_mysql==NULL){
exit(-1);
}
}
~TableDish(){
MysqlRelease(_mysql);
_mysql=NULL;
}
bool Insert(const Json::Value &dish){
//组织sql语句
#define DISH_INSERT "insert tb_dish values(null,'%s',%d,now());"
char str_sql[4096]={0};
sprintf(str_sql,DISH_INSERT,
dish["name"].asCString(),
dish["price"].asInt());
//insert tbname value()
//执行sql语句
return MysqlQuery(_mysql,str_sql);
}
bool Delete(int dish_id){
#define DISH_DELETE "delete from tb_dish where id=%d;"
char str_sql[4096]={0};
sprintf(str_sql,DISH_DELETE,dish_id);
return MysqlQuery(_mysql,str_sql);
}
bool Update(const Json::Value &dish){
#define DISH_UPDATE "update tb_dish set name='%s',price=%d where id=%d;"
char str_sql[4096]={0};
sprintf(str_sql,DISH_UPDATE,
dish["name"].asCString(),
dish["price"].asInt(),
dish["id"].asInt());
return MysqlQuery(_mysql,str_sql);
}
bool SelectAll(Json::Value *dishes){
#define DISH_SELECT "select * from tb_dish;"
_mutex.lock();
bool ret=MysqlQuery(_mysql,DISH_SELECT);
if(ret==false){
_mutex.unlock();
return false;
}
MYSQL_RES *res=mysql_store_result(_mysql);
_mutex.unlock();
if(res==NULL){
std::cout<<"store result failed!\\n";
return false;
}
int num=mysql_num_rows(res);
for(int i=0;i<num;i++){
MYSQL_ROW row=mysql_fetch_row(res);
Json::Value dish;
dish["id"]=std::stoi(row[0]);
dish["name"]=row[1];
dish["price"]=std::stoi(row[2]);
dish["ctime"]=row[3];
dishes->append(dish);
}
mysql_free_result(res);
return true;
}
bool SelectOne(int dish_id,Json::Value *dish){
#define DISH_SELECTONE "select * from tb_dish where id=%d;"
char str_sql[4096]={0};
sprintf(str_sql,DISH_SELECTONE,dish_id);
_mutex.lock();
bool ret=MysqlQuery(_mysql,str_sql);
if(ret==false){
_mutex.unlock();
return false;
}
MYSQL_RES *res=mysql_store_result(_mysql);
_mutex.unlock();
if(res==NULL){
std::cout<<"store result failed!\\n";
return false;
}
int num=mysql_num_rows(res);
if(num!=1){
std::cout<<"result error\\n";
mysql_free_result(res);
return false;
}
MYSQL_ROW row=mysql_fetch_row(res);
(*dish)["id"]=dish_id;
(*dish)["name"]=row[1];
(*dish)["price"]=std::stoi(row[2]);
(*dish)["ctime"]=row[3];
mysql_free_result(res);
return true;
}
};
class TableOrder{
private:
MYSQL *_mysql;
std::mutex _mutex;
public:
TableOrder(){/*mysql 初始化*/
_mysql=MysqlInit();
if(_mysql==NULL){
exit(-1);
}
}
~TableOrder(){
if(_mysql!=NULL){
MysqlRelease(_mysql);
}
}
bool Insert(const Json::Value &order){
#define ORDER_INSERT "insert tb_order values(null,'%s',0,now());"
char str_sql[4096]={0};
Json::FastWriter writer;
std::string dishes=writer.write(order["dishes"]);
sprintf(str_sql,ORDER_INSERT,dishes.c_str());
return MysqlQuery(_mysql,str_sql);
}
bool Delete(int order_id){
#define ORDER_DELETE "delete from tb_order where id=%d;"
char str_sql[4096]={0};
sprintf(str_sql,ORDER_DELETE,order_id);
return MysqlQuery(_mysql,str_sql);
}
bool Update(const Json::Value &order){
#define ORDER_UPDATE "update tb_order set dishes='%s',status=%d where id=%d;"
Json::FastWriter writer;
int order_id=order["id"].asInt();
int status=order["status"].asInt();
std::string dishes=writer.write(order["dishes"]);
char str_sql[4096]={0};
sprintf(str_sql,ORDER_UPDATE,dishes.c_str(),status,order_id);
return MysqlQuery(_mysql,str_sql);
}
bool SelectAll(Json::Value *orders){
#define ORDER_SELECTALL "select * from tb_order;"
_mutex.lock();
bool ret=MysqlQuery(_mysql,ORDER_SELECTALL);
if(ret==false){
_mutex.unlock();
return false;
}
MYSQL_RES *res=mysql_store_result(_mysql);
_mutex.unlock();
if(res==NULL){
std::cout<<mysql_error(_mysql)<<std::endl;
return false;
}
int num=mysql_num_rows(res);
for(int i=0;i<num;i++){
MYSQL_ROW row=mysql_fetch_row(res);
Json::Value order;
order["id"]=std::stoi(row[0]);
order["dishes"]=row[1];
order["status"]=std::stoi(row[2]);
order["mtime"]=row[3];
orders->append(order);
}
mysql_free_result(res);
return true;
}
bool SelectOne(int order_id,Json::Value *order){
#define ORDER_SELECTONE "select * from tb_order where id=%d;"
char str_sql[4096]={0};
sprintf(str_sql,ORDER_SELECTONE,order_id);
_mutex.lock();
bool ret=MysqlQuery(_mysql,str_sql);
if(ret==false){
_mutex.unlock();
return false;
}
MYSQL_RES *res=mysql_store_result(_mysql);
_mutex.unlock();
if(res==NULL){
std::cout<<mysql_error(_mysql)<<std::endl;
return false;
}
int rows=mysql_num_rows(res);
if(rows!=1)dr-helper项目设计介绍(一个包括移动端和Web端的点餐管理系统)
计算机毕业设计-基于javaweb的外卖点餐系统-基于jsp的外卖系统源代码-校园外卖点餐系统java-骑手送外卖商家统计项目代码
计算机课程设计-基于javaweb的在线点餐系统-线上点餐系统代码java外卖点餐系统代码