资源描述
课程设计报告
课程名称 基于J2EE项目开发
设计题目 超市管理系统
专业班级 软件1231
姓 名 刘香弟
学 号
成 绩 评 定
考核
内容
设计
体现
设计
报告
答辩
综合评
定成绩
成 绩
计算机技术与工程学院
和谐 勤奋 求是 创新
目 录
1题目选取与系统分析 3
1.1项目功能分析 3
1.1.1顾客功能性需求 3
1.1.2管理员功能性需求 4
2 模块设计 5
2.1系统总体设计 5
2.2模块设计 5
2.2.1登录模块 7
2.2.2商品信息查看模块 8
2.3.3购物车模块 8
3数据库数据表设计与映射 9
3.1数据库表设计 9
4 系统详细设计与实现 11
4.1综合描述 11
4.2系统运营界面描述 12
4.3重要Java类和其功能 25
4.4系统测试 27
4.4.1测试目的与办法 27
4.4.2测试用例 27
1题目选取与系统分析
1.1项目功能分析
功能性需求是整个需求分析章节最为重要某些。它直接决定了系统模块划分,业务逻辑,明确了使用者对小型超市信息管理系统功能规定。一种完善,明确,详细功能性需求分析是开发一种系统核心。成功功能性需求分析可以避免后期对系统大范畴改动甚至是推倒重建,因而,本某些极为重要。
1.1.1顾客功能性需求
1>不用输入顾客名,密码 ,直接登录超市管理系统商品页面;
2>查看商品基本信息,涉及 商品编号,单价,余量,厂家,生产日期,保质期;
3>在购物车中查看自己选中商品名称,价格,数量,并可以从购物车中移除某些商品,查看总价,并可以选取结账或选取继续购物;
4>点击结账后显示结账成功并退出系统。
有关用例图见图1-1。
图1-1 顾客用例图
顾客用例 “查看商品基本信息”用例描述见表1-1。其她用例类似于此,不再一一赘述。
表1-1 用例描述-查看商品基本信息
使用者
顾客
用例
查看商品基本信息
参加者
顾客,小型超市信息管理系统
数据
顾客向超市信息管理系统发送商品有关信息,如商品名,商品类型,商品编号等
勉励
超市信息管理系统依照顾客发送字段,查询后台数据库
响应
超市信息管理系统返回查询商品成果
备注
无
1.1.2管理员功能性需求
1>打开网站后,进入登录页面。输入顾客名,密码 登录系统。
2>登陆后,选取进入系统人员管理页面或者商品信息管理页面。在系统人员管理页面中,查看其他管理员信息,并可以添加新管理员。在商品信息管理页面,可以查看所有商品信息,涉及商品编号,进价,单价,余量,厂家,生产日期,保质期。
3>进入商品信息管理页面进货管理页面,可以填写进货单,实现有关产品数量增长。
4>进入商品信息管理页面销售查看页面,可以查看近期各项商品销售状况。
5>点击页面右上角退出按钮,直接退出系统并跳转到登录页面。
有关用例图见图1-2 管理员功能性需求用例图。
图1-2 管理员功能性需求用例
2 模块设计
2.1系统总体设计
系统总体设计图如图4-1所示。当使用人员登录系统后,按身份不同进入各自页面,并使用系统提供功能。管理员人员信息管理属于操作者所有,在此本系统默认管理员可以操作其她管理员信息。
图2-1 系统总体设计图
2.2模块设计
本处将对小型超市信息管理系统进行分模块设计,明确各个模块操作流程,功能如何使用等问题。
1> 登录模块
超市信息管理系统使用者重要有两种:普通顾客和管理员。
按照寻常生活中超市运作流程,普通顾客不需要为其设立专门数据表,因此只需要实现管理员登录模块。
使用者进入系统后,一方面进入欢迎界面。普通顾客点击“开始购物路程”超链接,直接进入购物界面。管理员点击“进入后台系统”超链接,进入管理员登陆界面。
由于管理员对系统有操作,查看等权限,因而不容许在登陆页面注册新管理员。
登陆成功后跳转至管理员管理页面,否则显示“Login fail”登陆失败。
当输入对的姓名,密码后,界面自动跳转到管理员管理欢迎界面。
2> 商品信息管理模块
管理员进入后台管理界面后,点击“商品信息管理页面”超链接,进入商品信息管理页面。
页面查询后台数据库数据,将所有商品信息展示在右侧页面上。若管理员需要对有关商品信息作出修改,或者删除某项商品信息。则点击相应超链接进行操作。删除成功后系统会提示“删除成功”。
点击“更新”,系统会进入商品信息更新页面。在页面中,已经预先填好了所选商品信息。这容许管理员仅对需要修改字段内容修改,避免了全盘输入麻烦。
若管理员需要添加新商品,则点击“添加新商品”链接。系统跳转到 商品信息添加页面。
在此页面填入相应商品信息,点击“添加”按钮。若各个字段值都符合规定,则系统提示“添加成功”。再点击左侧“商品信息管理页面”,则可以看到刚才插入商品信息。
3> 进货单管理模块
进货是超市正常运营,及时跟进市场最新动态,调节售货方向最重要手段。进货单管理模块用来实现进货功能,管理员可以填写进货单实现对商品表及进货单表更新。在 管理员管理欢迎界面 点击“进货单管理页面”,系统跳转到进货单管理页面。
由于进货操作是管理员对超市经营状况收集信息重要途径,因而不容许对进货单进行修改操作,以便进行对账,共计等操作。点击“增长进货单”链接,系统跳转至进货信息添加页面。
在进货信息添加页面中,当管理员填写好相应字段后,点击“添加”按钮。系统在后台会自动查找填入商品名。如果此前存在同名商品,则在本来商品基本上,对数量作出修改。如果查不到填入商品名,则在商品表中新建一条记录。最后,在进货单表中生成相应进货记录。
4> 管理员信息管理模块
在管理员管理欢迎界面,点击“管理员信息管理页面”。系统跳转至管理员信息管理界面。在此界面上,可以实现对管理员信息增删改,在此不再一一赘述。
5> 交易信息查看模块
顾客每次在超市消费都会有相应记录。由于小型超市规模限制,不也许大量保存每笔交易详细信息,因而系统以交易流水号形式表达每笔交易。此模块就是供管理员查看交易信息记录。
由于交易信息是对超市中已存在交易行为记录,因而不容许管理员对交易信息进行修改,只能在记录较多时删除某条记录。
6> 退出模块
管理员在左侧菜单点击“退出”链接,进入“确认退出页面”。
7> 购物模块
在开始页面点击“开始购物路程”链接,跳转到购物页面。
点击一项商品后添加至购物车链接,会提示添加成功,并选取查看购物车或继续购物。
点击“查看购物车”进入购物车管理页面。可以实现对购物车中商品数量修改,查看当前已购买商品价格总计,或者选取删除购物车中某项商品,甚至清空购物车。
点击“结账”链接,系统在新页面中会生成一种交易流水号,继续点击“结账”,如果后台保存成功,则提示交易完毕,点击链接离开。
2.2.1登录模块
登录流程如图2-3。管理员在登录表单填写顾客名,密码,将表单与Flag标志提交至Servlet。系统依照XML文献配备,调用有关Servlet类(MemberController.java)。Servlet依照Flag值,调用相应函数,查询数据库表(member)并进行判断,如果顾客名与密码匹配,则跳转到管理页面(manage.jsp),否则,输出登录失败页面。
图2-2 登录模块流程图
2.2.2商品信息查看模块
在Left.jsp 中点击“商品信息管理页面”,链接为”Goods.do?flag=1” 。系统依照XML配备文献,调用GoodsController.java 。接受到Flag=1 ,调用FindAll()办法,查询MysqL数据库中goods表,查询所有商品信息,返回一种List<Goods> 集合,名为list。运用req.setAttribute("goods",list) 将集合存入request范畴内,然后跳转至商品信息展示页面(Goodsmanage.jsp)。
在商品信息展示页面,创立一种Table.列名分别为商品各项属性名。新建一种List<Goods> list.。将request 范畴内“goods”接受并进行强制类型转换。循环list,将商品输出。
在每一行商品背面,加上“删除”“更新”两个链接,分别为:“Goods.do?flag=2&id=<%=list.get(i).getID()%>”,“Goods.do?flag=5&id=<%=list.get(i).getID()%>”。点击链接,可以调用GoodsController.java 中相应函数,传递参数为ID,进行删除或更新操作。
有关流程见图2-3。
图2-3 商品信息查看模块流程图
2.3.3购物车模块
添加商品至购物车时,会对购物车中商品进行校验,若商品已在购物车中,则不在购物车中添加新项目,而是只修改商品数量。
顾客可以在购物车中编辑商品信息,涉及修改商品数量,删除某些不想要商品,或者清空购物车。每点击有关链接就调用servlet相应函数对session中ShoppingCart进行操作。如果点击“结账”,则进入生成流水号页面。结账成功后,则对数据库中商品余量进行修改,自动减去顾客购买商品数量。
购物车流程图如图5-11所示。
图5-11 购物车模块流程图
3数据库数据表设计与映射
3.1数据库表设计
商品基本信息表见表3-1。
表3-1 商品基本信息表
名称
含义
类型
约束
备注
GoodsID
商品ID
Int 20
主键
自动增长
GoodsName
商品名称
Varchar 10
唯一值
GoodsType
商品类型
Int 20
不为空
GoodsPrice
单价
Int 10
不为空
GoodsPurchasePrice
进价
Int 10
不为空
GoodsAmount
商品数量
Int 10
不为空
GoodsGetTime
进货日期
Date
不为空
GoodsMaintainTime
保质期
Int 10
不为空
单位为(天)
GoodsFactory
生产厂家
Varchar 50
不为空
员工信息表见表 3-2。
表3-2 员工信息表
名称
含义
类型
约束
备注
MemberID
员工ID
Int 20
主键
自动增长
MemberName
员工姓名
Varchar 10
不为空
MemberPassword
员工密码
Varchar 6
不为空
MemberSex
员工性别
Int 1
不为空
1:男 2:女
MemberAge
员工年龄
Int 10
可为空
进货单表见表3-3。
表3-3 进货单表
名称
含义
类型
约束
备注
Input_ID
进货单ID
Int 50
主键
自动增长
Input_GoodsID
商品ID
Int 20
不为空
Input_GoodsName
商品名称
Varchar 10
唯一值
Input_GoodsType
商品类型
Int 20
不为空
Input_GoodsPrice
单价
Int 10
不为空
Input_GoodsPurchasePrice
进价
Int 10
不为空
Input_GoodsAmount
商品数量
Int 10
不为空
Input_GoodsGetTime
进货日期
Date
不为空
Input_GoodsMaintainTime
保质期
Int 10
不为空
单位为(天)
Input_GoodsFactory
生产厂家
Varchar 50
不为空
订单表见表3-4。
表3-4 订单表
名称
含义
类型
约束
备注
Account__ID
订单ID
Int 20
主键
自动增长
Account_GoodsID
商品ID
Int 20
不为空
Account_Code
交易流水号
Varchar 50
外键 参照Sale表code
不为空
Account_GoodsCount
购买商品数量
Int 10
不为空
交易单表见表3-5。
表3-5 交易单表
名称
含义
类型
约束
备注
Sale_ID
交易单ID
Varchar 20
主键
自动增长
Sale_Date
交易日期
Date
不为空
Sale_Accountcode
交易流水号
Varchar 50
不为空
4 系统详细设计与实现
4.1综合描述
由于小型超市信息管理系统构造比较简朴,相对大型,成熟超市采用管理系统来说,无论在系统性能,构造复杂度,安全性上面都无法与之相比。因而在进行系统设计时,应尽量做到构造清晰,编码方式合理,代码与系统可维护性较高。在本章节中,选用小型超市信息管理系统核心模块进行设计阐述。重要模块有登录模块,商品信息查看模块,购物车模块三某些。
关于本系统文献构造如下:
4.2系统运营界面描述
此处为小型超市信息管理系统核心模块详细描述,并附上有关代码以及截图。在代码核心处加以阐明,以以便读者阅读。
有关代码如下:
Login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<link type="text/css" rel="stylesheet" href="css/style.css" />
<script type="text/javascript">
<!--将表单中数据清空-->
function clearInfo(onePart){
document.getElementById(onePart).innerHTML = "";
}
</script>
</head>
<body class="blue-style">
<div id="login">
<div class="icon"></div>
<div class="login-box">
<form method="post" action="DologinServlet">
<dl>
<dt>
顾客名:
</dt>
<dd>
<input type="text" name="userName" class="input-text" onFocus="clearInfo('tishiMsg')" />
</dd>
<dt>
密 码:
</dt>
<dd>
<input type="password" name="passWord" class="input-text" />
</dd>
</dl>
<div class="buttons">
<input type="submit" name="submit" value="登录系统"
class="input-button" />
<input type="reset" name="reset" value="重 填" class="input-button" onclick="clearInfo('tishiMsg')" />
</div>
</form>
<c:if test="${flag==false}">
<div style="margin-left:450px;margin-top:6px;color:#F00">
<span id="tishiMsg" style="color:#F00">登录失败!请重新登陆</span>
阐明:登录表单中,将姓名与密码字段 “name”属性分别设立为“userName”,“userPassword”,向后台进行参数传递。点击submit按钮,按照action半途径调用办法,传递办法类型为“post”,将提交至servletdopost办法。
public interface UserService {
// 判断顾客登录与否成功
public User ifLogin(String name,String password);
// 依照顾客名查询顾客表中数据
public List<User> findUserInfoByName(String userName);
// 获取数据库中顾客表中数据并封装在集合中
public List<User> getAllUserInfo();
// 向顾客管理中添加顾客信息
public boolean add(User user);
// 依照顾客编号修改顾客管理页面中顾客信息
public int updateUserInfo(User user,int userId);
// 依照顾客名编号查询顾客表中数据
public User findUserInfoById(int userId);
// 依照顾客编号删除顾客管理页面中相应顾客信息
public int deleteUserInfoById(int userId);
// 分页获取顾客信息
public PageSize getUserInfoByPage(int currPage);
// 修改顾客密码
public int updateUserPwdInfo(int userId,String userNewPwd);
}阐明:login办法,接受前台页面传递过来顾客名与密码,并运用编码转换类将顾客名转换为UTF-8编码类型,解决了乱码问题。实例化一种MemberDao类,调用其Login办法,返回实体类Member。如果返回值为空,则输出登录失败页面。否则,跳转至管理员管理页面manage.jsp。
public interface UserDao {
// 判断顾客登录与否成功
public User ifLogin(String name,String password);
// 依照顾客名查询顾客表中数据
public List<User> findUserInfoByName(String userName);
// 获取数据库中顾客表中数据并封装在集合中
public List<User> getAllUserInfo();
// 向顾客管理中添加顾客信息
public boolean add(User user);
// 依照顾客编号修改顾客管理页面中顾客信息
public int updateUserInfo(User user,int userId);
// 依照顾客名编号查询顾客表中数据
public User findUserInfoById(int userId);
// 依照顾客编号删除顾客管理页面中相应顾客信息
public int deleteUserInfoById(int userId);
//分页获取顾客信息
public PageSize getUserInfoByPage(int currPage);
//修改顾客密码
public int updateUserPwdInfo(int userId,String userNewPwd);
}
阐明:Login办法对数据库进行操作。一方面连接至数据库,运用前台传来顾客名,密码字段对数据库进行查询,以成果集形式进行返回。并实例化user类,将成果集中数据输出,返回user类型。
有关界面设计见图4-1,图4-2,图4-3。
图4-1 超市信息管理系统欢迎界面
图4-2 超市管理员登陆界面
有关代码如下:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<link type="text/css" rel="stylesheet" href="css/style.css" />
<script type="text/javascript">
<!--将表单中数据清空-->
function clearInfo(onePart){
document.getElementById(onePart).innerHTML = "";
}
</script>
</head>
<body class="blue-style">
<div id="login">
<div class="icon"></div>
<div class="login-box">
<form method="post" action="DologinServlet">
<dl>
<dt>
顾客名:
</dt>
<dd>
<input type="text" name="userName" class="input-text" onFocus="clearInfo('tishiMsg')" />
</dd>
<dt>
密 码:
</dt>
<dd>
<input type="password" name="passWord" class="input-text" />
</dd>
</dl>
<div class="buttons">
<input type="submit" name="submit" value="登录系统"
class="input-button" />
<input type="reset" name="reset" value="重 填" class="input-button" onclick="clearInfo('tishiMsg')" />
</div>
</form>
<c:if test="${flag==false}">
<div style="margin-left:450px;margin-top:6px;color:#F00">
<span id="tishiMsg" style="color:#F00">登录失败!请重新登陆</span>
阐明:FindAll办法调用gooddaoselectGoods办法,将所有商品信息读出,以集合形式存入变量“goods”中,在中进行调用。
有关页面设计见图。
图4-3商品添加页面
<base href="<%=basePath%>">
<title>My JSP 'BillModify.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<link type="text/css" rel="stylesheet" href="css/style.css" />
<script type="text/javascript">
<!--验证账单编号-->
function checkNum(){
var txtId=document.getElementById("billNum").value;
if(txtId.length==0){
document.getElementById("idMsg").innerHTML="账单编号不能为空!";}
if(flag==false){
document.getElementById("idMsg").innerHTML="账单编号已经存在 !";
}
var reg=/^[0-9]*$/;
if(!reg.test(txtId)){
document.getElementById("idMsg").innerHTML="账单编号必要为数字!";
document.getElementById("billNum").value="";
} }
<!--将表单中数据清空-->
function clearInfo(onePart,twoPart){
document.getElementById(onePart).value="";
document.getElementById(twoPart).innerHTML = "";
}
<!--验证交易金额-->
function checkMoney(){
var txtMoney=document.getElementById("money").value;
if(txtMoney.length==0){
document.getElementById("moneyMsg").innerHTML="请输入交易金额!";}
var reg=/^[0-9]*$/;
if(!reg.test(txtMoney)){
document.getElementById("moneyMsg").innerHTML="非法字符,请输入数字!";
document.getElementById("money").value="";
<!--验证交易单位-->
function checkUnit(){
var txtUnit=document.getElementById("unit").value;
if(txtUnit.length==0){
document.getElementById("unitMsg").innerHTML="请输入交易单位!";
} }
<!--验证交易数量-->
function checkAmount(){
var txtAmount=document.getElementById("amount").value;
if(txtAmount.length==0){
document.getElementById("amountMsg").innerHTML="交易数量不能为空!";}
var reg=/^[0-9]*$/;
if(!reg.test(txtAmount)){
document.getElementById("moneyMsg").innerHTML="非法字符,请输入数字!";
document.getElementById("money").value="";
} }
<!--验证商品名称-->
function checkComName(){
var txtComName=document.getElementById("comName").value;
if(txtComName.length==0){
document.getElementById("comNameMsg").innerHTML="商品名称不能为空!";}
var reg=/^[\u4e00-\u9fa5]{0,}$/;
if(!reg.test(txtComName)){
document.getElementById("comNameMsg").innerHTML="非法字符,请输入中文!";
document.getElementById("comNameMsg").value="";
} }
<!--验证商品描述-->
function checkDiscription(){
var txtDiscription=document.getElementById("discription").value;
if(txtDiscription.length==0){
document.getElementById("discriptionMsg").innerHTML="商品描述不能为空!";
document.getElementById("discriptionMsg").value="";
} }
<!--验证各表单中输入数据时否合法-->
function submitYesNo(){
var allSpan = document.getElementsByTagName("span");
for(var i=0;i<allSpan.length;i++){
if(allSpan[i].innerHTML.length!=0){
return false;
break;
}}
return true;}
<!--验证与否确认修改-->
function checkReModify(){
var ifModify=confirm("确认修改吗?");
if(ifModify){
alert("恭喜您!修改成功!!");
document.getElementById("myForm").submit();
}}
<!--验证与否确认删除-->
function checkReDele(){
var ifModify=confirm("确认删除吗?");
if(ifModify){
location.href="DoDeleBillInfoByIdServlet?billId=${bill.billId}";
}else{
return false;
} }
图4-4商品信息页面
<%@ page lang
展开阅读全文