QT肝8天18--用户角色管理
1、用户角色管理的核心概念
用户角色管理是权限控制的重要组成部分,通过定义不同角色的权限级别,实现系统资源的精细化控制。典型应用场景包括企业管理系统、SaaS平台和多租户应用
角色定义与权限分配
明确系统中需要哪些角色,例如管理员、编辑、访客等。每个角色应关联具体的操作权限,如数据读取、修改或删除权限。权限分配通常采用RBAC(基于角色的访问控制)模型,通过角色-权限映射实现。
数据库设计实现
用户角色关系通常通过三张表实现:
- 用户表(users):存储用户基本信息
- 角色表(roles):定义系统角色
- 用户角色关联表(user_roles):建立多对多关系或1对1关系
2、前端界面设计
用户角色管理涉及到的界面有新增用户和编辑用户这两个地方,所以界面上UI设计需要调整
1、新添用户
2、编辑用户
3、后端开发
1、新增用户
新增用户时,界面上要将系统所有角色查询获取并绑定到下拉框
#include "sqlite3db.h"
#include <QDebug>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QList>Sqlite3Db::Sqlite3Db() {}OperatorInfo* globalUserInfo = nullptr; // 初始化全局指针为nullptr// Qt访问Sqlite的步骤:
// 1. 引入一个模块 QT += core gui sql
// 2. 引入头文件
// 3. 使用QSqlDatabase 来进行操作// 根据用户名和密码来判断,用户是否存在数据库中
bool Sqlite3Db::isContain(QString userName, QString passWord, OperatorInfo &infos) {QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db"); // 设置数据库名称db.open();//打开连接// bool isOpen = db.open();//打开连接//输出错误信息// qDebug() << isOpen ;// qDebug() << db.isValid(); // true// qDebug() << db.isOpen(); // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句? :占位符---避免sql注入QString sqlCmd = QString("SELECT * from operatorInfo where username=? and password=?");// 3.准备参数化占位符的数据query.prepare(sqlCmd);query.bindValue(0, userName);query.bindValue(1, passWord);//4.开始执行语句bool success = query.exec();if (success == false) {db.close(); // 网络资源,需要回收return false;}if (query.next() == false) {db.close(); // 网络资源,需要回收return false;}// 如果继续往后执行,就是已经买查询到对象了,返回这个对象的每个属性值OperatorInfo i;i.id = query.value(0).toInt();i.icon = query.value(1).toByteArray();i.username = query.value(2).toString();i.password = query.value(3).toString();i.addr = query.value(4).toString();i.gender = query.value(5).toInt();i.name = query.value(6).toString();i.phoneNo = query.value(7).toString();infos = i;db.close();return true;
}// //查询列表
// bool Sqlite3Db::selectOperators(OperatorInfoList &operatorinfs)
// {
// QSqlDatabase db;
// db.setHostName("localhost");//设置主机名
// db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型
// db.setDatabaseName("warehouse.db"); // 设置数据库名称
// bool isOpen = db.open();//打开连接
// //输出错误信息
// qDebug() << isOpen ;
// qDebug() << db.isValid(); // true
// qDebug() << db.isOpen(); // true// // 1.准备查询QSqlQuery 对象
// QSqlQuery query(db);
// // 2. 准备Sql语句? :占位符---避免sql注入
// QString sqlCmd = QString("SELECT * from operatorInfo ");
// // 3.准备 数据
// //query.prepare(sqlCmd);// //4.开始执行语句
// bool success = query.exec(sqlCmd);
// if (success == false) {
// db.close(); // 网络资源,需要回收
// OperatorInfoList list;
// operatorinfs=list;
// return false;
// }// // 循环属性值
// while(query.next()){
// OperatorInfo i;
// i.id = query.value(0).toInt();
// i.icon = query.value(1).toByteArray();
// i.username = query.value(2).toString();
// i.password = query.value(3).toString();
// i.addr = query.value(4).toString();
// i.gender = query.value(5).toInt();
// i.name = query.value(6).toString();
// i.phoneNo = query.value(7).toString();
// operatorinfs.push_back(i);
// }
// db.close(); // 网络资源,需要回收
// return true;
// }//查询列表,支持分页
bool Sqlite3Db::selectOperators(QString searchString,int pageIndex,int pageSize,int &pageCount, OperatorInfoList &operatorinfs)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db"); // 设置数据库名称bool isOpen = db.open();//打开连接//输出错误信息qDebug() << isOpen ;//qDebug() << db.isValid(); // true//qDebug() << db.isOpen(); // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句? :占位符---避免sql注入QString strWhere=QString(" and 1=1");if(searchString.isNull()==false && searchString.isEmpty()==false){strWhere=QString(" and (name like '%%1%' or username like '%%2%')").arg(searchString).arg(searchString);}//查询分页数据QString datasql = QString("SELECT * from operatorInfo where 1=1 %1 limit %2 offset %3 ").arg(strWhere).arg(pageSize).arg((pageIndex - 1) * pageSize);//查询总页数QString pageCoutSql = QString("select count(id) from operatorInfo where 1=1 %1 ").arg(strWhere);//4.开始执行语句bool success = query.exec(datasql);if (success == false) {db.close(); // 网络资源,需要回收OperatorInfoList list;operatorinfs=list;return false;}// 循环属性值while(query.next()){OperatorInfo i;i.id = query.value(0).toInt();i.icon = query.value(1).toByteArray();i.username = query.value(2).toString();i.password = query.value(3).toString();i.addr = query.value(4).toString();i.gender = query.value(5).toInt();i.name = query.value(6).toString();i.phoneNo = query.value(7).toString();operatorinfs.push_back(i);//将数据添加到列表中}// 开始查询总条数,计算总页数bool success2 = query.exec(pageCoutSql);if (success2) {if (query.next()) {int dataCount = query.value(0).toInt();pageCount = dataCount / pageSize;if (dataCount % pageSize > 0) {pageCount = pageCount + 1;}}}db.close(); // 网络资源,需要回收return true;
}//添加数据
bool Sqlite3Db::insertOperator(const OperatorInfo &opt,const QString &rolename)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db"); // 设置数据库名称db.open();//打开连接//bool isOpen = db.open();//打开连接//qDebug() << db.isOpen(); // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("insert into operatorInfo(icon,username,password,addr,gender,name,phoneNo) values (?,?,?,?,?,?,?);");query.bindValue(0, opt.icon);query.bindValue(1, opt.username);query.bindValue(2, opt.password);query.bindValue(3, opt.addr);query.bindValue(4, opt.gender);query.bindValue(5, opt.name);query.bindValue(6, opt.phoneNo);//3.开始执行语句bool success = query.exec();if(success){//查询新添用户的idQString datasql = QString("SELECT * from operatorInfo where username='%1' and name='%1' and password='%1'").arg(opt.username).arg(opt.name).arg(opt.password);success = query.exec(datasql);if(success & query.next()){//获取新加用户的idint userid=query.value(0).toInt();//查找角色对应的idint roleid=0;QList<SysRole> rolelist=sysRoleList();for (int i = 0; i < rolelist.size(); ++i) {SysRole role= rolelist.at(i);if(role.getName()==rolename){roleid=role.getId();break;}}UserRole urole;urole.setRoleID(roleid);urole.setUserID(userid);urole.setRemark(rolename);success=insertUserRole(urole);}}db.close(); // 网络资源,需要回收return success;
}//删除数据
bool Sqlite3Db::deleteOperator(qint64 id)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 设置数据库名称db.open();QSqlQuery query(db);query.prepare("delete from operatorInfo where id=?");query.bindValue(0, id);bool success = query.exec();db.close();return success;
}//根据id查询一条数据
bool Sqlite3Db::selectOperatorsById(qint64 id, OperatorInfo &operatorinfo)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("SELECT * from operatorInfo where id=?");query.bindValue(0, id);bool success = query.exec();if (success & query.next()) {operatorinfo.id = query.value(0).toInt();operatorinfo.icon = query.value(1).toByteArray();operatorinfo.username = query.value(2).toString();operatorinfo.password = query.value(3).toString();operatorinfo.addr = query.value(4).toString();operatorinfo.gender = query.value(5).toInt();operatorinfo.name = query.value(6).toString();operatorinfo.phoneNo = query.value(7).toString();db.close(); // 网络资源,需要回收return true;}return false;
}// 更新数据
bool Sqlite3Db::updateOperator(OperatorInfo info,const QString &rolename) {QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接QString sqlCmd = QString("update operatorInfo set icon = ?,username = ?,addr = ?,gender = ?,name = ?,phoneNo = ? where id = ?");QSqlQuery query(db);query.prepare(sqlCmd);query.bindValue(0, info.icon);query.bindValue(1, info.username);query.bindValue(2, info.addr);query.bindValue(3, info.gender);query.bindValue(4, info.name);query.bindValue(5, info.phoneNo);query.bindValue(6, info.id);bool success = query.exec();if (success) {//查找角色对应的idSysRole sysrole;QList<SysRole> rolelist=sysRoleList();for (int i = 0; i < rolelist.size(); ++i) {SysRole role= rolelist.at(i);if(role.getName()==rolename){sysrole=role;break;}}//修改用户角色idsuccess = updateUserRole(info.id,sysrole);}db.close();return success;
}//返回数据库菜单
QList<MenuItemRoot> Sqlite3Db::selectMenuRootItem(qint64 userid)
{QList<MenuItemRoot> menulist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from menuitems where id in (select menuID from menurole where roleID=(select roleID from userrole where userID=?))");query.bindValue(0, userid);bool success = query.exec();if (success) {while(query.next()){MenuItemRoot root;root.id = query.value(0).toInt();root.name = query.value(1).toString();root.value = query.value(2).toString();root.icon = query.value(3).toString();menulist.push_back(root);}}db.close(); // 网络资源,需要回收return menulist;
}//根据父id获取二级菜单
QList<MenuItemInfo> Sqlite3Db::findMenuInfoByPID(qint64 pid)
{QList<MenuItemInfo> itemlist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from menuitems where parentid=?");query.bindValue(0, pid);bool success = query.exec();if (success) {while(query.next()){MenuItemInfo menuitem;menuitem.id = query.value(0).toInt();menuitem.name = query.value(1).toString();menuitem.value = query.value(2).toString();menuitem.icon = query.value(3).toString();menuitem.parentid = query.value(4).toInt();itemlist.push_back(menuitem);}}db.close(); // 网络资源,需要回收return itemlist;
}//角色列表
QList<SysRole> Sqlite3Db::sysRoleList()
{QList<SysRole> rolelist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from SysRoles ");bool success = query.exec();if (success) {while(query.next()){SysRole roleitem;roleitem.setId(query.value(0).toInt());roleitem.setName(query.value(1).toString()) ;roleitem.setIcon(query.value(2).toString()) ;roleitem.setDesc(query.value(3).toString()) ;rolelist.push_back(roleitem);}}db.close(); // 网络资源,需要回收return rolelist;
}//添加用户角色关联记录
bool Sqlite3Db::insertUserRole(UserRole userrole)
{QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("insert into UserRole(userID,roleID,remark) values (?,?,?);");query.bindValue(0, userrole.getUserID());query.bindValue(1, userrole.getRoleID());query.bindValue(2, userrole.getRemark());//3.开始执行语句bool success = query.exec();db.close();return success;
}//根据用户id删除用户角色记录
bool Sqlite3Db::deleteUserRole(int userid)
{QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("delete from UserRole where userID=?");query.bindValue(0,userid);//3.开始执行语句bool success = query.exec();if(success){db.close();return success;}db.close();return success;
}//根据用户id查询用户角色记录
UserRole Sqlite3Db::findRoleIdByUserId(int userid)
{UserRole uRole;QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("select * from UserRole where userID=?");query.bindValue(0,userid);//3.开始执行语句bool success = query.exec();if(success & query.next()){uRole.setId(query.value(0).toInt());uRole.setUserID(query.value(1).toInt());uRole.setRoleID( query.value(2).toInt());uRole.setRemark(query.value(3).toString());db.close(); // 网络资源,需要回收}return uRole;
}//根据用户id修改角色记录
bool Sqlite3Db::updateUserRole(int userid,SysRole role)
{QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("update UserRole set roleID = ?,remark=? where userID = ?");query.bindValue(0,role.getId());query.bindValue(1,role.getName());query.bindValue(2,userid);//3.开始执行语句bool success = query.exec();db.close();return success;
}
#include "addoperator.h"
#include "ui_addoperator.h"
#include <QValidator>
#include <QRegularExpressionValidator>
#include <QRegularExpression>
#include <QMessageBox>
#include <QFileDialog>
#include <QStandardItem>
#include <sqlite3/sqlite3db.h>AddOperator::AddOperator(QWidget *parent): QWidget(parent), ui(new Ui::AddOperator)
{ui->setupUi(this);ui->maleRadioButton->setChecked(true);//默认让男性勾中//创建外围窗口if(m_basewin==nullptr){m_basewin=new BaseWin(parent);}m_basewin->setContentWidget(this);//将当前内容区域窗体嵌套到外围窗口m_basewin->setTitle("新增人员");m_basewin->resize(650, 530);m_basewin->show();//显示//获取指定按钮并绑定事件QPushButton *b1=m_basewin->getButton();if(b1){b1->setText("确认添加");//给按钮绑定点击事件的槽函数QObject::connect(b1,&QPushButton::clicked,this,&AddOperator::OnAdd);}//获取指定按钮并绑定事件QPushButton *b2=m_basewin->getButton2();if(b2){b2->setText("取消关闭");//给按钮绑定点击事件的匿名的槽函数QObject::connect(b2,&QPushButton::clicked,[=]{m_basewin->close();});}// 清空输入框的提示信息========================================ui->usernameLineEdit->setPlaceholderText("请输入用户名");ui->passwordLineEdit->setPlaceholderText("请输入密码");ui->passwordLineEdit->setEchoMode(QLineEdit::Password);ui->confimPasswordLineEdit->setPlaceholderText("再次输入密码");ui->confimPasswordLineEdit->setEchoMode(QLineEdit::Password);ui->nameLineEdit->setPlaceholderText("请输入用户名");ui->phoneNoLineEdit->setPlaceholderText("请输入手机号码");ui->addrLineEdit->setPlaceholderText("请输入地址~~");// 初始化输入框的提示信息========================================ui->usernameLineEdit->setText("");ui->passwordLineEdit->setText("");ui->passwordLineEdit->setText("");ui->confimPasswordLineEdit->setText("");ui->nameLineEdit->setText("");ui->phoneNoLineEdit->setText("");ui->addrLineEdit->setPlainText("");// 通过正则表达式去验证,如果手机号中的文本框,内容发生改变,就校验规则Ui::AddOperator *uiNew = ui;//创建界面设计的UI对象QRegularExpression regExt("^1[3456789]\\d{9}$");// 定义一个验证规则QRegularExpressionValidator *validator = new QRegularExpressionValidator(regExt, ui->phoneNoLineEdit); // 创建一个正则表达式,用于验证数据此处验证手机号//手机号码输入框绑定信号textChanged(文字内容发生改变时)和槽函数(匿名函数来处理)QObject::connect(ui->phoneNoLineEdit, &QLineEdit::textChanged, [uiNew, validator]() {// 控件中的内容发生改变,就触发信号,执行到这里处理int pos = 0;QString inputNo = uiNew->phoneNoLineEdit->text();if (validator->validate(inputNo, pos) != QValidator::Acceptable) {//如何校验不通过uiNew->phoneNoLineEdit->setStyleSheet("QLineEdit { border: 1px solid red; }");//设置手机框的边框样式uiNew->mobilMsg->setText("请输入符合格式的手机号~");//设置提示内容uiNew->mobilMsg->setStyleSheet("QLabel { color: red; }");//设置文字为红色} else {//校验通过时uiNew->mobilMsg->setStyleSheet("");uiNew->mobilMsg->setText("");}});initRoleList();
}AddOperator::~AddOperator()
{delete ui;
}//角色列表,绑定角色下拉框
void AddOperator::initRoleList()
{//连接数据库Sqlite3Db db;OperatorInfo user;QList<SysRole> list=db.sysRoleList();QStandardItemModel *model = new QStandardItemModel(ui->rolecmb);//添加默认项QStandardItem *Item0 = new QStandardItem("请选择角色");Item0->setData(-1, Qt::UserRole);model->appendRow(Item0);//循环数据库所有角色并绑定到下拉框for(SysRole &item:list){//创建标准项QStandardItem *standardItem = new QStandardItem(item.getName());standardItem->setData(item.getId(), Qt::UserRole);model->appendRow(standardItem);//添加到下拉框}ui->rolecmb->setModel(model);ui->rolecmb->setCurrentIndex(0);
}//点击【确认添加】按钮后要触发的函数
void AddOperator::OnAdd()
{//校验证用户名不能为空QString username = ui->usernameLineEdit->text();if (username.isNull() || username.isEmpty()) {ui->namelabel->setText("请输入用户名");ui->namelabel->show();return;}// int currentIndex = ui->rolecmb->currentIndex();QString roleText = ui->rolecmb->currentText();if(roleText=="请选择角色"){ui->rolelabel->setText("请选择具体角色名称");ui->rolelabel->show();return;}//校验证密码不能为空QString password = ui->passwordLineEdit->text();if (password.isNull() || password.isEmpty()) {ui->passlabel->setText("请输入密码");ui->passlabel->show();return;}//校验证密码2不能为空QString password2 = ui->confimPasswordLineEdit->text();if (password.isNull() || password.isEmpty()) {ui->pass2label->setText("请输入密码");ui->pass2label->show();return;}//1、检查两次密码是否一致QString pwd1=ui->passwordLineEdit->text();//密码1QString pwd2=ui->confimPasswordLineEdit->text();//密码2if(pwd1!=pwd2){QMessageBox::information(this,"信息提示","两次密码不一致,请确认.");return;}//校验证姓名不能为空QString name = ui->nameLineEdit->text();if (name.isNull() || name.isEmpty()) {ui->namelabel->setText("请输入姓名");ui->namelabel->show();return;}//校验证姓名不能为空QString phone = ui->phoneNoLineEdit->text();if (phone.isNull() || phone.isEmpty()) {ui->mobilMsg->setText("请输入电话");ui->mobilMsg->show();return;}//校验证姓名不能为空QString addr = ui->addrLineEdit->toPlainText();if (addr.isNull() || addr.isEmpty()) {ui->addrlabel->setText("请输入地址");ui->addrlabel->show();return;}//2、将界面UI输入框的信息赋给对象OperatorInfo opt;opt.username=ui->usernameLineEdit->text();//用户名opt.password=ui->passwordLineEdit->text();//密码opt.name=ui->nameLineEdit->text();//帐号opt.phoneNo=ui->phoneNoLineEdit->text();//电话opt.gender=ui->femaleRadioButton->isChecked()?0:1;//性别opt.addr=ui->addrLineEdit->toPlainText();//地址opt.icon = imagefile;emit sigAddOperator(opt,roleText);//发射信号
}//选择图片
void AddOperator::on_picpushButton_clicked()
{//获取图片路径imagepath= QFileDialog::getOpenFileName(this,"打开图片","./","image(*.jpg *.png *.jpeg *.bmp *.gif)");//打开文件对话框//将图片绘制在窗体widgetthis->mpix=QPixmap(imagepath);//创建图片ui->addpiclabel->setPixmap(this->mpix);ui->addpiclabel->setScaledContents(true);//自动缩放QDateTime current_time =QDateTime::currentDateTime();QString strTime = current_time.toString("yyyyMMddhhmmss");QString filename = QCoreApplication::applicationDirPath()+"/files/"+strTime+".png";//拼接文件完整路径bool result= this->mpix.save(filename,"png");if(result){imagefile="files/"+strTime+".png";}
}
2、编辑用户
#include "sqlite3db.h"
#include <QDebug>
#include <QtSql>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QList>Sqlite3Db::Sqlite3Db() {}OperatorInfo* globalUserInfo = nullptr; // 初始化全局指针为nullptr// Qt访问Sqlite的步骤:
// 1. 引入一个模块 QT += core gui sql
// 2. 引入头文件
// 3. 使用QSqlDatabase 来进行操作// 根据用户名和密码来判断,用户是否存在数据库中
bool Sqlite3Db::isContain(QString userName, QString passWord, OperatorInfo &infos) {QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db"); // 设置数据库名称db.open();//打开连接// bool isOpen = db.open();//打开连接//输出错误信息// qDebug() << isOpen ;// qDebug() << db.isValid(); // true// qDebug() << db.isOpen(); // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句? :占位符---避免sql注入QString sqlCmd = QString("SELECT * from operatorInfo where username=? and password=?");// 3.准备参数化占位符的数据query.prepare(sqlCmd);query.bindValue(0, userName);query.bindValue(1, passWord);//4.开始执行语句bool success = query.exec();if (success == false) {db.close(); // 网络资源,需要回收return false;}if (query.next() == false) {db.close(); // 网络资源,需要回收return false;}// 如果继续往后执行,就是已经买查询到对象了,返回这个对象的每个属性值OperatorInfo i;i.id = query.value(0).toInt();i.icon = query.value(1).toByteArray();i.username = query.value(2).toString();i.password = query.value(3).toString();i.addr = query.value(4).toString();i.gender = query.value(5).toInt();i.name = query.value(6).toString();i.phoneNo = query.value(7).toString();infos = i;db.close();return true;
}// //查询列表
// bool Sqlite3Db::selectOperators(OperatorInfoList &operatorinfs)
// {
// QSqlDatabase db;
// db.setHostName("localhost");//设置主机名
// db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型
// db.setDatabaseName("warehouse.db"); // 设置数据库名称
// bool isOpen = db.open();//打开连接
// //输出错误信息
// qDebug() << isOpen ;
// qDebug() << db.isValid(); // true
// qDebug() << db.isOpen(); // true// // 1.准备查询QSqlQuery 对象
// QSqlQuery query(db);
// // 2. 准备Sql语句? :占位符---避免sql注入
// QString sqlCmd = QString("SELECT * from operatorInfo ");
// // 3.准备 数据
// //query.prepare(sqlCmd);// //4.开始执行语句
// bool success = query.exec(sqlCmd);
// if (success == false) {
// db.close(); // 网络资源,需要回收
// OperatorInfoList list;
// operatorinfs=list;
// return false;
// }// // 循环属性值
// while(query.next()){
// OperatorInfo i;
// i.id = query.value(0).toInt();
// i.icon = query.value(1).toByteArray();
// i.username = query.value(2).toString();
// i.password = query.value(3).toString();
// i.addr = query.value(4).toString();
// i.gender = query.value(5).toInt();
// i.name = query.value(6).toString();
// i.phoneNo = query.value(7).toString();
// operatorinfs.push_back(i);
// }
// db.close(); // 网络资源,需要回收
// return true;
// }//查询列表,支持分页
bool Sqlite3Db::selectOperators(QString searchString,int pageIndex,int pageSize,int &pageCount, OperatorInfoList &operatorinfs)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db"); // 设置数据库名称bool isOpen = db.open();//打开连接//输出错误信息qDebug() << isOpen ;//qDebug() << db.isValid(); // true//qDebug() << db.isOpen(); // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句? :占位符---避免sql注入QString strWhere=QString(" and 1=1");if(searchString.isNull()==false && searchString.isEmpty()==false){strWhere=QString(" and (name like '%%1%' or username like '%%2%')").arg(searchString).arg(searchString);}//查询分页数据QString datasql = QString("SELECT * from operatorInfo where 1=1 %1 limit %2 offset %3 ").arg(strWhere).arg(pageSize).arg((pageIndex - 1) * pageSize);//查询总页数QString pageCoutSql = QString("select count(id) from operatorInfo where 1=1 %1 ").arg(strWhere);//4.开始执行语句bool success = query.exec(datasql);if (success == false) {db.close(); // 网络资源,需要回收OperatorInfoList list;operatorinfs=list;return false;}// 循环属性值while(query.next()){OperatorInfo i;i.id = query.value(0).toInt();i.icon = query.value(1).toByteArray();i.username = query.value(2).toString();i.password = query.value(3).toString();i.addr = query.value(4).toString();i.gender = query.value(5).toInt();i.name = query.value(6).toString();i.phoneNo = query.value(7).toString();operatorinfs.push_back(i);//将数据添加到列表中}// 开始查询总条数,计算总页数bool success2 = query.exec(pageCoutSql);if (success2) {if (query.next()) {int dataCount = query.value(0).toInt();pageCount = dataCount / pageSize;if (dataCount % pageSize > 0) {pageCount = pageCount + 1;}}}db.close(); // 网络资源,需要回收return true;
}//添加数据
bool Sqlite3Db::insertOperator(const OperatorInfo &opt,const QString &rolename)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");//添加数据库类型db.setDatabaseName("warehouse.db"); // 设置数据库名称db.open();//打开连接//bool isOpen = db.open();//打开连接//qDebug() << db.isOpen(); // true// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("insert into operatorInfo(icon,username,password,addr,gender,name,phoneNo) values (?,?,?,?,?,?,?);");query.bindValue(0, opt.icon);query.bindValue(1, opt.username);query.bindValue(2, opt.password);query.bindValue(3, opt.addr);query.bindValue(4, opt.gender);query.bindValue(5, opt.name);query.bindValue(6, opt.phoneNo);//3.开始执行语句bool success = query.exec();if(success){//查询新添用户的idQString datasql = QString("SELECT * from operatorInfo where username='%1' and name='%1' and password='%1'").arg(opt.username).arg(opt.name).arg(opt.password);success = query.exec(datasql);if(success & query.next()){//获取新加用户的idint userid=query.value(0).toInt();//查找角色对应的idint roleid=0;QList<SysRole> rolelist=sysRoleList();for (int i = 0; i < rolelist.size(); ++i) {SysRole role= rolelist.at(i);if(role.getName()==rolename){roleid=role.getId();break;}}UserRole urole;urole.setRoleID(roleid);urole.setUserID(userid);urole.setRemark(rolename);success=insertUserRole(urole);}}db.close(); // 网络资源,需要回收return success;
}//删除数据
bool Sqlite3Db::deleteOperator(qint64 id)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 设置数据库名称db.open();QSqlQuery query(db);query.prepare("delete from operatorInfo where id=?");query.bindValue(0, id);bool success = query.exec();db.close();return success;
}//根据id查询一条数据
bool Sqlite3Db::selectOperatorsById(qint64 id, OperatorInfo &operatorinfo)
{QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("SELECT * from operatorInfo where id=?");query.bindValue(0, id);bool success = query.exec();if (success & query.next()) {operatorinfo.id = query.value(0).toInt();operatorinfo.icon = query.value(1).toByteArray();operatorinfo.username = query.value(2).toString();operatorinfo.password = query.value(3).toString();operatorinfo.addr = query.value(4).toString();operatorinfo.gender = query.value(5).toInt();operatorinfo.name = query.value(6).toString();operatorinfo.phoneNo = query.value(7).toString();db.close(); // 网络资源,需要回收return true;}return false;
}// 更新数据
bool Sqlite3Db::updateOperator(OperatorInfo info,const QString &rolename) {QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接QString sqlCmd = QString("update operatorInfo set icon = ?,username = ?,addr = ?,gender = ?,name = ?,phoneNo = ? where id = ?");QSqlQuery query(db);query.prepare(sqlCmd);query.bindValue(0, info.icon);query.bindValue(1, info.username);query.bindValue(2, info.addr);query.bindValue(3, info.gender);query.bindValue(4, info.name);query.bindValue(5, info.phoneNo);query.bindValue(6, info.id);bool success = query.exec();if (success) {//查找角色对应的idSysRole sysrole;QList<SysRole> rolelist=sysRoleList();for (int i = 0; i < rolelist.size(); ++i) {SysRole role= rolelist.at(i);if(role.getName()==rolename){sysrole=role;break;}}//修改用户角色idsuccess = updateUserRole(info.id,sysrole);}db.close();return success;
}//返回数据库菜单
QList<MenuItemRoot> Sqlite3Db::selectMenuRootItem(qint64 userid)
{QList<MenuItemRoot> menulist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from menuitems where id in (select menuID from menurole where roleID=(select roleID from userrole where userID=?))");query.bindValue(0, userid);bool success = query.exec();if (success) {while(query.next()){MenuItemRoot root;root.id = query.value(0).toInt();root.name = query.value(1).toString();root.value = query.value(2).toString();root.icon = query.value(3).toString();menulist.push_back(root);}}db.close(); // 网络资源,需要回收return menulist;
}//根据父id获取二级菜单
QList<MenuItemInfo> Sqlite3Db::findMenuInfoByPID(qint64 pid)
{QList<MenuItemInfo> itemlist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from menuitems where parentid=?");query.bindValue(0, pid);bool success = query.exec();if (success) {while(query.next()){MenuItemInfo menuitem;menuitem.id = query.value(0).toInt();menuitem.name = query.value(1).toString();menuitem.value = query.value(2).toString();menuitem.icon = query.value(3).toString();menuitem.parentid = query.value(4).toInt();itemlist.push_back(menuitem);}}db.close(); // 网络资源,需要回收return itemlist;
}//角色列表
QList<SysRole> Sqlite3Db::sysRoleList()
{QList<SysRole> rolelist;QSqlDatabase db;db.setHostName("localhost");//设置主机名db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("warehouse.db"); // 配置数据库的地址db.open();QSqlQuery query(db);query.prepare("select * from SysRoles ");bool success = query.exec();if (success) {while(query.next()){SysRole roleitem;roleitem.setId(query.value(0).toInt());roleitem.setName(query.value(1).toString()) ;roleitem.setIcon(query.value(2).toString()) ;roleitem.setDesc(query.value(3).toString()) ;rolelist.push_back(roleitem);}}db.close(); // 网络资源,需要回收return rolelist;
}//添加用户角色关联记录
bool Sqlite3Db::insertUserRole(UserRole userrole)
{QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("insert into UserRole(userID,roleID,remark) values (?,?,?);");query.bindValue(0, userrole.getUserID());query.bindValue(1, userrole.getRoleID());query.bindValue(2, userrole.getRemark());//3.开始执行语句bool success = query.exec();db.close();return success;
}//根据用户id删除用户角色记录
bool Sqlite3Db::deleteUserRole(int userid)
{QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("delete from UserRole where userID=?");query.bindValue(0,userid);//3.开始执行语句bool success = query.exec();if(success){db.close();return success;}db.close();return success;
}//根据用户id查询用户角色记录
UserRole Sqlite3Db::findRoleIdByUserId(int userid)
{UserRole uRole;QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("select * from UserRole where userID=?");query.bindValue(0,userid);//3.开始执行语句bool success = query.exec();if(success & query.next()){uRole.setId(query.value(0).toInt());uRole.setUserID(query.value(1).toInt());uRole.setRoleID( query.value(2).toInt());uRole.setRemark(query.value(3).toString());db.close(); // 网络资源,需要回收}return uRole;
}//根据用户id修改角色记录
bool Sqlite3Db::updateUserRole(int userid,SysRole role)
{QSqlDatabase db;if (QSqlDatabase::contains("qt_sql_default_connection")) {db = QSqlDatabase::database("qt_sql_default_connection");} else{db = QSqlDatabase::addDatabase("QSQLITE");}db.setHostName("localhost");//设置主机名db.setDatabaseName("warehouse.db"); // 设置数据库名db.open(); // 打开连接// 1.准备查询QSqlQuery 对象QSqlQuery query(db);// 2. 准备Sql语句query.prepare("update UserRole set roleID = ?,remark=? where userID = ?");query.bindValue(0,role.getId());query.bindValue(1,role.getName());query.bindValue(2,userid);//3.开始执行语句bool success = query.exec();db.close();return success;
}
4、运行测试
新增操作
编辑操作
原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。