毕业设计C++基于MFC实验室机房管理系统毕业论文|寻找C站宝藏

Posted CSDN专家-小兔子编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了毕业设计C++基于MFC实验室机房管理系统毕业论文|寻找C站宝藏相关的知识,希望对你有一定的参考价值。

课题

C++基于MFC实验室机房管理系统

目   录

1. 引言

2. 开发技术简介

2.1 VC++ 6.0开发平台介绍

2.2 数据库系统介绍

3. 系统需求分析

3.1 需求分析

3.2 设计目标分析

3.3 安全保密需求分析

3.4 开发与运行环境

3.5 系统可行性分析

3.5.1 技术可行性

3.5.2 经济可行性

3.5.3 管理可行性

3.5.4 法律可行性

4. 系统设计

4.1 概要设计

4.1.1 主控端规划

4.1.2 学生端规划

4.2 功能模块结构的设计

4.3 系统操作流程图

4.4 系统数据库设计

4.4.1 数据表设计

4.4.2 视图设计

4.4.3 触发器设计

5. 系统实现

5.1 HOOK 消息钩子设计

5.1.1 概述

5.1.2 程序相关代码分析

5.2 学生端全屏透明登陆窗体设计

5.2.1 概述

5.2.2 程序相关代码分析

5.3 系统托盘设计

5.3.1 概述

5.3.2 程序相关代码分析

5.4 学生端监听服务端后台线程设计

5.4.1 概述

5.4.2 程序相关代码分析

5.5 系统还原失效检测

5.5.1 概述

5.5.2 程序相关代码分析

5.6 多线程主控端设计

5.6.1 概述

5.6.2 程序相关代码分析

5.7 Excel表格导入和导出的实现

5.7.1 概述

5.7.2 程序相关代码分析

5.8 单程序实例的实现

5.8.1 概述

5.7.2 程序相关代码分析

5.9 主机列表的实现.

5.9.1 概述

5.9.2 主要代码分析

5.10 远程桌面的实现

5.10.1 概述

5.10.2 主要代码分析.

5.11  配置信息注册表存储的实现

5.11.1 概述

5.11.2 相关代码分析

5.12 状态栏下实现进度条

6. 系统测试与性能分析

7. 总结

参考文献

致谢


此处省略几千字


 

概要设计

实验室机房管理系统是一个典型的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++实现实验设备管理系统 课程设计论文+源程序+数据库+使用说明

计算机毕业设计之java+ssm实验室设备管理系统

基于javaweb项目实验室管理系统设计与现实(论文+项目源码)

仿人机器人的实时模仿(基于Kinect)