數(shù)據(jù)庫表的實現(xiàn)
創(chuàng)建表
創(chuàng)建三個表
將powerDesigner里面的表導(dǎo)出成xxx.sql腳本
此時就會生成文件在桌面了
將SQL文件導(dǎo)入數(shù)據(jù)庫創(chuàng)建表
運行sql文件
設(shè)置主鍵自增
圖書管理系統(tǒng)思維導(dǎo)圖
創(chuàng)建工程
在qt上創(chuàng)建一個工程項目
把這個四個文件發(fā)到controller文件夾下,在創(chuàng)建一個dao文件夾
controller文件夾下面是一些界面類和邏輯類,dao文件夾下就是和數(shù)據(jù)庫交互的
進入項目
加上這一句話
include($$PWD/controller/controller.pri)
正在右鍵項目執(zhí)行qmake
添加一句這個以后生成的目標文件都在這里(當(dāng)前文件目錄的上一級創(chuàng)建一個bin 文件夾
開發(fā)階段
創(chuàng)建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;}
主頁頁面布局
主函數(shù)測試login
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//實現(xiàn)登錄
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;
}
實現(xiàn)Dlg_login函數(shù)
void Dlg_login::on_btn_login_clicked()
{
setResult(1);
this->hide();
}
void Dlg_login::on_btn_exit_clicked()
{
setResult(0);
this->hide();
}
設(shè)置logo
在資源文件中添加一個app.rc文件,在打開這個app.rc文件 添加一句話:
IDI_ICON1 ICON DISCARDABLE “tubiao.ico”
再把這個ico圖標放到這個資源文件里
打包程序
如果還 運行不了,可能是有些庫沒有權(quán)限沒靠過來,手動考
子頁面的樣子
將子頁面放到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);
//設(shè)置首頁是用戶管理
ui->stackedWidget->setCurrentIndex(0);
qDebug()<<"helloworld";
auto l=ui->tool->children();//獲得子控件
for(auto it:l){
//為每個頁面進行綁定槽函數(shù)
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;
}
在添加完之后在進行切換操作,頁面之間切換
按鈕直接形成互斥效果
用屬性選擇器來改變樣式
設(shè)置user頁面的標頭和設(shè)置文本不可編輯
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//一次選中一行
ui->tableView->setModel(&m_model);
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//設(shè)置不可編輯
m_model.setHorizontalHeaderLabels(QStringList{"用戶id","年級","部門","權(quán)限","人物類型","密碼","用戶名"});
創(chuàng)建SqlMgr類進行SQL操作
涉及到的函數(shù)函數(shù)和變量
class SqlMgr
{
public:
SqlMgr();
//設(shè)置單例模式
static SqlMgr* instance;
static SqlMgr* getInstance(){
if(nullptr==instance){
instance=new SqlMgr();
}
return instance;
}
void test1();
void init();//初始化數(shù)據(jù)庫
//登錄
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;
初始化數(shù)據(jù)庫
void SqlMgr::init()
{
m_db=QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(QCoreApplication::applicationDirPath()+"/db/WpcBook.db");
qDebug()<<m_db.open();
}
失敗啦?。?!
成功啦,失敗原因是之前把一些文件打包到bin目錄下了,所以就不走系統(tǒng)的了缺少一些文件就會報錯,把bin目錄下的文件刪除就走系統(tǒng)的了
m_db.setDatabaseName(QCoreApplication::applicationDirPath()
app目錄是這個路徑
登錄功能login
先不實現(xiàn)鍵盤輸入登錄功能,先測試一下,查詢數(shù)據(jù)庫里面是否有這個用戶,有就返回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);//執(zhí)行查詢語句 執(zhí)行成功返回true
if(ret==false){
qDebug()<<q.lastError();
}
return ret;
}
用戶功能
getUsers功能
(數(shù)據(jù)庫層)SqlMgr代碼:
//獲取所有用戶
QVector<QStringList> SqlMgr::getUsers(QString StrCondition){
QSqlQuery q(m_db);
//StrCondition里可以寫模糊查詢的東西
QString sql=QString("select *from user %1").arg(StrCondition);
//獲取到的數(shù)據(jù)可能是多行
QVector<QStringList> vec;
bool ret=q.exec(sql);
if(ret==false){
qDebug()<<q.lastError();
}else{
//讀取返回來的數(shù)據(jù)
//獲取這個數(shù)據(jù)是幾行
int col =q.record().count();
QStringList temp;
while(q.next()){//向下讀
temp.clear();
for(int i=0;i<col;i++){
//將這一行數(shù)據(jù)轉(zhuǎn)換為QString放到
temp<<q.value(i).toString();
}
vec.push_back(temp);
}
qDebug()<<"sqlMgr getuser被執(zhí)行";
}
return vec;
}
(控制層代碼)cell_UserMgr:
//初始化用戶管理頁面
void cell_UserMgr::initPage(QString strCondition){
qDebug()<<"initUSer被執(zhí)行";
//調(diào)用數(shù)據(jù)庫進行查詢
QVector<QStringList>vec= SqlMgr::getInstance()->getUsers(strCondition);
m_model.clear();//在設(shè)置一次頭
m_model.setHorizontalHeaderLabels(QStringList{"用戶id","年級","部門","權(quán)限","人物類型","密碼","用戶名"});
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);
}
}
導(dǎo)入用戶(導(dǎo)入文件里面的數(shù)據(jù)到數(shù)據(jù)庫)
使用: QFileDialog::getOpenFileName(nullptr,“輸入文件路徑”);會出現(xiàn)彈窗
**dao代碼(SqlMgr) **
//導(dǎo)入用戶(.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();
}
}
}
控制層代碼:
//導(dǎo)入用戶
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();//一次讀一行
//轉(zhuǎn)換為QString 里面的數(shù)據(jù)類型是 : xxx,xxx,xxx,xxx用,分割
QString str(bytes);
qDebug()<<"str = "<<str;
//分割
QStringList strList=str.split(",");
//判斷
if(strList.size()!=6){
QMessageBox::information(nullptr,"信息","導(dǎo)入失敗",QMessageBox::Ok);
return;
}
//把一行數(shù)據(jù)的最后的元素的最后兩個字節(jié)去掉\n\r去掉
strList[strList.size()-1]=strList[strList.size()-1].chopped(2);
//存
vec.push_back(strList);
}
//調(diào)用數(shù)據(jù)庫
SqlMgr::getInstance()->addUsers(vec);
f.close();
//刷新頁面
//ui->le_search->clear();
initPage();
}
}
先寫數(shù)據(jù)層庫層
效果:
刪除用戶(del)
數(shù)據(jù)庫:
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()
{
//獲取鼠標點擊到的哪一行的
//第一列的數(shù)據(jù)
int r=ui->tableView->currentIndex().row();//獲取當(dāng)前行號
if(r<0){
QMessageBox::information(nullptr,"提示","請選中一行...",QMessageBox::Ok);
}else{
//獲取r行 的0列
auto id=m_model.item(r,0)->text();
SqlMgr::getInstance()->delUser(id);
//刷新頁面
initPage();
}
}
搜索用戶
控制層:(直接調(diào)用initPage函數(shù))
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);
}
圖書管理功能
獲取圖書
數(shù)據(jù)庫:
//獲取圖書
QVector<QStringList> SqlMgr::getBooks(QString StrCondition)
{
QSqlQuery q(m_db);
QString sql=QString("select *from book %1").arg(StrCondition);
QVector<QStringList> vec;
//執(zhí)行
bool ret=q.exec(sql);
if(!ret){
qDebug()<<q.lastError().text();
}else{
QStringList strList;
//獲取這些數(shù)據(jù)有幾列
int col=q.record().count();
//從q里面獲取數(shù)據(jù)
while(q.next()){
strList.clear();
for(int i=0;i<col;i++){
//把這一行數(shù)據(jù)放進去
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);//執(zhí)行查詢語句
if(ret==false){
qDebug()<<q.lastError();
return;
}
}
控制層:
//初始化圖書管理頁面
void cell_BookMgr::initPage(QString condition){
//調(diào)用dao的getbooks
auto vec=SqlMgr::getInstance()->getBooks(condition);
//拿數(shù)據(jù)顯示到頁面
m_model.clear();//在設(shè)置一次頭
m_model.setHorizontalHeaderLabels(QStringList{"圖書id","圖書名稱","價格","類型1","類型2","類型3","數(shù)量","圖片"});
for(QStringList tlist:vec){//拿出一行QStringList
QList<QStandardItem*> items;
for(int i=0;i<tlist.size();i++){
//追加到items
items.append(new QStandardItem(tlist[i]));
}
qDebug()<<"圖書被調(diào)用";
//加到model
m_model.appendRow(items);
}
}
添加圖書
添加圖書要彈出一個頁面Dlg_addOrUp
數(shù)據(jù)庫層:
//添加圖書
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);//執(zhí)行查詢語句
if(ret==false){
qDebug()<<q.lastError().text();
}
}
控制層:
void cell_BookMgr::on_btn_bookAdd_clicked()
{
//調(diào)用子窗口
Dlg_addOrUp dlg;
dlg.setFlag(-1);//添加就設(shè)置為-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;
//調(diào)用數(shù)據(jù)添加函數(shù)
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);//執(zhí)行查詢語句
if(ret==false){
qDebug()<<q.lastError();
}
}
控制層:
void cell_BookMgr::on_btn_bookUpdate_clicked()
{
//判斷有沒有選中一行將要修改的數(shù)據(jù)
//要知道鼠標點中哪一行
int r=ui->tableView->currentIndex().row();
if(r<0){
QMessageBox::information(nullptr,"信息","請選中要更新的一行",QMessageBox::Ok);
}
else{
qDebug()<<"update被調(diào)用...";
//獲得選中的一行的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];//查出來的是一條數(shù)據(jù)
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;
//調(diào)用數(shù)據(jù)添加函數(shù)
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();
}
}
借閱圖書
創(chuàng)建一個窗口類
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()
{
//點擊確定之后獲取頁面上的數(shù)據(jù)進行調(diào)用數(shù)據(jù)庫
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);//執(zhí)行查詢語句
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);//執(zhí)行查詢語句
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);//執(zhí)行查詢語句
if(ret==false){
qDebug()<<q.lastError().text();
return "";
}
QString userid = "";
if (q.next()) { // 移動到結(jié)果集中的第一條記錄
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()
{
//判斷點擊了哪一行數(shù)據(jù)
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;
}
//否則向下執(zhí)行 要進行登記是誰借了這本書調(diào)用子頁面
Dlg_getSetBook dlg;
//獲得書的名字
auto bookName =m_model.item(r,1)->text();
dlg.setBookId(bookid);//設(shè)置圖書id
dlg.showBorrowBook(bookName);
dlg.exec();
initPage();
}
搜索圖書
控制層:(直接調(diào)用initPage函數(shù))
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;
//執(zhí)行
bool ret=q.exec(sql);
if(!ret){
qDebug()<<q.lastError().text();
}else{
QStringList strList;
//獲取這些數(shù)據(jù)有幾列
int col=q.record().count();
//從q里面獲取數(shù)據(jù)
while(q.next()){
strList.clear();
for(int i=0;i<col;i++){
//把這一行數(shù)據(jù)放進去
strList<<q.value(i).toString();
}
vec.push_back(strList);
}
}
return vec;
}
控制層:
void cell_Record::initPage(QString condition){
auto vec=SqlMgr::getInstance()->getRecord(condition);
//拿數(shù)據(jù)顯示到頁面
m_model.clear();//在設(shè)置一次頭
m_model.setHorizontalHeaderLabels(QStringList{"圖書id","圖書名稱","價格","類型1","類型2","類型3","數(shù)量","圖片"});
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);
}
模糊查詢記錄
通過開始時間和結(jié)束時間與用戶名和密碼進行查詢
void cell_Record::on_le_search_textChanged(const QString &arg1)
{
//同過開始時間和結(jié)束時間與用戶名和密碼進行查詢
QString sql=QString("where start like '%%1%' or end like '%%1%' or user.username = '%1' or book.name= '%1'").arg(arg1);
initPage(sql);
}
歸還圖書
數(shù)據(jù)庫層:
//歸還圖書
QString SqlMgr::returnBook(QString userId,QString bookId){
//根據(jù)userid==bookid刪除記錄 在根據(jù)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);//設(shè)置到頁面上
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()
{
//點擊確定之后獲取頁面上的數(shù)據(jù)進行調(diào)用數(shù)據(jù)庫
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;
}
//獲取當(dāng)前登錄在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){//借閱
//借閱圖書的時候用當(dāng)前登錄的用戶的用戶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();
}
出現(xiàn)的問題
改造一下歸還函數(shù)
//歸還圖書
QString SqlMgr::returnBook(QString userId,QString bookId,QString recordId){
//根據(jù)userid==bookid刪除記錄 在根據(jù)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 "歸還成功";
}
//轉(zhuǎn)換日期格式
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;
}
添加一下這個函數(shù)
#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()
{
//點擊確定之后獲取頁面上的數(shù)據(jù)進行調(diào)用數(shù)據(jù)庫
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;
}
//獲取當(dāng)前登錄在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){//借閱
//借閱圖書的時候用當(dāng)前登錄的用戶的用戶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);//執(zhí)行查詢語句
if(ret==false){
qDebug()<<q.lastError();
return;
}
sql=QString("delete from sqlite_sequence where name= 'record';");
ret=q.exec(sql);//執(zhí)行查詢語句
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);//執(zhí)行查詢語句 執(zhí)行成功返回true
if(ret==false){
qDebug()<<q.lastError().text();
}
//執(zhí)行這個q.next()判斷是否還有可以執(zhí)行成功
ret=q.next();
return ret;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-699952.html
頁面展示
文章來源地址http://www.zghlxwxcb.cn/news/detail-699952.html
到了這里,關(guān)于Qt實現(xiàn)圖書管理系統(tǒng)(C++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!