Qt实现图书管理系统(C++)

这篇具有很好参考价值的文章主要介绍了Qt实现图书管理系统(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据库表的实现

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

创建表

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

创建三个表
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

将powerDesigner里面的表导出成xxx.sql脚本

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
此时就会生成文件在桌面了
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

将SQL文件导入数据库创建表

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
运行sql文件
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
设置主键自增

图书管理系统思维导图

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

创建工程

在qt上创建一个工程项目

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

把这个四个文件发到controller文件夹下,在创建一个dao文件夹

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

controller文件夹下面是一些界面类和逻辑类,dao文件夹下就是和数据库交互的

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

进入项目

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

加上这一句话

include($$PWD/controller/controller.pri)
正在右键项目执行qmake
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

添加一句这个以后生成的目标文件都在这里(当前文件目录的上一级创建一个bin 文件夹

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

开发阶段

创建Dlg_login登录页面

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

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;}
主页页面布局

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

主函数测试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

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
在资源文件中添加一个app.rc文件,在打开这个app.rc文件 添加一句话:

IDI_ICON1 ICON DISCARDABLE “tubiao.ico”
再把这个ico图标放到这个资源文件里

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

打包程序

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
如果还 运行不了,可能是有些库没有权限没靠过来,手动考
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

子页面的样子

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

将子页面放到StackedWidget里面

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

#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;
}


在添加完之后在进行切换操作,页面之间切换
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

按钮直接形成互斥效果

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

用属性选择器来改变样式

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

设置user页面的标头和设置文本不可编辑
  ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//一次选中一行
    ui->tableView->setModel(&m_model);
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//设置不可编辑
    m_model.setHorizontalHeaderLabels(QStringList{"用户id","年级","部门","权限","人物类型","密码","用户名"});

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

创建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();
}

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
失败啦!!!
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
成功啦,失败原因是之前把一些文件打包到bin目录下了,所以就不走系统的了缺少一些文件就会报错,把bin目录下的文件删除就走系统的了
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

m_db.setDatabaseName(QCoreApplication::applicationDirPath()

app目录是这个路径

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

登录功能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);
    }

}

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

导入用户(导入文件里面的数据到数据库)

使用: 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();
    }
}

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
先写数据层库层

效果:
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

删除用户(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);
    }

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

图书管理功能

获取图书

数据库:

//获取图书
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

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
数据库层:

//添加图书
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);
    }
}

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

删除图书

遇到的错误

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

//删除图书
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();
    }
}

借阅图书

创建一个窗口类
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
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);
}

借阅记录管理功能

获取借阅记录

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
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();
}



出现的问题

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
改造一下归还函数

//归还图书
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;
}

添加一下这个函数
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库

#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;
}

Qt实现图书管理系统(C++),C语言,qt,c++,数据库

页面展示

Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库
Qt实现图书管理系统(C++),C语言,qt,c++,数据库文章来源地址https://www.toymoban.com/news/detail-699952.html

到了这里,关于Qt实现图书管理系统(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

    一个管理员编号对应一个密码,且需要有管理员注册密匙。 可以在图书信息表中录入、修改、删除图书。 可以在图书信息表中查询书籍。 可以编辑图书借阅、归还信息。 可以编辑欠款信息。 可以编辑读者信息表。 图书馆注册,获得读者编号。 可以在图书信息表中查阅书籍

    2024年02月10日
    浏览(50)
  • 图书管理系统(C语言实现)

    设计并实现一个简单的图书管理系统 本次实训内容主要在于训练学生的C语言的基本编程能力,通过C语言输入输出、循环语句、子函数设计、数组、结构体等知识点,完成一个简单图书管理系统的设计开发。实现录入图书、删除指定图书、修改指定图书和查询指定图书的基本

    2024年02月12日
    浏览(33)
  • Java连接数据库实现图书馆管理系统(详细教程)

    该功能用到的软件为 IDEA 、Navicat 、云服务器(非必须) 源码下载 https://www.aliyundrive.com/s/UTz8pNxobGK 在自己的服务器或者电脑本机安装数据库系统,本次系统演示的数据库版本为5.6。 1.创建图书管理数据库library 字符集为:utf8 -utf8_general_ci 2.设计好将要使用的sql语句 视图、存储

    2024年02月06日
    浏览(47)
  • 数据库课程设计-图书馆管理系统(2.数据库实现-基于mysql)

    如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是)  (骗一下数据,说不定以后面试就过了,拜谢) 好像有读者说现在不要积分的资源也要vip才能下,如果下不了可以留邮箱到评论区或者私聊,我也把资源放到github了,地址如下: https://github.com/goLSX/library_mana

    2024年02月06日
    浏览(46)
  • 用Java语言实现一个简单的图书管理系统

    这个系统有两个登录选项:用户和管理员,选择两者进入都需要输入账号和密码进行审核。 用户有查看图书列表,借阅图书,归还图书这些选项,管理员有查看图书列表,增加图书,删除图书,修改图书这些选项。 我们先建一个Book类,用来存放图书名称以及借阅状态,图书

    2024年02月09日
    浏览(43)
  • 将Java与数据库连接起来(配置idea),实现一个简单的图书管理系统

    目录 1.通过connector连接Java和Mysql数据库 (1)首先配置idea (2)如何把java和mysql连接起来 1.简单连接 2.认识PrepareStatement 2.实现简单的图书管理系统 (1)创建数据库jdbc,并且创建出book表  (2)在idea中书写代码将mysql与java连接,实现基本的增删改查 1.JdbcUtiles类,一个使用jdbc的工具

    2024年02月11日
    浏览(45)
  • 基于java的图书借阅管理系统设计与实现(源代码+数据库+部署文档+部署视频)

           图书管理系统 该系统对数据进行保存、修改、删除等管理。为用户提供了一个友好、简单快捷的运行操作平台。该统对数据进行保存、修改、删除等管理,为用户提供了一个友好、简单快捷的运行操作平台。本系统的各界面设计友好、流程正确、功能也较为完善,

    2024年02月03日
    浏览(53)
  • 跨平台C++ Qt数据库管理系统设计与实战:从理论到实践的全面解析

    在我们的日常生活中,数据无处不在。无论是我们的个人信息,还是我们的购物习惯,甚至是我们的工作记录,都可以被视为数据。这些数据的管理和处理,对于个人和企业来说,都是至关重要的。这就是数据库管理系统(Database Management System,简称DBMS)的重要性所在。 数据

    2024年02月06日
    浏览(63)
  • qt实现信息管理系统(学生信息管理系统)功能更完善

    信息系统代码地址:https://gitee.com/dxl96/StdMsgSystem 本学生信息管理系统同升级改造的幅度较大,涉及到的东西对于初学者来说,可能稍显复杂,可以先移步到 https://blog.csdn.net/IT_CREATE/article/details/82027462 查看简易的系统。 本系统引入日志管理,数据库选择支持sqllite、mysql,自

    2024年02月13日
    浏览(44)
  • qt实现物业管理系统源代码

              需要源码加我QQ    源代码不要998现在只要299元即可拿到手。

    2024年02月12日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包