您的位置:首页 > 编程语言 > PHP开发

项目实战篇-餐馆管理系统—MFC,PHP,MySql:4.权限管理模块

2016-12-18 17:09 941 查看
1.MFC 端 RightAdmin 类 继承 Person 类

#pragma once
#include "Person.h"

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

class RightAdmin :
public Person
{
public:
RightAdmin(CString strUser, CString strSession);
~RightAdmin();
// 获取权限列表 start 是从第几页里取,nLimit 取列表个数
CString getRightList(int nStart, int nLimit);
// 修改 strUser 的权限 为 strRight
CString changeUserRight(CString strUser, CString strRight);
// 取回权限名称列表
CString getRightNameList();
};


#define STRING_RIGHT_HOST_ADDRESS L"http://192.168.200.128/myAdminSystem/right.php"

RightAdmin::RightAdmin(CString strUser, CString strSession) : Person(strUser, strSession)
{
}

RightAdmin::~RightAdmin()
{
}

CString RightAdmin::getRightList(int nStart, int nLimit)
{
CoInitialize(NULL);
WinHttp::IWinHttpRequestPtr ptrHttp = nullptr;
ptrHttp.CreateInstance(__uuidof(WinHttp::WinHttpRequest));
if (nullptr == ptrHttp)
{
return L"";
}
CString strGetUrl = L"";
strGetUrl.Format(L"%s?start=%d&limit=%d", STRING_RIGHT_HOST_ADDRESS, nStart, nLimit);
ptrHttp->Open(L"GET", strGetUrl.GetBuffer());
strGetUrl.ReleaseBuffer();
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->SetRequestHeader(L"Cookie", this->getSession().GetBuffer());
ptrHttp->Send();
CoUninitialize();
CString strRet = ptrHttp->GetResponseText();
return strRet;
}

CString RightAdmin::changeUserRight(CString strUser, CString strRight)
{
CoInitialize(NULL);
WinHttp::IWinHttpRequestPtr ptrHttp = nullptr;
ptrHttp.CreateInstance(__uuidof(WinHttp::WinHttpRequest));
if (nullptr == ptrHttp)
{
return L"";
}
ptrHttp->Open(L"POST", STRING_RIGHT_HOST_ADDRESS);
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->SetRequestHeader(L"Cookie", this->getSession().GetBuffer());
CString strPostData = L"username=" + strUser + L"&rightstr=" + strRight;
ptrHttp->Send(strPostData.GetBuffer());
strPostData.ReleaseBuffer();
CoUninitialize();
CString strRet = ptrHttp->GetResponseText();
return strRet;
}

CString RightAdmin::getRightNameList()
{
CoInitialize(NULL);
WinHttp::IWinHttpRequestPtr ptrHttp = nullptr;
ptrHttp.CreateInstance(__uuidof(WinHttp::WinHttpRequest));
if (nullptr == ptrHttp)
{
return L"";
}
CString strGetUrl = L"";
strGetUrl.Format(L"%s?getrightname=1", STRING_RIGHT_HOST_ADDRESS);
ptrHttp->Open(L"GET", strGetUrl.GetBuffer());
strGetUrl.ReleaseBuffer();
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->SetRequestHeader(L"Cookie", this->getSession().GetBuffer());
ptrHttp->Send();
CoUninitialize();
CString strRet = ptrHttp->GetResponseText();
return strRet;
}


生成继承 CDialogEx 的 RightDlg类,然后修改该类让它再继承刚刚写好 RightAdmin类

为对话框资源添加控件



为了不让程序在载入时卡死,所以将获取权限列表的操作放入线程中。

DWORD WINAPI getRightListProc(LPVOID lpParameter)
{
RightDlg* ptrDlg = (RightDlg*)lpParameter;
ptrDlg->m_RightList.DeleteAllItems();
CString strListText = L"";
CString strBuffer = L"";
int cnt = 0;
do
{
strBuffer = ptrDlg->getRightList(cnt, 1);
if (strBuffer != L"")
{
CString strUser = L"";
CString strRight = L"";
int npos = strBuffer.Find(L"|");
if (npos != -1)
{
strUser = strBuffer.Mid(0, npos);
strRight = strBuffer.Mid(npos + 1, strBuffer.GetLength() - npos - 1);
int nRow = ptrDlg->m_RightList.InsertItem(0, strUser);
ptrDlg->m_RightList.SetItemText(nRow, 1, strRight);
}
}
cnt++;
} while (strBuffer != L"");
return 0;
}


调用方式:

::CreateThread(0, 0, (LPTHREAD_START_ROUTINE)getRightListProc, this, 0, 0);


MFC 端对话框部分代码:

// RightDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "ManagementSystem.h"
#include "RightDlg.h"
#include "afxdialogex.h"
#include "ChangeInfomation.h"
#include <regex>

// RightDlg 对话框

IMPLEMENT_DYNAMIC(RightDlg, CDialogEx)

RightDlg::RightDlg(CString strUser, CString strSession, CWnd* pParent /*=NULL*/)
: CDialogEx(RightDlg::IDD, pParent), RightAdmin(strUser, strSession)
, m_strQueryUser(_T(""))
, m_strUserSet(_T(""))
{

}

RightDlg::~RightDlg()
{
}

void RightDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_RIGHT, m_RightList);
DDX_Text(pDX, IDC_EDIT_RIGHT_USER, m_strQueryUser);
DDX_Text(pDX, IDC_EDIT_USER_SET_RIGHT, m_strUserSet);
DDX_Control(pDX, IDC_COMBO_RIGHT_LIST, m_setRightList);
DDX_Control(pDX, IDC_COMBO_RIGHT_SELECT, m_SelectListBox);
DDX_Control(pDX, IDC_BTN_SELECT, m_SelectBTN);
}

BEGIN_MESSAGE_MAP(RightDlg, CDialogEx)
ON_COMMAND(ID_ChangeInfo, &RightDlg::OnChangeinfo)
ON_NOTIFY(NM_CLICK, IDC_LIST_RIGHT, &RightDlg::OnNMClickListRight)
ON_BN_CLICKED(IDC_BTN_QUERY, &RightDlg::OnBnClickedBtnQuery)
ON_BN_CLICKED(IDC_BTN_UNSET_RIGHT, &RightDlg::OnBnClickedBtnUnsetRight)
ON_BN_CLICKED(IDC_BTN_SET_RIGHT, &RightDlg::OnBnClickedBtnSetRight)
ON_BN_CLICKED(IDC_BTN_SELECT, &RightDlg::OnBnClickedBtnSelect)
END_MESSAGE_MAP()

// RightDlg 消息处理程序

void RightDlg::OnChangeinfo()
{
// TODO: 在此添加命令处理程序代码
ChangeInfomation changeInfo(this->getUser(), this->getSession());
changeInfo.DoModal();
}

DWORD WINAPI getRightListProc(LPVOID lpParameter) { RightDlg* ptrDlg = (RightDlg*)lpParameter; ptrDlg->m_RightList.DeleteAllItems(); CString strListText = L""; CString strBuffer = L""; int cnt = 0; do { strBuffer = ptrDlg->getRightList(cnt, 1); if (strBuffer != L"") { CString strUser = L""; CString strRight = L""; int npos = strBuffer.Find(L"|"); if (npos != -1) { strUser = strBuffer.Mid(0, npos); strRight = strBuffer.Mid(npos + 1, strBuffer.GetLength() - npos - 1); int nRow = ptrDlg->m_RightList.InsertItem(0, strUser); ptrDlg->m_RightList.SetItemText(nRow, 1, strRight); } } cnt++; } while (strBuffer != L""); return 0; }

BOOL RightDlg::OnInitDialog()
{
__super::OnInitDialog();

// TODO: 在此添加额外的初始化
CRect rect;
m_RightList.GetClientRect(&rect);

m_RightList.SetExtendedStyle(m_RightList.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); // 增加全行选中和表格线

AfxOleInit(); // 防止发生错误
m_RightList.InsertColumn(0, L"用户名", LVCFMT_CENTER, rect.Width() / 2, 0);
m_RightList.InsertColumn(1, L"权限", LVCFMT_CENTER, rect.Width() / 2, 1);

::CreateThread(0, 0, (LPTHREAD_START_ROUTINE)getRightListProc, this, 0, 0);
CString strRet = this->getRightNameList();

int index = 0;
int nCount = 0;
int nSearch = 0;
while ((nSearch = strRet.Find(L"|", index)) != -1 || index < strRet.GetLength())
{
if (-1 == nSearch)
{
m_setRightList.InsertString(nCount, strRet.Mid(index, strRet.GetLength() - index));
m_SelectListBox.InsertString(nCount, strRet.Mid(index, strRet.GetLength() - index));
index = strRet.GetLength();
nCount++;
}else {
m_setRightList.InsertString(nCount, strRet.Mid(index, nSearch - index));
m_SelectListBox.InsertString(nCount, strRet.Mid(index, nSearch - index));
index = nSearch + 1;
nCount++;
}
}
m_SelectListBox.InsertString(nCount, L"All");
m_setRightList.SetCurSel(0);
m_SelectListBox.SetCurSel(nCount);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}

void RightDlg::OnNMClickListRight(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
int nItem = m_RightList.GetSelectionMark();
if (0 != m_RightList.GetSelectedCount())
{
m_strUserSet = m_RightList.GetItemText(nItem, 0);
UpdateData(FALSE);
}
*pResult = 0;
}

void RightDlg::OnBnClickedBtnQuery()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (m_strQueryUser.GetLength() < 2 || m_strQueryUser.GetLength() > 20)
{
MessageBox(L"账号格式输入错误!", L"Info", MB_OK | MB_ICONSTOP);
return;
}
LVFINDINFO info;
info.flags = LVFI_STRING;
info.psz = m_strQueryUser;
int index = 0;
if ((index = m_RightList.FindItem(&info)) != -1)
{
int nItem = m_RightList.GetSelectionMark();
m_RightList.SetItemState(nItem, 0, -1);
m_RightList.SetItemState(index, LVNI_FOCUSED | LVIS_SELECTED, LVNI_FOCUSED | LVIS_SELECTED);
m_RightList.SetFocus();
m_strUserSet = m_RightList.GetItemText(index, 0);
UpdateData(FALSE);
} else {
int nItem = m_RightList.GetSelectionMark();
m_RightList.SetItemState(nItem, 0, -1);
m_strUserSet = m_RightList.GetItemText(-1, 0);
UpdateData(FALSE);
MessageBox(L"没有找到该用户名!", L"Info", MB_OK | MB_ICONINFORMATION);
}
int nItem = m_RightList.GetSelectionMark();
int AllItemNumber = m_RightList.GetTopIndex();
CRect rc;
m_RightList.GetItemRect(AllItemNumber, rc, LVIR_BOUNDS);
CSize sz(0, (nItem - AllItemNumber) * rc.Height());
m_RightList.Scroll(sz);
}

void RightDlg::OnBnClickedBtnUnsetRight()
{
UpdateData(TRUE);
if (m_strUserSet.GetLength() < 2 || m_strUserSet.GetLength() > 20)
{
MessageBox(L"账号格式输入错误!", L"Info", MB_OK | MB_ICONSTOP);
return;
}
CString strRet = this->changeUserRight(m_strUserSet, L"delete");
if (strRet != L"")
{
MessageBox(strRet, L"Info", MB_OK | MB_ICONINFORMATION);
}
else {
MessageBox(L"出现未知错误!", L"Info", MB_OK | MB_ICONSTOP);
}
::CreateThread(0, 0, (LPTHREAD_START_ROUTINE)getRightListProc, this, 0, 0);
}

void RightDlg::OnBnClickedBtnSetRight()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (m_strUserSet.GetLength() < 2 || m_strUserSet.GetLength() > 20)
{
MessageBox(L"账号格式输入错误!", L"Info", MB_OK | MB_ICONSTOP);
return;
}
CString strRight = L"";
m_setRightList.GetLBText(m_setRightList.GetCurSel(), strRight);
CString strRet = this->changeUserRight(m_strUserSet, strRight);
if (strRet != L"")
{
MessageBox(strRet, L"Info", MB_OK | MB_ICONINFORMATION);
} else {
MessageBox(L"出现未知错误!", L"Info", MB_OK | MB_ICONSTOP);
}

::CreateThread(0, 0, (LPTHREAD_START_ROUTINE)getRightListProc, this, 0, 0);
}

void RightDlg::OnBnClickedBtnSelect()
{
// TODO: 在此添加控件通知处理程序代码
CString strSelect = L"";
m_SelectListBox.GetLBText(m_SelectListBox.GetCurSel(), strSelect);
if (L"All" == strSelect)
{
::CreateThread(0, 0, (LPTHREAD_START_ROUTINE)getRightListProc, this, 0, 0);
} else {
strSelect += "\n";
for (int i = m_RightList.GetItemCount(); i >= 0; i--)
{
CString tmp = m_RightList.GetItemText(i, 1);
if (m_RightList.GetItemText(i, 1) != strSelect)
{
m_RightList.DeleteItem(i);
}
}
}
}


2.php端

right.php

<?php
require_once("db_info.php");
$rightstr = $_SESSION['rightstr'];
$start = $_GET['start'];
$limit = $_GET['limit'];
$getlist = $_GET['getrightname'];
$username = $_POST['username'];
$right = $_POST['rightstr'];
if( $rightstr == 'administrator' or $rightstr == 'right_admin') {
if (!is_null($start) and !is_null($limit)) {
$sql_count = "SELECT * FROM privilege";
if ($limit === '-1') {
$sql = mysqli_query($con, $sql_count);
while ($row = mysqli_fetch_array($sql)) {
echo $row['username']."|".$row['rightstr'] . "\n";
}
} else {
if ($limit > 0) {
$sql = mysqli_query($con, $sql_count);
$number = mysqli_num_rows($sql);
$pagesize = $limit;
$row_start = $start * $limit;
$sql_rightstr = "SELECT * FROM privilege LIMIT $row_start, $pagesize";
$sql_result = mysqli_query($con, $sql_rightstr);
while ($row = mysqli_fetch_array($sql_result)) {
echo $row['username'] . "|" . $row['rightstr'] . "\n";
}
}
}
}
else if (!is_null($getlist) and $getlist == '1') {
for ($var = 0; $var < count($right_arr); $var++) {
echo $right_arr[$var];
echo ($var == count($right_arr) - 1) ? '' : '|';
}
}
else if (!is_null($username))
{
$sql_is_username_exist = "SELECT * FROM privilege WHERE username = '$username'";
$mysql_result = mysqli_query($con, $sql_is_username_exist);
$flag = false;
for ($var = 0; $var < count($right_arr); $var++) {
if ($right_arr[$var] == $right) {
$flag = true;
}
}
if ($right === 'delete') {
$sql_query = "DELETE FROM privilege WHERE username = '$username'";
$flag = true;
}
else if ($flag and mysqli_num_rows($mysql_result) < 1) {
$sql_query = "INSERT INTO privilege(username, rightstr) VALUES ('$username', '$right')";
} else if ($flag) {
$sql_query = "UPDATE privilege SET rightstr = '$right' WHERE username = '$username'";
}
if ($flag) {
$sql_change_result = mysqli_query($con, $sql_query);
echo "SUCCEED|Change right is succeed!";
}
}
}
else {
echo "FAILED|您的权限不足!";
}


在 db_info.php 中添加代码

global $right_arr;
$right_arr = array('administrator', 'cook', 'order_admin', 'right_admin');


运行时截图:



快考试了,可能更新不会这么快了O(∩_∩)O
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息