毕业设计C++基于MFC实验室机房管理系统毕业论文|寻找C站宝藏
Posted CSDN专家-小兔子编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了毕业设计C++基于MFC实验室机房管理系统毕业论文|寻找C站宝藏相关的知识,希望对你有一定的参考价值。
课题
C++基于MFC实验室机房管理系统
目 录
此处省略几千字
概要设计
实验室机房管理系统是一个典型的C/S模式应用程序,包括学生端和主控端两部分。
主控端规划
主控端负责学生端上机登陆的验证、学生端的远程控制等,具体的功能模块如下:
(1) 系统设置模块
1) 通讯设置:主控端与被控端的通讯端口设置。
2) 密码修改:修改主控端解锁密码。
(2) 账号管理:
1) 添加账号:需要的字段有:学号、姓名、班级、密码。
2) 账号修改:对指定的账号进行修改,如学生忘记密码,可以让管理 员修改密码。
3) 批量导入:可以把包含账号信息Excel表格数据导入到数据库。
4) 批量删除:可以对查询出来的账号批量删除。
(3) 日常维护:
1) 上机日志:记录学生的每次登陆和注销的日志。
2) 异常日志:记录学生端异常日志,如还原卡失效。
3) 数据库备份:管理员可以定期对进行数据备份
(4) 学生端列表:
1) 列表动态维护:管理学生端连接,并在列表上动态更新。
2) 消息发送:对选中的学生端发送消息。
3) 远程桌面:对单个学生端进行远程桌面控制。
4) 远程关机:对选中的学生端发出关机命令。
5) 远程重启:对选中的学生端发出关机命令。
学生端规划
学生端负责学生机屏幕锁定、执行主控端的命令等,具体的功能模块如下:
(1) 登陆模块:
1) 热键屏蔽:系统启动时屏蔽掉相关热键,并锁定屏幕,显示登录框。
2) 登陆验证:发送学号与密码到服务端,若验证成功,会自动解锁。
3) 管理员解锁:管理员可以利用解锁密码解除学生端的锁定。
(2) 与服务端通信模块:
1) 接收消息:接收服务端发过来的消息并自动在桌面提示。
2) 接收远程控制:对服务端要求的各种控制进行响应。
3) 异常监控:把学生端出现的异常发送给服务端。
4) 修改密码:学生修改登陆密码。
(3) 学生端设置:需要在管理模式才能使用,设置通讯方式和解锁密码。
功能模块结构设计
系统操作流程图
系统数据库设计
数据表设计(部分)
对于实验室机房管理系统,主要的功能是来控制学生端的上机,数据库设计比较简单。本系统采用SQL 2000 数据库,系统数据库名称为db_LabMS,数据库db_LabMS中包括3个数据表。下面分别给出数据库概要说明、数据表的结构。
(1)用户数据表
用户保存系统用户的账户信息,数据表命名为“student”,结构见表:4-1。
表:4-1 用户表(student)
序号 | 列名 | 数据类型 | 长度 | 标识 | 主键 | 允许空 | 默认值 | 说明 |
1 | s_id | int | 4 | 是 |
| 否 |
| 自动编号ID |
2 | s_xh | nvarchar | 12 |
| 是 | 否 |
| 学号 |
3 | s_name | nvarchar | 8 |
|
| 否 |
| 名字 |
4 | s_pwd | nvarchar | 12 |
|
| 否 |
| 密码 |
5 | s_class | nvarchar | 30 |
|
| 否 |
| 班级 |
(2)上机记录数据表
用于保存学生上机记录数据,数据表命名为“log”,结构见表:4-2。
表:4-2 上机记录数据表(log)
序号 | 列名 | 数据类型 | 长度 | 标识 | 主键 | 允许空 | 默认值 | 说明 |
1 | l_id | int | 4 | 是 | 是 | 否 |
| 自动编号ID |
2 | s_xh | nvarchar | 12 |
|
| 否 |
| 学号 |
3 | l_type | nvarchar | 8 |
|
| 否 |
| 类型 |
4 | l_time | datetime | 8 |
|
| 否 | (getdate()) | 时间 |
5 | l_pc | nvarchar | 20 |
|
| 否 |
| Pc名 |
(3)异常数据表
用于保存学生机出现异常信息,数据表命名为“exception”,结构见表:4-3。
表:4-3 异常数据表(exception)
序号 | 列名 | 数据类型 | 长度 | 标识 | 主键 | 允许空 | 默认值 | 说明 |
1 | e_id | int | 4 | 是 | 是 | 否 |
| 自动编号ID |
2 | e_type | nvarchar | 50 |
|
| 是 |
| 异常类型 |
3 | e_state | nvarchar | 8 |
|
| 是 | (N'未处理') | 状态 |
4 | e_pc | nvarchar | 20 |
|
| 是 |
| Pc名 |
5 | e_time | datetime | 8 |
|
| 是 | (getdate()) | 异常出现时间 |
(4)主机列表数据表
用于保存当前登陆的学生机列表,数据表命名为“list”,结构见表4-4。
表:4-4 主机列表数据表(list)
序号 | 列名 | 数据类型 | 长度 | 标识 | 主键 | 允许空 | 默认值 | 说明 |
1 | l_xh | nvarchar | 12 |
|
| 是 |
| 学号 |
2 | l_mac | nvarchar | 12 |
|
| 是 |
| MAC地址 |
3 | l_pc | nvarchar | 20 |
|
| 是 |
| PC名 |
4 | l_time | datetime | 8 |
|
| 是 | (getdate()) | 登陆时间 |
视图设计(部分)
从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样,对表能够进行的一般操作都可以应用于视图,例如查询,插入,修改,删除操作等。[3]
系统的logview视图创建语句如下:
CREATE VIEW dbo.logview
AS
SELECT dbo.[log].l_time, dbo.[log].s_xh, dbo.student.s_name, dbo.[log].l_type,
dbo.[log].l_pc, dbo.student.s_class
FROM dbo.[log] INNER JOIN
dbo.student ON dbo.[log].s_xh = dbo.student.s_xh
触发器设计(部分)
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。[4]当对log表进进行插入操作,会触发更新list表,list表保存这当前主机列表。
触发器trig_updatelist创建语句如下:
CREATE TRIGGER trig_updatelist ON dbo.[log]
FOR insert
AS
if exists(select l_mac from inserted where l_mac not in (select l_mac from [list]))
begin
insert into [list](l_pc,l_mac,l_xh) select l_pc,l_mac,s_xh from inserted
end
else
begin
delete [list] where l_mac=(select l_mac from inserted)
end
系统实现(部分)
HOOK 消息钩子设计
学生端开机是要进行锁屏,屏蔽系统热键,保护锁屏程序不被关闭。屏蔽系统热键需要利用到HOOK技术,钩子(Hook)是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。[5]当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理Window消息或特定事件。通过HOOK技术可以屏蔽掉一些热键如ALT+F4、 ALT+ESC等,可以有效保护锁屏程序。
一般来讲,系统级钩子必须是一个DLL。下面提供的一个键盘钩子DLL的代码片断(TaskKeyHook.dll):
//头文件
//TaskKeyHook.h
//
#define DLLIMPORT __declspec(dllimport)
DLLIMPORT BOOL DisableTaskKeys(BOOL bEnable, BOOL bBeep);
DLLIMPORT BOOL AreTaskKeysDisabled();
//实现文件
// TaskKeyHook.cpp
//
#define _WIN32_WINNT 0x0500 // for KBDLLHOOKSTRUCT
#include <afxwin.h> // MFC core and standard components
#define DLLEXPORT __declspec(dllexport)
//
// App (DLL) object
//
class CTaskKeyHookDll : public CWinApp {
public:
CTaskKeyHookDll() { }
~CTaskKeyHookDll() { }
} MyDll;
// 下面的代码表示这一部分在此DLL所有实例之间共享
// 低级键盘钩子一定是系统级的钩子
//
#pragma data_seg (".mydata")
HHOOK g_hHookKbdLL = NULL; // 钩子句柄
BOOL g_bBeep = FALSE; // 按下非法键时蜂鸣响铃
#pragma data_seg ()
#pragma comment(linker, "/SECTION:.mydata,RWS") // 告诉链接器:建立数据共享段
//
// 低级键盘钩子
// 截获任务转换键:不传递直接返回
//
LRESULT CALLBACK MyTaskKeyHookLL(int nCode, WPARAM wp, LPARAM lp)
{
KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;
if (nCode==HC_ACTION) {
BOOL bCtrlKeyDown =
GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);
if ((pkh->vkCode==VK_ESCAPE && bCtrlKeyDown) || // Ctrl+Esc
// Alt+TAB
(pkh->vkCode==VK_TAB && pkh->flags & LLKHF_ALTDOWN) ||
// Alt+Esc
(pkh->vkCode==VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN)||
(pkh->vkCode==VK_LWIN || pkh->vkCode==VK_RWIN)) { // 开始菜单
if (g_bBeep && (wp==WM_SYSKEYDOWN||wp==WM_KEYDOWN))
MessageBeep(0); // 蜂鸣
return 1; // 不再往CallNextHookEx传递,直接返回
}
}
return CallNextHookEx(g_hHookKbdLL, nCode, wp, lp);
}
// 是否屏蔽任务键序列——也就是说键盘钩子是否安装?
// 注:这里假设没有其它钩子做同样的事情
//
DLLEXPORT BOOL AreTaskKeysDisabled()
{
return g_hHookKbdLL != NULL;
}
// 屏蔽任务键:安装低级键盘构
// 返回当前是否屏蔽标志(TRUE/FALSE)
//
DLLEXPORT BOOL DisableTaskKeys(BOOL bDisable, BOOL bBeep)
{
if (bDisable) {
if (!g_hHookKbdLL) {
g_hHookKbdLL = SetWindowsHookEx(WH_KEYBOARD_LL,
MyTaskKeyHookLL, MyDll.m_hInstance, 0);
}
} else if (g_hHookKbdLL != NULL) {
UnhookWindowsHookEx(g_hHookKbdLL);
g_hHookKbdLL = NULL;
}
g_bBeep = bBeep;
return AreTaskKeysDisabled();
}
TaskKeyHook 输出两个函数:DisableTaskKeys 和 AreTaskKeysDisabled。前者安装WH_KEYBOARD_LL 钩子;后者判断这个钩子是否安装。此键盘钩子的处理思路是截获Alt+Tab,Ctrl+Esc,Alt+Esc以及Windows 键等热键。
学生端全屏透明登陆窗体设计
学生端一启动就会自动对学生机进行全屏锁定。学生端锁屏登陆界面图:5-1所示。其实现原理是通过两个对话框实现,父对话框实现全屏透明窗体,然后弹出子对话框(登陆框),登陆框隐藏了边框,并且用笔刷填充了背景。
图:5-1 实验室机房管理系统主窗体
全屏透明登陆窗体主要代码片段:
// ClientDlg.cpp : implementation file
void CClientDlg::OnFullScreen()
{
LONG style = GetWindowLong(m_hWnd, GWL_STYLE); //得到窗口风格
::ShowWindow(m_hWnd, SW_MAXIMIZE);
style = GetWindowLong(m_hWnd, GWL_STYLE);
style &= ~(WS_DLGFRAME | WS_THICKFRAME);
SetWindowLong(m_hWnd, GWL_STYLE, style); //设置窗口风格
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
::SetWindowPos(m_hWnd, HWND_TOPMOST, -1, -1, cx+3, cy+3, SWP_FRAMECHANGED);//实现全屏显示
::InvalidateRect(m_hWnd,NULL,TRUE); //窗口背景要被擦除
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); //窗口加入WS_EX_LAYERED扩展属性
HINSTANCE hInst = LoadLibrary("User32.DLL");
if (hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
fun = (MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes"); //取得SetLayeredWindowAttributes函数指针
if (fun)
fun(this->GetSafeHwnd(),0,125,2); //设置窗口为半透明
FreeLibrary(hInst);
}
CTaskKeyMgr::Disable(CTaskKeyMgr::ALL, TRUE); //利用Hook工具类实现热键屏蔽
CLoginDlg dlg=new CLoginDlg();
dlg.DoModal(); //弹出模式对话框等待用户输出
CTaskKeyMgr::Disable(CTaskKeyMgr::ALL, FALSE); //恢复所有禁止的东西
}
登陆框主要代码片段:
// LoginDlg.cpp : implementation file
//
//填充背景
void CLoginDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rect;
GetClientRect(&rect);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP1);
BITMAP bitmap;
bmpBackground.GetBitmap(&bitmap);
CBitmap *pbmpOld=dcMem.SelectObject(&bmpBackground);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,
bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
}
void CLoginDlg::OnLogin()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if ((m_uid == "")||(m_pwd == "")) //如果用户名为空
{
MessageBoxA("用户名或密码不能为空");
GetDlgItem(IDC_UID)->SetFocus();
return;
}
else
{
if (m_uid.Find(" ")!=-1)
{
MessageBoxA("用户名不能包含空格");
GetDlgItem(IDC_UID)->SetFocus();
return;
}else
if (m_pwd.Find(" ")!=-1)
{
MessageBoxA("密码不能包含空格");
GetDlgItem(IDC_PWD)->SetFocus();
return;
}
}
//发送用户名和密码到服务端验证
if (CScoketMgr::SendLogin(m_uid,m_pwd))
{
CDialog::OnCancel();
}
}
BOOL CLoginDlg::PreTranslateMessage(MSG* pMsg)
{
// 屏蔽掉RETURN、PAUSE、ESCAPE键,防止登陆框被关闭
if (pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_RETURN)
{
return TRUE;
}
if (pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_PAUSE)
{
return TRUE;
}
if (pMsg->message==WM_KEYDOWN&&pMsg->wParam==VK_ESCAPE)
{
return TRUE;
}
return CDialog::PreTranslateMessage(pMsg);
}
void CLoginDlg::OnClose()
{
// 防止登陆框被关闭
return;
}
void CLoginDlg::OnUnlock()
{
// 解锁
UpdateData(true);
CMD5 md5T;
if (md5T.MD5(m_pwd)==theApp.unlockpwd) //验证解锁密码
OnCancel();
}
此处省略几千字
资源下载
完整源程序+数据库+论文+使用说明下载:https://download.csdn.net/download/frank2102/19414729
以上是关于毕业设计C++基于MFC实验室机房管理系统毕业论文|寻找C站宝藏的主要内容,如果未能解决你的问题,请参考以下文章
万字长文毕业设计 C#开发基于BS的实验室预约管理系统 毕业论文论文+数据库+源程序
数据库课程设计 C++实现实验设备管理系统 课程设计论文+源程序+数据库+使用说明