因为是本人本科阶段某课程的课程设计,所以并不适合全部人,仅供参考。
由于本人水平,可能会有地方有误,望以指正。
一、系统概要设计
序号 | 功能 | 功能说明 |
1 | 登录 | 借阅人、管理员均可用自己的账户信息可以登录系统 |
2 | 图书查询 | 借阅人、管理员登录系统可以查询图书情况 |
3 | 图书录入 | 管理员登录系统后可以录入图书 |
4 | 图书修改 | 管理员登录系统后可以修改图书的信息 |
5 | 删除图书 | 管理员登录系统后可以删除图书的信息 |
6 | 修改密码 | 借阅人、管理员登录系统后可以修改自己账号的密码 |
7 | 读者管理 | 管理员登录系统后对读者信息悉心进行管理,包括添加借阅人信息、图书信息和删除 |
8 | 分类管理(附加) | 对图书进行分类,进行分类管理 |
9 | 自动识别(附加) | 登录系统时会识别是管理人员或者是借阅人 |
10 | 退出功能(附加) | 将自己的账号退出 |
11 | 判断输入的信息是否合法(附加) | 在注册,登录时判断输入的信息是否合法 |
二、数据库设计
2.1 数据库逻辑结构设计
管理员管理关系:admin(aid,username,name,password,emali,phone,status,lend_num,max_num)
图书管理关系:book(bid,name,card,author,num,press,type)
图书分类管理:book type(tid,name)
图书归还管理:history(hid,aid,bid,card,bookname,adminname,username,begintime,endtime,status)
2.2 数据库表
(1)管理员表(admin)
属性:aid,username,name,password,emali,phone,status,lend_num,max_num
(2)图书管理关系 (book)
属性:bid,name,card,author,num,press,type
(3)图书分类管理
属性:book type(tid,name)
(4)图书归还(history)
属性:hid,aid,bid,card,bookname,adminname,username,begintime,endtime,status
三、系统实现
3.1 功能1登录注册
3.1.1流程设计
- 进入图书管理系统的注册页面
- 进入图书管理系统的登录页面
- 填写登录者的登录信息,点击按钮将信息提交给数据库
- 检索图书管理系统数据库信息,对比信息是否和数据库一致
- 登录者输入的登录信息通过系统数据库验证,系统会自动识别是管理员或者是借阅人,进入相应的页面页面
3.1.2技术应用
在实现登录功能中,主要由项目中的login.jsp,来实现。在login.jsp中我们主要来实现登陆界面的设计和判断账号密码不能为空。在判断账号密码不能为空上,我使用了javascript来实现,首先获取账号和密码的内容,然后判断账号和密码是否为空,如果为空的话弹出一个警告窗口信息为“这是必填字段”,然后输入焦点或者光标定位到这个为空的文本框里。我们用HTML的相关技术来实现登录页面的设计,先利用<form></form>创建一个HTML 表单,第一行是标题“欢迎使用图书管理系统”,然后利用<table></table>标签创建一个表格,表格分四行,第一行是账号,第二行是密码,第三行是没有账号可以自行再去注册的跳转,第四行是登录键。接着在登录键上实现登录。最后利用css样式来美化我们的界面。
3.1.3技术选择分析
页面跳转,我用的是在button标签中加上onclick属性,赋值为Javascript,
3.1.4关键代码
(1)查询信息是否正确
①有关读者账号的连接数据库操作,登录验证,注册,修改账号,修改密码
public class AdminDao { /** * 登录验证功能,传入用户名和密码,在数据库中查找,如果找到了,返回true,没找到则返回false * @param username * @param password * @return */ public boolean Login_verify(String username,String password){ Connection conn = DBUtil.getConnectDb(); String sql = "select * from admin where username="+username+" and password="+password; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); if(rs.next()){ return true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return false; } ②注册的代码 /** * 注册账号的函数,传入账号,密码,姓名,邮箱,手机号,借阅天数,可借阅数 * @param username * @param password * @param name * @param email * @param phone * @param lend_num * @param max_num */ public void Register(String username, String password, String name, String email, String phone,int lend_num,int max_num) { // TODO Auto-generated method stub Connection conn = DBUtil.getConnectDb(); String sql = "insert into admin(status,username,password,name,email,phone,lend_num,max_num) values(?,?,?,?,?,?,?,?)"; int rs = 0; PreparedStatement stm = null; try { stm = conn.prepareStatement(sql); stm.setInt(1, 1); stm.setString(2, username); stm.setString(3, password); stm.setString(4, name); stm.setString(5, email); stm.setString(6, phone); stm.setInt(7, lend_num); stm.setInt(8, max_num); rs = stm.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
5.实现
图3.1.1注册界面
图3.1.2登录界面
3.2 功能2查看图书信息
3.2.1流程设计(借阅人模块)
- 借阅人登陆系统后点击图书查询可以查询图书信息
- 点击借阅信息后后,可以查看借阅的信息
- 点击借阅历史,可以对书籍的借阅历史进行了解
- 在整体的右上方可以查看个人资料、修改自己的密码、还可以退出系统
3.2.2技术应用
①图书查询
学生成绩查询功能主要是由/books/select.jsp来实现的。在这里,利用row进行页面布局,使用panel进行控件,使它们在一个界面。
<tbody> <td><%= bean.getCard() %></td> <td><%= bean.getType() %></td> <td><%= bean.getName() %></td> <td><%= bean.getAutho() %></td> <td><%= bean.getPress() %></td> <td><%= bean.getNum() %></td> <td><button type="button" class="btn btn-info btn-xs" data-toggle="modal" onclick="borrowbook(<%= bean.getBid() %>)" >借阅</button> </td> </tbody>
②借阅信息与借阅历史
学生留言功能主要是由borrow.jsp完成、借阅历史由history.jsp完成
③修改密码
修改图书系统账号密码功能主要是由项目中的updatepwd完成来实现。。
让它存储通过调用数据库中的getstudent()方法查询出来的相关信息。接下来我们要设置密码不能为空,在设置密码不能为空,我使用了javascript来实现,首先利用getElementById ()方法获取密码的内容,然后判断密码是否为空,如果为空的话利用alert ()弹出一个警告窗口信息为“这是必填字段”,然后输入焦点或者光标定位到这个为空的文本框里,用username.focus();最后返回一个失败。然后,我们可以在文本框中输入新的密码点击保存,之后新密码会被同步到数据库中。我是使用的<input>文本框并设置οnclick="savestudent()" value="保存"属性来实现将新密码保存到数据库中的。
3.2.3技术选择分析
采用了javascript中focus()的语句,文本输入框要鼠标点击下输入框,等光标在里面之后再敲键盘输入。
focus()的作用就是将光标放在输入框中,省掉了你点击的那一下,直接输入你要输入的内容。可以留意下百度的首页,你打开页面之后光标就直接在输入框里了,直接敲键盘输入你要搜索的内容就行了,省掉了还要用鼠标点击下输入框才能输入的步骤,非常人性化的考虑。
3.2.4关键代码
①图书查询
(1)查询语句
①查看全部图书信息
返回的是ArrayList数组形式
try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ BookBean tag = new BookBean(); tag.setBid(rs.getInt("bid")); tag.setName(rs.getString("name")); tag.setCard(rs.getString("card")); tag.setType(rs.getString("type")); tag.setAutho(rs.getString("autho")); tag.setPress(rs.getString("press")); tag.setNum(rs.getInt("num")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); }
②获取用户想要的单个图书/**
* 用户查找图书,根据输入的名称,使用like进行模糊查询,然后返回一个ArrayList数组类型
*/
public ArrayList<BookBean> getLikeList(String name) { // TODO Auto-generated method stub ArrayList<BookBean> tag_Array = new ArrayList<BookBean>(); Connection conn = DBUtil.getConnectDb(); String sql = "select * from book where name like '%"+name+"%'"; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ BookBean tag = new BookBean(); tag.setBid(rs.getInt("bid")); tag.setName(rs.getString("name")); tag.setCard(rs.getString("card")); tag.setType(rs.getString("type")); tag.setAutho(rs.getString("autho")); tag.setPress(rs.getString("press")); tag.setNum(rs.getInt("num")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return tag_Array; }
②图书借阅信息
* 获取借阅记录的全部信息,传入的条件有status,aid,表示搜索正在借阅的,或者已经还书的信息,aid代表当前登录用户
try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ HistoryBean tag = new HistoryBean(); tag.setHid(rs.getInt("hid")); tag.setAid(rs.getInt("aid")); tag.setBid(rs.getInt("bid")); tag.setBookname(rs.getString("bookname")); tag.setCard(rs.getString("card")); tag.setAdminname(rs.getString("adminname")); tag.setUsername(rs.getString("username")); tag.setBegintime(rs.getString("begintime")); tag.setEndtime(rs.getString("endtime")); tag.setStatus(rs.getInt("status")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); }
③查看借阅历史
public void setHid(int hid) { this.hid = hid; } public int getAid() { return aid; } public void setAid(int aid) { this.aid = aid; } public int getBid() { return bid; } public void setBid(int bid) { this.bid = bid; } public String getCard() { return card; } public void setCard(String card) { this.card = card; } public String getBookname() { return bookname; } public void setBookname(String bookname) { this.bookname = bookname; } public String getAdminname() { return adminname; } public void setAdminname(String adminname) { this.adminname = adminname; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getBegintime() { return begintime; } public void setBegintime(String begintime) { this.begintime = begintime; } public String getEndtime() { return endtime; } public void setEndtime(String endtime) { this.endtime = endtime; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; }
④修改密码
public boolean Login_verify(String username,String password){ Connection conn = DBUtil.getConnectDb(); String sql = "select * from admin where username="+username+" and password="+password; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); if(rs.next()){ return true; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return false;
3.2.5实现
图3.2.1 读者登陆系统的主页面
图3.2.2 借阅信息查询页面
图3.2.3 借阅历史页面
图3.2.4 个人资料页面
图3.2.5 修改密码
3.3 功能3对图书和借阅者增加、删除、修改
3.3.1流程设计
- 管理员进入系统后可以对图书进行管理
- 可以查看读者信息,对读者信息进行修改和删除
- 管理员可以对图书进行分类
- 管理员可以查看借阅信息
- 同时,管理员可以查看图书归还信息
- 管理员同样可以对密码和个人资料进行修改
3.3.2技术应用
①管理员管理图书
在管理员管理图书功能中主要由AdminDao.jsp来实现。
在AdminDao.jsp中,首先要判断登陆账号的角色是否为管理员。定义了一个role,并且令它等于从session中保存的数据的role。接下来判断,如果role不为空,接着判断如果角色为借阅者则成功进入借阅者主页面。反之则返回登陆页面。接下来是构思页面的布局。在这个页面中有表头、主体、分割线、内容、表单和表尾这几个部分。我重点介绍主体中的内容部分。在内容中我创建了一个表单,又利用css相关知识设计样式。
②管理员删除相关信息
在管理员删除相关信息功能中主要是由admin_user.jsp、admin_book.jsp来实现的。
<ul class="dropdown-menu"> <li><a href="#updateinfo" data-toggle="modal">个人资料</a></li> <li role="presentation" class="divider"></li> <li><a href="#updatepwd" data-toggle="modal">修改密码</a></li> <li role="presentation" class="divider"></li> <!-- href="#identifier" 来指定要切换的特定的模态框(带有 id="identifier")。--> <li><a href="/books/login.jsp">退出</a></li>
③管理员可以对图书进行分类
在管理员对图书分类的功能中主要由admin_booktype.jsp来实现。
<!---------------------表单--------------------> <div class="form-group"> <label for="firstname" class="col-sm-3 control-label">分类名称</label> <div class="col-sm-7"> <input type="text" class="form-control" id="addBookName" required="required" name="name" placeholder="请输入图书分类名称"> <label class="control-label" for="addBookName" style="display: none;"></label> </div> </div> <!---------------------表单--------------------> </div> try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ TypeBean tag = new TypeBean(); tag.setTid(rs.getInt("tid")); tag.setName(rs.getString("name")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); }
在admin_booktype.jsp中,首先定义一个JDBCUtil.java的名称db。定义一个teachername并让它等于获取保存在 session 对象中名称为 name的属性信息。再定义一个sql,来存储查询对应的msg表和student表的sql语句。定义一个map集合data,让它存储通过调用数据库中的comminlist()方法查询出来的相关信息。接下来利用HTML技术来创建一个表格,表头为“图书分类、操作、增加分类”然后通过循环来获取data中存储的对应信息并填到列表中。
在huifu.jsp中,我们要使回复内容不能为空并把回复内容保存进grademanage数据库的msg表中。在实现这些功能前我们要先定义一个JDBCUtil.java的名称db。定义一个msgid并让它等于使用request.getParameter()方法获取的id。再定义一个sql,来存储查询对应的msg表和student表的sql语句。定义一个map集合data,让它存储通过调用数据库中的comminlist()方法查询出来的相关信息。
接下来是构思页面的布局。在这个页面中有表头、主体、分割线、内容、表单和表尾这几个部分。我重点介绍主体中的内容部分。在内容中我创建了一个表单,又利用css相关知识设计样式。
3.3.3技术选择分析
在页面传值时采用了session页面取值传值,这种传值方式优点在于使用简单,不仅能传递简单数据类型,还能传递对象。同时,数据量大小是不限制的。缺点在于在Session变量存储大量的数据会消耗较多的服务器资源。容易丢失。
在使用时要注意,session不用时可以销毁它,销毁的方法是:清除一个:Session.Remove("session名");
3.3.4实现
图3.3.1 管理员登录进入的主页面
图3.3.2 管理员修改图书信息
图3.3.3 管理员删除图书信息
图3.3.4 管理员添加图书
图3.3.5 管理员添加读者
图3.3.6 管理员删除读者
图3.3.7 管理员添加、修改、删除图书分类信息
图3.3.8管理员查看图书归还信息
3.4 功能4连接数据库(附加)
3.4.1流程设计
(1)用数据库建立管理员信息的管理
(2)用数据库建立图书信息的管理
3.4.2技术应用
该功能主要由BookDao.java和AdminDao.java文件实现。
Book.java中首先通过获取数据库连接对象,调用PreparedStatement的executeQuery方法和相应的SQL语句,执行查询操作。然后通过while循环遍历查询结果集ResultSet,将结果封装到UserBean对象中,并返回该对象。如果没有符合条件的结果,直接返回null。
AdminDao.java实现了用户注册时的数据库操作,包括添加用户、查询用户是否存在等功能.加载MySQL的JDBC驱动,DriverManager的getConnection方法获得连接对象,通过PreparedStatement执行insert语句,将用户输入的信息插入到数据库中。调用方法实现用户名的查询操作,判断输入的用户名或用户名和密码是否存在。然后调用方法实现用户信息的插入操作,将用户输入的用户名、密码、邮箱和手机号码插入到用户表中
3.4.3技术选择分析
(1)加载MySQL的JDBC驱动:通过Class.forName(“com.mysql.jdbc.Driver”)方法加载MySQL的JDBC驱动。
(2)通过PreparedStatement的executeUpdate方法和相应的SQL语句,向数据库中添加用户信息并更新数据。
第四章项目测试与评价
测试是开发一个系统的重要环节,是对软件最后的完成起至关重要的作用。随着新技术的出现,软件测试的方法也变得越来越多,对系统整体的功能和性能需求也逐步提高。测试的目的保证系统的完整性,避免某些功能影响其他功能的运行,保证了系统的独立性。
4.1功能测试
- 用户登录注册模块测试
登录测试主要测试用户名和密码是否正确。登录功能测试用例如表2-1所示。
表4-1 用户登录注册功能测试用例
表格编号:001 | 项目名称:基于Javaweb的图书管理系统的设计与实现 | ||||
模块 编号 | 序号 | 测试用例描述 | 操作过程及数据 | 预期结果 | 验证结果 |
1.1 | 功能描述:登录功能 | ||||
1 | 密码输错 | 用户名:202002 密码:1234 | 登录失败,请检查用户名或密码 | √ | |
2 | 账号输错 | 用户名:527573 密码:123456 | 登录失败,请检查用户名或密码 | √ | |
3 | 正常登录 | 用户名:123 密码:123 | 进入系统 | √ |
- 用户信息管理模块测试
用户信息管理模块测试主要是测试管理员对用户的信息能否正常的进行管理。表2-2为用户信息管理功能测试的用例。
表4-2 用户信息管理功能测试用例
表格编号:002 | 项目名称:基于Javaweb的图书管理系统的设计与实现 | ||||
模块 编号 | 序号 | 测试用例描述 | 操作过程及数据 | 预期结果 | 验证结果 |
2.1 | 功能描述:添加用户 | ||||
1 | 用户名为空 | 用户名:null | 添加失败 | √ | |
2 | 密码为空 | 密码:null | 添加失败 | √ |
3 | 正常添加 | 用户名:张三 账号:123 密码:123 | 添加用户成功 | √ | |
2.2 | 功能描述:修改用户密码 | ||||
1 | 修改用户密码 | 修改前:123456 修改后:123456 | 修改失败 | √ | |
2 | 修改用户密码 | 修改前:123 修改后:123456 | 修改成功 | √ | |
2.3 | 功能描述:删除用户 | ||||
1 | 删除用户 | 点击删除按钮,点击确定 | 删除用户成功 | √ |
4.2 项目评价
通过环境测试、功能测试、性能测试等测试环节,证明本系统能够满足用户的需求。能够保障管理数据的安全、准确;能够实现方便的扩展,满足图书馆发展的需要。
易安装、部署;系统维护方便;对操作人员的技能要求比较低,操作方便。在高系统配置、高网络带宽和容易得到保证的情况下,我们最需要考虑的性能需求就是系统安全性问题。在开发系统的每个阶段,均需要考虑彼此间的认证与授权。尤其要注意认证,简单地说就是确定谁是特定用户,并针对安全源验证该用户的身份。在处理完识别用户的方法之后,必须利用一种方法以向用户授权,从而能够使用系统的特定功能。
使用了css技术,设置页面的样式和布局。可以使登录页面的各个元素的布局和样式达到美观和易用的要求,同时也可以提高用户的交互体验和操作便利性。
在安全问题上,前端和后端相分离,提高了代码的安全性和维护性,便于后期进行代码功能的完善和管理。
第五章 结语
5.1、出现的问题
- 在我写添加图书的功能的时候我遇到了添加失败的情况,一直添加不成功。
- 我在写录入图书信息的时候,遇到了录入失败的情况。
- 配置环境比较麻烦,尤其是之前的MySQL有些问题
- 想添加一些新功能,但是总是出错
5.2、解决方法
- 重新配置了MySQL,然后成功使用了数据库
- 经过检查发现录入失败是因为数据库中表的内容有误
- 添加新功能出错,后来从网上查找资料,看视频,成功解决
5.3、项目总结
经过这几周的努力,图书管理系统基本开发完毕。其功能基本达到预期目的,对于数据的一致性的问题也通过程序进行了有效的解决。但是由于系统设计时间较短,所以该系统还有许多不尽如人意的地方,有待进一步改善。
我对系统中的列表分页功能比较满意,分页技术是把数据全部查询出来,然后再进行分页。本系统中含有不少的列表,对列表进行分页可以,降低带宽使用,提高访问速度。
在这个图书管理系统中,登录功能、图书查询功能、图书增加、修改图书、修改密码功能、借阅者录入、查看已录入图书、查看已录入借阅者、修改密码功能、退出系统、自动识别功能均已实现
但是,该程序也有不足的地方,由于我的水平不高,做出来的程序还是有许多问题存在。经过这次课程设计,通过对程序的编制,调试和运行,使我更好的掌握了文件的输入输出流基本性质和有关它们之间关系使用问题的解决方法,熟悉了各种调用的数据类型,在调试和运行过程中使我更加的了解和熟悉程序运行的环境,提高了我对程序调试分析的能力和对错误的纠正能力。通过这次JavaWeb课程设计实验,使我能够综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力,此次课程设计是对我实际工作能力的具体训练和考察过程。