当前位置: 首页 > news >正文

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、运行测试

新增操作

编辑操作

原创不易,打字不易,截图不易,撸码不易,整理不易,走过路过,不要错过,欢迎点赞,收藏,转载,复制,抄袭,留言,灌水,请动动你的金手指,祝您早日实现财务自由。

http://www.dtcms.com/a/441995.html

相关文章:

  • 【开题答辩实录分享】以《基于Python的新能源汽车管理系统的设计与实现》为例进行答辩实录分享
  • springboot+vue智慧旅游管理小程序(源码+文档+调试+基础修改+答疑)
  • [创业之路-683]:“行业的分类”
  • MCI评估量表
  • 探索 Docker/K8s 部署 MySQL 的创新实践与优化技巧——高可用与性能调优进阶
  • Coze源码分析-资源库-编辑知识库-前端源码-核心组件
  • 搜索网站排名mj wordpress
  • 网站容量空间一般要多大做装修效果图的网站
  • MySQL-表的操作
  • C++架构全解析:从设计哲学到实战应用
  • wordpress 多级导航网络营销优化外包
  • 视频生成技术Deepfake
  • 【大语言模型 82】LoRA高级技巧:秩选择与初始化策略
  • 自己做的网站百度搜不到网站的空间是
  • Leetcode 3698. Split Array With Minimum Difference
  • mysql学习--日志查询
  • 北京做网站哪家强网站被k如何恢复
  • Redis的零食盒满了怎么办?详解缓存淘汰策略
  • display mac-address vlan vlan-id 概念及题目
  • 国内十大网站建设广州11个区排名
  • windows远程桌面连接的时候用户名用什么
  • Webpack实战笔记:从自动构建到本地服务器搭建的完整流程
  • SpringBoot + MongoDB全栈实战:从架构原理到AI集成
  • 台山网站建设公司申请云应用wordpress
  • 小迪安全v2023学习笔记(九十五讲)—— 云原生篇Docker安全权限环境检测容器逃逸特权模式危险挂载
  • 从零开始的C++学习生活 1:命名空间,缺省函数,函数重载,引用,内联函数
  • react源码
  • 怎么用记事本做钓鱼网站如何做外贸电商
  • 【自学笔记】Redis 快速入门(下篇)
  • 微信网站怎么开发东莞品牌营销型网站建设