功能需求分析
- 登录注册功能模块:(1)系统具有良好的人机交互界面;(2)只有在本网站已注册用户可以登录,未登录的用户只可以检索图书,但不可以购买图书,购买需先强制登录;(3)登录对象分为普通用户和后台管理员(不可注册),根据权限的不同登录后的功能不同。
- 图书检索功能模块:(1)进入系统整体显示图书信息;(2)分类检索图书信息;(3)模糊信息(书名关键字、主要内容片段)查询图书信息。
- 图书销售管理功能模块:(1)对喜欢的图书可以加入购物车,以及对购物车内容的管理(购物车账单的增加与删除,查询账单)(2)购买后数据记录的保存。
- 报表查询功能模块:(1)各个用户对本人账单的查询;(2)管理员可对所有账单记录查询。
- 管理员后台功能模块:(1)管理员可对现有用户信息查询(不可更改,隐私数据加密);(2)管理员对所有账单信息的维护;(3)管理员对现有书库信息的维护。
- 各类用户退出系统功能模块:(1)普通用户退出系统后,只有未登录时的权限;(2)管理员退出系统后,无法查看后台任何数据。
非功能需求分析
- 系统最大限度地实现易维护性和易操作性。
- 系统运行稳定、安全可靠。
系统处理流程分析
(1)系统启动,用户根据自己的身份选择登录用户类型并进行身份验证(根据用户输入的登录信息与数据库中的信息进行比对);
(2)登录成功后,进入系统主界面;
(3)系统初始化,导入数据库;
(4)登录成功的用户根据自己的权限级别进行相应的功能选择并进行操作;
(5)退出系统。
开发工具和编程语言
开发工具:Eclipse,Navicat for Mysql
编程语言:java,jsp,js,sql
概念结构设计
用户(Id,UserName,PassWord,Names,Sex,Adress,Phone,Post,,Email,
RegTime,RegIPAdress);
管理员(AdminUser,AdminPass);
图书(Id,BookName,BookClass,Author,Publish,BookNo,Content,Price,
Amount,Leav_number,RegTime,picture);
图书类别(Id,BookClass);
图书查询(Id,BookName,BookClass,ClassName,Author,Publish,BookNo,
Content,Price,Amount,Leav_number,RegTime,picture)
销售表单(Id,orderID,BookNo,Amount)
分类查询(BookClass,BookName)
登录注册功能模块
采用jsp,css设计良好的用户交互界面,并在登录的jsp文件中的掺入少量的基本检错功能(如登录界面,用户名或者密码为空,并给出友好的提示;如注册界面除检测基本的必要信息不能为空外,加上注册密码两次密码的输入是否一致),输入必要的信息后,点击登录按钮将表单数据提交到对应的servelet文件,检索数据库做更深层次的检查。
部分代码:
登录界面
<script language="javascript">
function checkform() {
if (document.form1.username.value=="" || document.form1.passwd.value==""){
alert("用户名或密码为空!");
return false;
}
return true;
}
</script>
注册界面:
<script language="javascript">
function openScript(url,name, width, height){
var Win = window.open(url,name,'width=' + width + ',height=' + height + ',resizable=1,scrollbars=yes,menubar=no,status=yes' );
}
function checkform() {
if (document.form1.username.value==""){
alert("用户名不能为空");
document.form1.username.focus();
return false;
}
if (document.form1.passwd.value==""){
alert("用户密码不能为空");
document.form1.passwd.focus();
return false;
}
if (document.form1.passwd.value!=document.form1.passconfirm.value){
alert("确认密码不相符!");
document.form1.passconfirm.focus();
return false;
}
return true;
}
源码:
https://pan.baidu.com/s/1WsSe97V0Ebhcyzn9_hRSHw?pwd=1004
图书检索功能模块
该模块主要是在对应的数据处理(.java)文件中,实现对数据库中视图book_class(基本对应book表)的检索,采用具体书名的检索,模糊匹配检索,模糊的简介检索。
部分代码:
/**
* 完成图书查询,包括分类,分页查询
*
* @param res
* @return
* @throws java.lang.Exception
*/
public boolean book_search(HttpServletRequest res) throws Exception {
DataBase db = new DataBase();
Connection conn = db.connect();
Statement stmt = conn.createStatement();
request = res;
String PAGE = request.getParameter("page"); // 页码
String classid = request.getParameter("classid"); // 分类ID号
String keyword = request.getParameter("keyword"); // 查询关键词
if (classid == null)
classid = "";
if (keyword == null)
keyword = "";
keyword = to_String(keyword).toUpperCase();
try {
page = Integer.parseInt(PAGE);
} catch (NumberFormatException e) {
page = 1;
}
// 取出记录数
if (!classid.equals("") && keyword.equals("")) {
sqlStr = "select count(*) from book where bookclass='" + classid
+ "'";
} else if (!keyword.equals("")) {
if (classid.equals("")) {
sqlStr = "select count(*) from book where upper(bookname) like '%"
+ keyword
+ "%' or upper(content) like '%"
+ keyword
+ "%'";
} else {
sqlStr = "select count(*) from book where bookclass='"
+ classid + "'" + " and (upper(bookname) like '%"
+ keyword + "%' or " + "upper(content) like '%"
+ keyword + "%')";
}
} else {
sqlStr = "select count(*) from book";
}
int rscount = pageSize;
try {
ResultSet rs1 = stmt.executeQuery(sqlStr);
if (rs1.next())
recordCount = rs1.getInt(1);
rs1.close();
} catch (SQLException e) {
System.out.println(e.getMessage());
return false;
}
// 设定有多少pageCount
if (recordCount < 1)
pageCount = 0;
else
pageCount = (int)recordCount / pageSize + 1;
// 检查查看的页面数是否在范围内
if (page < 1)
page = 1;
else if (page >= pageCount)
page = pageCount;
if(page==pageCount)
rscount = (int) recordCount % pageSize; // 最后一页记录数
sqlStr = "select * from class_book";
if (!classid.equals("") && keyword.equals("")) { // 如果类别不为空,非查询
if (page == 1) {
sqlStr = sqlStr + " where a.bookclass='" + classid + "' ";
} else {
sqlStr = sqlStr + " where a.bookclass='" + classid + "'";
}
} else if (!keyword.equals("")) { // 如果是查询资料
if (page == 1) {
if (!classid.equals("")) {// 查询某一类
sqlStr = sqlStr + "where a.Bookclass='" + classid
+ "' and (upper(a.bookname) like '%" + keyword
+ "%' or upper(a.content) like '%" + keyword
+ "%')";
} else { // 查询所有类
sqlStr = sqlStr + " where (upper(a.bookname) like '%"
+ keyword + "%' or upper(a.content) like '%"
+ keyword + "%')";
}
} else {
if (!classid.equals("")) {
sqlStr = sqlStr + " where a.Bookclass='" + classid + "'"
+ " and (upper(a.bookname) like '%" + keyword
+ "%'" + " or upper(a.content) like '%" + keyword
+ "%')";
} else {
sqlStr = sqlStr + " where (upper(a.bookname) like '%"
+ keyword + "%'" + " or upper(a.content) like '%"
+ keyword + "%')";
}
}
} else {// 非查询,也非分类浏览
if (page == 1) {
sqlStr = sqlStr ;
} else {
sqlStr = sqlStr;
}
}
try {
rs = stmt.executeQuery(sqlStr);
booklist = new Vector(rscount);
if(page<pageCount) {
rs.absolute((page-1)*rscount);
}
else
rs.absolute((page-1)*pageSize);
for(int i=1;i<=rscount;i++)
if(rs.next()) {
book book = new book();
book.setId(rs.getLong("id"));
book.setBookName(rs.getString("bookname"));
book.setBookClass(rs.getInt("bookclass"));
book.setClassname(rs.getString("classname"));
book.setAuthor(rs.getString("author"));
book.setPublish(rs.getString("publish"));
book.setBookNo(rs.getString("Bookno"));
book.setContent(rs.getString("content"));
book.setPrince(rs.getFloat("prince"));
book.setAmount(rs.getInt("amount"));
book.setLeav_number(rs.getInt("leav_number"));
book.setRegTime(rs.getString("regtime"));
book.setPicture(rs.getString("picture"));
booklist.addElement(book);
}
System.out.println(booklist.size());
rs.close();
return true;
} catch (Exception e) {
System.out.println(e.getMessage());
return false;
}
}