关于乱码问题:

        后来亲测加上qstringliteral有效,而官方给出的tr函数,似乎对中文没啥用

出现编码错误,如字符常量这些,是qt自身的问题,用记事本存为utf-8应该就好了。

其余的话,就是连数据库的问题,需要自己配置好

QAQ剩下的错误就不太懂了,因为我在几个电脑上都编译通过了

一.图书管理数据库概念模式设计

图书管理系统包括了游客、用户登录、管理员登录三种模式。

在游客模式下,可以实现检索书籍的功能。

游客可以注册用户,但是借书权限需要管理员授予。

用户登录后,在检索书籍功能的基础上,还可以进行书籍的借阅,并且查看自己的借还情况。

管理员登录后,可以对图书进行管理,即入库新的书籍,也可以对用户进行管理,即授予用户借书证,注销用户。

二.数据库设计

        管理员(manager)

属性

主码/外码

数据类型

说明

Username

主码

varchar(20)

用户名

Password

varchar(20) not null

密码

        用户(user)

属性

主码/外码

数据类型

说明

Username

主码

varchar(20)

用户名

Password

varchar(20) not null

密码

      图书(book)

属性

主码/外码

数据类型

说明

book_id

主码

char(5)

编号

Name

varchar(20) not null

书名

Price

float(9,2)

价格

Number

int unsigned

数量

storage_date

date

入库时间

manage_name

外码,参照manager

varchar(20)

入库人员

Publisher

varchar(15) not null

出版社

publish_year

year

出版日期

Type

varchar(10) not null

分类

      作者信息(book_author)

属性

主码/外码

数据类型

说明

Book_id

主码

外码,参照book

char(5)

编号

Author_name

主码

varchar(20)

作者

      借阅(loan)

属性

主码/外码

数据类型

说明

Username

主码

varchar(20)

用户名

book_id

主码

char(5)

编号

loan_number

主码

int unsigned

单册编号

loan_date

date

借阅日期

三.开发技术

本次图书管理系统用MySql和qt进行开发。两者都是知名的跨平台、开源的项目。

mysql被广泛应用于web开发中,相比起其他数据库,其体积较小,而且被多种语言支持,是非常流行的开源关系型数据库。

qt是基于C++的图形界面开发库,它提供了基本窗口控件对象绘制、网络、多线程开发、数据库连接、XML使用等功能。

基于mysql开发的qt应用程序的搭建非常简单,只需安装32位的mysql和qt creator,然后把mysql提供的libmysql.dll放到qt的bin下,而不需要安装特别的插件,因为qt已经默认安装了mysql的驱动。

对于mysql,qt提供了两种驱动,一种是QMYSQL驱动程序,另一种是QODBC驱动程序,在这里我们选择了前者。

qt的数据库驱动程序

qt提供了两种操纵数据库的方式,一种是使用QSqlQuery类,就可以直接使用底层的SQL语句,另一种是使用QsqlTableModel,使用者不需要了解SQL语法,qt对sql语句进行了很好的封装,在这里我们选择了QSqlQuery。

四.详细设计

1.图书搜索

只提供图书检索功能,游客可以选择注册,但是借书权限需要管理员添加。

图书检索实例:

检索采用了‘%string%’形式,可以搜索到包含用户输入字符串的信息。

用户可以不用填写所有信息,只需填写一部分感兴趣的信息即可。代码会根据用户的输入生成相应的SQL查询代码。

为了便于编程,搜索采取的是所有信息的交集,如果想要检索并集,只能分别查询。这样的设计已经基本能够满足用户的搜索需求了。

左侧的类型和右侧的搜索栏是独立的,它们点击后的搜索是单独进行的,而不是取交集。

该系统会对用户输入的语句进行简单的判断,在一些异常情况下,会给出一些提示:

如果是错误的输入,会有sql底层的警告信息:

如果没有查找到结果,也会给出提示。

注:因为没有写预备语句,查询不能保证安全性,对于有意的破坏性语句(sql注入),可能会导致数据库的崩溃。

2.用户注册

注册过程中也会对用户输入的信息做出相应的判断:

注册完成后,会向user表中插入user信息,借书权限默认为false。

3.用户/管理员登录

登录时,会根据用户输入的用户名,在数据库在搜索密码,如果没有搜到,提示用户名不存在,如果搜到的密码和用户输入不匹配,提示密码错误。

切换用户和管理员登录,只需在上面的分栏选择。

游客身份,显示图书搜索界面

用户身份,显示图书搜索、借阅情况界面

管理员身份,显示图书搜索、用户管理、单册入库、多册入库界面

4.借阅情况

在借阅情况窗口,用户可以查到自己的借阅信息,包括书本编号、名称,以及借阅、归还日期。单册编号是为了维护借阅关系的主码,针对一本书被借多次的情况设置的。

同时,用户可在这里进行归还书籍操作。

点击归还后,借阅信息动态更新。同时可以发现,在用户登录后,查询书籍的界面多了一个借阅书籍的按钮,用户可以在查询的过程中进行书本借阅操作,如:

借阅成功后,库存量会减少,然后用户借阅窗口的信息也会动态更新。

如果用户没有选中书籍,或者用户借阅数量已经达到上限,都会给出警告:

5.用户管理

以管理员身份登录后,可以对用户进行管理,在这里可以看到用户的几乎所有信息。同时也可以执行删除/授予借书权限、用户删除操作。

判断是删除还是授予权限,是由用户当前的状态决定。

如果一个用户有未归还的书籍,管理系统会禁止删除操作:

6.单册入库

信息必须全部填写,否则不允许插入:

只有全部填写才能插入书籍:

在插入的同时,会给书籍设置一个编号,编号通过如下算法得到:

id = select count(*)from book

while(exist id) id++

之所以执行第二步,是因为数据库可能因为删除书籍操作导致中间部分编号的缺失。

同时,还会存入当前的入库人员(管理员),入库时间等信息。入库时间是通过获取系统时间得到的,如果计算机的系统时间被篡改了,我们也没有很好的办法。

插入成功后,输入框会自动清空,便于下一次入库。

很遗憾的是,这里并没有对输入数据进行类型检查(预处理操作),所以输入了什么错误的东西,数据库也会一并接收。

删除书籍只提供了指定书的编号删除的功能。因为删除书时一般都有明确的导向,不像查询书籍,需要实现复合条件搜索功能。

7.多册入库

除了单册入库,我们还提供了多册入库的功能,包括了表格的填写,和文本文件的读入:

表格填写入库。

直接点击表格,就可以对内容进行编辑。

如果管理员插入了和原来相同的书籍,我们会询问管理员是否需要合并,如果点击确认,就将原来书籍的数量更新,否则将取消入库。

表格插入也会检测用户输入是否完整的数据,最后是一条条插入数据的。如果哪一条插入失败,会有单独的提示。

同样,我们可以通过文件读入来批量录入,点击右上角的加载文件,文件需要按照一定的格式书写,并且只支持.txt后缀的文件。

以下是一个预先准备好的文件:

读入后的显示效果如下:

此时文件还没有加载到数据库里,需要点击提交表单。

由于这里限定一页只显示13列,而文本有时会有超过13条书本信息的记录,所以点击了提交后,只提交13本书的信息,剩下的书本记录会在提交后继续加载到表格中。

也就是说,对于多条数据,管理员需要多次提交表单。

mysql建立数据库代码:

CREATE SCHEMA `book_manage` ;
use book_manage;
set autocommit=0;create table `manager`
(
`username` varchar(20),
`password` varchar(20) not null,
primary key(`username`)
);create table `user`
(
`username` varchar(20) not null,
`password` varchar(20) not null,
primary key (`username`)
);create table `book`
(
`book_id` char(5),
`name` varchar(20) not null,
`price` float(9,2) unsigned,
`number` int unsigned not null,
`storage_date` date,
`manage_name` char(20),
`publisher` varchar(15) not null,
`publish_year` year,
`type` varchar(10) not null,
primary key(`book_id`),
foreign key(`manage_name`) references `manager`(`username`)
);create table `book_author`
(
`book_id` char(5),
`author_name` varchar(20),
primary key(`author_name`,`book_id`),
foreign key(`book_id`) references `book`(`book_id`) on delete cascade on update cascade
);create table `loan`
(
`username` char(20),
`book_id` char(5),
`loan_date` date,
`loan_number` int unsigned,
primary key(`username`,`book_id`,`loan_number`),
foreign key(`username`) references `user`(`username`),
foreign key(`book_id`) references `book`(`book_id`)
);

database.pro

#-------------------------------------------------
#
# Project created by QtCreator 2016-04-03T16:38:55
#
#-------------------------------------------------QT       += core gui sqlgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = Database
TEMPLATE = appQTPLUGIN += QSQLMYSQLSOURCES += main.cpp\database.cppHEADERS  += database.hINCLUDEPATH += "C:/Program Files (x86)/MySQL/MySQL Server 5.7/include"LIBS += "C:/Program Files (x86)/MySQL/MySQL Server 5.7/lib/libmysql.lib"

database.h

#ifndef DATABASE_H
#define DATABASE_H
#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QVector>class QWidget;
class QLineEdit;
class QComboBox;
class QPushButton;
class QLabel;
class QGridLayout;
class QTabWidget;
class QVBoxLayout;
class QHBoxLayout;
class QTreeWidget;
class QTreeWidgetItem;
class QGroupBox;
class QToolButton;
class QTableWidget;
class QCheckBox;
class QTableWidgetItem;
class QTimer;class database : public QObject
{Q_OBJECTprivate:enum{MANAGER,USER,VISITOR,USER_LOGIN,USER_REGISTER};QString current_user;int user_type;int current_page;int max_page;int user_current_page;int user_max_page;int user_num;int current_row_number;QTimer *timer;QTableWidget *tablewidget;QGridLayout *gridLayout ;QVBoxLayout *vboxLayout0;QVBoxLayout *vboxLayout1;QVBoxLayout *vboxLayout ;QWidget *titleImage;QVBoxLayout *vboxLayout3;QVBoxLayout *vboxLayout2;QHBoxLayout *hboxLayout1;QHBoxLayout *hboxLayout ;QHBoxLayout *hboxLayout2;QHBoxLayout *hboxLayout3;QLabel *spacelabel2;QLabel *spacelabel3;QGroupBox *groupbox;QGroupBox *groupbox1;QPushButton *clearbutton;QPushButton *searchbutton;QPushButton *registerbutton;QPushButton *loginbutton;QPushButton *quitloginbutton;QLabel *label;QTreeWidget *tree;QTreeWidgetItem *root;QLineEdit *nameLine;QLineEdit *publishLine;QLineEdit *priceLine;QLineEdit *priceLine1;QLineEdit *authorLine;QComboBox *dateBox;QComboBox *dateBox1;QComboBox *isLent;QWidget *window;QPushButton *nextbutton;QPushButton *lastbutton;QSqlDatabase db;QSqlQuery query;QTabWidget *mainTabWidget;QTabWidget *loginTabWidget;QWidget *user_loginWidget;QWidget *manager_loginWidget;QLineEdit *username1;QLineEdit *password1;QLineEdit *username2;QLineEdit *password2;QPushButton *okbutton;QVBoxLayout *vboxLayout4;QVBoxLayout *vboxLayout5;QVBoxLayout *vboxLayout6;QHBoxLayout *hboxLayout4;QHBoxLayout *hboxLayout5;QHBoxLayout *hboxLayout6;QGridLayout *gridLayout2;QTabWidget *manageTabWidget;QWidget *addBookWidget;QLabel *label2;QLineEdit *nameLine2;QComboBox *typeBox2;QLineEdit *priceLine2;QLineEdit *authorLine2;QLineEdit *numLine2;QLineEdit *publishLine2;QComboBox *dateBox2;QWidget *window1;QWidget *window2;QWidget *window3;QWidget *window4;QWidget *window5;QWidget *registerWindow;QLabel *label3;QLineEdit *nameLine3;QLineEdit *passwordLine1;QLineEdit *passwordLine2;QPushButton *registerOkButton;QHBoxLayout *hboxLayout7;QHBoxLayout *hboxLayout8;QVBoxLayout *vboxLayout7;QGridLayout *gridLayout3;QLabel *label4;QVector<QString>result;QLabel *label5;QLineEdit *idLine;QVBoxLayout *vboxLayout9;QHBoxLayout *hboxLayout9;QWidget *deletebookWidget;QPushButton *deleteOkButton;QTableWidget *tablewidget1;QVBoxLayout *vboxLayout10;QHBoxLayout *hboxLayout10;QPushButton *deleteUserButton;QPushButton *grantLentButton;QPushButton *lastPageButton;QPushButton *nextPageButton;QTableWidgetItem *item0[13];QTableWidgetItem *item1[13];QVector<QString*>userMessage;QTableWidgetItem *item2[10];QTableWidgetItem *item3[10];QPushButton *lendBookButton;QTableWidget *tablewidget2;QVector<QString*>loanMessage;QHBoxLayout *hboxLayout11;QVBoxLayout *vboxLayout11;QTableWidgetItem *item4[3];QPushButton *returnBookButton;QTableWidget *tablewidget3;QVBoxLayout *vboxLayout12;QHBoxLayout *hboxLayout12;QPushButton *addBookOkButton;QPushButton *addBookClearButton;QComboBox *bookType[13];QComboBox *publishDate[13];QString bookMessage[7];QLabel *tipLabel;QWidget *fileWindow;QHBoxLayout *hboxLayout13;QPushButton *loadFileButton;QVector<QString*>multiBookMessage;void setLayout();bool createConnection();void setWindowShowBook(int type);void setWindowSearchBook(int type);void setWindowAddBook();void setWindowUserManage();void setWindowLoanBook();void setWindowMutiAddBook();void setWindowTitle();void updateManageWindow();void updateShowBookWindow();void updateLoanBookWindow();void updateTitle(int type);bool addBook();void loadUserMessage();void loadLoanMessage();QWidget* createLoginWindow(int type);public:database(QObject *parent = 0);~database();private slots:void searchBook();void updateTime();void clear();void quitLogin();void returnBook();void managerLogin();void deleteLogin();void bookLastPage();void bookNextPage();void deleteBook();void searchBookByType(QTreeWidgetItem*,int);void userLogin();void setWindowRegister();void setWindowLogin();void Register();void deleteUser();void grantLent();void userNextPage();void userLastPage();void lendBook();void oneAddBook();void mutiAddBook();void clearAddBookMessage();void openFile();
};#endif // DATABASE_H

database.cpp

/*  _______________________|                       ||  author:fish1996      ||  start:2016/04/03     ||  finish:2016/04/22    ||  tool:mysql+qtCreator ||  图书管理系统           ||                       |———————————————————————
*/
#include "database.h"
#include <QWidget>
#include <QLineEdit>
#include <QLayout>
#include <QComboBox>
#include <QLabel>
#include <QFrame>
#include <QGroupBox>
#include <QPushButton>
#include <QTabWidget>
#include <QTreeWidget>
#include <QPalette>
#include <QBrush>
#include <QPixmap>
#include <QDateTime>
#include <QtSql>
#include <QStringList>
#include <QPluginLoader>
#include <QMessageBox>
#include <QCheckBox>
#include <QTableWidget>
#include <QTimer>
#include <QDir>
#include <QFileDialog>/* 构造函数 */
database::database(QObject *parent): QObject(parent)
{//初始化变量user_num = 0;user_type = VISITOR;current_user = "游客";//新建计时器timer = new QTimer();connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));timer->start(1000);//初始化指针tablewidget = NULL;tablewidget2 = NULL;nextbutton = NULL;lastbutton = NULL;hboxLayout6 = NULL;lastbutton = NULL;nextbutton = NULL;deleteUserButton = NULL;grantLentButton = NULL;lendBookButton = NULL;returnBookButton = NULL;window4 = NULL;for(int i=0;i<10;i++){item2[i] = NULL;item3[i] = NULL;}//窗口布局setLayout();//连接数据库createConnection();
}/* 析构函数 */
database::~database()
{//取消与数据库的连接db.removeDatabase("book_manage");
}/*  _______________________|                       ||   第一部分:页面布局     ||                       |———————————————————————
*//* 初始化布局 */
void database::setLayout()
{//显示标题栏setWindowTitle();//以游客身份新建搜索窗口setWindowSearchBook(VISITOR);
}/* 标题窗口布局*/
void database::setWindowTitle()
{//申请内存QPalette palette;loginbutton = new QPushButton(tr("登录"));registerbutton = new QPushButton(tr("注册"));spacelabel2 = new QLabel();spacelabel3 = new QLabel("\n\n");vboxLayout0 = new QVBoxLayout();hboxLayout2 = new QHBoxLayout();hboxLayout3 = new QHBoxLayout();titleImage = new QWidget();window = new QWidget();vboxLayout3 = new QVBoxLayout();mainTabWidget = new QTabWidget();//登录注册按钮状态设置registerbutton->setFlat(true);registerbutton->setFixedSize(QSize(60,30));loginbutton->setFlat(true);loginbutton->setFixedSize(QSize(60,30));//建立信号与槽connect(registerbutton,SIGNAL(clicked()),this,SLOT(setWindowRegister()));//点击注册按钮,显示注册窗口connect(loginbutton,SIGNAL(clicked()),this,SLOT(setWindowLogin()));//点击登录按钮,显示登录窗口//设置标题图片QDir d;titleImage->setAutoFillBackground(true);palette.setBrush(QPalette::Background,QBrush(QPixmap(d.currentPath()+"/title.jpg")));titleImage->setPalette(palette);titleImage->setLayout(hboxLayout2);//标题栏布局hboxLayout3->addWidget(spacelabel2);hboxLayout3->addWidget(loginbutton);hboxLayout3->addWidget(registerbutton);vboxLayout3->addWidget(spacelabel3);vboxLayout3->addLayout(hboxLayout3);hboxLayout2->addStretch();hboxLayout2->addLayout(vboxLayout3);//将标题图片和标签窗口加入总布局vboxLayout0->addWidget(titleImage);vboxLayout0->addWidget(mainTabWidget);//总窗口显示window->setAutoFillBackground(true);window->setLayout(vboxLayout0);window->setWindowTitle(tr("图书管理系统"));window->setFixedSize(1024*1.2,768*1.2);window->show();
}/* 登录窗口布局 */
void database::setWindowLogin()
{//登录时禁用登录和注册按钮loginbutton->setDisabled(true);registerbutton->setDisabled(true);//新建用户和管理员登录窗口user_loginWidget = createLoginWindow(1);manager_loginWidget = createLoginWindow(2);//加入两个登录窗口加入分栏布局,并显示loginTabWidget = new QTabWidget();loginTabWidget->addTab(user_loginWidget,"用户登录");loginTabWidget->addTab(manager_loginWidget,"管理员登录");//禁用关闭按钮loginTabWidget->setWindowFlags(loginTabWidget->windowFlags()&~Qt::WindowCloseButtonHint);loginTabWidget->show();}/* 搜索书籍界面布局 */
void database::setWindowSearchBook(int type)
{//如果身份为用户,需要销毁之前的窗口新建if(type==USER_LOGIN||type==USER_REGISTER){delete window1;}//常量const int num = 8;const int columnNum = 3;const int typenum =23;//申请内存window1 = new QWidget();gridLayout = new QGridLayout();vboxLayout1 = new QVBoxLayout();vboxLayout = new QVBoxLayout();hboxLayout1 = new QHBoxLayout();hboxLayout = new QHBoxLayout();groupbox = new QGroupBox();groupbox1 = new QGroupBox();clearbutton = new QPushButton(tr("清空"));searchbutton = new QPushButton(tr("搜索"));tablewidget = new QTableWidget();tree = new QTreeWidget();root = new QTreeWidgetItem(QStringList()<<"所有类型");QTreeWidgetItem *leaf[typenum];//建立信号与槽connect(searchbutton,SIGNAL(clicked()),this,SLOT(searchBook()));//点击搜索按钮,进行搜索操作connect(clearbutton,SIGNAL(clicked()),this,SLOT(clear()));//点击清除按钮,进行清除操作connect(tree,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(searchBookByType(QTreeWidgetItem*,int)));//点击树状列表,进行查找书籍操作//更新窗口信息updateTitle(type);//设置左边的树状图书分类栏tree->setHeaderLabels(QStringList()<<"图书类型");tree->addTopLevelItem(root);tree->setFixedWidth(280);tree->setColumnWidth(1,10);QString str2[] = {"马列主义毛邓思想","哲学","社会科学总论","政治法律","军事","经济","文化科学体育教育","语言文字","文学","艺术","历史地理","自然科学总论","数理科学与化学","天文学与地理科学","生物科学","医药卫生","工业技术","交通运输","航空航天","环境科学"};for(int i=0;i<20;i++){leaf[i] = new QTreeWidgetItem(QStringList()<<str2[i]);root->addChild(leaf[i]);}tree->expandAll();//设置高级搜索栏window = new QWidget();nameLine = new QLineEdit();publishLine = new QLineEdit();authorLine = new QLineEdit();dateBox = new QComboBox();dateBox1 = new QComboBox();priceLine = new QLineEdit();priceLine1 = new QLineEdit();isLent = new QComboBox();label = new QLabel[num];QString str[] = {"书名","出版社","作者","年份"," --","状态","价位"," --"};for(int i=0;i<num;i++){label[i].setText(str[i]);gridLayout->addWidget(label+i,i/columnNum+1,2*(i%columnNum)+1);}dateBox->addItem("    ");dateBox1->addItem("    ");for(int i=0;i<60;i++){dateBox->addItem(QString::number(2016-i));dateBox1->addItem(QString::number(2016-i));}isLent->addItem("    ");isLent->addItem("已借出");isLent->addItem("未借出");//表格布局,放置搜索选项gridLayout->addWidget(nameLine,1,2);       //书名gridLayout->addWidget(publishLine,1,4);       //类型gridLayout->addWidget(authorLine,1,6);     //作者名称gridLayout->addWidget(dateBox,2,2);        //年份(起)gridLayout->addWidget(dateBox1,2,4);       //年份(终)gridLayout->addWidget(isLent,2,6);        //借阅状态gridLayout->addWidget(priceLine,3,2);     //价格(从)gridLayout->addWidget(priceLine1,3,4);     //价格(到)//搜索选项加入群组中groupbox->setLayout(gridLayout);groupbox->setFixedSize(600,140);//垂直布局,放置两个按钮vboxLayout1->addStretch();vboxLayout1->addWidget(searchbutton);vboxLayout1->addWidget(clearbutton);vboxLayout1->addStretch();groupbox1->setLayout(vboxLayout1);groupbox1->setFixedSize(200,140);//水平布局,依次加入搜索选项和按钮的垂直布局hboxLayout1->addWidget(groupbox);hboxLayout1->setSpacing(30);hboxLayout1->addWidget(groupbox1);//垂直布局,依次加入搜索框和显示框vboxLayout->addLayout(hboxLayout1);vboxLayout->addWidget(tablewidget);setWindowShowBook(type);vboxLayout->addLayout(hboxLayout6);//水平布局,加入左边栏和右窗口hboxLayout->addWidget(tree);hboxLayout->addLayout(vboxLayout);//窗口1加入水平布局window1->setLayout(hboxLayout);mainTabWidget->addTab(window1,"图书搜索");//如果对象为用户,那么新建借书窗口if(type==USER_LOGIN||type==USER_REGISTER){setWindowLoanBook();}
}/* 单册添加书籍界面布局 */
void database::setWindowAddBook()
{//申请内存QLabel *label3 = new QLabel;label3->setText("(如果有多个作者,请用空格分开)");addBookWidget = new QWidget();deletebookWidget = new QWidget();window3 = new QWidget();vboxLayout4 = new QVBoxLayout();vboxLayout5 = new QVBoxLayout();vboxLayout6 = new QVBoxLayout();vboxLayout9 = new QVBoxLayout();hboxLayout4 = new QHBoxLayout();hboxLayout5 = new QHBoxLayout();hboxLayout9 = new QHBoxLayout();deleteOkButton = new QPushButton("确定");manageTabWidget = new QTabWidget();gridLayout2 = new QGridLayout();okbutton = new QPushButton(tr("确定"));nameLine2 = new QLineEdit();typeBox2 = new QComboBox();priceLine2 = new QLineEdit();authorLine2 = new QLineEdit();numLine2 = new QLineEdit();publishLine2 = new QLineEdit();dateBox2 = new QComboBox();idLine = new QLineEdit();label2 = new QLabel[7];label5 = new QLabel;label5->setText("请输入待删除书目的编号");//建立信号与槽connect(deleteOkButton,SIGNAL(clicked()),this,SLOT(deleteBook()));//点击确认删除按钮,进行删除书籍操作connect(okbutton,SIGNAL(clicked()),this,SLOT(oneAddBook()));//点击确认按钮,进行添加书本操作//设置选项框信息QString str[7] = {"书名","价格","数量","出版社","出版日期","分类","作者"};QString str2[20] = {"马列主义毛邓思想","哲学","社会科学总论","政治法律","军事","经济","文化科学体育教育","语言文字","文学","艺术","历史地理","自然科学总论","数理科学与化学","天文学与地理科学","生物科学","医药卫生","工业技术","交通运输","航空航天","环境科学"};for(int i = 0;i < 7;i++){label2[i].setText(str[i]);}for(int i=0;i<20;i++){typeBox2->addItem(str2[i]);}for(int i=0;i<60;i++){dateBox2->addItem(QString::number(2016-i));}//窗口布局//设置选项框表格gridLayout2->addWidget(label2,1,1);gridLayout2->addWidget(label2+1,1,3);gridLayout2->addWidget(label2+2,2,1);gridLayout2->addWidget(label2+3,2,3);gridLayout2->addWidget(label2+4,3,1);gridLayout2->addWidget(label2+5,3,3);gridLayout2->addWidget(label2+6,4,1);gridLayout2->addWidget(nameLine2,1,2);gridLayout2->addWidget(priceLine2,1,4);gridLayout2->addWidget(numLine2,2,2);gridLayout2->addWidget(publishLine2,2,4);gridLayout2->addWidget(dateBox2,3,2);gridLayout2->addWidget(typeBox2,3,4);gridLayout2->addWidget(authorLine2,4,2);gridLayout2->addWidget(label3,4,3,1,2);//加入确认按钮hboxLayout5->addStretch();hboxLayout5->addWidget(okbutton);hboxLayout5->addStretch();vboxLayout6->addLayout(gridLayout2);vboxLayout6->addLayout(hboxLayout5);addBookWidget->setLayout(vboxLayout6);hboxLayout9->addStretch();hboxLayout9->addWidget(deleteOkButton);hboxLayout9->addStretch();vboxLayout9->addStretch();vboxLayout9->addWidget(label5);vboxLayout9->addWidget(idLine);vboxLayout9->addLayout(hboxLayout9);vboxLayout9->addStretch();//添加分页窗口deletebookWidget->setLayout(vboxLayout9);manageTabWidget->addTab(addBookWidget,"添加图书");manageTabWidget->addTab(deletebookWidget,"删除书籍");vboxLayout5->addSpacing(100);vboxLayout5->addWidget(manageTabWidget);vboxLayout5->addSpacing(300);hboxLayout4->addStretch();hboxLayout4->addLayout(vboxLayout5);hboxLayout4->addStretch();window3->setLayout(hboxLayout4);
}/* 多册添加书籍界面布局 */
void database::setWindowMutiAddBook()
{//申请内存tipLabel = new QLabel();window5 = new QWidget();tablewidget3 = new QTableWidget();vboxLayout12 = new QVBoxLayout();hboxLayout12 = new QHBoxLayout();hboxLayout13 = new QHBoxLayout();addBookOkButton = new QPushButton("提交表单");addBookClearButton = new QPushButton("清空表单");loadFileButton = new QPushButton("加载文件");//建立信号与槽connect(addBookOkButton,SIGNAL(clicked()),this,SLOT(mutiAddBook()));connect(addBookClearButton,SIGNAL(clicked()),this,SLOT(clearAddBookMessage()));connect(loadFileButton,SIGNAL(clicked()),this,SLOT(openFile()));//设置选项信息tipLabel->setText("请双击表格进行内容填写,或者通过文本加载。""如果有多个作者,请用空格分开\n""文本格式:按表格属性填写,同样属性按空格分开。""输入下本书籍信息要换行区分");tipLabel->setFrameShape (QFrame::Box);QStringList header;tablewidget3->setRowCount(13);tablewidget3->setColumnCount(7);header<<"书名"<<"价格"<<"数量"<<"出版社"<<"出版日期"<<"分类"<<"作者";//初始化表格信息for(int i=0;i<13;i++){for(int j=0;j<7;j++){if(j==4){publishDate[i] = new QComboBox();for(int k=0;k<60;k++){publishDate[i]->addItem(QString::number(2016-k));}tablewidget3->setCellWidget(i,j,publishDate[i]);}else if(j==5){QString str[] = {"马列主义毛邓思想","哲学","社会科学总论","政治法律","军事","经济","文化科学体育教育","语言文字","文学","艺术","历史地理","自然科学总论","数理科学与化学","天文学与地理科学","生物科学","医药卫生","工业技术","交通运输","航空航天","环境科学"};bookType[i] = new QComboBox();for(int k=0;k<20;k++){bookType[i]->addItem(str[k]);}tablewidget3->setCellWidget(i,j,bookType[i]);}else{QTableWidgetItem *item = new QTableWidgetItem("");tablewidget3->setItem(i,j,item);}}}tablewidget3->setHorizontalHeaderLabels(header);//加入按钮和表格hboxLayout12->addStretch();hboxLayout12->addWidget(addBookOkButton);hboxLayout12->addWidget(addBookClearButton);hboxLayout13->addWidget(tipLabel);hboxLayout13->addWidget(loadFileButton);vboxLayout12->addLayout(hboxLayout13);vboxLayout12->addWidget(tablewidget3);vboxLayout12->addLayout(hboxLayout12);window5->setLayout(vboxLayout12);
}/* 借阅书籍界面布局 */
void database::setWindowLoanBook()
{//申请内存window4 = new QWidget();mainTabWidget->addTab(window4,"借阅情况");tablewidget2 = new QTableWidget(3,7);hboxLayout11 = new QHBoxLayout();vboxLayout11 = new QVBoxLayout();returnBookButton = new QPushButton("归还书籍");//建立信号与槽connect(returnBookButton,SIGNAL(clicked()),this,SLOT(returnBook()));//点击还书按钮,进行还书操作//加入按钮和表格hboxLayout11->addStretch();hboxLayout11->addWidget(returnBookButton);hboxLayout11->addStretch();vboxLayout11->addWidget(tablewidget2);vboxLayout11->addLayout(hboxLayout11);vboxLayout11->addStretch();window4->setLayout(vboxLayout11);//更新借阅表格updateLoanBookWindow();
}/* 用户管理界面布局 */
void database::setWindowUserManage()
{//申请内存lastPageButton = new QPushButton("上一页");nextPageButton = new QPushButton("下一页");deleteUserButton = new QPushButton("删除用户信息");grantLentButton = new QPushButton("授予/删除借书权限");tablewidget1 = new QTableWidget(13,11);window2 = new QWidget();hboxLayout10 = new QHBoxLayout();vboxLayout10 = new QVBoxLayout();//建立信号与槽connect(lastPageButton,SIGNAL(clicked()),this,SLOT(userLastPage()));//点击上一页按钮,翻到上一页connect(nextPageButton,SIGNAL(clicked()),this,SLOT(userNextPage()));//点击下一页按钮,翻到下一页connect(deleteUserButton,SIGNAL(clicked()),this,SLOT(deleteUser()));//点击删除用户按钮,进行删除用户操作connect(grantLentButton,SIGNAL(clicked()),this,SLOT(grantLent()));//点击借书授权按钮,进行借书授权操作//载入用户信息,并更新用户管理表格loadUserMessage();updateManageWindow();//加入按钮hboxLayout10->addStretch();hboxLayout10->addWidget(deleteUserButton);hboxLayout10->addWidget(grantLentButton);hboxLayout10->addWidget(lastPageButton);hboxLayout10->addWidget(nextPageButton);//布局vboxLayout10->addWidget(tablewidget1);vboxLayout10->addLayout(hboxLayout10);window2->setLayout(vboxLayout10);
}/* 用户注册界面布局 */
void database::setWindowRegister()
{//申请内存registerWindow = new QWidget();gridLayout3 = new QGridLayout();label4 = new QLabel[3];label4[0].setText("用户名");label4[1].setText("密码");label4[2].setText("密码确认");label3 = new QLabel("请输入注册信息(借书权\n""限将由管理员添加)");nameLine3 = new QLineEdit();passwordLine1 = new QLineEdit();passwordLine2 = new QLineEdit();passwordLine1->setEchoMode(QLineEdit::Password);passwordLine2->setEchoMode(QLineEdit::Password);registerOkButton = new QPushButton("确定");hboxLayout7 = new QHBoxLayout();hboxLayout8 = new QHBoxLayout();vboxLayout7 = new QVBoxLayout();//页面布局hboxLayout7->addStretch();hboxLayout7->addWidget(registerOkButton);hboxLayout7->addStretch();gridLayout3->addWidget(&label4[0],1,1);gridLayout3->addWidget(&label4[1],2,1);gridLayout3->addWidget(&label4[2],3,1);gridLayout3->addWidget(nameLine3,1,2);gridLayout3->addWidget(passwordLine1,2,2);gridLayout3->addWidget(passwordLine2,3,2);vboxLayout7->addWidget(label3);vboxLayout7->addLayout(gridLayout3);vboxLayout7->addLayout(hboxLayout7);hboxLayout8->addStretch();hboxLayout8->addLayout(vboxLayout7);hboxLayout8->addStretch();registerWindow->setLayout(hboxLayout8);registerWindow->resize(400,300);registerWindow->show();//建立信号与槽connect(registerOkButton,SIGNAL(clicked()),this,SLOT(Register()));//点击确认登录按钮,进行登录操作
}/* 显示书籍信息界面布局 */
void database::setWindowShowBook(int type)
{//申请内存hboxLayout6 = new QHBoxLayout();lastbutton = new QPushButton(tr("上一页"));nextbutton = new QPushButton(tr("下一页"));//建立信号与槽connect(lastbutton,SIGNAL(clicked()),this,SLOT(bookLastPage()));//点击上一页按钮,翻到上一页connect(nextbutton,SIGNAL(clicked()),this,SLOT(bookNextPage()));//点击下一页按钮,翻到下一页//页面布局hboxLayout6->addStretch();hboxLayout6->addWidget(lastbutton);hboxLayout6->addWidget(nextbutton);//如果当前使用者为用户,加入借阅书籍按钮if(type==USER_LOGIN||type==USER_REGISTER){lendBookButton = new QPushButton(tr("借阅书籍"));connect(lendBookButton,SIGNAL(clicked()),this,SLOT(lendBook()));hboxLayout6->addWidget(lendBookButton);}//初始化当前页和最大页current_page = 1;max_page = 1;//更新显示书目窗口updateShowBookWindow();
}/* 更新书籍信息界面 */
void database::updateShowBookWindow()
{QStringList header;//清除表格信息tablewidget->clear();//设置表格为不可选择、不可修改tablewidget->setEditTriggers(QAbstractItemView::NoEditTriggers);tablewidget->setSelectionMode(QAbstractItemView::NoSelection);//根据当前使用者的不同使用不同的标题栏if(user_type==USER){tablewidget->setRowCount(10);tablewidget->setColumnCount(11);header<<""<<"编号"<<"书名"<<"价格"<<"库存"<<"入库时间"<<"入库人员"<<"出版社"<<"出版年份"<<"类型"<<"作者";}else{tablewidget->setRowCount(10);tablewidget->setColumnCount(10);header<<"编号"<<"书名"<<"价格"<<"库存"<<"入库时间"<<"入库人员"<<"出版社"<<"出版年份"<<"类型"<<"作者";}//加入标题栏tablewidget->setHorizontalHeaderLabels(header);//设置宽度for(int i=0;i<10;i++){tablewidget->setColumnWidth(i,120);}//求出当前页的最多显示条目int max;if(result.length()==0)return;if(current_page==max_page){max = result.length()%100/10;if(max==0)max=10;}else max = 10;//根据当前使用者的不同在表格上显示不同信息if(user_type==USER){for(int i=0;i<max;i++){item2[i] = new QTableWidgetItem();item2[i]->setCheckState(Qt::Unchecked);item3[i] = new QTableWidgetItem(result.at(10*i+100*(current_page-1)));tablewidget->setItem(i,0,item2[i]);tablewidget->setItem(i,1,item3[i]);for(int j=1;j<10;j++){QTableWidgetItem *item = new QTableWidgetItem(result.at(10*i+j+100*(current_page-1)));tablewidget->setItem(i,j + 1,item);}}}else{for(int i=0;i<max;i++){for(int j=0;j<10;j++){QTableWidgetItem *item = new QTableWidgetItem(result.at(10*i+j+100*(current_page-1)));tablewidget->setItem(i,j,item);}}}
}/* 更新借阅书籍界面 */
void database::updateLoanBookWindow()
{//更新前加载借阅信息loadLoanMessage();QStringList header;//清空表格信息tablewidget2->clear();//设置标题栏header<<""<<"书本编号"<<"书本名称"<<"借阅日期"<<"单册编号"<<"最晚归还日期"<<"剩余归还天数";tablewidget2->setHorizontalHeaderLabels(header);//设置表格为不可修改,不可选择tablewidget2->setEditTriggers(QAbstractItemView::NoEditTriggers);tablewidget2->setSelectionMode(QAbstractItemView::NoSelection);//将信息显示到表格上for(int i=0;i<loanMessage.length();i++){item4[i] = new QTableWidgetItem();item4[i]->setCheckState(Qt::Unchecked);tablewidget2->setItem(i,0,item4[i]);for(int j=0;j<6;j++){QTableWidgetItem *item = new QTableWidgetItem(loanMessage.at(i)[j]);tablewidget2->setItem(i,j + 1,item);}}
}/* 更新用户管理界面 */
void database::updateManageWindow()
{//计算当前页面能显示的最多用户数int max;if(user_current_page==user_max_page){max = (user_num%13==0)?13:user_num%13;}else{max = 13;}//清除表格信息tablewidget1->clear();//设置表格为不可选择,不可修改tablewidget1->setEditTriggers(QAbstractItemView::NoEditTriggers);tablewidget1->setSelectionMode(QAbstractItemView::NoSelection);//设置标题栏QStringList header;header<<""<<"用户名"<<"密码"<<"借书权限"<<"借阅数目"<<"借阅书籍1"<<"借阅日期"<<"借阅书籍2"<<"借阅日期"<<"借阅书籍3"<<"借阅日期";tablewidget1->setHorizontalHeaderLabels(header);//将信息显示到表格上for(int i=0;i<max;i++){int row = i + (user_current_page - 1)*13;item0[i] = new QTableWidgetItem();item0[i]->setCheckState(Qt::Unchecked);item1[i] = new QTableWidgetItem(userMessage.at(row)[0]);tablewidget1->setItem(i,0,item0[i]);tablewidget1->setItem(i,1,item1[i]);for(int j=1;j<10;j++){QTableWidgetItem *item = new QTableWidgetItem(userMessage.at(row)[j]);tablewidget1->setItem(i,j+1,item);}}
}/* 更新时间显示 */
void database::updateTime()
{//获取系统时间QDateTime current_date_time = QDateTime::currentDateTime();QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");QString text = "当前用户: " + current_user + " | 当前时间:"+current_date+" ";spacelabel2->setText(text);
}/* 更新标题栏信息 */
void database::updateTitle(int type)
{//获取系统时间QDateTime current_date_time = QDateTime::currentDateTime();QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");QString text;//如果当前使用者为游客,更新标题栏,直接返回if(type==VISITOR){text = "当前用户:游客 | 当前时间:"+current_date+" ";spacelabel2->setText(text);return;}//登录后删除登录、注册按钮delete loginbutton;delete registerbutton;//新建退出登录按钮,点击退出登录按钮,进行退出登录操作quitloginbutton = new QPushButton("退出登录");connect(quitloginbutton,SIGNAL(clicked()),this,SLOT(quitLogin()));hboxLayout3->addWidget(quitloginbutton);quitloginbutton->setFlat(true);//根据当前使用者显示不同的标题栏if(type==USER_LOGIN){text = "当前用户:"+username1->text()+" | 当前时间:"+current_date+" ";current_user = username1->text();user_type = USER;//删除登录窗口delete loginTabWidget;}else if(type==USER_REGISTER){text = "当前用户:"+nameLine3->text()+" | 当前时间:"+current_date+" ";current_user = nameLine3->text();user_type = USER;//删除注册窗口delete registerWindow;}else if(type==MANAGER){text = "当前用户:"+username2->text()+" | 当前时间:"+current_date+" ";current_user = username2->text();user_type = MANAGER;//删除登录窗口delete loginTabWidget;}spacelabel2->setText(text);
}/* 创建登录窗口(登录窗口布局的辅助函数) */
QWidget* database::createLoginWindow(int type)
{//申请内存QWidget *widget = new QWidget();QLabel *username_label = new QLabel;QLabel *password_label = new QLabel;QGridLayout *glayout = new QGridLayout;QPushButton *yesbutton = new QPushButton(tr("确定"));QPushButton *quitbutton = new QPushButton(tr("退出"));QHBoxLayout *hlayout = new QHBoxLayout();QVBoxLayout *vlayout = new QVBoxLayout();//根据不同类型建立不同的输入栏if(type==1){username1 = new QLineEdit();password1 = new QLineEdit();password1->setEchoMode(QLineEdit::Password);glayout->addWidget(username1,1,2);glayout->addWidget(password1,2,2);}else if(type==2){username2 = new QLineEdit();password2 = new QLineEdit();password2->setEchoMode(QLineEdit::Password);glayout->addWidget(username2,1,2);glayout->addWidget(password2,2,2);}username_label->setText(tr("账号"));password_label->setText(tr("密码"));//表格布局加入文字标签glayout->setContentsMargins(50,100,50,100);glayout->setSpacing(40);glayout->addWidget(username_label,1,1);glayout->addWidget(password_label,2,1);//加入按钮和输入栏hlayout->addStretch();hlayout->addWidget(yesbutton);hlayout->addWidget(quitbutton);hlayout->addStretch();vlayout->addLayout(glayout);vlayout->addLayout(hlayout);widget->setLayout(vlayout);//点击退出按钮,进行删除登录窗口操作connect(quitbutton,SIGNAL(clicked()),this,SLOT(deleteLogin()));//点击确认按钮,根据类型不同将信号发送到用户登录和管理员登录中if(type==1){connect(yesbutton,SIGNAL(clicked()),this,SLOT(userLogin()));}else if(type==2){connect(yesbutton,SIGNAL(clicked()),this,SLOT(managerLogin()));}return widget;
}/* 清空搜索框 */
void database::clear()
{nameLine->clear();publishLine->clear();authorLine->clear();priceLine->clear();priceLine1->clear();
}/* 清空多册添加的表单 */
void database::clearAddBookMessage()
{//对每一个表单,设置为空for(int i = 0;i<13;i++){for(int j = 0;j<7;j++){if(j!=5&&j!=4){tablewidget3->item(i,j)->setText("");}}}//如果有图书信息缓存,清空for(int i=0;i<multiBookMessage.length();i++){multiBookMessage.pop_front();}
}/* 删除登录界面*/
void database::deleteLogin()
{//删除登陆界面,并将登录注册按钮设为可使用delete loginTabWidget;loginbutton->setEnabled(true);registerbutton->setEnabled(true);
}/* 退出登录更新界面*/
void database::quitLogin()
{//删除退出登录按钮delete quitloginbutton;//根据当前使用者的不同,删除对应的窗口以及控件if(user_type==MANAGER){delete window3;delete window2;delete window5;}else if(user_type==USER){delete window4;delete lendBookButton;}//获取系统时间QDateTime current_date_time = QDateTime::currentDateTime();QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm:ss ddd");QString text = "当前用户: 游客 | 当前时间:"+current_date+" ";//更新使用者类型为游客user_type = VISITOR;current_user = "游客";spacelabel2->setText(text);//重新建立登录注册按钮,并摆放loginbutton = new QPushButton("登录");registerbutton = new QPushButton("注册");loginbutton->setFlat(true);registerbutton->setFlat(true);registerbutton->setFixedSize(QSize(60,30));loginbutton->setFixedSize(QSize(60,30));hboxLayout3->addWidget(loginbutton);hboxLayout3->addWidget(registerbutton);//重新连接登录注册与对应的槽函数connect(loginbutton,SIGNAL(clicked()),this,SLOT(setWindowLogin()));connect(registerbutton,SIGNAL(clicked()),this,SLOT(setWindowRegister()));
}/* 用户管理翻页(上一页)*/
void database::userLastPage()
{//当前页为1,不存在上一页,返回if(user_current_page==1)return;//当前页减1user_current_page--;//更新用户管理窗口updateManageWindow();
}/* 用户管理翻页(下一页)*/
void database::userNextPage()
{//如果当前页面为最大页面,不存在下一页面,返回if(user_current_page==user_max_page)return;//当前页面加一user_current_page++;//更新用户管理窗口updateManageWindow();
}/* 显示书籍翻页(上一页)*/
void database::bookLastPage()
{//当前页为1,不存在上一页,返回if(current_page==1)return;//当前页减1current_page--;//更新显示书本窗口updateShowBookWindow();
}/* 显示书籍翻页(下一页)*/
void database::bookNextPage()
{//如果当前页面为最大页面,不存在下一页面,返回if(current_page==max_page)return;//当前页面加一current_page++;//更新显示书本窗口updateShowBookWindow();
}/* 打开文件导入书籍数据 */
void database::openFile()
{//新建文件显示窗口fileWindow = new QWidget;QFileDialog dlg(fileWindow,"打开文本");dlg.resize(400,300);dlg.setAcceptMode(QFileDialog::AcceptOpen);//只允许打开.txt后缀的文件dlg.setNameFilter("*txt");//打开文件对话框if(dlg.exec()==QDialog::Accepted ){QStringList files = dlg.selectedFiles();if(!files.isEmpty()){//以只读形式打开选中文件QFile file;file.setFileName(files.at(0));file.open(QIODevice::ReadOnly);if(!file.atEnd()){int count = 0;int rowNum = 0;//读取文本所有信息,并进行转码处理QByteArray buff;buff = file.readAll();QString fileContent = QString::fromLocal8Bit(buff);QString str = "";//对文本进行格式化处理for(int k=0;k<=fileContent.length();k++){//读到换行符或者读完文本,把书籍信息存储if(fileContent.at(k)=='\n'||k==fileContent.length()){bookMessage[6] = str;if(rowNum>=13){ //列数超过显示范围,暂存到容器中QString *tmp = new QString[7];for(int i=0;i<7;i++){tmp[i] = bookMessage[i];}multiBookMessage.push_back(tmp);}else{ //列数未超过显示范围,直接显示在表格中for(int i=0;i<7;i++){if(i==4)publishDate[rowNum]->setCurrentText(bookMessage[i]);else if(i==5)bookType[rowNum]->setCurrentText(bookMessage[i]);else{tablewidget3->item(rowNum,i)->setText(bookMessage[i]);}}rowNum++;count = 0;str = "";}//如果以换行符结束,不需要继续处理if(fileContent.at(k)=='\n'&&k==fileContent.length()-1){break;}}//读到空格且不是作者信息中的空格,跳过空格,并把字符串存储到bookmessage中else if(fileContent.at(k)==' '&&count!=6){bookMessage[count++] = str;str = "";}//读到空格且是作者信息中的空格,直接存储空格信息else if(fileContent.at(k)==' '&&count==6){str = str + fileContent.at(k);}//读到支持的文本内容,将其加入字符串中else if(fileContent.at(k).isLetter()||fileContent.at(k).isNumber()||fileContent.at(k)=='.'||fileContent.at(k)==':'||fileContent.at(k)=='-'||fileContent.at(k)=='"'||fileContent.at(k)=='('||fileContent.at(k)==')'||fileContent.at(k)=='·'){str = str + fileContent.at(k);}}}}}
}/*  _______________________|                       ||   第二部分:业务逻辑     ||                       |———————————————————————
*//* 用户注册 */
void database::Register()
{//检测用户是否输入了全部的信息if(nameLine3->text().isEmpty()||passwordLine1->text().isEmpty()||passwordLine2->text().isEmpty()){QMessageBox::critical(NULL, "Error", "您的信息填写不完整",QMessageBox::Yes);return;}//检测密码是否一致if(passwordLine1->text().compare(passwordLine2->text())!=0){QMessageBox::critical(NULL, "Error", "两次密码输入不一致!",QMessageBox::Yes);return;}//查询用户名是否已存在于数据库QSqlQuery query;query.exec("select username from user where username = '" + nameLine3->text() + "'");if(query.next()){QMessageBox::critical(NULL, "Error", "该用户名已被注册",QMessageBox::Yes);return;}//向user表中插入用户信息query.exec("insert into user values('" + nameLine3->text() + "','" + passwordLine1->text() + "'" +",false)");if(query.isActive()){QMessageBox::about(0,"database","注册成功!");}else{QMessageBox::critical(NULL, "Error", "注册失败",QMessageBox::Yes);return;}//更新检索书籍窗口setWindowSearchBook(USER_REGISTER);
}/* 用户登录 */
void database::userLogin()
{QSqlQuery query2;//根据用户输入的用户名,在user表中查询其密码query2.exec("select password from user where username = '"+username1->text()+"'");if(!query2.isActive()){return;}//判断密码是否与结果一致if(query2.next()){QString sel_password = query2.value(0).toString();if(QString::compare(sel_password,password1->text())!=0){QMessageBox::critical(NULL, "Error", "密码错误",QMessageBox::Yes);return;}}//如果数据库中没有此用户名,给出警告else{QMessageBox::critical(NULL, "Error", "该用户名不存在",QMessageBox::Yes);return;}//更新检索书籍窗口setWindowSearchBook(USER_LOGIN);
}/* 管理员登录 */
void database::managerLogin()
{QSqlQuery query2;//根据用户输入的用户名,在manager表中查询其密码query2.exec("select password from manager where username = '"+username2->text()+"'");if(!query2.isActive()){return;}//判断密码是否与结果一致if(query2.next()){QString sel_password = query2.value(0).toString();if(QString::compare(sel_password,password2->text())!=0){QMessageBox::critical(NULL, "Error", "密码错误",QMessageBox::Yes);return;}}//如果数据库中没有此用户名,给出警告else{QMessageBox::critical(NULL, "Error", "该用户名不存在",QMessageBox::Yes);return;}//更新标题栏信息updateTitle(MANAGER);//添加图书单册入库窗口setWindowAddBook();//添加用户管理窗口setWindowUserManage();//添加图书多册入库窗口setWindowMutiAddBook();//在分页栏中加入以上窗口mainTabWidget->addTab(window2,"用户管理");mainTabWidget->addTab(window3,"单册入库");mainTabWidget->addTab(window5,"多册入库");
}/* 多条件查询书籍 */
void database::searchBook()
{//判断用户是否填写了信息if(nameLine->text().isEmpty()&&publishLine->text().isEmpty()&&authorLine->text().isEmpty()&&(!dateBox->currentText().compare("    ")&&!dateBox1->currentText().compare("    "))&&!isLent->currentText().compare("    ")&&(priceLine->text().isEmpty()&&priceLine1->text().isEmpty())){QMessageBox::critical(0,QObject::tr("error"),"您尚未填写任何信息");return;}//检查日期和价格的填写是否正确else if(((dateBox->currentText().compare("    ")==0&&dateBox->currentText().compare("    ")!=0)||(dateBox->currentText().compare("    ")!=0&&dateBox->currentText().compare("    ")==0))&&(!priceLine->text().isEmpty()&&priceLine1->text().isEmpty()||priceLine->text().isEmpty()&&!priceLine1->text().isEmpty())){QMessageBox::critical(0,QObject::tr("error"),"您的日期和价格范围有误");return;}else if((dateBox->currentText().compare("    ")==0&&dateBox->currentText().compare("    ")!=0)||(dateBox->currentText().compare("    ")!=0&&dateBox->currentText().compare("    ")==0)){QMessageBox::critical(0,QObject::tr("error"),"您的日期范围有误");return;}else if(!priceLine->text().isEmpty()&&priceLine1->text().isEmpty()||priceLine->text().isEmpty()&&!priceLine1->text().isEmpty()){QMessageBox::critical(0,QObject::tr("error"),"您的价格范围有误");return;}int x1,x2,y1,y2;x1=x2=y1=y2=0;if(dateBox->currentText().compare("    ")){x1 = dateBox->currentText().toInt();x2 = dateBox1->currentText().toInt();}if(!priceLine->text().isEmpty()){y1 = priceLine->text().toInt();y2 = priceLine1->text().toInt();}if(x1>x2&&y1>y2){QMessageBox::critical(0,QObject::tr("error"),"您的日期和价格范围有误");return;}else if(x1>x2){QMessageBox::critical(0,QObject::tr("error"),"您的日期范围有误");return;}else if(y1>y2){QMessageBox::critical(0,QObject::tr("error"),"您的价格范围有误");return;}//将用户输入的信息暂存于容器中QVector<QString>list;if(!nameLine->text().isEmpty()){list.push_back("name");list.push_back(nameLine->text());}if(!publishLine->text().isEmpty()){list.push_back("publisher");list.push_back(publishLine->text());}if(!authorLine->text().isEmpty()){list.push_back("author");list.push_back(authorLine->text());}if(dateBox->currentText().compare("    ")!=0){list.push_back("publish_year");list.push_back(dateBox->currentText());list.push_back(dateBox1->currentText());}if(isLent->currentText().compare("    ")!=0){QString str;if(isLent->currentText().compare("未借出")==0){str = ">";}else if(isLent->currentText().compare("已借出")==0){str = "=";}list.push_back("number");list.push_back(str);}if(!priceLine->text().isEmpty()){list.push_back("price");list.push_back(priceLine->text());list.push_back(priceLine1->text());}//根据用户输入的信息在book表和book_author两个表中进行检索int len = list.length();int count = 0;QString ans = "select * from book where " ;QSqlQuery query,query2;while(count<len){if(count!=0)ans = ans + " and ";QString tmp = list.front();list.pop_front();count++;QString tmp1,tmp2;if(tmp.compare("publish_year")==0){tmp1 = list.front();list.pop_front();count++;tmp2 = list.front();list.pop_front();count++;ans = ans + tmp + " >= '" + tmp1 + "' and " +tmp + " <= '" + tmp2 + "'";}else if(tmp.compare("price")==0){tmp1 = list.front();list.pop_front();count++;tmp2 = list.front();list.pop_front();count++;ans = ans + tmp + " > " + tmp1 + " and " +tmp + " < " + tmp2;}else if(tmp.compare("number")==0){tmp1 = list.front();list.pop_front();count++;ans = ans + tmp + tmp1 + "0";}else if(tmp.compare("author")==0){bool flag = false;QVector<QString>str;tmp1 = list.front();list.pop_front();count++;query2.exec("select book_id from book_author where author_name like '%" + tmp1 + "%'");while(query2.next()){flag = true;str.push_back(query2.value(0).toString());}if(!flag){QMessageBox::critical(0,QObject::tr("error"),"未查到搜索的结果!");return;}if(str.length()==1){ans = ans + "book_id = '" + str.front() + "'";str.pop_front();}else{for(int i=0;i<str.length();i++){if(i==0) ans = ans + "(book_id = '" + str[i] + "'";else if(i==str.length()-1) ans = ans + " or book_id = '" + str[i] + "')";else ans = ans + " or book_id = '" + str[i] + "'";}}str.clear();}else{tmp1 = list.front();list.pop_front();count++;ans = ans + tmp + " like '%" + tmp1 + "%'";}}query.exec(ans);if(!query.isActive()){QMessageBox::critical(0,QObject::tr("error"),query.lastError().text());}//将结果容器清空,把搜索的结果暂存于结果容器中,之后根据页码显示相应的结果result.clear();while(query.next()){QString ans="";QString str = query.value(0).toString();query2.exec("select author_name from book_author where book_id = '"+str+"'");while(query2.next()){ans = ans + query2.value(0).toString() + " ";}for(int i=0;i<9;i++){result.push_back(query.value(i).toString());}result.push_back(ans);}if(result.length()==0){QMessageBox::critical(0,QObject::tr("error"),"未查到搜索的结果!");return;}//初始化当前页和最大页current_page = 1;max_page = result.length()/100 + (result.length()%100!=0);//更新显示书籍窗口updateShowBookWindow();
}/* 按照书的分类查询书籍 */
void database::searchBookByType(QTreeWidgetItem* tree,int num)
{QSqlQuery query,query2;QString text = tree->text(0);//根据分类,在book表和book_author两个表中进行检索query.exec("select * from book ""where type = '"+text+"'");if(!query.isActive()){QMessageBox::critical(0,QObject::tr("error"),"未查询到结果!");}//将结果容器清空,把搜索的结果暂存于结果容器中,之后根据页码显示相应的结果result.clear();while(query.next()){QString ans="";QString str = query.value(0).toString();query2.exec("select author_name from book_author where book_id = '"+str+"'");while(query2.next()){ans = ans + query2.value(0).toString() + " ";}for(int i=0;i<9;i++){result.push_back(query.value(i).toString());}result.push_back(ans);}//初始化当前页和最大页current_page = 1;max_page = result.length()/100 + (result.length()%100!=0);//更新显示书籍窗口updateShowBookWindow();
}/* 加载借书信息 */
void database::loadLoanMessage()
{QSqlQuery query,query1;//由于容器中存的是指针对象,需要一个个释放内存//防止频繁更新表导致的内存泄漏for(int i=0;i<loanMessage.length();i++){for(int j=0;j<5;j++){loanMessage.at(i)[j].clear();}}//清空借阅信息loanMessage.clear();//从表loan中查询借书信息query.exec("select book_id,loan_date,loan_number from loan where username = '"+ current_user + "'");//把搜索的结果暂存于借阅信息容器中,之后根据页码显示相应的结果while(query.next()){QString *ans = new QString[6];ans[0] = query.value(0).toString();query1.exec("select name from book where book_id = '" + ans[0] + "'");if(query1.next()){ans[1] = query1.value(0).toString();}else{qDebug()<<"error";return;}ans[2] = query.value(1).toString();//日期ans[3] = query.value(2).toString();//单册编号QDate currentDate = QDate::currentDate();QDate loanDate = query.value(1).toDate();QDate returnDate = loanDate.addDays(90);int remainingTime = currentDate.daysTo(returnDate);ans[4] = returnDate.toString("yyyy-MM-dd");if(remainingTime>=0){ans[5] = QString::number(remainingTime);}else{ans[5] = "已逾期";}loanMessage.push_back(ans);}
}/* 加载用户信息 */
void database::loadUserMessage()
{user_num = 0;QSqlQuery query,query1,query2;//由于容器中存的是指针对象,需要一个个释放内存//防止频繁更新表导致的内存泄漏for(int i=0;i<userMessage.length();i++){for(int j=0;j<10;j++){userMessage.at(i)[j].clear();}}//清空用户信息userMessage.clear();//在表user中搜索所有信息query.exec("select * from user");int i = 0;QString name[3];QString id[3];QString date[3];//把搜索的结果暂存于借阅信息容器中,之后根据页码显示相应的结果while(query.next()){QString *ans = new QString[10];int num = 0;int count = 0;for(int j=0;j<=2;j++){ans[j] = query.value(j).toString();}query1.exec("select book_id,loan_date"" from loan where username = '" + ans[0] + "'");while(query1.next()){id[count] = query1.value(0).toString();date[count] = query1.value(1).toString();num++;query2.exec("select name from book where book_id = '"+ id[count] + "'");if(query2.next()){name[count++] = query2.value(0).toString();}}ans[3] = QString::number(num);for(int j=0;j<count;j++){ans[4 + 2*j] = name[j] + "(" + id[j] + ")";ans[5 + 2*j] = date[j];}for(int j=count;j<3;j++){ans[4 + 2*j] = "";ans[5 + 2*j] = "";}userMessage.push_back(ans);i++;user_num++;}//初始化当前页码和最大页码user_current_page = 1;if(user_num%13==0)user_max_page = user_num/13;else user_max_page = user_num/13 + 1;
}/* 连接数据库 */
bool database::createConnection()
{//连接MySQL数据库db = QSqlDatabase::addDatabase("QMYSQL");//设置主机名db.setHostName("localhost");//设置数据库名db.setDatabaseName("book_manage");//设置账号名db.setUserName("root");//设置密码名db.setPassword("root");//设置端口db.setPort(3306);if(!db.open()){QMessageBox::critical(0,QObject::tr("error"),db.lastError().text());return false;}return true;
}/* 删除书籍 */
void database::deleteBook()
{QSqlQuery query,query1;//删除之前,检索书号是否存在,便于给出用户反馈信息query1.exec("select book_id from book where book_id = '" + idLine->text() + "'");if(!query1.next()){QMessageBox::critical(NULL, "Error", "该书号不存在",QMessageBox::Yes);return;}//从book中删除该书本信息query.exec("delete from book where book_id = '" + idLine->text() + "'");if(!query.isActive()){QMessageBox::critical(NULL, "Error", "删除失败",QMessageBox::Yes);}else{QMessageBox::about(NULL,"Ok","删除成功");}
}/* 书籍入库 */
bool database::addBook()
{QSqlQuery query,query1,query2;QString author_str = bookMessage[6];QVector<QString>list;QString tmp="";//入库前,先查找是否存在相同(除作者)的书籍query.exec("select book_id from book where name = '"+ bookMessage[0] + "' and price = '"+ bookMessage[1] + "' and publisher = '"+ bookMessage[3] + "' and publish_year = '"+ bookMessage[4] + "' and type = '"+ bookMessage[5] + "'");//如果存在的话,给出已存在书的信息//并向用户询问,选择将两本书合并,还是退出if(query.next()){query1.exec("select author_name from book_author where book_id = '" +query.value(0).toString() + "'");QString author = "";QString str = "";while(query1.next()){author = author + query1.value(0).toString() + " ";}for(int i = 0;i<6;i++){if(i==2)continue;else str = str + bookMessage[i] + ",";}str = str + author;QMessageBox::StandardButton messagebox  = QMessageBox::question(NULL,"question","图书库已有类似图书:\n(" +str + ")\n是否需要合并两本书?(不合并则取消入库)");if(messagebox==QMessageBox::Yes){query2.exec("update book set number = number + " + bookMessage[2]+ " where book_id = '" + query.value(0).toString() +"'");if(query2.isActive()){return true;}else return false;}else if(messagebox==QMessageBox::No){return false;}}//对用户一次输入的多个作者,进行格式化,将作者名分开,并暂存于容器中for(int i=0;i<author_str.length();i++){if(author_str.at(i)!=' ')tmp = tmp + author_str.at(i);else{list.push_back(tmp);tmp = "";}}if(!tmp.isEmpty())list.push_back(tmp);//获取当前时间QDate d = QDate::currentDate();QString str2 = d.toString("yyyy-MM-dd");//查询当前书的总数,为该书分配一个编号,计算方法为当前书总数 + 1//如果该编号已存在,继续查找连续的编号,直到找到一个未使用的编号为止query.exec("select count(*) from book");int num = 0;int tmp_num;if(query.next()){num = query.value(0).toInt();}if(num>=99999){QMessageBox::critical(NULL,"error","数据库存储已满,请申请数据库扩容");return false;}tmp_num = ++num;int count = 0;while(tmp_num){tmp_num/=10;count++;}count=5-count;QString str = QString::number(num);for(int i=0;i<count;i++){str = "0" + str;}query.exec("select book_id from book where book_id = '" + str +"'");while(query.next()){count = 0;tmp_num = ++num;while(tmp_num){tmp_num/=10;count++;}str = QString::number(num);count=5-count;for(int i=0;i<count;i++){str = "0" + str;}query.exec("select book_id from book where book_id = '" + str +"'");}//向表book中插入书籍信息query2.exec("insert into book values('"+ str + "','" + bookMessage[0] + "'," +bookMessage[1] + "," + bookMessage[2] + ",'" +str2 + "','" + current_user + "','" +bookMessage[3] + "','" + bookMessage[4] +"','" + bookMessage[5]+"')");//向表book_author中插入作者信息for(int i=0;i<list.size();i++){query1.exec("insert into book_author values('"+str + "','"+list.front()+"')");list.pop_front();}if(query1.isActive()&&query1.isActive()){return true;}else{return false;}
}/* 单册书籍入库(加载书籍信息) */
void database::oneAddBook()
{//检查用户填写的信息是否完整if(nameLine2->text().isEmpty()||priceLine2->text().isEmpty()||authorLine2->text().isEmpty()||numLine2->text().isEmpty()||publishLine2->text().isEmpty()){QMessageBox::critical(NULL, "Error", "您的信息填写不完整",QMessageBox::Yes);return;}//将用户输入的信息暂存于数组中bookMessage[0] = nameLine2->text();bookMessage[1] = priceLine2->text();bookMessage[2] = numLine2->text();bookMessage[3] = publishLine2->text();bookMessage[4] = dateBox2->currentText();bookMessage[5] = typeBox2->currentText();bookMessage[6] = authorLine2->text();if(addBook()){QMessageBox::about(0,"database","插入成功!");}else{QMessageBox::critical(0,QObject::tr("error"),"插入失败");}//清空输入框nameLine2->clear();priceLine2->clear();numLine2->clear();publishLine2->clear();authorLine2->clear();
}/* 多册书籍入库(加载书籍信息) */
void database::mutiAddBook()
{bool flag = true;int count = 0;//统计书本数目//检查用户输入是否完整for(int i=0;i<13;i++){bool hasValue = false;bool isEmpty = false;for(int j=0;j<7;j++){if(j==4||j==5)continue;else{if(tablewidget3->item(i,j)->text().compare("")==0){isEmpty = true;}else hasValue = true;}if(hasValue&&isEmpty){QMessageBox::critical(NULL,"error","您的信息填写不完整");return;}        }if(!isEmpty){count++;}}//将用户输入的信息暂存于数组中for(int i=0;i<count;i++){for(int j=0;j<7;j++){if(j==4){bookMessage[j] = publishDate[i]->currentText();}else if(j==5){bookMessage[j] = bookType[i]->currentText();}else{bookMessage[j] = tablewidget3->item(i,j)->text();}}if(!addBook()){flag = false;QMessageBox::critical(NULL,"error","第" + QString::number(i+1) + "本书添加失败");}}if(flag){QMessageBox::about(NULL,"ok","插入成功");//清空书本信息for(int i=0;i<7;i++){bookMessage[i].clear();}}//对每一个表单,设置为空for(int i = 0;i<13;i++){for(int j = 0;j<7;j++){if(j!=5&&j!=4){tablewidget3->item(i,j)->setText("");}}}//继续加载文本信息(如果还有的话)int max = multiBookMessage.length()<13?multiBookMessage.length():13;for(int i=0;i<max;i++){for(int j=0;j<7;j++){if(j==4)publishDate[i]->setCurrentText(multiBookMessage.at(i)[j]);else if(j==5)bookType[i]->setCurrentText(multiBookMessage.at(i)[j]);else{tablewidget3->item(i,j)->setText(multiBookMessage.at(i)[j]);}}}for(int i=0;i<max;i++){multiBookMessage.pop_front();}
}/* 删除用户 */
void database::deleteUser()
{QSqlQuery query;//判断是否选中用户bool flag = false;//求出当前页面最多显示的用户int max;if(user_current_page==user_max_page){max = (user_num%13==0)?13:user_num%13;}else max = 13;//删除管理员选中的用户信息for(int i=0;i<max;i++){if(item0[i]->checkState() == Qt::Checked){//如果用户有未归还的书籍,禁止删除if(tablewidget1->item(i,4)->text().toInt()>0){QMessageBox::critical(0,"error","该用户有未归还的书籍,不能删除!");return;}flag = true;query.exec("delete from user where username = '" +item1[i]->text() + "'");}}if(!flag){QMessageBox::critical(0,"error","您尚未选择任何用户!");return;}if(query.isActive()){QMessageBox::about(0,"ok","删除成功");}else{QMessageBox::critical(0,"error","删除失败");}//更新用户信息loadUserMessage();//更新用户管理窗口updateManageWindow();
}/* 授予借书权限*/
void database::grantLent()
{//判断是否选中用户bool flag = false;//判断执行的操作是授权还是取消授权int isGrant;QSqlQuery query;//求出当前页面最多显示的用户int max;if(user_current_page==user_max_page){max = (user_num%13==0)?13:user_num%13;}else max = 13;//根据用户当前借阅权限,执行授予借阅权限/取消借阅权限操作for(int i=0;i<max;i++){if(item0[i]->checkState() == Qt::Checked){flag = true;isGrant = tablewidget1->item(i,3)->text().toInt();if(isGrant==0){isGrant = true;query.exec("update user set isLent = true where username = '" +item1[i]->text() + "'");}else if(isGrant==1){isGrant = false;query.exec("update user set isLent = false where username = '" +item1[i]->text() + "'");}}}if(!flag){     QMessageBox::critical(0,"error","您尚未选择任何用户!");return;}if(query.isActive()){if(isGrant){QMessageBox::about(0,"ok","授权成功");}else{QMessageBox::about(0,"ok","取消权限成功");}}else{if(isGrant){QMessageBox::critical(0,"error","授权失败");}else{QMessageBox::critical(0,"error","取消权限失败");}return;}//更新用户信息loadUserMessage();//更新用户管理窗口updateManageWindow();
}/* 归还书籍 */
void database::returnBook()
{//判断是否选中书籍bool flag = false;QSqlQuery query,query1;//执行归还操作for(int i=0;i<loanMessage.length();i++){if(item4[i]->checkState() == Qt::Checked){flag = true;query.exec("delete from loan where username = '" +current_user + "' and book_id = '" +loanMessage.at(i)[0] + "' and loan_number = " +loanMessage.at(i)[3]);query1.exec("update book set number = number + 1 where book_id = '"+loanMessage.at(i)[0] + "'");}}if(!flag){QMessageBox::critical(0,"error","您尚未选中任何书目!");return;}if(query.isActive()){QMessageBox::about(NULL,"ok","归还成功!");}else{QMessageBox::about(NULL,"error","归还失败");return;}if(query1.isActive()){QMessageBox::about(NULL,"ok","更新成功!");}else{QMessageBox::about(NULL,"error","更新失败");return;}//更新借书窗口updateLoanBookWindow();
}/* 借阅书籍 */
void database::lendBook()
{//判断是否选中书籍bool flag = false;int max_num = 0;QSqlQuery query,query1,query2;//借书前判断用户是否具有借阅权限query.exec("select isLent from user where username = '" + current_user + "'");if(query.next()){bool isLent = query.value(0).toBool();if(!isLent){QMessageBox::critical(0,"error","您不具有借书权限,需等待管理员添加!");return;}}else{return;}//判断用户借阅的书籍是否达到最大书籍query.exec("select count(*) from loan where username = '" +current_user + "'");if(query.next()){int totalNum = query.value(0).toInt();if(totalNum>=3){QMessageBox::critical(0,"error","您的借书数目已达到限额(3本)!");return;}}else{return;}//得到当前页码所能显示的最多书籍int max;if(current_page==max_page){max = result.length()%100/10;if(result.length()%100==0)max = 10;}else max = 10;QDate d = QDate::currentDate();QString date = d.toString("yyyy-MM-dd");//根据用户选中的书籍插入相应借阅信息for(int i=0;i<max;i++){if(item2[i]->checkState() == Qt::Checked){bool isMutiNum = false;int num = 1;flag = true;//判断当前书本是否有库存query.exec("select number from book where book_id = '" + item3[i]->text() + "'");if(query.next()){int num = query.value(0).toInt();if(num==0){QString str = item3[i]->text() + "暂无库存!";QMessageBox::critical(NULL,"error",str);}}else{return;}//考虑到一本书可以被借多次,在这里进行特殊的处理query.exec("select loan_number from loan where username ='" +current_user + "' and book_id = '" + item3[i]->text()+ "'" );while(query.next()){isMutiNum = true;num = query.value(0).toInt();               if(num>max_num)max_num = num;}if(isMutiNum){max_num++;query1.exec("insert into loan values('" + current_user + "','" +item3[i]->text() + "','" + date + "'," +QString::number(max_num) + ")" );}else{query1.exec("insert into loan values('" + current_user + "','" +item3[i]->text() + "','" + date + "',1)" );}if(query1.isActive()){query2.exec("update book set number = number - 1 where book_id = '" +item3[i]->text() + "'");}}}if(!flag){QMessageBox::critical(0,"error","您尚未选择任何书目!");return;}if(query1.isActive()){QMessageBox::about(0,"ok","借阅成功");}else{QMessageBox::critical(0,"error","借阅失败");return;}updateLoanBookWindow();
}

main.cpp

#include "database.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);database w;return a.exec();
}

[mysql+qt] 图书管理系统相关推荐

  1. MYSQL JDBC图书管理系统

    两万字,博主辛辛苦苦给大家写的,在这里求个三连~~. JDBC编程 一.JDBC简介 二.准备工作 三.JDBC五毒神掌 3.1导入驱动包,创建DataBase实例 四.加入SQL版的数据库 4.1系 ...

  2. 基于Springboot+mybatis+mysql+html图书管理系统2

    基于Springboot+mybatis+mysql+html图书管理系统2 一.系统介绍 二.功能展示 1.用户登陆 2.用户主页 3.图书查询 4.还书 5.个人信息修改 6.图书管理(管理员) ...

  3. 基于Springboot+mybatis+mysql+html图书管理系统

    基于Springboot+mybatis+mysql+html图书管理系统 一.系统介绍 二.功能展示 1.用户登陆 2.用户主页 3.图书查询 4.还书 5.个人信息修改 6.图书管理(管理员) 7 ...

  4. java计算机毕业设计Vue和mysql智能图书管理系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计Vue和mysql智能图书管理系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计Vue和mysql智能图书管理系统源码+mysql数据库+系统+lw文档+部 ...

  5. java计算机毕业设计Vue和mysql智能图书管理系统MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计Vue和mysql智能图书管理系统MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计Vue和mysql智能图书管理系统MyBatis+系统+LW文档+源码+调 ...

  6. Java Swing Mysql实现图书管理系统源码附带高清视频指导运行教程

    Java swing实现的图书管理系统 实现的功能有管理员登录管理图书类别.信息.用户管理.新订书籍等等. 基础开发环境 开发工具:Eclipse(MyEclipse.idea.sts) 我这里用的是 ...

  7. Java + Swing + MySQL实现图书管理系统

    项目:图书管理系统开发 图书管理系统会因为图书的数量.种类.提供的操作等不同而具有不同的复杂度.基本信息的维护.图书借阅.归还及查询等操作通常是图书管理系统的基本功能.在规模较大.业务较多的图书馆还需 ...

  8. python下tkinter模块和mysql构建图书管理系统实验

    前言与准备 本次实验是大二数据库期末大作业,我采用的是python语言和mysql8.0.27制作的基于cs构架的数据库框架,由于之前从未了解过python语言,所以代码部分语言较为粗暴,未成年人请在 ...

  9. javaSwing+MySQL实现图书管理系统

    javaSwing已经学了一个月了,重最开始的生疏到后来慢慢的熟悉其实这并不是一个短暂的过程,也是十分消耗时间的.菜单页面设计的不是很好,各方面也需要改进,数据库的关联性也不是很强,等有时间了在回来慢 ...

最新文章

  1. OpenCV边缘检测专题
  2. Ubuntu 安装 QQ
  3. linux某个目录环境变量,在linux下加环境变量或者是把某个目录加到环境变量
  4. 当我们谈论生信的时候我们在谈什么
  5. 如果打开MSSQL server 显示无项目的解决方法
  6. Android 如何抓取开机Log
  7. react 刨坑之路之使用create-react-app脚手架
  8. Matlab: 汉字转拼音函数包
  9. 重要极限二:x趋近于无穷大,(1+1/x)^x的极限
  10. 【OpenCV笔记】光流法之金字塔Lucas-Kanade
  11. CenterNet( Keypoint Triplets for Object Detection) 学习笔记
  12. linux 操作系统:setenv
  13. 【SAP-SD】合同与发运协议的区别
  14. c语言long型是什么,c语言long类型是什么意思
  15. 根据地址获取HTTP返回的状态码
  16. 姨搜侯松:信贷场景全流程数据风控体系
  17. 慧都APS解决方案,点亮「照明灯具行业」精益化生产之路
  18. 堆和栈访问效率哪个更高
  19. 关于使用C++万能头文件时定义y1报编译错误的那点事
  20. 用 JavaScript 比较两个日期

热门文章

  1. linux的du和df命令
  2. SVN 服务端 和 客户端(转)
  3. ubuntu18使用preseed文件定制ISO镜像实现自动化安装
  4. MySQL数据库——MySQL数据表添加字段(三种方式)
  5. 一个网站服务器需要多大带宽,网站需要多大的带宽 ?
  6. EMC电磁兼容测试服务包括
  7. FPGA数字系统设计(9)——信号产生
  8. 联想电脑使用“联想电脑管家”之后电脑频繁蓝屏
  9. 联想0xc000007b蓝屏怎么修复
  10. 补码加减运算及判断溢出方法