菜鸡学习日记,欢迎指点!
实现效果
-
用户分级登录后的页面还未设计,暂用空白页代替,已实现用户对应信息在信息库的比对以及记住密码功能。
-
登录逻辑就是将用户输入的信息拿去与数据库的初始数据做对比,如果账号名密码ID都一样,则登录成功。记住密码部分逻辑分写ini文件和读ini文件,每次在构造函数里面读取ini文件,若上次选择记住密码,则将信息显示至信息框中,反之,不显示;每次登录成功后,将信息写入ini文件中。
主要代码
1、connect.h 主要用于创建数据库、以及创建用户信息表
//判断表是否存在
bool isTableExists(const QString &table)
{
QSqlQuery query;
QString sql = QString("select * from sqlite_master where name = '%1';").arg(table); // 查询sqlite_master表中是否存在表名
if(query.exec(sql))//如果存在返回第一个结果
{
return query.next();
}
return false;
}
static bool createConnection()//static:所有类共享的函数
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//创建连接数据库实例
db.setDatabaseName("userdatebase.db");
if (!db.open())//没能成功建立用户数据库
{
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection."), QMessageBox::Cancel);
return false;
}
if(!isTableExists("UserManagement"))//如果已经存在相同名字的表
{
QSqlQuery query;//操作数据库的实例
//创建一个表User,包含索引,用户名,密码,用户类型
query.exec("create table UserManagement (id int primary key,name varchar(20),password varchar(20),type varchar(20))");
query.exec("insert into UserManagement values(0, 'root','123456','Root')");
query.exec("insert into UserManagement values(1, 'admin','chen','Administrator')");
query.exec("insert into UserManagement values(2, 'cym','0108','User')");
//插入新用户也可以用以下代码
// query.prepare("insert into User(userName, password, type)"
// "values (:userName, :password, :type)");
// query.bindValue(":userName", userName);
// query.bindValue(":password", password);
// query.bindValue(":type", int(userType));
// query.exec();
return true;
}
return false;
}
2、login.cpp 主要实现登录按钮,用户信息比对以及记住密码功能
#define CONFIGPATH (QCoreApplication::applicationDirPath() + "config.ini") //设置一个用于存储的ini文件
login::login(QWidget *parent) :
QDialog(parent),
ui(new Ui::login)
{
ui->setupUi(this);
loginInit();//登录界面初始化
}
login::~login()
{
delete ui;
}
void login::loginInit()
{
QSettings setting(CONFIGPATH, QSettings::IniFormat); // 打开存放登录信息的ini文件
setting.setIniCodec(QTextCodec::codecForName("UTF-8")); // 设置编码格式,如果这里有中文,读和写的时候都要保持一致
QString isremember = setting.value("login/isremember").toString(); // 是否选择了记住密码
QString name = setting.value("login/username").toString(); // 账号
QString password = setting.value("login/password").toString(); // 密码
ui->lineEdit_user->setText(name); // 显示上一次登录的账号名
if (isremember == "true") // 记住密码
{
ui->lineEdit_pwd->setText(password); // 密码写在密码输入框
ui->checkBox_rempwd->setChecked(true); // 记住密码那里打√
ispassword = true; // 记住密码
}
else
{
ui->checkBox_rempwd->setChecked(false); // 记住密码那里不打√
ispassword = false; // 不记住密码
}
}
//登录按钮
void login::on_pushButton_login_clicked()
{
createConnection();
mymodel_login = new QSqlTableModel(this);
mymodel_login->setTable("UserManagement");//设置表的名称
mymodel_login->setEditStrategy(QSqlTableModel::OnManualSubmit);// 设置编辑策略
//获取用户名,密码,类型
QString user_name = ui->lineEdit_user->text().trimmed();//trimmed去除开头结尾的空白字符串
QString user_pwd = ui->lineEdit_pwd->text().trimmed();
QString user_type = ui->comboBox_ID->currentText().trimmed();
if(user_name.isEmpty())
{
QMessageBox::about(this, "注意!", "用户名不能为空");
return;
}
if(user_pwd.isEmpty())
{
QMessageBox::about(this, "注意!", "用户密码不能为空");
return;
}
QSqlQuery query;
//方法1
mymodel_login->setFilter(QString("name = '%1'").arg(user_name));//可选择使用
QString str="select count(id) from UserManagement where name='"+user_name+"' and password='"+user_pwd+"'and type='"+user_type+"'";
query.exec(str);//执行选择语句
query.next();//指针指向结果
int count = query.value(0).toInt();//将指针所指的第一个字段取出,如果有就说明成功比对
if(count == 1)
{
qDebug() <<user_type <<":"<< user_name << "logining...";
QSettings writeini(CONFIGPATH, QSettings::IniFormat); // 打开ini文件
writeini.setIniCodec(QTextCodec::codecForName("UTF-8")); // 设置编码格式
if (ispassword) // 选择保存密码
{
writeini.setValue("login/isremember", "true"); // 写ini文件时记录为true
}
else // 不保存密码
{
writeini.setValue("login/isremember", "false"); // 写ini文件时记录为false
}
writeini.setValue("login/username", user_name); // 把账号写入ini文件
writeini.setValue("login/password", user_pwd); // 把密码写入ini文件
accept();
}
//方法2
// QString sql = QString("select * from UserManagement where name = '%1';").arg(user_name); // 查询用户
// if(query.exec(sql))
// {
// if(query.next()) // true则用户存在
// {
// qDebug()<< query.value("name").toString();
// if(user_pwd == query.value("password").toString()) // 密码相等
// if(user_type==query.value("type").toString()) //身份相等
// {
// accept();//进入
// }
// }
// }
else
{
QMessageBox::information(this,"提示","用户名或密码错误");
}
}
//记住密码
void login::on_checkBox_rempwd_clicked()
{
// 根据是否记住密码改变标志位
ispassword = ui->checkBox_rempwd->isChecked();
}
小结
-
sql中三个频繁使用的类,QsqlQuery(执行sql语句相关)、QsqlDatabase(连接数据库相关)、QSqlTableModel(用来显示数据库中数据表的数据,实现对数据的编辑、插入、删除等操作),需要简单了解如何使用。
贴几个佬关于这方面的介绍:
1)QsqlQuery
https://blog.csdn.net/u012175418/article/details/76774551
https://blog.csdn.net/xr469786706/article/details/78035514
2)QSqlTableModel
https://blog.csdn.net/wzz953200463/article/details/114552235 -
简单的sql语法需要掌握,select、insert、delete等
-
QCoreApplication::applicationDirPath()的路径问题,使用后发现ini文件存在项目生成的build里面,数据库文件也在里面。
待优化部分
- 登录页面背景图
- 用户实现中文输入
- 自动登录选项
- 注册页面
代码下载
链接:https://pan.quark.cn/s/d7d44a377ba3
提取码:MUbf