本文设计的是学生信息管理系统,能够实现权限管理即不同的用户角色能够拥有不同的限,角色主要是学生、教师和管理员,针对不同的用户,有着不同的操作权限,学生角色只能够查看到学生基础信息,不能够进行删除和添加的操作,而教师和管理员则能够实现学生基础信息的增加、删除等。
本系统设计采用的是c++语言,使用的软件是VS2017,数据库使用的是MYSQL数据库,数据库可用Navicat 进行可视化操作。
系统的主要架构如下图:
用户首先进入到登录界面,输入用户名和密码,并选择角色,进行身份的验证,通过连接数据库进行用户名和密码进行验证,当用户输入的用户名和密码与数据库中的一致的话就可以登陆进去,同时记录用户的角色,验证用户角色,判断是否显示学生成绩的页面,在对学生基础信息与学生成绩信息进行操作都需要进行用户角色的验证,验证不通过则会提示权限不足,验证通过则可以进行学生信息的增加、删除等操作。
2.配置MYSQL数据源,首先在电脑中的【控制面板】---->【管理工具】里打开MYSQL数据库ODBC驱动,找不到则去网上下载ODBC驱动程序,如下图所示。
3. 创建一个MYSQL数据源,选择MySQLODBC 5.1 Driver 驱动程序,如下图所示。
之后会弹出一个配置数据库连接信息的界面,按照提示填写,如下图所示。
4. 登录界面
登录界面能够实现三种角色的登录,当用户输入账户和密码之后,通过连接数据库对用户账户和密码进行判断,验证之后,如果用户名和密码正确,则能够登录到系统中,如果验证失败,则提示错误信息。登录界面如图。
登录界面实现数据库验证的主要代码是:
mysql_query(&m_sqlCon, "SET NAMES GB2312");
query.Format("select userName,userPassword,role from t_user where userName = \'%s\' and userPassword=\'%s\'", this->userName, this->userPassword);
int ress = mysql_query(&m_sqlCon, (char*)(LPCSTR)query);
if (ress == 0) //检测查询成功
{
res = mysql_store_result(&m_sqlCon);
if (mysql_num_rows(res) == 0) //查询结果为空
{
AfxMessageBox("用户不存在");
}
else
{
row = mysql_fetch_row(res);
if (strIdentify==row[2])
{
mysql_free_result(res);
CDialog::OnOK();
MAINLOG mianlog;
mianlog.DoModal();//让对话框对象以有模式形式显示出来
UpdateData(false);
mysql_close(&m_sqlCon);//关闭Mysql连接
}
else
{
AfxMessageBox("密码错误!");
}
}
}
在登录之后同时将登录的用户身份信息记录,以便后续使用,程序主要为:
UpdateData(true);
int nIndex = identify.GetCurSel();
strIdentify = str[nIndex];
其中
static CString str[3] = { "管理员","教师","学生"};
static CString strIdentify;
5.学生基础信息界面
登录到系统界面后,显示学生基础信息,学生角色只可查询,教师和管理员则可以进行增加和删除学生基础信息。用户可自己选择每页显示的数据数。也可以通过学号查询该学生信息。显示界面如图。
用户可以按“学号”进行查询,也可以进行添加、删除、选择每页显示的个数等操作;
操作数据库实现分页查询的主要程序为:
mysql_query(&m_sqlCon, "SET NAMES GB2312");
sql.Format("SELECT studentId,studentNumber,name,sex,age,class,phone,qq,college FROM t_student LIMIT %d,%d", intStart, pageSize);
int ress = mysql_query(&m_sqlCon, (char*)(LPCSTR)sql);
if (ress == 0) {//检测成功
res = mysql_store_result(&m_sqlCon);
mysql_close(&m_sqlCon);//关闭Mysql连接
学生是没有添加和删除的权限,会提示警告:
当切换用户到教师或者管理员的角色时,就能够实现学生信息的添加和删除操作,如图所示:
实现添加学生基础信息的程序主要为:
mysql_init(&m_sqlCon);
if (!mysql_real_connect(&m_sqlCon,"localhost","root","4321","managersystem",3306,NULL,0))
{
AfxMessageBox(_T("数据库连接失败!"));
return;
}else
{
UpdateData(true);
char* studentNumber1 = (char*)studentNumber.GetBuffer();
char* studentName1 = (char*)studentName.GetBuffer();
char* studentSex1 = (char*)studentSex.GetBuffer();
char* studentAge1 = (char*)studentAge.GetBuffer();
char* studClass1 = (char*)studClass.GetBuffer();
char* telephone1 = (char*)telephone.GetBuffer();
char* stuQQ1 = (char*)stuQQ.GetBuffer();
char* college1 = (char*)college.GetBuffer();
mysql_query(&m_sqlCon,"SET NAMES GB2312");
//char insert[1000];
sql.Format("INSERT INTO t_student(studentNumber,name,sex,age,class,phone,qq,college)VALUES(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\')",studentNumber1,studentName1,
studentSex1,studentAge1,studClass1,telephone1,stuQQ1,college1);
int ress = mysql_query(&m_sqlCon, (char*)(LPCSTR)sql);
if (ress == 0)
{
AfxMessageBox(_T("插入数据成功!"));
CDialog::OnOK();
INFORADD inforAdd;
inforAdd.DoModal();
OnInitDialog();
UpdateData(false);
mysql_close(&m_sqlCon);//关闭Mysql连接
}
else {
AfxMessageBox(_T("插入数据失败!"));
}
}
同样地,点击“按钮”输入学号,就可以实现删除的操作,如图为实现删除操作:
6.学生成绩显示界面
当角色为“教师”或者“管理员”时,在学生基础信息界面就能够显示“学生成绩表”的按钮。点击“学生成绩表”,就可以跳转到学生成绩的界面。
学生成绩界面同样有删除、添加的操作,有可以实现按添加查询,可以按照时间查询和按照学号查询。
按照年份实现查询的主要程序为:
mysql_query(&m_sqlCon2, "SET NAMES GB2312");
sql2.Format("SELECT id,studentId,objectOriented,english,matrixAnalysis,term,SUM(objectOriented+english+matrixAnalysis) AS markSum,AVG((objectOriented+english+matrixAnalysis)/3) AS average FROM t_mark WHERE YEAR(term)=\'%s\' GROUP by id", this->term);
int ress = mysql_query(&m_sqlCon2, (char*)(LPCSTR)sql2);
if (ress == 0) {//检测成功
res2 = mysql_store_result(&m_sqlCon2);
mysql_close(&m_sqlCon2);//关闭Mysql连接
while ((row2 = mysql_fetch_row(res2)))
{
//mysql_display(&mysql,sqlrow);
stuMark1.setId(row2[0]);
stuMark1.setsId(row2[1]);
stuMark1.setsObjectOriented(row2[2]);
stuMark1.setsEnglish(row2[3]);
stuMark1.setsMatrixAnalysis(row2[4]);
stuMark1.setTerm(row2[5]);
stuMark1.setSumMark(row2[6]);
stuMark1.setAverage(row2[7]);
stuMarkInfor.push_back(stuMark1);
}
在这里并没有写的很详细,写细的话东西还是挺多的,就不一一赘述了。
总结一下,这个简单的mfc程序,原理很简单,涉及到了C++语言基础、mfc相关操作知识和MYSQL数据库的知识,在最后附上源码。
源码:mfc工程文件含数据库文件
提取码:k35x