文章目录
- 数据库表的实现
- 创建表
- 将powerDesigner里面的表导出成xxx.sql脚本
- 将SQL文件导入数据库创建表
- 图书管理系统思维导图
- 创建工程
- 开发阶段
- 创建Dlg_login登录页面
- login页面样式
- 主页页面布局
- 主函数测试login
- 设置logo
- 打包程序
- 子页面的样子
- 将子页面放到StackedWidget里面
- 按钮直接形成互斥效果
- 用属性选择器来改变样式
- 设置user页面的标头和设置文本不可编辑
- 创建SqlMgr类进行SQL操作
- 初始化数据库
- 登录功能login
- 用户功能
- getUsers功能
- 导入用户(导入文件里面的数据到数据库)
- 删除用户(del)
- 搜索用户
- 图书管理功能
- 获取图书
- 添加图书
- 修改图书
- 删除图书
- 遇到的错误
- 借阅图书
- 搜索图书
- 借阅记录管理功能
- 获取借阅记录
- 模糊查询记录
- 归还图书
- 出现的问题
- 清空借阅记录
- 登录功能
- 页面展示
数据库表的实现
创建表
创建三个表
将powerDesigner里面的表导出成xxx.sql脚本
此时就会生成文件在桌面了
将SQL文件导入数据库创建表
运行sql文件
设置主键自增
图书管理系统思维导图
创建工程
在qt上创建一个工程项目
把这个四个文件发到controller文件夹下,在创建一个dao文件夹
controller文件夹下面是一些界面类和逻辑类,dao文件夹下就是和数据库交互的
进入项目
加上这一句话
include($$PWD/controller/controller.pri)
正在右键项目执行qmake
添加一句这个以后生成的目标文件都在这里(当前文件目录的上一级创建一个bin 文件夹
开发阶段
创建Dlg_login登录页面
login页面样式
QLabel#le_title{font:38px '方正姚体';}
QLabel#name,QLabel#pwd{font: 18px '楷体';}
QLineEdit{border-radius:4px;min-height:25px;border:1px solid gray;}
QPushButton{border-radius:4px;background-color:#409eff;color:white;font-size:18px;}
QWidget#bg{background:white;}
主页页面布局
主函数测试login
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//实现登录
Dlg_login dlg;
int ret=dlg.exec();
if(1==ret){
Cell_main w;
w.show();
return a.exec();
}
if(0==ret){
exit(0);
return 0;
}
return 0;
}
实现Dlg_login函数
void Dlg_login::on_btn_login_clicked()
{
setResult(1);
this->hide();
}
void Dlg_login::on_btn_exit_clicked()
{
setResult(0);
this->hide();
}
设置logo
在资源文件中添加一个app.rc文件,在打开这个app.rc文件 添加一句话:
IDI_ICON1 ICON DISCARDABLE “tubiao.ico”
再把这个ico图标放到这个资源文件里
打包程序
如果还 运行不了,可能是有些库没有权限没靠过来,手动考
子页面的样子
将子页面放到StackedWidget里面
#include "cell_main.h"
#include "ui_cell_main.h"
#include"dlg_login.h"
#include"QPushButton"
#include"QDebug"
Cell_main::Cell_main(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::Cell_main),
m_bookPage(nullptr),
m_recordPage(nullptr),
m_userPage(nullptr)
{
ui->setupUi(this);
//初始化栈窗口
initPage();
}
void Cell_main::initPage()
{
m_bookPage=new cell_BookMgr(this);
m_userPage=new cell_UserMgr(this);
m_recordPage=new cell_Record(this);
//把页面放到栈窗口
ui->stackedWidget->addWidget(m_userPage);
ui->stackedWidget->addWidget(m_bookPage);
ui->stackedWidget->addWidget(m_recordPage);
//设置首页是用户管理
ui->stackedWidget->setCurrentIndex(0);
qDebug()<<"helloworld";
auto l=ui->tool->children();//获得子控件
for(auto it:l){
//为每个页面进行绑定槽函数
if(it->objectName().contains("btn"))
{
connect(static_cast<QPushButton*>(it),&QPushButton::clicked,this,&Cell_main::DealMenu);
}
}
//主页初始化一下
// m_userPage->initPage();
}
void Cell_main::DealMenu()
{
auto str=sender()->objectName();
//切换页面
do{
if("btn_user"==str){
//m_userPage->initPage();
ui->stackedWidget->setCurrentIndex(0);
break;
}
if("btn_book"==str){
//m_bookPage->initPage();
ui->stackedWidget->setCurrentIndex(1);
break;
}
if("btn_his"==str){
//m_recordPage->initPage();
ui->stackedWidget->setCurrentIndex(2);
break;
}
}while(false);
}
Cell_main::~Cell_main()
{
delete ui;
}
在添加完之后在进行切换操作,页面之间切换
按钮直接形成互斥效果
用属性选择器来改变样式
设置user页面的标头和设置文本不可编辑
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//一次选中一行
ui->tableView->setModel(&m_model);
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑
m_model.setHorizontalHeaderLabels(QStringList{"用户id","年级","部门","权限","人物类型","密码","用户名"});
创建SqlMgr类进行SQL操作
涉及到的函数函数和变量
class SqlMgr
{
public:
SqlMgr();
//设置单例模式
static SqlMgr* instance;
static SqlMgr* getInstance(){
if(nullptr==instance){
instance=new SqlMgr();
}
return instance;
}
void test1();
void init();//初始化数据库
//登录
bool login(QString username,QString password,int &userId);
//获取所有用户
QVector<QStringList> getUsers(QString StrCondition="");
//添加用户
void addUsers(QVector<QStringList> );
//删除用户
void delUser(QString userId);
//获取所有图书
QVector<QStringList> getBooks(QString StrCondition="");
//添加图书
void addBooks(QVector<QStringList> );
//修改图书
void updateBook(QStringList);
//删除图书
QString delBook(QString bookId);
//归还图书
QString returnBook(QString userId,QString bookId);
//图书借阅
QString borrowBook(QString userId,QString bookId);
//获取借阅记录
QVector <QStringList> getRecord(QString strCondition="");
//清除借阅记录
void clearRecord();
//
private:
QSqlDatabase m_db;
初始化数据库
void SqlMgr::init()
{
m_db=QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(QCoreApplication::applicationDirPath()+"/db/WpcBook.db");
qDebug()<<m_db.open();
}
失败啦!!!
成功啦,失败原因是之前把一些文件打包到bin目录下了,所以就不走系统的了缺少一些文件就会报错,把bin目录下的文件删除就走系统的了
m_db.setDatabaseName(QCoreApplication::applicationDirPath()
app目录是这个路径
登录功能login
先不实现键盘输入登录功能,先测试一下,查询数据库里面是否有这个用户,有就返回true
//返回 true登录成功
bool SqlMgr::login(QString username, QString password)
{
QSqlQuery q(m_db);
QString sql=QString("select *from user where username='%1' and password='%2'").arg(username).arg(password);
bool ret=q.exec(sql);//执行查询语句 执行成功返回true
if(ret==false){
qDebug()<<q.lastError();
}
return ret;
}
用户功能
getUsers功能
(数据库层)SqlMgr代码:
//获取所有用户
QVector<QStringList> SqlMgr::getUsers(QString StrCondition){
QSqlQuery q(m_db);
//StrCondition里可以写模糊查询的东西
QString sql=QString("select *from user %1").arg(StrCondition);
//获取到的数据可能是多行
QVector<QStringList> vec;
bool ret=q.exec(sql);
if(ret==false){
qDebug()<<q.lastError();
}else{
//读取返回来的数据
//获取这个数据是几行
int col =q.record().count();
QStringList temp;
while(q.next()){//向下读
temp.clear();
for(int i=0;i<col;i++){
//将这一行数据转换为QString放到
temp<<q.value(i).toString();
}
vec.push_back(temp);
}
qDebug()<<"sqlMgr getuser被执行";
}
return vec;
}
(控制层代码)cell_UserMgr:
//初始化用户管理页面
void cell_UserMgr::initPage(QString strCondition){
qDebug()<<"initUSer被执行";
//调用数据库进行查询
QVector<QStringList>vec= SqlMgr::getInstance()->getUsers(strCondition);
m_model.clear();//在设置一次头
m_model.setHorizontalHeaderLabels(QStringList{"用户id","年级","部门","权限","人物类型","密码","用户名"});
QList <QStandardItem*>items;//添加到页面
//获取每一个QStringList
for(QStringList tempList:vec){
items.clear();//清理
for(int i=0;i<tempList.size();i++){
//追加每一个元素
items.append(new QStandardItem(tempList[i]));
}
//追加到一行上面
m_model.appendRow(items);
}
}
导入用户(导入文件里面的数据到数据库)
使用: QFileDialog::getOpenFileName(nullptr,“输入文件路径”);会出现弹窗
**dao代码(SqlMgr) **
//导入用户(.txt类型 是GBK编码)
void SqlMgr::addUsers(QVector<QStringList> vec){
QSqlQuery q(m_db);
//StrCondition里可以写模糊查询的东西
//一个个拿出来
for(auto tempList:vec){
QString sql=QString("insert into user VALUES(NULL,'%1','%2','%3','%4','%5','%6')")
.arg(tempList[0])
.arg(tempList[1])
.arg(tempList[2])
.arg(tempList[3])
.arg(tempList[4])
.arg(tempList[5]);
bool ret=q.exec(sql);
if(ret==false){
qDebug()<<q.lastError();
}
}
}
控制层代码:
//导入用户
void cell_UserMgr::on_btn_UserAdd_clicked()
{
//会弹出页面窗口
auto strPath=QFileDialog::getOpenFileName(nullptr,"输入文件路径");
QVector<QStringList>vec;
if(strPath.isEmpty()!=true){
QFile f(strPath);//读这个文件
qDebug()<<"路径: "<<strPath;
f.open(QFile::ReadOnly);
while(!f.atEnd()){
QByteArray bytes= f.readLine();//一次读一行
//转换为QString 里面的数据类型是 : xxx,xxx,xxx,xxx用,分割
QString str(bytes);
qDebug()<<"str = "<<str;
//分割
QStringList strList=str.split(",");
//判断
if(strList.size()!=6){
QMessageBox::information(nullptr,"信息","导入失败",QMessageBox::Ok);
return;
}
//把一行数据的最后的元素的最后两个字节去掉\n\r去掉
strList[strList.size()-1]=strList[strList.size()-1].chopped(2);
//存
vec.push_back(strList);
}
//调用数据库
SqlMgr::getInstance()->addUsers(vec);
f.close();
//刷新页面
//ui->le_search->clear();
initPage();
}
}
先写数据层库层
效果:
删除用户(del)
数据库:
void SqlMgr::delUser(QString userId){
QSqlQuery q(m_db);
QString sql=QString("delete from user where id= %1").arg(userId);
bool ret=q.exec(sql);
if(!ret){
qDebug()<<q.lastError().text();
}
}
控制层:
//删除用户
void cell_UserMgr::on_btn_UserDel_clicked()
{
//获取鼠标点击到的哪一行的
//第一列的数据
int r=ui->tableView->currentIndex().row();//获取当前行号
if(r<0){
QMessageBox::information(nullptr,"提示","请选中一行...",QMessageBox::Ok);
}else{
//获取r行 的0列
auto id=m_model.item(r,0)->text();
SqlMgr::getInstance()->delUser(id);
//刷新页面
initPage();
}
}
搜索用户
控制层:(直接调用initPage函数)
void cell_UserMgr::on_le_search_textChanged(const QString &arg1)
{
QString sql=QString("where username like '%%1%' or department like '%%1%'").arg(arg1);
initPage(sql);
}
图书管理功能
获取图书
数据库:
//获取图书
QVector<QStringList> SqlMgr::getBooks(QString StrCondition)
{
QSqlQuery q(m_db);
QString sql=QString("select *from book %1").arg(StrCondition);
QVector<QStringList> vec;
//执行
bool ret=q.exec(sql);
if(!ret){
qDebug()<<q.lastError().text();
}else{
QStringList strList;
//获取这些数据有几列
int col=q.record().count();
//从q里面获取数据
while(q.next()){
strList.clear();
for(int i=0;i<col;i++){
//把这一行数据放进去
strList<<q.value(i).toString();
}
vec.push_back(strList);
}
}
return vec;
}
//添加图书
void SqlMgr::addBooks(QVector<QStringList> vec ){
//添加图书是一次添加一本
QSqlQuery q(m_db);
auto data= vec[0];
QString sql=QString("insert into Wbook values(null,'%1','%2','%3','%4','%5',%6,'');")
.arg(data[1])
.arg(data[2])
.arg(data[3])
.arg(data[4])
.arg(data[5])
.arg(data[6]);
bool ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError();
return;
}
}
控制层:
//初始化图书管理页面
void cell_BookMgr::initPage(QString condition){
//调用dao的getbooks
auto vec=SqlMgr::getInstance()->getBooks(condition);
//拿数据显示到页面
m_model.clear();//在设置一次头
m_model.setHorizontalHeaderLabels(QStringList{"图书id","图书名称","价格","类型1","类型2","类型3","数量","图片"});
for(QStringList tlist:vec){//拿出一行QStringList
QList<QStandardItem*> items;
for(int i=0;i<tlist.size();i++){
//追加到items
items.append(new QStandardItem(tlist[i]));
}
qDebug()<<"图书被调用";
//加到model
m_model.appendRow(items);
}
}
添加图书
添加图书要弹出一个页面Dlg_addOrUp
数据库层:
//添加图书
void SqlMgr::addBooks(QStringList data ){
//添加图书是一次添加一本
QSqlQuery q(m_db);
QString sql=QString("insert into book values(null,'%1','%2','%3','%4','%5',%6,'');")
.arg(data[0])
.arg(data[1])
.arg(data[3])
.arg(data[4])
.arg(data[5])
.arg(data[2]);
bool ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError().text();
}
}
控制层:
void cell_BookMgr::on_btn_bookAdd_clicked()
{
//调用子窗口
Dlg_addOrUp dlg;
dlg.setFlag(-1);//添加就设置为-1
dlg.exec();
}
Dlg_addOrUp类
#include "dlg_addorup.h"
#include "ui_dlg_addorup.h"
#include"dao/sqlmgr.h"
#include"QDebug"
Dlg_addOrUp::Dlg_addOrUp(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dlg_addOrUp)
{
ui->setupUi(this);
}
Dlg_addOrUp::~Dlg_addOrUp()
{
delete ui;
}
void Dlg_addOrUp::addOrUp()
{
QStringList strList;
//添加
if(m_flag==-1){
//获取页面输入
strList<<ui->le_name->text();
strList<<ui->le_press->text();
strList<<ui->le_count->text();
strList<<ui->cb1->currentText();
strList<<ui->cb2->currentText();
strList<<ui->cb3->currentText();
qDebug()<<"==== "<<strList;
//调用数据添加函数
SqlMgr::getInstance()->addBooks(strList);
}
}
void Dlg_addOrUp::setFlag(int flag)
{
m_flag=flag;
}
void Dlg_addOrUp::on_btn_ok_clicked()
{
addOrUp();
//隐藏页面
this->hide();
}
void Dlg_addOrUp::on_btn_cancel_clicked()
{
this->hide();
}
这个Dlg_addOrUp既是添加页面又是修改页面里面m_flag=-1时是添加,非-1时是修改
修改图书
dao层:
//修改图书
void SqlMgr::updateBook(QStringList data){
QSqlQuery q(m_db);
QString sql=QString("update book set"
" name='%1',press='%2',type1='%3',type2='%4',"
"type3='%5',cnt='%6' where bookid='%7';")
.arg(data[1])
.arg(data[2])
.arg(data[4])
.arg(data[5])
.arg(data[6])
.arg(data[3])
.arg(data[0]);
bool ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError();
}
}
控制层:
void cell_BookMgr::on_btn_bookUpdate_clicked()
{
//判断有没有选中一行将要修改的数据
//要知道鼠标点中哪一行
int r=ui->tableView->currentIndex().row();
if(r<0){
QMessageBox::information(nullptr,"信息","请选中要更新的一行",QMessageBox::Ok);
}
else{
qDebug()<<"update被调用...";
//获得选中的一行的id拿出来
auto it= m_model.item(r,0)->text();
Dlg_addOrUp dlg;
dlg.setFlag(it.toInt());//修改
dlg.showDetial(it.toInt());//显示要修改的信息
dlg.exec();
initPage();
}
}
显示到页面上信息(Dlg_addOrUp):
void Dlg_addOrUp::showDetial(int id)
{
QString sql=QString("where bookid= %1").arg(id);
//先查询信息显示到页面上
QVector<QStringList> vec =SqlMgr::getInstance()->getBooks(sql);
QStringList data=vec[0];//查出来的是一条数据
ui->le_name->setText(data[1]);
ui->le_press->setText(data[2]);
ui->cb1->setCurrentText(data[3]);
ui->cb2->setCurrentText(data[4]);
ui->cb3->setCurrentText(data[5]);
ui->le_count->setText(data[6]);
}
更新:
void Dlg_addOrUp::addOrUp()
{
QStringList strList;
//添加
if(m_flag==-1){
//获取页面输入
strList<<ui->le_name->text();
strList<<ui->le_press->text();
strList<<ui->le_count->text();
strList<<ui->cb1->currentText();
strList<<ui->cb2->currentText();
strList<<ui->cb3->currentText();
qDebug()<<"==== "<<strList;
//调用数据添加函数
SqlMgr::getInstance()->addBooks(strList);
}else{//修改
strList.clear();
strList<<QString::number(m_flag);//把bookid拿进去
//获取页面输入
strList<<ui->le_name->text();
strList<<ui->le_press->text();
strList<<ui->le_count->text();
strList<<ui->cb1->currentText();
strList<<ui->cb2->currentText();
strList<<ui->cb3->currentText();
SqlMgr::getInstance()->updateBook(strList);
}
}
删除图书
遇到的错误
//删除图书
QString SqlMgr:: delBook(QString bookId){
QSqlQuery q(m_db);
QString sql=QString("delete from book where bookid= %1").arg(bookId);
bool ret=q.exec(sql);
if(!ret){
qDebug()<<q.lastError().text();
return "fail";
}
return "success";
}
void cell_BookMgr::on_btn_bookDel_clicked()
{
//获取鼠标点击到哪一行了
int r=ui->tableView->currentIndex().row();
if(r<0){
QMessageBox::information(nullptr,"信息","请选中要删除的一行",QMessageBox::Ok);
}else{
auto id =m_model.item(r,0)->text();
QString str=SqlMgr::getInstance()->delBook(id);
QMessageBox::information(nullptr,"信息",str=="success"?"删除成功":"删除失败",QMessageBox::Ok);
initPage();
}
}
借阅图书
创建一个窗口类
Dlg_getsetbook
#include "dlg_getsetbook.h"
#include "ui_dlg_getsetbook.h"
#include"dao/sqlmgr.h"
#include"QMessageBox"
Dlg_getSetBook::Dlg_getSetBook(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dlg_getSetBook)
{
ui->setupUi(this);
}
Dlg_getSetBook::~Dlg_getSetBook()
{
delete ui;
}
void Dlg_getSetBook::showBorrowBook(QString bookName)
{
//在页面上显示图书
ui->le_bookname->setText(bookName);
}
void Dlg_getSetBook::setBookId(QString bookid)
{
m_bookid=bookid;
}
void Dlg_getSetBook::on_btn_ok_clicked()
{
//点击确定之后获取页面上的数据进行调用数据库
auto userName=ui->le_username->text();
auto pwd=ui->le_pwd->text();
//判断用户是否存在
bool ret=SqlMgr::getInstance()->login(userName,pwd);
if(ret==false){
QMessageBox::information(nullptr,"提示","该用户不存在",QMessageBox::Ok);
return;
}
// 图书借阅 QString borrowBook(QString userId,QString bookId);
//获取用户id
QString userid = SqlMgr::getInstance()->getUserid(userName,pwd);
m_userid=userid;
if(m_userid==""&&m_bookid==""){
QMessageBox::information(nullptr,"提示","用户id或图书id为null",QMessageBox::Ok);
return;
}
QString str=SqlMgr::getInstance()->borrowBook(m_userid,m_bookid);
QMessageBox::information(nullptr,"提示",str=="借阅成功"?"借阅成功":"借阅失败",QMessageBox::Ok);
//隐藏窗口
this->hide();
}
#ifndef DLG_GETSETBOOK_H
#define DLG_GETSETBOOK_H
#include <QDialog>
namespace Ui {
class Dlg_getSetBook;
}
class Dlg_getSetBook : public QDialog
{
Q_OBJECT
public:
explicit Dlg_getSetBook(QWidget *parent = nullptr);
~Dlg_getSetBook();
//显示你借的那一本书
void showBorrowBook(QString bookName);
void setBookId(QString bookid);
private slots:
void on_btn_ok_clicked();
private:
Ui::Dlg_getSetBook *ui;
QString m_bookid;
QString m_userid;
};
#endif // DLG_GETSETBOOK_H
dao:
//图书借阅
QString SqlMgr::borrowBook(QString userId,QString bookId){
QSqlQuery q(m_db);
QString sql=QString("update book set cnt=cnt-1 where bookid = %1").arg(bookId);
bool ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError().text();
return "借阅失败";
}
//QDateTime::currentSecsSinceEpoch()
QString start =secondsToDateString(QDateTime::currentSecsSinceEpoch());
QString end =secondsToDateString(QDateTime::currentSecsSinceEpoch()+3600*24*10);
sql=QString("insert into record values(null,%1,%2,'%3','%4')")
.arg(userId)
.arg(bookId)
.arg(start)
.arg(end);
ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError().text();
return "借阅失败";
}
return "借阅成功";
}
dao:(getuserid)
QString SqlMgr::getUserid(QString userName, QString pwd)
{
QSqlQuery q(m_db);
QString sql=QString("select id from user where username = '%1' and password = '%2' ")
.arg(userName)
.arg(pwd);
bool ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError().text();
return "";
}
QString userid = "";
if (q.next()) { // 移动到结果集中的第一条记录
userid = q.value(0).toString();
}
return userid;
}
QString SqlMgr::secondsToDateString(qint64 seconds)
{
QDateTime dateTime = QDateTime::fromSecsSinceEpoch(seconds);
QString dateString = dateTime.toString("yyyy-MM-dd");
return dateString;
}
控制层:
//借阅图书
void cell_BookMgr::on_btn_BookRecord_clicked()
{
//判断点击了哪一行数据
int r=ui->tableView->currentIndex().row();
if(r<0){
QMessageBox::information(nullptr,"信息","请选中要借阅的图书",QMessageBox::Ok);
}else{
auto bookid =m_model.item(r,0)->text();
//获得cnt cnt<=0 库存没了不能借 r行的6列
auto cnt =m_model.item(r,6)->text();
if(cnt<="0"){
QMessageBox::information(nullptr,"信息","该书没有库存了,嗷了个嗷~",QMessageBox::Ok);
return;
}
//否则向下执行 要进行登记是谁借了这本书调用子页面
Dlg_getSetBook dlg;
//获得书的名字
auto bookName =m_model.item(r,1)->text();
dlg.setBookId(bookid);//设置图书id
dlg.showBorrowBook(bookName);
dlg.exec();
initPage();
}
搜索图书
控制层:(直接调用initPage函数)
void cell_BookMgr::on_le_search_textChanged(const QString &arg1)
{
QString sql=QString("where name like '%%1%' or type1 = '%1' or type2 = '%1' or type3 = '%1' ").arg(arg1);
initPage(sql);
}
借阅记录管理功能
获取借阅记录
dao:
//获取借阅记录
QVector <QStringList> SqlMgr::getRecord(QString strCondition){
QSqlQuery q(m_db);
QString sql=QString("select * from record %1").arg(strCondition);
QVector<QStringList> vec;
//执行
bool ret=q.exec(sql);
if(!ret){
qDebug()<<q.lastError().text();
}else{
QStringList strList;
//获取这些数据有几列
int col=q.record().count();
//从q里面获取数据
while(q.next()){
strList.clear();
for(int i=0;i<col;i++){
//把这一行数据放进去
strList<<q.value(i).toString();
}
vec.push_back(strList);
}
}
return vec;
}
控制层:
void cell_Record::initPage(QString condition){
auto vec=SqlMgr::getInstance()->getRecord(condition);
//拿数据显示到页面
m_model.clear();//在设置一次头
m_model.setHorizontalHeaderLabels(QStringList{"图书id","图书名称","价格","类型1","类型2","类型3","数量","图片"});
for(QStringList strList:vec){
QList<QStandardItem*> items;
for(int i=0;i<strList.size();i++){
items.append(new QStandardItem(strList[i]));
}
m_model.appendRow(items);
}
}
void cell_Record::on_le_search_textChanged(const QString &arg1)
{
QString sql=QString("where start like '%%1%' or end like '%%1%' or userid = %1 or bookid = %1").arg(arg1);
initPage(sql);
}
模糊查询记录
通过开始时间和结束时间与用户名和密码进行查询
void cell_Record::on_le_search_textChanged(const QString &arg1)
{
//同过开始时间和结束时间与用户名和密码进行查询
QString sql=QString("where start like '%%1%' or end like '%%1%' or user.username = '%1' or book.name= '%1'").arg(arg1);
initPage(sql);
}
归还图书
数据库层:
//归还图书
QString SqlMgr::returnBook(QString userId,QString bookId){
//根据userid==bookid删除记录 在根据bookid为本书cnt(库存+1)
QSqlQuery q(m_db);
// qDebug()<<"bookid= "<<bookId<<" userid = "<<userId;
/*
* 假如a(id=1)借西游记(bookid=6) b(id=2)借了西游记(bookid=6)
* 登录b还a借的书也是会成功的 b(id=2) a借的书(bookid=6)
*/
QString sql=QString("delete from record where userid = %1 and bookid = %2")
.arg(userId)
.arg(bookId);
bool ret=q.exec(sql);
if(ret==false){
qDebug()<<q.lastError().text();
return "归还失败";
}
sql=QString("update book set cnt = cnt+1 where bookid = %1")
.arg(bookId);
// qDebug()<<"bookid= ======"<<bookId;
ret=q.exec(sql);
if(ret==false){
qDebug()<<q.lastError().text();
return "归还失败";
}
return "归还成功";
}
控制层:
//归还图书
void cell_Record::on_btn_return_clicked()
{
//获取鼠标点中的哪一行
int r=ui->tableView->currentIndex().row();
if(r<0){
QMessageBox::information(nullptr,"信息","请选中要归还的图书",QMessageBox::Ok);
}else{
//弹出子页面用户登录之后在删除
Dlg_getSetBook dlg;
//获得书的名字
QString tempBookid=m_model.item(r,2)->text();
QString bookName=getBookName(tempBookid.toInt());
//获取图书id
auto bookid = m_model.item(r,2)->text();
//获取userid
auto userid = m_model.item(r,1)->text();
dlg.setBookId(bookid);
dlg.setUserId(userid);
dlg.setFlag(true);
dlg.showBorrowBook(bookName);//设置到页面上
dlg.exec();
initPage();
}
}
QString cell_Record::getBookName(int bookid)
{
QString bookName;
bookName=SqlMgr::getInstance()->getBookName(bookid);
return bookName;
}
Dlg_setgetBook
void Dlg_getSetBook::on_btn_ok_clicked()
{
//点击确定之后获取页面上的数据进行调用数据库
auto userName=ui->le_username->text();
auto pwd=ui->le_pwd->text();
//判断用户是否存在
bool ret=SqlMgr::getInstance()->login(userName,pwd);
if(ret==false){
QMessageBox::information(nullptr,"提示","该用户不存在",QMessageBox::Ok);
return;
}
//获取当前登录在Dlg_getsetbook窗口的用户id
QString CurUserid = SqlMgr::getInstance()->getUserid(userName,pwd);
if(m_userid==""&&m_bookid==""){
QMessageBox::information(nullptr,"提示","用户id或图书id为null",QMessageBox::Ok);
return;
}
if(m_flag==false){//借阅
//借阅图书的时候用当前登录的用户的用户id借阅
m_userid=CurUserid;
QString str=SqlMgr::getInstance()->borrowBook(m_userid,m_bookid);
QMessageBox::information(nullptr,"提示",str=="借阅成功"?"借阅成功":"借阅失败",QMessageBox::Ok);
}else{//归还
if(CurUserid==m_userid){
QString str=SqlMgr::getInstance()->returnBook(m_userid,m_bookid);
QMessageBox::information(nullptr,"提示",str=="归还成功"?"归还成功":"归还失败",QMessageBox::Ok);
}
else{
QMessageBox::information(nullptr,"提示","用户: "+userName+" 未借此书",QMessageBox::Ok);
}
}
//隐藏窗口
this->hide();
}
出现的问题
改造一下归还函数
//归还图书
QString SqlMgr::returnBook(QString userId,QString bookId,QString recordId){
//根据userid==bookid删除记录 在根据bookid为本书cnt(库存+1)
QSqlQuery q(m_db);
// qDebug()<<"bookid= "<<bookId<<" userid = "<<userId;
/*
* 假如a(id=1)借西游记(bookid=6) b(id=2)借了西游记(bookid=6)
* 登录b还a借的书也是会成功的 b(id=2) a借的书(bookid=6)
*/
QString sql=QString("delete from record where userid = %1 and bookid = %2 and id= %3")
.arg(userId)
.arg(bookId)
.arg(recordId);
bool ret=q.exec(sql);
if(ret==false){
qDebug()<<q.lastError().text();
return "归还失败";
}
sql=QString("update book set cnt = cnt+1 where bookid = %1")
.arg(bookId);
// qDebug()<<"bookid= ======"<<bookId;
ret=q.exec(sql);
if(ret==false){
qDebug()<<q.lastError().text();
return "归还失败";
}
return "归还成功";
}
//转换日期格式
QString SqlMgr::secondsToDateString(qint64 seconds)
{
QDateTime dateTime = QDateTime::fromSecsSinceEpoch(seconds);
QString dateString = dateTime.toString("yyyy-MM-dd");
return dateString;
}
QString SqlMgr::getBookName(int bookid)
{
QSqlQuery q(m_db);
QString sql=QString("select name from book where bookid = %1").arg(bookid);
bool ret =q.exec(sql);
if(!ret){
qDebug()<<q.lastError().text();
return "";
}
QString bookName="";
if(q.next()){
bookName= q.value(0).toString();
return bookName;
}
return bookName;
}
添加一下这个函数
#include "dlg_getsetbook.h"
#include "ui_dlg_getsetbook.h"
#include"dao/sqlmgr.h"
#include"QMessageBox"
Dlg_getSetBook::Dlg_getSetBook(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dlg_getSetBook)
{
ui->setupUi(this);
}
Dlg_getSetBook::~Dlg_getSetBook()
{
delete ui;
}
void Dlg_getSetBook::showBorrowBook(QString bookName)
{
//在页面上显示图书
ui->le_bookname->setText(bookName);
}
void Dlg_getSetBook::setBookId(QString bookid)
{
m_bookid=bookid;
}
void Dlg_getSetBook::setFlag(bool flag)
{
m_flag=flag;
}
void Dlg_getSetBook::setUserId(QString userid)
{
m_userid=userid;
}
void Dlg_getSetBook::setRecordId(QString recordid)
{
m_recordid=recordid;
}
void Dlg_getSetBook::on_btn_ok_clicked()
{
//点击确定之后获取页面上的数据进行调用数据库
auto userName=ui->le_username->text();
auto pwd=ui->le_pwd->text();
//判断用户是否存在
bool ret=SqlMgr::getInstance()->login(userName,pwd);
if(ret==false){
QMessageBox::information(nullptr,"提示","该用户不存在",QMessageBox::Ok);
return;
}
//获取当前登录在Dlg_getsetbook窗口的用户id
QString CurUserid = SqlMgr::getInstance()->getUserid(userName,pwd);
if(m_userid==""&&m_bookid==""){
QMessageBox::information(nullptr,"提示","用户id或图书id为null",QMessageBox::Ok);
return;
}
if(m_flag==false){//借阅
//借阅图书的时候用当前登录的用户的用户id借阅
m_userid=CurUserid;
QString str=SqlMgr::getInstance()->borrowBook(m_userid,m_bookid);
QMessageBox::information(nullptr,"提示",str=="借阅成功"?"借阅成功":"借阅失败",QMessageBox::Ok);
}else{//归还
if(CurUserid==m_userid){
//归还的时候还要用到记录id
QString str=SqlMgr::getInstance()->returnBook(m_userid,m_bookid,m_recordid);
QMessageBox::information(nullptr,"提示",str=="归还成功"?"归还成功":"归还失败",QMessageBox::Ok);
}
else{
QMessageBox::information(nullptr,"提示","用户: "+userName+" 未借此书",QMessageBox::Ok);
}
}
//隐藏窗口
this->hide();
}
清空借阅记录
dao:
void SqlMgr::clearRecord()
{
//删除所有图书
QSqlQuery q(m_db);
QString sql=QString("delete from record;");
bool ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError();
return;
}
sql=QString("delete from sqlite_sequence where name= 'record';");
ret=q.exec(sql);//执行查询语句
if(ret==false){
qDebug()<<q.lastError();
return;
}
qDebug()<<"clearRecord()成功.......";
}
控制层:
void cell_Record::on_btn_clear_clicked()
{
SqlMgr::getInstance()->clearRecord();
initPage();
}
登录功能
控制层:
void Dlg_login::on_btn_login_clicked()
{
auto username=ui->username->text();
auto pwd=ui->password->text();
if(username==""||pwd==""){
QMessageBox::information(nullptr,"提示","用户名或密码不能为空",QMessageBox::Ok);
return;
}
bool ret=SqlMgr::getInstance()->login(username,pwd);
if(ret){
setResult(1);
hide();
}else{
QMessageBox::information(nullptr,"提示","用户名或密码错误",QMessageBox::Ok);
}
}
dao:
//返回 true登录成功
bool SqlMgr::login(QString username, QString password)
{
QSqlQuery q(m_db);
QString sql=QString("select *from user where username='%1' and password='%2'").arg(username).arg(password);
bool ret=q.exec(sql);//执行查询语句 执行成功返回true
if(ret==false){
qDebug()<<q.lastError().text();
}
//执行这个q.next()判断是否还有可以执行成功
ret=q.next();
return ret;
}
页面展示