金樽清酒斗十千,玉盘珍羞直万钱。
停杯投箸不能食,拔剑四顾心茫然。
欲渡黄河冰塞川,将登太行雪满山。
闲来垂钓碧溪上,忽复乘舟梦日边。
行路难!行路难!多歧路,今安在?
长风破浪会有时,直挂云帆济沧海。
—唐.李白
通过在需求阶段对系统的总体功能的分析,我们得到了这个学生信息管理系统的总体功能结构,其主要功能如上面的功能结构图所示。它应包括四大基本功能模块。
(1)信息增加模块:通过增加用户信息、管理员信息、班级信息,使得整个学生信息管理系统能够获得数据的输入,为整个学生信息管理系统的操作提供了必要的条件。
(2)信息删除模块:通过删除用户信息、管理员信息、班级信息,使得学生信息管理系统中的无用数据能够及时清除,从而更好的管理有效数据。
(3)信息修改模块:通过修改用户信息、管理员信息、班级信息,使得学生信息管理系统中的信息能够得到及时的更新,保证了系统信息的实时性。
(4)信息查看模块:对于管理员来说,信息能被查看,才能去执行其他的操作。对于学生来说,查看自己的数据和修改密码是仅有的操作。
这个学生信息管理系统主要实现用qt布局和设计,增删改查数据库,所以主要的代码其实是数据库的代码。Qt连接Sqiite数据库虽然不像mysql那样需要安装驱动,但是要在如下图所示的文件中加上sql。
(1)首先是创建数据库和三个表的代码,我写在main函数里。创建表的同时插入了一些数据,作为示范,其中,管理员的账号和密码插入是初始化管理员登录,不然没有管理员也没有学生,就登不了系统。
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QSqlDatabase db= QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("StudentInformationManagementSystem.db");
if ( !db.open()){
qDebug()<<"没有打开!";
}
QSqlQuery query;//QSqlQuery类提供执行和操作的SQL语句的方法
//创建数据库admin表
query.exec("CREATE TABLE admin ("
"admin_account VARCHAR(40) PRIMARY KEY NOT NULL,"
"admin_password VARCHAR(40) NOT NULL)");
//创建数据库student表
query.exec("CREATE TABLE student ("
"id VARCHAR(50) PRIMARY KEY NOT NULL, "
"name VARCHAR(30) NOT NULL, "
"sex VARCHAR(10) NOT NULL, "
"age INTEGER NOT NULL,"
"address VARCHAR(50) NOT NULL,"
"phone_number VARCHAR(30) NOT NULL,"
"password VARCHAR(30) NOT NULL,"
"dormitory VARCHAR(30) NOT NULL,"
"className VARCHAR(30) NOT NULL)");
query.exec("CREATE TABLE class ("
"name VARCHAR(40) PRIMARY KEY NOT NULL, "
"department VARCHAR(50) NOT NULL, "
"instructor VARCHAR(40) NOT NULL, "
"instructor_number VARCHAR(40) NOT NULL,"
"people_number INTEGER NOT NULL)");
Login w;
w.show();
return a.exec();
}
(2)其次是登录管理员和学生的账号密码验证。根据选择的radioButton是管理员或者学生,分别去查阅数据库,管理员一一对照数据库中的账号密码(学生用户一一对照学号和密码)与输入框的账号密码对比。找到数据与之比较,正确则登录成功,失败则弹出账号或密码错误框。代码如下。
//点击登录
void Login::on_loginBtn_clicked()
{
QString username = ui->zhanghao->text();
QString password = ui->password->text();
QSqlDatabase db;
db = QSqlDatabase::addDatabase("QSQLITE");//指定SQLite
db.setDatabaseName("StudentInformationManagementSystem.db");//数据库
if (!db.open())
qDebug() << "连接失败";
//如果管理员被选择
if( ui->adminRadio->isChecked()){
QSqlQuery query(db);
db.exec("SET NAMES 'GBK'");//防止乱码
query.exec("select admin_account,admin_password from admin");
bool T1=false;
while(query.next())
{
QString user = query.value(0).toString();
QString pass = query.value(1).toString();
if(username.compare(user)==0&&password.compare(pass)==0){
T1=true;
login_zhanghao=user;//将登录者的账号记录,就知道谁登录了。
this->hide();
admin=new adminFace;
admin->show();
}
}
if(T1==false)
QMessageBox::information(this, "警告", "用户名或密码错误");
}
if( ui->studentRadio->isChecked()){
QSqlQuery query(db);
db.exec("SET NAMES 'GBK'");//防止乱码
query.exec("select id,password from student");
bool zhanghaoAndPassword=false;
while(query.next())
{
QString user = query.value(0).toString();
QString pass = query.value(1).toString();
if(username.compare(user)==0&&password.compare(pass)==0){
zhanghaoAndPassword=true;
login_zhanghao=user;//记录学生的账号
login_password=pass;//这里要记录学生的密码用于修改
//this->hide();
this->close();
student=new studentFace;
student->setModal(true);
student->show();
break;
}
}
if(zhanghaoAndPassword==false)
QMessageBox::information(this, "警告", "用户名或密码错误");
}
}
(3)然后,我们会发现,上面的代码所示,登录窗口会被隐藏,创建了管理员界面,这就算是登录成功了。对于学生用户,登录成功后就会看见自己的信息,可以更改密码,这就算是全部操作了。对于管理员来说,登录后就能操作各种数据了。而三个表的操作都是增删改查,所以用管理员管理学生信息表作为例子。点击学生信息表之后,首先要让存在的学生信息显示出来,在tableview中以表格形式展现。代码写在构造方法里,如下:
QSqlQuery query;
QSqlQueryModel *model = new QSqlQueryModel(this);
model->setQuery("select id,password,name,sex,age,address,phone_number,dormitory,className from student");
//以下为展示的各列的名称
model->setHeaderData(0,Qt::Horizontal,tr("学号"));
model->setHeaderData(1,Qt::Horizontal,tr("密码"));
model->setHeaderData(2,Qt::Horizontal,tr("姓名"));
model->setHeaderData(3,Qt::Horizontal,tr("性别"));
model->setHeaderData(4,Qt::Horizontal,tr("年龄"));
model->setHeaderData(5,Qt::Horizontal,tr("籍贯"));
model->setHeaderData(6,Qt::Horizontal,tr("联系电话"));
model->setHeaderData(7,Qt::Horizontal,tr("寝室"));
model->setHeaderData(8,Qt::Horizontal,tr("班级名称"));
ui->tableView->setModel(model);
(4)最后一点核心代码是对数据库增删改查操作,同样以学生信息表为例。
1.增加学生信息
//确定提交数据
void admin_student_add::on_pushButton_clicked()
{
QString addId=ui->idEdit->text();
QString addPassword=ui->passwordEdit->text();
QString addName=ui->nameEdit->text();
QString addSex=ui->sexEdit->text();
int addage=ui->ageEdit->text().toInt();
QString address=ui->addressEdit->text();
QString addPhone_number=ui->phone_numberEdit->text();
QString addDormitory=ui->dormitoryEdit->text();
QString addClassName=ui->classNameEdit->text();
if(addId.isEmpty()||addName.isEmpty()||addPassword.isEmpty()||addSex.isEmpty()||addage<=0||address.isEmpty()||addPhone_number.isEmpty()||addDormitory.isEmpty()||addClassName.isEmpty()){
QMessageBox::information(this, "警告", "未完全填写或填写错误");
}else{
QSqlQuery query;
//判断输入学号是否存在于数据库中
query.exec("select id from student");
bool isExist=false;//是否存在
while(query.next())
{
QString id=query.value(0).toString();
if(id.compare(addId)==0){
QMessageBox::information(this, "警告", "该账号已存在!");
isExist=false;
//this->close();
break;
}
isExist=true;
}
//一开始没有任何数据的情况下,query.next()不会执行,所以会出现无响应情况,增加!query.next(),让第一个增加的数据能增加成功
if(!query.next()){
isExist=true;
}
if(isExist){
QString sql=QString("insert into student(id,password,name,sex,age,address,phone_number,dormitory,className)values('%1','%2','%3','%4','%5','%6','%7','%8','%9')").arg(addId).arg(addPassword).arg(addName).arg(addSex).arg(addage).arg(address).arg(addPhone_number).arg(addDormitory).arg(addClassName);
query.exec(sql);
QMessageBox::information(this, "温馨提示", "恭喜,学号:"+addId+"添加成功");
qDebug()<<addId+"添加成功";
this->close();
admin_student_show *newAdminStudentShow=new admin_student_show;
newAdminStudentShow->show();
}
}
}
2.删除学生信息
//删除学生信息
void admin_student_show::on_pushButton_3_clicked()
{
QString wantDeleteStuentId=ui->wantDeleteEdit->text();
if(wantDeleteStuentId==""){QMessageBox::information(this, "警告", "您未输入想要删除的学生学号");return;};
//判断输入想要删除的班级是否存在于数据库中
QSqlQuery query;
query.exec("select id from student");
bool isExist=false;//是否存在
while(query.next())
{
QString tempStudentId=query.value(0).toString();
if(tempStudentId.compare(wantDeleteStuentId)==0){
QString sql=QString("delete from student where id='%1'").arg(wantDeleteStuentId);
query.exec(sql);
QMessageBox::information(this, "温馨提示", "恭喜,学号:"+wantDeleteStuentId+"删除成功");
qDebug()<<wantDeleteStuentId+"删除成功";
isExist=false;
//自动刷新表格
this->close();
admin_student_show *newAdminStudentShow=new admin_student_show;
newAdminStudentShow->show();
break;
}
isExist=true;
}
if(isExist){
QMessageBox::information(this, "警告", "抱歉,不存在学号:"+wantDeleteStuentId);
qDebug()<<wantDeleteStuentId+"删除失败";
//this->close();
ui->wantDeleteEdit->setText("");
}
}
3.修改学生信息,需要先查找到该学生信息再修改
//更新修改数据
void admin_student_updata::on_pushButton_clicked()
{
if(ifNotFindIdDo){ QMessageBox::information(this, "警告", "请先输入学号");return;}
QString updateId=ui->updateIdEdit->text();
QString updatePassword=ui->passwordEdit->text();
QString updateName=ui->nameEdit->text();
QString updateSex=ui->sexEdit->text();
int updateage=ui->ageEdit->text().toInt();
QString updatedress=ui->addressEdit->text();
QString updatePhone_number=ui->phone_numberEdit->text();
QString updateDormitory=ui->dormitoryEdit->text();
QString updateClassName=ui->classNameEdit->text();
if(updateId.isEmpty()||updateName.isEmpty()||updatePassword.isEmpty()||updateSex.isEmpty()||updateage<=0||updatedress.isEmpty()||updatePhone_number.isEmpty()||updateDormitory.isEmpty()||updateClassName.isEmpty()){
QMessageBox::information(this, "警告", "未完全填写或填写错误");
}else{
QSqlQuery query;
QString wantUpdateStudentId=ui->idEdit->text();
QString sql=QString("update student set id='%1',password='%2',name='%3',sex='%4',age='%5',address='%6',phone_number='%7',dormitory='%8',className='%9' where id='%10'").arg(updateId).arg( updatePassword).arg( updateName).arg( updateSex).arg( updateage).arg( updatedress).arg( updatePhone_number).arg( updateDormitory).arg( updateClassName).arg(wantUpdateStudentId);
query.exec(sql);
QMessageBox::information(this, "温馨提示", "恭喜!信息修改成功!");
qDebug()<<"修改成功";
this->close();
admin_student_show *newAdminStudentShow=new admin_student_show;
newAdminStudentShow->show();
}
}
//想要更改的学生学号
void admin_student_updata::on_pushButton_3_clicked()
{
QString wantUpdateStudentId=ui->idEdit->text();
QSqlQuery query;
//判断输入学号是否存在于数据库中
QString sql=QString("select id from student where id='%1'").arg(wantUpdateStudentId);
query.exec(sql);
bool isExist=false;//是否存在
while(query.next())
{
QString id=query.value(0).toString();
if(id.compare(wantUpdateStudentId)==0){
ifNotFindIdDo=false;
isExist=true;
//this->close();
break;
}
isExist=false;
}
if(isExist){
QSqlQuery query;
QString sql=QString("select id,password,name,sex,age,address,phone_number,dormitory,className from student where id='%1'").arg(wantUpdateStudentId);
query.exec(sql);
while (query.next()) {
QString Update_id=query.value(0).toString();
QString Update_password=query.value(1).toString();
QString Update_name=query.value(2).toString();
QString Update_sex=query.value(3).toString();
QString Update_age=query.value(4).toString();
QString Update_address=query.value(5).toString();
QString Update_phone_number=query.value(6).toString();
QString Update_dormitory=query.value(7).toString();
QString Update_className=query.value(8).toString();
ui->updateIdEdit->setText(Update_id);
ui->passwordEdit->setText(Update_password);
ui->nameEdit->setText(Update_name);
ui->sexEdit->setText(Update_sex);
ui->ageEdit->setText(Update_age);
ui->addressEdit->setText(Update_address);
ui->phone_numberEdit->setText(Update_phone_number);
ui->dormitoryEdit->setText(Update_dormitory);
ui->classNameEdit->setText(Update_className);
}
}
}
4.查看学生信息就不需要了,因为学生信息界面的tableview就能观看学生信息。
5.最后是查找信息,可以根据学号或姓名去查找学生信息,不存在则会提示,存在则显示。具体实现代码如下:
void admin_find_show::on_findBtn_clicked()
{
QString findId= ui->id_find->text();
QString findName=ui->name_find->text();
//多表查询知识点 select table1.abc from table1 inner join table2 on table1.xxx=table2.xxx;
QSqlQuery query1;//执行第一个sql语句
QSqlQuery query2;//执行第二个sql语句
if(!findId.isEmpty()){
QString sqlById1=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory,class.name,class.department,class.instructor,class.instructor_number,class.people_number from student inner join class on student.className=class.name and student.id='%1'").arg(findId);
query1.exec(sqlById1);
bool Notfond=true;
bool InfoNotAll=true;
while (query1.next()) {
QString id=query1.value(0).toString();
QString name=query1.value(1).toString();
QString sex=query1.value(2).toString();
QString age=query1.value(3).toString();
QString address=query1.value(4).toString();
QString phoneNumber=query1.value(5).toString();
QString dormitory=query1.value(6).toString();
QString className=query1.value(7).toString();
QString department=query1.value(8).toString();
QString instructor=query1.value(9).toString();
QString instructorPhone=query1.value(10).toString();
//下面为查到的信息
ui->IdLineEdit->setText(id);
ui->NameLineEdit->setText(name);
ui->SexLineEdit->setText(sex);
ui->AgeLineEdit->setText(age);
ui->AddressLineEdit->setText(address);
ui->PhoneNumberLineEdit->setText(phoneNumber);
ui->DormitoryLineEdit->setText(dormitory);
ui->classLineEdit->setText(className);
ui->DepartmentLineEdit->setText(department);
ui->InstructorLineEdit->setText(instructor);
ui->InstructorPhoneNumberLineEdit->setText(instructorPhone);
Notfond=false;
InfoNotAll=false;
}
if(InfoNotAll){
QString sqlById2=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory from student where student.id='%1'").arg(findId);
query2.exec(sqlById2);
while (query2.next()) {
QString id=query2.value(0).toString();
QString name=query2.value(1).toString();
QString sex=query2.value(2).toString();
QString age=query2.value(3).toString();
QString address=query2.value(4).toString();
QString phoneNumber=query2.value(5).toString();
QString dormitory=query2.value(6).toString();
//下面为查到的信息
ui->IdLineEdit->setText(id);
ui->NameLineEdit->setText(name);
ui->SexLineEdit->setText(sex);
ui->AgeLineEdit->setText(age);
ui->AddressLineEdit->setText(address);
ui->PhoneNumberLineEdit->setText(phoneNumber);
ui->DormitoryLineEdit->setText(dormitory);
ui->classLineEdit->setText("null");
ui->DepartmentLineEdit->setText("null");
ui->InstructorLineEdit->setText("null");
ui->InstructorPhoneNumberLineEdit->setText("null");
Notfond=false;
}
}
if(Notfond){
QMessageBox::information(this, "警告", "未找到相关信息");
this->close();
admin_find_show *adminFindShow=new admin_find_show;
adminFindShow->show();
}
}
else{
QString sqlByName1=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory,class.name,class.department,class.instructor,class.instructor_number,class.people_number from student inner join class on student.className=class.name and student.name='%1'").arg(findName);
query1.exec(sqlByName1);
bool Notfond=true;
bool InfoNotAll=true;
while (query1.next()) {
QString id=query1.value(0).toString();
QString name=query1.value(1).toString();
QString sex=query1.value(2).toString();
QString age=query1.value(3).toString();
QString address=query1.value(4).toString();
QString phoneNumber=query1.value(5).toString();
QString dormitory=query1.value(6).toString();
QString className=query1.value(7).toString();
QString department=query1.value(8).toString();
QString instructor=query1.value(9).toString();
QString instructorPhone=query1.value(10).toString();
//下面为查到的信息
ui->IdLineEdit->setText(id);
ui->NameLineEdit->setText(name);
ui->SexLineEdit->setText(sex);
ui->AgeLineEdit->setText(age);
ui->AddressLineEdit->setText(address);
ui->PhoneNumberLineEdit->setText(phoneNumber);
ui->DormitoryLineEdit->setText(dormitory);
ui->classLineEdit->setText(className);
ui->DepartmentLineEdit->setText(department);
ui->InstructorLineEdit->setText(instructor);
ui->InstructorPhoneNumberLineEdit->setText(instructorPhone);
Notfond=false;
InfoNotAll=false;
}
if(InfoNotAll){
QString sqlByName2=QString("select student.id,student.name,student.sex,student.age,student.address,student.phone_number,student.dormitory from student where student.name='%1'").arg(findName);
query2.exec(sqlByName2);
while (query2.next()) {
QString id=query2.value(0).toString();
QString name=query2.value(1).toString();
QString sex=query2.value(2).toString();
QString age=query2.value(3).toString();
QString address=query2.value(4).toString();
QString phoneNumber=query2.value(5).toString();
QString dormitory=query2.value(6).toString();
//下面为查到的信息
ui->IdLineEdit->setText(id);
ui->NameLineEdit->setText(name);
ui->SexLineEdit->setText(sex);
ui->AgeLineEdit->setText(age);
ui->AddressLineEdit->setText(address);
ui->PhoneNumberLineEdit->setText(phoneNumber);
ui->DormitoryLineEdit->setText(dormitory);
ui->classLineEdit->setText("null");
ui->DepartmentLineEdit->setText("null");
ui->InstructorLineEdit->setText("null");
ui->InstructorPhoneNumberLineEdit->setText("null");
Notfond=false;
}
}
if(Notfond){
QMessageBox::information(this, "警告", "未找到相关信息");
this->close();
admin_find_show *adminFindShow=new admin_find_show;
adminFindShow->show();
}
}
}
6.此外,受之前科学计算器的启发,增加了复制tableview信息的功能,比如要删除某学号,点一下相对应的学号,就会弹出已复制的提示,到删除学号框或查找框就能进行粘贴。这是提高用户体验感的一种做法。具体实现代码如下:
//选中tableview,获取选中的内容
void admin_student_show::on_tableView_clicked(const QModelIndex &index)
{
QString tableViewValue=index.data().toString();
QClipboard *board=QApplication::clipboard();
board->setText(tableViewValue);
QMessageBox::information(this, "温馨提示", "信息"+tableViewValue+"已复制到粘贴板");
}
整个学生信息管理系统来说,原理比较简单,也比较好实现,但是由于Qt连接sqlite数据库没有学过,所以我查阅了很多教程,花了比较多时间整理思路。整个程序给我的感觉就是满足实用性。
打包后可执行文件,需要的同学可以点击下载