基于Java Web的图书销售管理系统(源代码+课程设计报告)
CSDN 2024-08-02 14:03:18 阅读 58
1 需求分析
1.1 功能需求分析
登录注册功能模块:(1)系统具有良好的人机交互界面;(2)只有在本网站已注册用户可以登录,未登录的用户只可以检索图书,但不可以购买图书,购买需先强制登录;(3)登录对象分为普通用户和后台管理员(不可注册),根据权限的不同登录后的功能不同。图书检索功能模块:(1)进入系统整体显示图书信息;(2)分类检索图书信息;(3)模糊信息(书名关键字、主要内容片段)查询图书信息。图书销售管理功能模块:(1)对喜欢的图书可以加入购物车,以及对购物车内容的管理(购物车账单的增加与删除,查询账单)(2)购买后数据记录的保存。报表查询功能模块:(1)各个用户对本人账单的查询;(2)管理员可对所有账单记录查询。管理员后台功能模块:(1)管理员可对现有用户信息查询(不可更改,隐私数据加密);(2)管理员对所有账单信息的维护;(3)管理员对现有书库信息的维护。各类用户退出系统功能模块:(1)普通用户退出系统后,只有未登录时的权限;(2)管理员退出系统后,无法查看后台任何数据。
1.2非功能需求分析系统最大限度地实现易维护性和易操作性。系统运行稳定、安全可靠。
2 概要设计
2.1系统功能模块图
通过以上的系统需求分析,根据以上系统所要满足的功能,设计出了图书销售管理系统的主要功能模块图,如图1.1所示。
图1.1 图书销售管理系统的系统功能图
2.2 系统处理流程分析
(1)系统启动,用户根据自己的身份选择登录用户类型并进行身份验证(根据用户输入的登录信息与数据库中的信息进行比对);
(2)登录成功后,进入系统主界面;
(3)系统初始化,导入数据库;
(4)登录成功的用户根据自己的权限级别进行相应的功能选择并进行操作;
(5)退出系统。
系统具体处理流程如图2.2所示:
3 运行环境
Windows 10操作系统
4 开发工具和编程语言
开发工具:Eclipse,Navicat for Mysql
编程语言:java,jsp,js,sql
5 详细设计
5.1数据表
(1)shop_user表 记录注册用户信息
表5.1用户表
编 号 | 数据项名称 | 数据类型 | 备 注 |
---|---|---|---|
1 | Id | int | 用户标记 |
2 | UserName | varchar | 用户名 |
3 | PassWord | varchar | 用户密码、长度为20个字符 |
4 | Names | varchar | 用户真实姓名 |
5 | Sex | varchar | 用户性别 |
6 | Address | varchar | 用户地址 |
7 | Phone | varchar | 用户电话 |
8 | Post | varchar | 用户邮政编码 |
9 | varchar | 用户邮箱 | |
10 | Reg time | datetime | 用户注册时间 |
11 | ReglpAddress | varchar | 用户注册IP |
(2)book_admin表 记录管理员账号信息
表5.2管理员表
编 号 | 数据项名称 | 数据类型 | 备 注 |
---|---|---|---|
1 | AdminUser | varchar | 用户名 |
2 | AdminPass | varchar | 用户密码、长度为50个字符 |
(3)book表 记录录入的书籍信息
表5.3图书表
编 号 | 数据项名称 | 数据类型 | 备 注 |
---|---|---|---|
1 | Id | int | 书籍标记 |
2 | BookName | varchar | 书籍名称 |
3 | BookClass | int | 书籍类别 |
4 | Author | varchar | 书籍作者 |
5 | Publish | varchar | 书籍出版社 |
6 | BookNo | varchar | 书号 |
7 | Content | longtext | 书籍简介 |
8 | Prince | double | 书籍价格 |
9 | Amount | int | 书籍含有量 |
10 | Leav_number | int | 书籍剩余量 |
11 | RegTime | date | 上架时间 |
12 | picture | varchar | 照片名称 |
(4)bookclass表 记录书籍的类别
表5.4图书分类表
编 号 | 数据项名称 | 数据类型 | 备 注 |
---|---|---|---|
1 | Id | int | 类别标记 |
2 | ClassName | varchar | 类名 |
(5)order表 各用户独自的订单信息
表5.5用户订单信息表
编 号 | 数据项名称 | 数据类型 | 备 注 |
---|---|---|---|
1 | Id | int | 订单标记 |
2 | orderId | varchar | 订单号 |
3 | UserId | int | 用户的Id标记 |
4 | SubmitTime | datetime | 订单的提交时间 |
5 | ConsignmentTime | varchar | 订单的交货时间 |
6 | TotalPrice | double | 订单的总价格 |
7 | content | longtext | 书籍简介 |
8 | IPAdress | varchar | 用户IP |
9 | IsPayoff | int | 是否付款(1:未付,0:已付) |
10 | IsSales | int | 是否发货(1:未发,0:已发) |
(6)allorders表 后台记录所有的订单
表5.6后台订单总表
编 号 | 数据项名称 | 数据类型 | 备 注 |
---|---|---|---|
1 | Id | int | 订单标记 |
2 | orderID | bigint | 订单号 |
3 | BookNo | int | 所对应的书籍的Id标记 |
4 | Amount | int | 购买的数量 |
5.2 概念结构设计
用户(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)
5.3数据库的建立
5.3.1 建立数据库
CREATE DATABASE bookshop;
5.3.2 建数据表
(1)allorders表
DROP TABLE IF EXISTS `allorders`;
CREATE TABLE `allorders` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`orderID` bigint(11) NOT NULL,
`BookNo` int(11) NOT NULL,
`Amount` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `oderID` (`orderID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
(2)book表
DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`BookName` varchar(40) NOT NULL,
`BookClass` int(11) NOT NULL,
`Author` varchar(25) DEFAULT NULL,
`Publish` varchar(150) DEFAULT NULL,
`BookNo` varchar(30) DEFAULT NULL,
`Content` longtext,
`Prince` double DEFAULT NULL,
`Amount` int(11) DEFAULT NULL,
`Leav_number` int(11) DEFAULT NULL,
`RegTime` date NOT NULL,
`picture` varchar(200) DEFAULT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `Id` (`Id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;
(3)bookadmin表
DROP TABLE IF EXISTS `bookadmin`;
CREATE TABLE `bookadmin` (
`AdminUser` varchar(20) NOT NULL DEFAULT '',
`AdminPass` varchar(50) DEFAULT NULL,
PRIMARY KEY (`AdminUser`),
UNIQUE KEY `AdminUser` (`AdminUser`) USING BTREE,
UNIQUE KEY `AdminPass` (`AdminPass`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
(4)bookclass表
DROP TABLE IF EXISTS `bookclass`;
CREATE TABLE `bookclass` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`ClassName` varchar(30) NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
(5)order表
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`orderId` varchar(250) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`UserId` int(11) NOT NULL,
`SubmitTime` datetime NOT NULL,
`ConsignmentTime` varchar(20) DEFAULT NULL,
`TotalPrice` double DEFAULT NULL,
`content` longtext,
`IPAddress` varchar(20) DEFAULT NULL,
`IsPayoff` int(11) DEFAULT NULL,
`IsSales` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `orderID` (`orderId`) USING BTREE,
UNIQUE KEY `UserId` (`UserId`) USING BTREE,
KEY `Id` (`Id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
(6)shop_user表
DROP TABLE IF EXISTS `shop_user`;
CREATE TABLE `shop_user` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`UserName` varchar(20) NOT NULL,
`PassWord` varchar(50) NOT NULL,
`Names` varchar(20) DEFAULT NULL,
`Sex` varchar(2) DEFAULT NULL,
`Address` varchar(150) DEFAULT NULL,
`Phone` varchar(25) DEFAULT NULL,
`Post` varchar(8) DEFAULT NULL,
`Email` varchar(50) DEFAULT NULL,
`RegTime` datetime DEFAULT NULL,
`RegIpAddress` varchar(50) DEFAULT NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `UserName` (`UserName`),
KEY `Id` (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
5.3.3 建立视图
(1)class_book视图 (图书检索所用)
DROP VIEW IF EXISTS `class_book`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `class_book` AS select `a`.`Id` AS `id`,`a`.`BookName` AS `bookname`,`a`.`BookClass` AS `bookclass`,`b`.`ClassName` AS `classname`,`a`.`Author` AS `author`,`a`.`Publish` AS `publish`,`a`.`BookNo` AS `bookno`,`a`.`Content` AS `content`,`a`.`Prince` AS `prince`,`a`.`Amount` AS `amount`,`a`.`Leav_number` AS `Leav_number`,`a`.`RegTime` AS `regtime`,`a`.`picture` AS `picture` from (`book` `a` join `bookclass` `b`) where (`a`.`BookClass` = `b`.`Id`) ;
(2)getbookclass视图 (检索图书类别所用)
DROP VIEW IF EXISTS `getbookclass`;
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `getbookclass` AS select `bookclass`.`Id` AS `Id`,`bookclass`.`ClassName` AS `ClassName` from `bookclass` order by `bookclass`.`Id` asc ;
5.3.4 建立触发器
(1)ispay_book触发器 在向订单列表添加一条数据时(相当于购买图书),会在图书的库存值减去出售数量的图书。
DROP TRIGGER IF EXISTS `ispay_book`;
DELIMITER ;;
CREATE TRIGGER `ispay_book` AFTER INSERT ON `allorders` FOR EACH ROW UPDATE book
SET Leav_number = Leav_number - (SELECT Amount from allorders order by orderID desc limit 1)
WHERE book.Id = (SELECT BookNo from allorders order by orderID desc limit 1
;;
DELIMITER ;
(2)del_allorders触发器
在订单列表中删除一条数据,如果已支付,删除对应用户订单列表中的记录。如果未支付,则也同样删除对应用户订单列表的记录并且在书库的储存量上加上提交时购买的图书量。
DROP TRIGGER IF EXISTS `del_allorders`;
DELIMITER ;;
CREATE TRIGGER `del_allorders` AFTER DELETE ON `allorders` FOR EACH ROW if exists(select orderID from `order` where IsPayoff=1) then
update book set Leav_number= Leav_number+old.Amount where id = old.bookno;
delete from `order` where id=old.id;
else
delete from `order` where id=old.id;
end if
;;
DELIMITER ;
5.3.5 建立索引
在经常检索的表(order)的列上建立索引
(1)在每个用户订单列表上建立。
re>
图5.8显示用户订单表索引
(2)在图书表(book)上建立
re>
图5.9显示图书表索引
5.4 具体功能模块设计
5.4.1 登录注册功能模块
采用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;
}
运行截图:
re>
图7.1用户登录界面
re>
图7.2管理员登录界面
re>
图7.3用户登录成功界面
5.4.2 图书检索功能模块
该模块主要是在对应的数据处理(.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;
}
}
运行截图:
re>
图7.4计算机类图书的检索
re>
图7.5模糊查询相关图书
5.4.3 图书销售管理功能模块
该功能模块主要是用户将将要购买的书籍和书的数量确定后提交到购物车,在购物车界面可对所选物品做最后的确认,可以修改所选物品的基本信息。然后提交订单,有系统根据计算机的时间位移偏移量生成唯一的订单号,在用户的订单表中添加一条数据,并在总的销售记录表中添加一条记录。
部分代码:
/**
* 提交购物车
* @param newrequest
* @return
* @throws java.lang.Exception
*/
public boolean payout(HttpServletRequest newrequest) throws Exception {
request = newrequest;
session = request.getSession(true);
if (session == null) {
return false;
}
String Userid = (String) session.getAttribute("userid"); //取得用户ID号
long userid = 0;
if (Userid == null || Userid.equals("")) {
isLogin = false;
return false;
}
else {
try {
userid = Long.parseLong(Userid);
}
catch (NumberFormatException e) {
// System.out.print(e.getMessage());
return false;
}
}
purchaselist = (Vector) session.getAttribute("shopcart");
if (purchaselist == null || purchaselist.size() < 0) {
return false;
}
String Content = request.getParameter("content");
if (Content == null) {
Content = "";
}
Content = getGbk(Content);
String IP = request.getRemoteAddr();
String TotalPrice = request.getParameter("totalprice");
long timeInMillis = System.currentTimeMillis();
sqlStr = "insert into `order`(orderId,UserId,SubmitTime,ConsignmentTime,TotalPrice,content,IPAddress,IsPayoff,IsSales) values (";
orderId=" "+timeInMillis;//以系统时间产生位移的订单编号
sqlStr = sqlStr + orderId + ",";
sqlStr = sqlStr + userid + ",now(),date_add(now(),interval 1 week),";
sqlStr = sqlStr + TotalPrice + ",'";
sqlStr = sqlStr + dataFormat.toSql(Content) + "','";
sqlStr = sqlStr + IP + "',1,1)";
session.setAttribute("orderId", orderId);
try {
DataBase db = new DataBase();
Connection conn=db.connect();
stmt = conn.createStatement ();
stmt.execute(sqlStr);
for (int i = 0; i < purchaselist.size(); i++) {
allorder iList = (allorder) purchaselist.elementAt(i);
sqlStr =
"insert into allorders (orderId,BookNo,Amount) values (";
sqlStr = sqlStr + orderId + ",'";
sqlStr = sqlStr + iList.getBookNo() + "','";
sqlStr = sqlStr + iList.getAmount() + "')";
stmt.execute(sqlStr);
/* sqlStr = "update book set leav_number=leav_number - " +
iList.getAmount() + " where id = " + iList.getBookNo();
stmt.execute(sqlStr);*/
}
return true;
}
catch (SQLException e) {
System.out.print(e.getMessage());
return false;
}
}
}
re>
re>
图7.6提交购买jsp书
5.4.4 报表查询功能模块
该功能模块主要是对该系统所有的订单表中的数据进行检索。
部分代码:
/**
* 查询书店的所有订单数据
* @return
*/
public boolean getOrder() {
sqlStr = "select count(*) from `order`"; //取出记录数
int rscount = pageSize;
try {
DataBase db = new DataBase();
Connection conn=db.connect();
stmt = conn.createStatement ();
ResultSet rs1 = stmt.executeQuery(sqlStr);
if (rs1.next())
recordCount = rs1.getInt(1);
rs1.close();
}
catch (SQLException e) {
return false;
}
//设定有多少pageCount
if (recordCount < 1)
pageCount = 0;
else
pageCount = (int) (recordCount - 1) / pageSize + 1;
//检查查看的页面数是否在范围内
if (page < 1)
page = 1;
else if (page > pageCount)
page = pageCount;
rscount = (int) recordCount % pageSize; // 最后一页记录数
//sql为倒序取值
sqlStr = "select * from `order` ";
if (page == 1) {
sqlStr = sqlStr + " order by Id desc";
}
else {
sqlStr = sqlStr + " order by Id desc limit "+(recordCount - pageSize * page) +","+ (recordCount - pageSize * (page - 1));
}
try {
DataBase db = new DataBase();
Connection conn=db.connect();
stmt = conn.createStatement ();
rs = stmt.executeQuery(sqlStr);
allorder = new Vector();
while (rs.next()) {
order ind = new order();
ind.setId(rs.getLong("id"));
ind.setOrderId(rs.getString("orderid"));
ind.setUserId(rs.getLong("userid"));
ind.setSubmitTime(rs.getString("submitTime"));
ind.setConsignmentTime(rs.getString("ConsignmentTime"));
ind.setTotalPrice(rs.getFloat("TotalPrice"));
ind.setContent(rs.getString("content"));
ind.setIPAddress(rs.getString("IpAddress"));
if (rs.getInt("IsPayoff") == 1)
ind.setIsPayoff(false);
else
ind.setIsPayoff(true);
if (rs.getInt("IsSales") == 1)
ind.setIsSales(false);
else
ind.setIsSales(true);
allorder.addElement(ind);
}
rs.close();
return true;
}
catch (SQLException e) {
System.out.println(e);
return false;
}
}
5.4.5 后台功能模块
该模块主要是对后台图书的信息,用户的订单列表信息,用户的基本信息的维护。
运行截图:
re>
图7.7管理员登录页面
re>
图7.8用户信息管理
re>
re>
图7.9添加新图书
re>
re>
图7.10管理员订单查询
re>
re>
图7.11管理员删除订单信息
由于该订单未支付,用户nanfeng的订单信息也应该删除,并且JSP应用开发的数量也会被增加删除订单所拥有的数量。
5.4.6 退出功能模块
该模块主要是在退出时(或者未登录时)未激活登录状态标志islogin,未登录或者退出的用户,无法进行购买图书,只可以以游客身份进行检索查看。管理员界面未登录或退出时,所有功能都不可以使用,会提示无权限访问。
re>
图7.12管理员退出后功能提示无权限访问
re>
图7.13用户未登录需登录才可购买
6 调试分析
在测试系统时,采用本人信息实体注册,登录。在登录成功后的图书展示界面比较的友好,但是在从购物车中提交购买信息表单后,在表单列表无法对订单信息(如收货地址)的修改与删除,而且每次购物必须先放进去购物车,无法直接购买,值得在时间充裕时修正。在管理员的后台管理模块,整体设计都比较偏向界面友好,对用户的使用没有太大难度。
7 测试结果
7.1登录测试数据:
普通用户:
表7.1
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | UserName:nanfeng Password:1 | 登录成功 | 通过 |
管理员:
表7.2
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | AdminName:admin PassWord:admin | 登录成功 | 通过 |
7.2图书检索测试数据:
分类检索:
表7.3
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | 计算机类 | 显示计算机类信息 | 通过 |
图书检索:
表7.4
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | java | 显示有关java的书籍 | 通过 |
7.3提交订单测试
购买图书:
表7.5
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | 购买JSP应用开发详解 | 显示订单信息以及总价格 | 通过 |
7.4管理员登录维护后台信息
添加图书信息
表7.6
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | 购买JSP应用开发详解 | 正确添加到书库 | 通过 |
管理员订单查询
表7.7
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | JSP应用开发订单信息 | 显示订单信息以及总价格 | 通过 |
管理员订单管理
表7.8
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | 删除JSP应用与开发订单 | 显示订单信息以及总价格 | 通过 |
7.5用户退出系统测试
表7.9
编号 | 测试用例 | 期待结果 | 是否通过 |
---|---|---|---|
1 | 用户和管理员退出系统 | 用户界面可以以游客身份查询图书,管理员界面无权限访问 | 通过 |
参考文献
[1] 边肇祺,模式识别[M](第二版),北京:清华大学出版社,1988
[2] 李绍俊,杨海军,黄耀欢,周芹。基于NoSQL数据库的空间大数据分布式存储策略[J].武汉大学学报(信息科学版),2017,42(02):163-169..
[3]刘纪刚。高校图书馆自建特色数据库的着作权分析[J].图书馆研究与工作,2017,(01):52-57
[4]刘杰,何小波。大数据环境下高校教学基本状态数据库的研究[J].计算机时代,2017,(01):90-92.[2017-08-25]
[5]戴声,王波。基于图数据库的大规模配置管理数据库关联查询[J].计算机与现代化,2017,(01):51-56.(2017-01-12)[2017-08-25]
心得体会
通过本次实验,我基本实现了数据库系统所需的全部需求内容,同时我更加理解了数据库由概念结构设计、逻辑结构设计、物理结构设计一体的设计过程。在数据库的设计中需要考虑的各项因素很多,重点在于数据字典的各项设计。数据库中的数据控制包含触发器、存储过程的设计。对于经常检索的表的数据可以建立索引增加查询的速度。
在编写系统的过程中,对于分页显示检索的信息时,遭遇到无法分页显示的问题,而是全部数据全部显示。由于该控制函数在所有界面的检索结果中都有用到,对于其耦合度需要很好的控制。我通过后来的测试,在java文件的函数中实现遍历,对于页数的控制在jsp文件中控制,然后将参数使用session控制。对于数据库检索结果的Result集,使用absolute()函数来控制游标的位置(前提是将每页的条数用标记参数控制好)。在设计时,由于时间关系用户界面没有在登录时的验证码验证,以及登录后对该用户个人信息的维护。由于这些设计在后台管理有体现所以没有进行更全面的编写。对于整体而言,可能还存有潜在的问题,但是整体来说已经可以使用,包括错误数据的提示与不同情况权限的控制。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。