php实现餐厅管理系统,项目实战篇-餐馆管理系统—MFC,PHP,MySql:2.登陆功能的实现...

1.mysql 数据库的建立

首先在虚拟机终端上利用 ifconfig 获取虚拟机IP。

deddcaf7319b2b1e7b0852bac24e1059.png

然后在本地计算机浏览器地址栏输入 http://192.168.200.128/phpmyadmin 如果载入不成功检查Ubuntu是否安装phpmyadmin。

3114ed57422bea48ee220a67b0464634.png

输入mysql的账号和密码进入。并且新建一个名为 sdb 的数据库

4ff5cbc633a9dadbe48d89ae596a37af.png

及其对应的表:

privilege

b4d4ed5f2619e76f83e373be77d91920.png

users

867e0dffbfd257a2d3a2eea8d2c37300.png

2.后端PHP代码

db_info.php

/**

* Created by PhpStorm.

* User: pldq

* Date: 16-12-13

* Time: 下午8:31

*/

#echo "From db_info.php";

# databases infomation

static $DB_HOST="localhost";

static $DB_NAME="sdb";

static $DB_USER="root";

static $DB_PASS="******";

global $con;

$con = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS);

if ($con == null) {

die("FAILED|Could not connect:" . mysqli_error() . "

");

}

if (!mysqli_select_db($con, "sdb")) {

die("FAILED|Could't use foo: " . mysqli_error());

}

?>

login.php

'db_info.php');

// echo "Hello World!";

// echo $_REQUEST["username"];

// echo $_REQUEST["psd"];

$username = $_POST["username"];

$psd = $_POST["psd"];

// $phone = $_POST["phone"];

// $email = $_POST["email"];

$sql_username = "Select * from users WHERE username = '" . $username . "'";

$mysqli_result = mysqli_query($con, $sql_username);

$row = mysqli_fetch_array($mysqli_result);

if (mysqli_num_rows($mysqli_result) == 0) {

die("FAILED|The username is not existed!");

}

if ($row['password'] === $psd and strlen($psd) > 6)

{

$str_ret = "SUCCEED|SUCCEED LOGIN IN THE SYSTEM!|";

$sql_get_privilege = "Select * from privilege WHERE username = '" . $username . "'";

$mysqli_privilege_result = mysqli_query($con, $sql_get_privilege);

if (mysqli_num_rows($mysqli_result) == 0) {

$_SESSION['user'] = $username;

die($str_ret);

} else {

$row = mysqli_fetch_array($mysqli_privilege_result);

$_SESSION['user'] = $username;

$_SESSION['rightstr'] = $row['rightstr'];

die($str_ret . $row['rightstr']);

}

} else {

die("FAILED|The password is incorrect!");

}

mysqli_close($con); // close db connect

?>

然后将代码上传到Ubuntu 站点目录下

a1d6ba063babb48062c734b4354b6a41.png

这样网页后端就编写成功了!

3.MFC 端

1、利用 MFC 生成向导生成一个基于对话框的程序。

e17552cbca88dcc598a0f5bdcc92df15.png

使用GDI绘图:

#include

#pragma comment(lib, "gdiplus.lib")

using namespace Gdiplus;

// Bitmap* m_mainImage; // 声明为类成员

BOOL CManagementSystemDlg::OnInitDialog()

{

// 初始化 GDI+

GdiplusStartupInput gdiplusStartupInput;

GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);

// !其余代码没有进行修改、删除

}

void CManagementSystemDlg::OnClose()

{

// 释放GDI+

GdiplusShutdown(m_gdiplusToken);

}

绘制图片:

#define IMAGE_MAIN_FILENAME L"Important\\res_login\\main.jpg"

BOOL CManagementSystemDlg::OnInitDialog()

{

// 加载图片到内存

m_mainImage = Bitmap::FromFile(IMAGE_MAIN_FILENAME);

}

void CManagementSystemDlg::OnPaint()

{

CClientDC Clientdc(this);

Graphics graphics(Clientdc.GetSafeHdc());

// 绘制图片

graphics.DrawImage(m_mainImage, 0, 0, m_mainImage->GetWidth(), m_mainImage->GetHeight());

}

然后编译运行、、、

f7e4df26a67829f3f8733c0e93b86a36.png

但是运行后发现窗口并不能实现拖动。为了实现窗口拖动我们还需要让对话框响应 WM_NCHITTEST 消息。让它把点击再窗口客户区的消息响应为在标题栏点击的消息。

LRESULT CManagementSystemDlg::OnNcHitTest(CPoint point)

{

// TODO: 在此添加消息处理程序代码和/或调用默认值

CRect rc;

GetClientRect(&rc);

ClientToScreen(&rc);

int x = point.x;

int y = point.y;

if (x >= rc.left && x <= rc.right && y >= rc.top && y <= rc.bottom)

{

return HTCAPTION;

}

else {

return CDialogEx::OnNcHitTest(point);

}

}

退出按钮的事件代码:

void CManagementSystemDlg::OnBnClickedButtonExit()

{

// TODO:在此添加控件通知处理程序代码

this->SendMessage(WM_CLOSE, 0, 0);

}

登陆按钮的事件代码:

HTTP访问:

1. 利用MFC 里面的CSession、CHttpConnection等函数:(实现失败!)

#include

void Ansi2Wchar(std::string strSource, CString& strDest)

{

int length = 0;

length = ::MultiByteToWideChar(CP_ACP, 0, strSource.c_str(), strSource.length(), 0, 0);

WCHAR* Buffer = new WCHAR[length + 1];

memset(Buffer, 0, (length + 1) * sizeof(WCHAR));

::MultiByteToWideChar(CP_ACP, 0, strSource.c_str(), strSource.length(), Buffer, length);

strDest = Buffer;

delete[] Buffer;

}

void Wchar2Ansi(CString strSource, std::string& strDest)

{

int length = 0;

length = ::WideCharToMultiByte(CP_ACP, 0, strSource.GetBuffer(), strSource.GetLength(), 0, 0, 0, 0);

strSource.ReleaseBuffer();

CHAR* Buffer = new CHAR[length + 1];

memset(Buffer, 0, sizeof(CHAR)* (length + 1));

::WideCharToMultiByte(CP_ACP, 0, strSource.GetBuffer(), strSource.GetLength(), Buffer, length, 0, 0);

strSource.ReleaseBuffer();

strDest = Buffer;

delete[] Buffer;

}

void CManagementSystemDlg::OnBnClickedButtonLogin()

{

// TODO: 在此添加控件通知处理程序代码

UpdateData(TRUE);

CString strUrl = L"http://192.168.200.128/myAdminSystem/login.php";

DWORD dwServiceType = AFX_INET_SERVICE_HTTP;

CString strServer = L"";

CString strObject = L"";

INTERNET_PORT nPort = 80;

if (!AfxParseURL(strUrl, dwServiceType, strServer, strObject, nPort))

{

return;

}

CInternetSession mysession(L"session", 0);

mysession.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 1000 * 20);

mysession.SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1000);

mysession.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);

CHttpConnection* mycon = mysession.GetHttpConnection(strServer, INTERNET_FLAG_KEEP_CONNECTION, nPort);

CHttpFile* myfile = mycon->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject, 0, 1, 0, L"HTTP/1.1", INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);

CString strPostData = L"username=" + strUSER + L"&psd=" + strPsd;

std::string strPost = "";

Wchar2Ansi(strPostData, strPost);

CString strHeaders = L"Content-Type: application/x-www-form-urlencoded\r\nAccept: */*\r\n";

BOOL result = myfile->SendRequest(strHeaders, (LPVOID)strPost.c_str(), strPost.size());

strHeaders.ReleaseBuffer();

strPostData.ReleaseBuffer();

CHAR Buffer[1024 + 1] = { 0 };

memset(Buffer, 0, (1024 + 1) * sizeof(CHAR));

std::string strRawResponse = "";

UINT nReaded = 0;

while ((nReaded = myfile->Read((void*)Buffer, 1024)) > 0)

{

Buffer[nReaded] = '\0';

strRawResponse += Buffer;

memset(Buffer, 0, (1024 + 1) * sizeof(CHAR));

}

CString strResponse = L"";

Ansi2Wchar(strRawResponse, strResponse);

if (strResponse.GetLength() <= 0)

{

MessageBox(L"获取数据失败!", L"Info", MB_OK | MB_ICONWARNING);

return;

}

}

这个 Bug 很奇怪,当我打开 Fiddler 进行抓包时 SendRequest 可以成功使用,当我关闭 Fiddler 的抓包功能时它会弹出 “无法与服务器建立连接的信息框”

bd3ae6c374c21f0a984c001f959f18ae.png

2. 利用WinHttp 的 com 组件智能指针编程(实现简单、现使用)

#import "C:\\windows\\system32\\winhttp.dll"

#define STRING_LOGIN_HOST_ADDRESS L"http://192.168.200.128/myAdminSystem/login.php"

void CManagementSystemDlg::OnBnClickedButtonLogin()

{

// TODO: 在此添加控件通知处理程序代码

UpdateData(TRUE);

CString strPostData = L"username=" + strUSER + L"&psd=" + strPsd;

// using com programming winhttp

WinHttp::IWinHttpRequestPtr ptrHttp = nullptr;

ptrHttp.CreateInstance(__uuidof(WinHttp::WinHttpRequest));

if (0 != ptrHttp->Open(L"POST", STRING_LOGIN_HOST_ADDRESS))

{

MessageBox(L"服务器连接失败!", L"Info", MB_OK | MB_ICONSTOP);

return;

}

ptrHttp->SetRequestHeader(L"User-Agent", L" Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 50.0.2661.102 Safari / 537.36");

ptrHttp->SetRequestHeader(L"Content-Type", L"application/x-www-form-urlencoded");

ptrHttp->Send(strPostData.GetBuffer());

strPostData.ReleaseBuffer();

CString strResult = ptrHttp->GetResponseText();

CString strCookie = ptrHttp->GetResponseHeader(L"Set-Cookie"); // get http post cookie

strCookie.Replace(L"; path=/", L"");

}

对HTTP返回消息的处理:

if (strResult.GetLength() <= 0)

{

MessageBox(L"获取数据失败!", L"Info", MB_OK | MB_ICONWARNING);

return;

}

if (-1 == strResult.Find(L"FAILED"))

{

int index = 0;

CString strCaption = strResult.Mid(index, strResult.Find(L"|", index) - index);

index = strResult.Find(L"|", index) + 1;

CString strInformation = strResult.Mid(index, strResult.Find(L"|", index) - index);

index = strResult.Find(L"|", index) + 1;

CString session = strResult.Mid(index, strResult.GetLength() - index);

MessageBox(strInformation, strCaption, MB_OK | MB_ICONINFORMATION);

// TODO

} else {

int index = 0;

CString strCaption = strResult.Mid(index, strResult.Find(L"|", index) - index);

index = strResult.Find(L"|", index) + 1;

CString strInformation = strResult.Mid(index, strResult.GetLength() - index);

MessageBox(strInformation, strCaption, MB_OK | MB_ICONSTOP);

return;

}

这样一个登陆功能就成功实现了!

da1f2940f2e946f945e2b1d3b41b2c85.png

b4c17533bb550b6b4b0e0b3873b721ae.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
千味餐厅点餐支付管理系统是以php进行开发的餐厅点餐系统。方便的点菜下单,手机、平板全系列支持;快捷的网络支付,微信及支付宝在线付款;创新的管理模式,全手机操作无小票传递;完善的数据统计,每日营销情况一目了然。 前期配置: 1、使用本系统,您店内必须有Wifi网络。 2、自行架设服务器,安装Php+MySql运行环境。配置服务器,将服务器IP地址设置为固定IP。使用WinXP系统作为服务器请务必使用XP连接数破解补丁,否则最多只能同时在线40人。 3、注册成为本站商户,检查注册时的邮箱,获取登陆商户ID和密码,登陆商户管理,获取通讯密钥。 3、安装本系统,在浏览器地址栏输入//服务器IP地址/Qv/install.php,填写通讯密钥及相关信息,完成安装。 4、使用默认用户名admin密码123456登陆本系统,配置系统。 5、点击右上角设置,基本设置修改餐厅名称,务必将主机地址设置为服务器IP!然后配置餐桌,添加餐品及分类,配置工作人员ID及权限;安装打印控件,测试小票打印机。 6、返回大厅,点击当前员工旁边的二维码,生成各个餐桌的二维码图片,将图片打印,分别粘贴在各个餐桌上。 使用流程: 1、餐厅服务员扫描店员二维码,进入餐厅管理界面;后厨及送餐人员扫描厨房二维码进入后厨管理界面。 2、客人到来后,服务员引导顾客入座,在手机管理界面上点入座。 3、客人连接店内Wifi,扫描桌上二维码,进入顾客自助点餐界面。也可将店内预置的Pad或店员手机给顾客点餐。注意:将店员手机或店内预置Pad给顾客点餐,请务必选择“顾客点餐”选项,这样返回管理界面需要密码,而“点餐”返回时无需密码,防止顾客误操作进入管理界面。返回管理界面点最上面图标。 4、客人选好餐品,下单后,服务员手机端及前台电脑端将收到下单通知,服务员可与客人核对无误后点交厨,提交到后厨处理。 5、后厨接收到前台下单后,点击接收,开始做菜,制作完成后,将菜品交送餐口,点击完成。 6、送餐人员根据厨师送来的菜品,手机上查看应是哪一桌的菜品,然后送餐,送餐完成后点击完成。 7、客人就餐完毕后,呼叫服务员来结账。服务员点击结账,选择可用折扣,自动计算金额。 8、选择支付方式,当选择微信或支付宝支付时,右边出现扫码链接,点击扫码链接,生成支付二维码界面。 9、客人扫描二维码,完成支付,系统自动同步支付数据,并将交易号填写入备注栏待查备用。 10、客人离开,服务员点击清台,餐桌状态转为空桌,迎接下一位顾客。 v5.0更新 1、系统重构,数据传递改用json 2、餐厅管理改为统一登录,手机端也可管理店铺后台 3、更新打印控件,解决新版chrome核浏览器不能打印问题,重写打印组件,解决打空单问题 4、利用微信模板消息实现点餐下单通知,顾客下单可直接发送消息至厨师、店员微信上,不用厨房打印机也可方便接单 5、独立版可实时提现至店主个人微信余额账户 6、集成UU跑腿外卖送餐 7、大厅广播取餐通知功能 8、界面布局调整,更富立体感
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值