项目简介
在网页端实现有关图书管理的一系列功能。
功能描述:在登录页面输入正确的管理员账号名和密码并输入正确的验证码后跳转到主页,若账号、密码或验证码有误则网页提示“用户名或密码不正确”、“验证码错误”。在主页左侧有四个功能选项,分别是“会员管理”、“图书管理”、“常用操作”、“个人中心”。
“会员管理”中有“会员开卡”、“会员管理”两个子功能。“会员开卡”需要输入用户名、密码、确认密码、充值金额、电话号码与身份证号码,正确输入后会在mybook数据库user表中存入一个新的会员信息并且在表中自动生成一个id编号(数据库采用无线层级分类能够自动给加入的数据生成id编号,编号自1开始,每记录一条信息,分配给该条信息的id编号是历史总信息条数+1)。“会员管理”页面能够显示所有注册会员的信息,每一行显示一条用户信息,每一行右侧有“修改”“删除”功能键。点击右侧的‘修改’进入会员信息修改页面,点击‘删除’若此时用户账户下的余额为0才能成功删除,否则提示删除失败。
“图书管理”:点击“添加图书”后输入图书信息后能将图书信息存入book表中。点击“修改图书”能够以行列的形式展示所有的图书信息,与“会员管理”功能一样每一行有“修改”“删除”功能键。
“常用操作”:进入“图书借阅”模块,首先要输入正确的用户id编号在网页上显示该用户的‘会员名称’‘可借数量’‘账户余额’,后才能够使用下面的图书查询功能,“图书查询”模块中要输入书籍的全名才能在网页上显示书籍信息,选中书籍条目,点击完成借阅就可以完成书籍的借阅。“图书归还”同样要输入正确的id编号后才能显示该用户借阅的书籍信息。
“个人中心”则面向管理员,修改管理账号的密码。
团队博客链接:
https://blog.csdn.net/huayvmoshui/article/details/122420825
二、功能架构图
流程图
个人任务简述
完成功能与任务 | 描述 |
---|---|
基本类和表结构的设计 | 明确各种对象的具体属性 |
方法类的编写 | 实现对数据库信息的修改 |
DataHelper | 实现有关日期的计算 |
本人负责功能详解
DataHelper类的编写:由于图书管理系统中书籍的借阅和归还是十分重要的功能,而上述功能关系的日期的计算,若在所有有关书籍的借阅和归还的方法中编写有关日期计算的代码,代码会显的臃肿。因此编写一个帮助类方便后面代码的编写
package com.enjoy.book.util;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateHelper {
/**
* 对date日期进行加减操作
* @param date 一个日期
* @param amount (加、减)多少天
* @return 计算后的日期对象
* @author 赵洋
*/
public static java.sql.Date getNewDate(java.sql.Date date , long amount){
long mills = date.getTime();
mills += amount*24*60*60*1000;
java.sql.Date backDate = new java.sql.Date(mills);
return backDate;
}
/**
* 计算两个时间差
* @param date01
* @param date02
* @return
*/
public static int getSpan(Date date01,Date date02){
long span = date01.getTime()-date02.getTime();
int day = (int)(span/1000/60/60/24);
return Math.abs(day);
}
}
基本类和表结构的设计
由于该项目的数据修改储存用到mysql数据库,因此根据数据库中的表结构设计基本类。
book表储存书籍:信息name书名,price书籍单价,desc书籍简介,author作者,address书籍馆藏区域,publish出版社,stock库存数量。
member表储存用户信息:name用户名,pwd用户密码,balance用户账户金额,tel用户联系电话,idNumber用户身份证号码
user表储存管理员信息:name管理员名称,pwd管理员密码,state管理员状态,若state为0则不可登陆
record表储存借阅信息:memberid是用户表中id列中的信息,bookid是book表中的id列中的信息,rentDate借阅日期,backDate归还日期,deposit押金,userId记录是哪一个管理员负责该次借阅。
1.方法编写
该类编写有关数据库信息的修改的方法的实现,下列举其中一个方法的具体代码
QueryRunner runner= new QueryRunner();
private int pageIndex;
/**
* 添加书籍
* @return
*/
@Override
public int add(String name,double price,String desc,
String publish,String author,long stock,String address) throws SQLException {
Connection conn = DBHelper.getConnection();
String sql="insert into book(`name`,price,`desc`,publish,author,stock,address) " +
"values(?,?,?,?,?,?,?)";
int count = runner.update(conn,sql,name,price,desc,publish,author,stock,address);
DBHelper.close(conn);
return count;
}
Bookdata类中add方法实现对书籍信息的添加,DBHelper类中通过c3p0连接池,实现连接数据库的方法,调用DBHelper中的连接方法连接到数据库,runner是类中声明的QueryRunner对象用来完成数据库操作。 最后关闭数据库连接。而传入该方法的参数从BookServlet中通过jsp页面传入的表单数据,调用switch方法判断用户在页面要实现的方法
若传入的String短语是“add”,则调用bookData类中的add方法对数据库进行修改。
课程设计感想
编程过程中对servelet的理解不够透彻,了解不够深入,常常会因为一些语法的错误导致工作进度很长一段时间没有进展,同时我也对编程过程中的一些学习进行了总结。
serializable接口:Serializable接口是启用其序列化功能的接口。实现java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化。为什么要序列化?存储对象在存储介质中,以便在下次使用的时候,可以很快捷的重建一个副本。便于数据传输,尤其是在远程调用的时候!
4个JSP内置对象的作用域分别为:application、session、request、page 。
application 作用域是整个应用是指从应用启动,到应用结束。我们没有说“从服务器启动,到服务器关闭”,是因为一个服务器可能部署多个应用,当然你关闭了服务器,就会把上面所有的应用都关闭了。 application作用域里的变量,它们的存活时间是最长的,如果不进行手工删除,它们就一直可以使用。
session作用域同一浏览器对服务器进行多次访问,在这多次访问之间传递信息,就是session作用域的体现。如果把变量放到session里,就说明它的作用域是session,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。
request作用域一个HTTP请求的处理可能需要多个Servlet合作,而这几个Servlet之间可以通过某种方式传递信息,但这个信息在请求结束后就无效了。request里的变量可以跨越forward前后的两页。但是只要刷新页面,它们就重新计算了。如果把变量放到request里,就说明它的作用域是request,它的有效范围是当前请求周期。
page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。page里的变量只要页面跳转了,它们就不见了。如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。
Form表单元素的信息需要被后台获取就必须设置name属性。
展望
本次完成的系统仅仅面向管理员,若普通用户想要实现有关于图书借阅,归还以及信息的修改就必须通过管理员才能完成相关操作。若想进一步完善该系统可以在登陆时选择身份类型从而跳转到相关页面实现功能的操作。同时在图书借阅功能中是通过用户在数据库中自动生成的id查询信息,因而用户对id的印象不够深刻,用户忘记id时必须先通过会员管理页面找到用户的id后才能完成相关操作。应将id改为身份证号。