程序设计---图书管理系统客户端(优)
Posted 易小顺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序设计---图书管理系统客户端(优)相关的知识,希望对你有一定的参考价值。
1、绪论
1.1 课程设计的目的及意义
随着人们生活水平的日益提高,人们对文化的需求也越来越大。在人们的业余生活中,越来越多的人乐于享受文字给生活带来的乐趣,而图书也是学生的学习过程中必不可少的,如何以一种便捷的管理方式进行图书的管理,提高管理效率,降低管理成本已成为图书管理的关键问题。
本课设旨在研发一个图书馆的管理系统,实现图书馆的信息化管理,减少图书管理员的工作量并使其能更有效的管理书库中的图书,实现了传统的图书管理工作的信息化建设。本系统提供图书管理、后台数据查询、读者信息管理、读者借阅管理、系统维护管理等操作,方便后台管理员对所有图书进行管理。
1.2 课程设计的主要任务
构建图书管理系统主要分为四个阶段:
-
第一阶段是进行系统整体功能的分析设计,设计每个模块相关的数据库,及数据库之间的相互关系,主要完成整个系统的功能架构;
-
第二阶段是对系统的主要界面进行分析设计,包括控件的选择、关联变量的添加、模块之间的关系等主要完成系统整体框架的建立;
-
第三阶段是为各模块的功能实现添加底层代码,包括数据库链接检测、相关错误的反馈等;
-
第四阶段是准备相关的图标、图片、光标进行界面的美化,增强人机交互能力。
2、需求分析
目前,高校图书馆藏书籍的增多和学校的扩招带来的大量的生源,对图书的流通的管理提出了更大的要求,迫使图书馆希望采用一种新的管理方式来管理图书馆的图书,而计算机信息技术的发展为图书管理注入了新的生机,相比于传统的管理方式,大幅的提高了体术管理的效率,对图书信息的维护起到了十分重要的作用。通过对图书管理流程的分析,一款合格的图书馆管理系统必须具备以下 3 个特点:
-
能够对图书馆内的所有图书进行集中的管理,包括图书信息维护、分类放置,快速检索;
-
能够大大的提高图书管理员的工作效率,简化图书借阅的工作流程;
-
能够对学生的信息、借阅情况进行管理。
3、系统设计
3.1 系统的总体设计
通过对图书管理过程的研究和分析,在设计系统时,主要实现的目标如下:
- 实现图书的入库、信息的维护;
- 实现图书数据的查询;
- 实现学生信息的管理和维护;
- 实现图书的借阅和归还管理;
- 实现操作员对系统的维护功能;
- 实现系统的登陆功能。
3.2 系统的详细设计
3.2.1 系统登陆模块
为了防止非法人员计入系统,程序中设计了一个系统登录窗口。在程序启动时,首先显示登录窗口进行身份验证。管理员输入账号和密码进行登陆,当输入为空,或输入信息错误时提示出错,输入正确登入系统,点击取消退出登陆。
3.2.2 图书信息管理模块
管理员通过输入图书的相关信息进行书籍的登记,也可以修改图书的相关信息和删除图书的信息记录。为了方便管理员操作,程序利用表格显示所有信息。
添加一个图书信息后将会显示在表格中;如果想要修改信息,双击表格中的数据,信息将会在上方的编辑框和组合框中出现,单击修改按钮即可完成信息的修改;点击删除会提示是否删除对话框,确认后可删除书籍信息。
3.2.3 后台数据管理模块
主要由一个树结构控件和一个列表视图控件组成,管理员可在树结构中点击相应的类别分类,快速的对馆内的所有图书进行检索,达到快速管理书籍的目的。
右方的只读编辑框显示当前统计书籍的数量及分布情况。
3.2.4 学生信息管理模块
主要实现对学生信息的实时管理,管理员可通过输入学生的信息从而录入数据库,达到学生的信息注册功能,可以对信息进行增删改查,进行查找时,可通过多个条件的输入进行查找,每个编辑框中的数据内容都可以成为查询条件,更加方便管理员对学生信息的维护及更新,双击数据表格时,数据将会显示在上方的编辑框中,快速的实现数据的更改。
学生的信息有简单的限制条件,ID号为10位的十进制数所组成且不能相重复,对于已经分配的ID号,即使删除相应的学生信息,也不会再次分配给其他的学生所使用。
3.2.5 图书借阅管理模块
主要功能是查找、出借和归还等功能,查找语句设置的是模糊查找,可通过输入完整的学号、姓名、书籍ID等来查找出借书籍的记录,在不知道完整信息的情况下,系统的查询采取了模糊查询的语句,实现字段查询相似的所有数据,方便跟踪书籍的状态;
出借功能由当前登陆系统的管理员操作,输入借阅学生的ID和书籍的ID可以从其他的表中自动查询对应的学生姓名和书籍的名称,出借时间和归还时间由两个时间控件进行控制,通过点击控件选择相应的时间即可,管理员的名字由当前登陆的管理员所决定,登陆成功则已经进行了绑定。
归还功能类似出借功能,通过输入学生的ID和书籍的ID即可实现图书的归还操作,这时会删除相应的数据库中的数据,并且在总数据库中记录下所有的信息。
3.2.6 管理员信息模块
此信息模块由系统管理员所操作,其余人员不具备实际的操纵权限,在系统当中即是权限为‘高’的人员具有该模块的访问权限。
主要的功能是对管理员的信息进行管理,包括管理员信息的更新、添加新的管理员、更改相关管理员的全系等,如果更新了当前正在登陆状态的管理员信息会强制登出系统,并使用更新后的数据进行系统的再次登陆。
3.2.6 公共类的设计
为了方便对程序中多次使用的函数、变量的管理,设计了一个公共类CPublic,用于存储程序中的所有全局函数及全局变量,增大程序的可读性。
包括了登陆时需要记录的管理员的信息,数据库的接口变量,链接数据库所使用的的API函数。
3.3 数据库设计
3.3.1 概念设计
系统所使用的的数据库为mysql,使用API函数和SQL语句进行连接。
主要设计四个表用于系统信息的存取管理。
3.3.2 逻辑结构设计
①表 bookinfo 有6个字段:name
、press
、author
、price
、remark
、kind
、bookID
,分别表示书籍名称、书籍出版社、作者、价格、备注、分类、书籍ID号(唯一,用于标识一本书)。
②表 data 有5个字段:bookname
、name
、timef
、timel
、manager
,分别表示书籍名称、借阅者姓名、开始借阅时间、结束归还时间、操作管理员。
③表 student 有7个字段:name
、college
、grade
、card
、bookID
、 timef
、
timel` ,分别表示学生姓名、所属学院、年级、卡号(唯一,用于表示一个学生)、书籍ID、开始借阅时间、结束归还时间(如果该学生没有进行借书、则该三个字段为null)。
④表 user 有4个字段:name
、password
、grade
、userid
,分别表示管理员姓名、登陆密码、管理等级、登陆ID。
4、系统实现
4.1 开发环境
程序调试编译软件:Microsoft Visual Studio Community 2019 X64
环境
数据库操作软件:Navicat
系统环境:Windows10 X86
系统
4.2 主要技术
C++MFC
应用程序开发;
MySQL
数据库。
4.3 实现结果
4.3.1 用户登陆界面
登陆时先连接数据库,接收管理员的输入并检查数据的有效性,查询成功则记录登陆账号的信息,根据权限等级开放系统功能。
const char* sql= "select * from user";
mysql_query(&mysql, sql);
res = mysql_store_result(&mysql);
while(column = mysql_fetch_row(res))
{
if (column[3] == c_user && column[1] == c_password)
{
temp = 1;
CPublic::x = column[2];
CPublic::m = column[0];
mysql_close(&mysql);
if (column[2] == "高")
{
mysql_free_result(res);
EndDialog(2);
}
else
{
mysql_free_result(res);
EndDialog(1);
}
}
}
mysql_close(&mysql);
if(temp==0)
MessageBox(TEXT("用户名或者密码不正确"), TEXT("提示"), 64);
4.3.2 系统主界面
主要提供系统的功能选择,界面有系统的菜单信息、图书信息、后台数据、读者信息、借阅管理、系统配置等六大功能,由CImageList
、CToolBar
两个控件进行实现,根据管理员的功能选择打开不同的子窗口,显示具体功能。
BOOL Cdemo5Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
m_Menu.LoadMenu(IDR_MENU1);
SetMenu(&m_Menu);
HICON m_hicon = AfxGetApp()->LoadIconW(IDI_ICON6);
SetIcon(m_hicon,true);
SetWindowText(TEXT("图书管理系统"));
m_ImageList.Create(32, 32, ILC_COLOR24 | ILC_MASK, 1, 1);
m_ImageList.Add(AfxGetApp()->LoadIconW(IDI_ICON2));
m_ImageList.Add(AfxGetApp()->LoadIconW(IDI_ICON3));
m_ImageList.Add(AfxGetApp()->LoadIconW(IDI_ICON4));
m_ImageList.Add(AfxGetApp()->LoadIconW(IDI_ICON5));
m_ImageList.Add(AfxGetApp()->LoadIconW(IDI_ICON7));
m_ImageList.Add(AfxGetApp()->LoadIconW(IDI_ICON8));
UINT array[6];
for (int i = 0; i < 6; i++)
array[i] = 1000 + i;
m_toolbar.Create(this);
m_toolbar.SetButtons(array, 6);
m_toolbar.SetButtonText(0, TEXT("图书信息"));
m_toolbar.SetButtonText(1, TEXT("后台数据"));
m_toolbar.SetButtonText(2, TEXT("读者信息"));
m_toolbar.SetButtonText(3, TEXT("借阅管理"));
m_toolbar.SetButtonText(4, TEXT("系统配置"));
m_toolbar.SetButtonText(5, TEXT("未知功能"));
m_toolbar.GetToolBarCtrl().SetButtonWidth(60, 120);
m_toolbar.GetToolBarCtrl().SetImageList(&m_ImageList);
m_toolbar.SetSizes(CSize(80, 70), CSize(50, 50));
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST, 0);
return TRUE;
}
void Cdemo5Dlg::OnPaint()
{
CPaintDC dc(this);
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
CDC dcBmp;
dcBmp.CreateCompatibleDC(&dc);
CBitmap bmpBackground;
bmpBackground.LoadBitmap(IDB_BITMAP2);
BITMAP m_bitmap;
bmpBackground.GetBitmap(&m_bitmap);
CBitmap* pbmpOld = dcBmp.SelectObject(&bmpBackground);
dc.StretchBlt(0, 0, rect.Width(), rect.Height(), &dcBmp, 0, 0, m_bitmap.bmWidth, m_bitmap.bmHeight, SRCCOPY);
}
4.3.3 图书信息界面
主要实现图书的管理功能,连接数据库表bookinfo
对图书进行增加、删除、修改等操作,点击图书信息时,在编辑框中展现所有的图书信息,主要用CComboBox
、CListCtrl
等功能实现。
BOOL CBookInfo::OnInitDialog()
{
CDialogEx::OnInitDialog();
m_kind.SetWindowTextW(TEXT("无"));
m_kind.AddString(TEXT("文科"));
m_kind.AddString(TEXT("理科"));
m_kind.AddString(TEXT("工科"));
m_kind.AddString(TEXT("社科"));
CRect rect;
m_output.GetClientRect(rect);
m_output.SetExtendedStyle(LVS_EX_GRIDLINES);
m_output.InsertColumn(0, TEXT("书籍名称"), LVCFMT_CENTER, rect.Width() / 7);
m_output.InsertColumn(1, TEXT("出版社"), LVCFMT_CENTER, rect.Width() / 7);
m_output.InsertColumn(2, TEXT("作者"), LVCFMT_CENTER, rect.Width() / 7);
m_output.InsertColumn(3, TEXT("价格"), LVCFMT_CENTER, rect.Width() / 7);
m_output.InsertColumn(4, TEXT("备注"), LVCFMT_CENTER, rect.Width() / 7);
m_output.InsertColumn(5, TEXT("种类"), LVCFMT_CENTER, rect.Width() / 7);
m_output.InsertColumn(6, TEXT("书籍ID"), LVCFMT_CENTER, rect.Width() / 7);
LoadBookINFO();
return TRUE;
}
void CBookInfo::OnBnClickedBookMod()
{
UpdateData(true);
std::string sql, bookname, bookpress, bookauthor, bookprice, bookremark, bookkind, bookID;
CString kind;
bookname = CW2A(m_bookname);
bookpress = CW2A(m_press);
bookauthor = CW2A(m_author);
bookprice = CW2A(m_price);
bookremark = CW2A(m_remark);
bookID = CW2A(m_bookid);
m_kind.GetWindowTextW(kind);
bookkind = CW2A(kind);
sql = "update bookinfo set name='"+bookname+"',press='"+ bookpress +"',author='"+bookauthor+"',price='"+bookprice+"',remark='"+bookremark+"',kind='"+bookkind+"' where bookID='" + bookID + "'";
mysql_query(&mysql, "set names gbk");
mysql_query(&mysql, sql.c_str());
mysql_close(&mysql);
UpdateData(false);
LoadBookINFO();
}
4.3.4 后台数据界面
连接数据库bookinfo
表,可根据具体的分类实现书籍的快速查找和统计功能,查看书籍的分布情况,主要用CImageList
、CTreeCtrl
等控件实现。
BOOL CStageData::OnInitDialog()
{
CDialogEx::OnInitDialog();
{
CRect rect;
m_listinfo.GetClientRect(rect);
m_listinfo.SetExtendedStyle(LVS_EX_GRIDLINES);
m_listinfo.InsertColumn(0, TEXT("书籍名称"), LVCFMT_CENTER, rect.Width() / 3);
m_listinfo.InsertColumn(1, TEXT("出版社"), LVCFMT_CENTER, rect.Width() / 3);
m_listinfo.InsertColumn(2, TEXT("书籍ID"), LVCFMT_CENTER, rect.Width() / 3);
}
m_list.Create(32, 32, ILC_COLOR32, 3, 3);
{
m_list.Add(AfxGetApp()->LoadIconW(IDI_LIBRARY));
m_list.Add(AfxGetApp()->LoadIconW(IDI_ARTS));
m_list.Add(AfxGetApp()->LoadIconW(IDI_ENGINEER));
m_list.Add(AfxGetApp()->LoadIconW(IDI_SCIENCE));
m_list.Add(AfxGetApp()->LoadIconW(IDI_SOCIAL));
m_list.Add(AfxGetApp()->LoadIconW(IDI_LIBRARY2));
m_list.Add(AfxGetApp()->LoadIconW(IDI_LIBRARY3));
m_tree.SetImageList(&m_list, TVSIL_NORMAL);
}
hRoot = m_tree.InsertItem(TEXT("一号图书馆"), 0, 0);
hCataItem[0] = m_tree.InsertItem(_T("文科"), 1, 1, hRoot, TVI_LAST);
hCataItem[1] = m_tree.InsertItem(_T("理科"), 2, 2, hRoot, TVI_LAST);
hCataItem[2] = m_tree.InsertItem(_T("工科"), 3, 3, hRoot, TVI_LAST);
hCataItem[3] = m_tree.InsertItem(_T("社科"), 4, 4, hRoot, TVI_LAST);
m_tree.InsertItem(TEXT("二号图书馆"), 5, 5);
m_tree.InsertItem(TEXT("三号图书馆"), 6, 6);
return TRUE;
}
void CStageData::OnDblclkTreeData(NMHDR* pNMHDR, LRESULT* pResult)
{
HTREEITEM hItem = m_tree.GetSelectedItem();
CString kind = m_tree.GetItemText(hItem);
{
m_listinfo.DeleteAllItems();
std::string sql, kind_;
kind_ = CW2A(kind);
sql = "select name,press,bookID from bookinfo where kind='" + kind_ + "'";
mysql_query(&mysql, "set names gbk");
mysql_query(&mysql, sql.c_str());
res = mysql_store_result(&mysql);
int row = 0;
while (column = mysql_fetch_row(res))
{
m_listinfo.InsertItem(row, TEXT(""));
m_listinfo.SetItemText(row, 0, (CString)column[0]);
m_listinfo.SetItemText(row, 1, (CString)column[1]);
m_listinfo.SetItemText(row, 2, (CString)column[2]);
row++;
}
mysql_free_result(res);
}
*pResult = 0;
}
4.3.5 读者信息界面
连接数据库student
表,用于学生读者的信息管理,可实现对学生信息的增删改查工作,点击列表单元将信息显示在编辑框中,更容易的编辑读者的信息,可根据任意的信息进行数据的查询。
void CStudent::OnBnClickedRegister()
{
UpdateData(true);
if (IsEmpty())
{
MessageBox(TEXT("输入信息不全"), TEXT("error"));
return;
}
std::string sql, sname, sid, scollege, sgrade;
sname = CW2A(m_sname);
sid = CW2A(m_sid);
scollege = CW2A(m_scollege);
sgrade = CW2A(m_sgrade);
sql = "insert into student values ('" + sname + "','" + scollege + "'," + sgrade + ",'" + sid + "',' ',now(),now())";
mysql_query(&mysql, "set names gbk");
mysql_query(&mysql, sql.c_str());
LoadStudentInfo();
}
void CStudent::OnBnClickedQuery()
{
UpdateData(true);
m_student.DeleteAllItems();
std::string sql, sname, sid, scollege, sgrade;
sname = CW2A(m_sname);
sid = CW2A(m_sid);
scollege = CW2A(m_scollege);
if(m_sgrade.IsEmpty())
sgrade = "0";
else
sgrade = CW2A(m_sgrade);
sql = "select * from student where name='"+ sname + "' or college='" + scollege + "' or grade=" + sgrade + " or card='" + sid + "'";
mysql_query(&mysql, "set names gbk");
mysql_query(&mysql, sql.c_str());
res = mysql_store_result(&mysql);
int row = 0;
while (column = mysql_fetch_row(res))
{
m_student.InsertItem(row, TEXT(""));
m_student.SetItemText(row, 0, (CString)column[0]);
m_student.SetItemText(row, 1, (CString)column[1]);
m_student.SetItemText(row, 2, (CString)column[2]);
m_student.SetItemText(row, 3, (CString)column[3]);
m_student.SetItemText(row, 4, (CString)column[4]);
m_student.SetItemText(row, 5, (CString)column[5]);
m_student.SetItemText(row, 6, (CString)column[6]);
row++;
}
mysql_free_result(res);
}
4.3.6 借阅管理界面
连接数据库data
、student
、bookinfo
表,可实现图书的借阅、归还、查询功能,借阅时间和归还时间可由管理员自行选择,学生的姓名和书籍的名称由相应的ID
在表中查询后再添加进data
表中;在归还一本书时同时更新student
表中的学生的借阅信息;查询可根据输入的信息进行自动的匹配查询。
void CDataSelect::OnBnClickedButton1()
{
UpdateData(true);
if (IsEmpty())
return;
else
{
mysql_query(&mysql, "set names gbk");
std::string sql, sqlb, sqls, sqlstu, bookid, studentid, timef, timel, manager;
bookid = CW2A(m_idbook);
studentid = CW2A(m_idstedent);
timef = CW2A(strf);
timel = CW2A(strl);
manager = CW2A(m_manager);
if(true)
{
sqlb = "select name from bookinfo where bookID='" + bookid + "'";
sqls = "select name from student where card='" + studentid + "'";
sqlstu = "update student set bookID='"+ bookid+"',timef='" + timef + "',timel='" + timel + "' where card='" + studentid + "'";
mysql_query(&mysql, sqlstu.c_str());
mysql_query(&mysql, sqlb.c_str());
res = mysql_store_result(&mysql);
column = mysql_fetch_row(res);
mysql_query(&mysql, sqls.c_str());
res = mysql_store_result(&mysql);
column = mysql_fetch_row(res);
}
sql = "insert into data values ('" + bookid + "','"+ studentid + "','" + timef + "','" + timel + "','" + manager + "')";
mysql_query(&mysql, sql.c_str());
mysql_free_result(res);
DataSelectInfo();
}
}
void CDataSelect::OnBnClickedDataSelect()
{
UpdateData(true);
mysql_query(&mysql, "set names gbk");
std::string sql = "select * from data where name=";
std::string str = CW2A(m_input);
sql += "'" + str + "'";
mysql_query(&mysql, sql.c_str());
res = mysql_store_result(&mysql);
int row = 0;
while (column = mysql_fetch_row(res))
{
m_dataface.InsertItem(row, TEXT(""));
m_dataface.SetItemText(row++, 0, (CString)column[0]);
m_dataface.SetItemText(row++, 1, (CString)column[1]);
m_dataface.SetItemText(row++, 2, (CString)column[2]);
m_dataface.SetItemText(row++, 3, (CString)column[3]);
m_dataface.SetItemText(row++, 4, (CString)column[4]);
}
mysql_free_result(res);
}
4.3.7 系统配置界面
根据登陆的管理员的账号管理等级进行匹配,只有等级为“高”
的才有权限进行管理,主要功能有对管理员的信息进行增删改,也可赋予其他管理员设置的权限。
BOOL COperator::OnInitDialog()
{
CDialogEx::OnInitDialog();
m_limits.AddString(TEXT("低"));
m_limits.AddString(TEXT("中"));
m_limits.AddString(TEXT("高"));
CRect rect;
m_list.GetClientRect(rect);
m_list.InsertColumn(0, TEXT("姓名"), LVCFMT_CENTER, rect.Width() / 3);
m_list.InsertColumn(1, TEXT("密码"), LVCFMT_CENTER, rect.Width() / 3);
m_list.InsertColumn(2, TEXT("管理等级"), LVCFMT_CENTER, rect.Width() / 3);
LoadOperatorINFO();
}
bool COperator::Query(std::string str)
{
std::string sql = "select * from user where name='" + str + "'";
mysql_query(&mysql, "set names gbk");
if (!mysql_query(&mysql, sql.c_str()))
{
mysql_close(&mysql);
MessageBox(TEXT("查无此用户"), TEXT("error"));
return false;
}
else
{
return true;
}
}
5、总结
需要源码可联系。。。
以上是关于程序设计---图书管理系统客户端(优)的主要内容,如果未能解决你的问题,请参考以下文章