资源描述
SSH框架技术
课程设计报告
题 目 网上拍卖网站设计与实现
院 系 哈尔滨广厦学院
专业及班级 12计算机海康班
姓 名 马天宇
学 号 1210741118
2015年5月20日
目录
1 概述 1
2 SSH开发技术 1
3 网上拍卖网站的设计 2
3.1 网站功能设计 2
3.2 网站页面设计 3
3.3 网站数据库设计 4
4 网上拍卖网站的实现 7
4.1实现浏览拍卖物品种类页面功能实现 7
4.2实现浏览拍卖物品页面功能 10
4.3实现查看物品详细信息及出价界面功能 13
5 结论 16
1 概述
电子商务(electronic commerce)是计算机网络所带来的又一次革命,它的发展将形成新的交换体制,产生新的市场规则,冲破时间与空间的限制,加快全球市场一体化的进程,电子商务还将有力地推动信息和信息服务业的发展。它不仅涉及电子技术和商业交易本身,而且涉及到诸如金融、税务、教育等其他社会层面,是一个与社会大环境息息相关并且具有完整结构体系的系统工程。电子商务的发展为网上拍卖带来了勃勃生机,使得网上拍卖迅速成为一种非常活跃的电子商务模式。
网上拍卖系统是一个C2C模式下的电子商务系统,提供了一个网上拍卖的市场给买方和卖方,企业可以以拍卖的方式出售自己的产品。拥有商品展示、拍卖竞投、用户注册、信息反馈和新商品发布几项基本功能。使得网上的用户可以安全、便捷的使用该系统。企业可以通过该系统观察到消费者、客户之间的买卖情况,从中获取最直接的市场消息,掌握最详细的市场动态。
随着通信技术和网络技术的飞速发展,网上拍卖的开展势在必行。应该说网上拍卖发展的前景十分广阔,作用越来越大。文中论述了构建网上拍卖系统的技术手段及其实现的关键方法。
本次课程设计完成的系统主要实现的功能包括用户注册、发布商品、竞拍商品、查看商品的详细信息等功能。
2 SSH开发技术
集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层,以帮助开发人员在短期内搭建结构清晰、可复用性好、维护方便的Web应用程序。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,控制业务跳转,利用Hibernate框架对持久层提供支持,Spring做管理,管理struts和hibernate。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO(Data Access Objects)接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring做管理,管理struts和hibernate。
系统的基本业务流程是: 在表示层中,首先通过JSP页面实现交互界面,负责接收请求(Request)和传送响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。
3 网上拍卖网站的设计
3.1 网站功能设计
“网上拍卖系统”包含八个功能。
① “注册”功能:对于首次登录该系统的用户,要先进行注册。
② “登录”功能:只有登录的用户才可以对系统做相应的操作。
③ “操作商品”功能:对于登录后的用户可以操作商品,发布新商品。
④ “操作商品种类”功能:对于登录后的用户可以操作商品种类,添加商品种类。
⑤ “竞拍商品”功能:对于登录后的用户可以参加处于拍卖状态商品的竞拍。
⑥ “浏览商品”功能:用户可以通过该用例浏览流拍状态的商品和处于拍卖状态的商品。
⑦ “查看商品”功能:用户可以通过该用例完成查看自己竞得商品和查看自己正在竞标的物品。
⑧ “发送邮件”功能:用户可以通过该用例向管理员发送邮件。
3.2 网站页面设计
详细介绍网站的各项功能是通过哪些页面呈现的,网站各个页面之间的组织结构图及相应文字说明。、、
登录页(login.jsp):系统为注册的用户提供一个进入系统并使用系统功能的入口。
登出页(logout.jsp):用户离开系统时显示的页面。
注册新用户页(newuser.jsp):系统提供给普通用户的注册功能。只有注册用户才可以参加竞拍并管理自己的物品。
管理商品页(mrgitem.jsp):系统为注册用户提供商品管理功能。
管理分类页(mrgkind.jsp):系统为注册用户提供商品分类管理功能。
查看竞得商品页(viewItemSu.jsp):系统为注册用户提供查看用户自己成功竞得的商品的功能。
查看自己的竞标(viewBid.jsp):系统为注册用户提供查看用户自己正在参与竞价的商品。
浏览流拍商品(viewFailItem.jsp):所有用户都可以浏览处于流拍状态的商品。
浏览拍卖商品(viewKind.jsp):所有用户都可以浏览正在拍卖的商品。
查看商品详细信息(viewDetail.jsp):所有用户都可以查看正在拍卖物品的详细信息。但要参与竞拍必须是注册用户。
提示错误信息页面(error.jsp):所有操作错误的提示信息页面。
网上拍卖系统
查看竞得物品
浏览拍卖物品
浏览流拍物品
管理商品种类
查看自己的竞标
管理商品
登录
注册
查看物品详细信息
添加商品分类
添加商品
参加
商品竞拍
3-2 系统层次概框图
3.3 网站数据库设计
详细介绍网站所用到的数据库的结构,包括有哪些表,表结构是什么,每个表保存哪些数据,表表之间的关系是什么?
根据系统的需求,数据库中需要创建以下数据表。
① 用户信息表:用于存放注册用户的资料以及用户登录情况。
② 商品分类信息表:商品的主要分类,和分类信息的描述。
③ 商品信息表:记录用户发布的商品的信息。
④ 用户出价信息表:用于记录用户对相关商品的出价信息。
⑤ 商品状态信息表:用于存放商品状态信息。
图3-3统E-R图
m
m
1
n
购买者
购买者编号
用户名
密码
真实姓名
竞购
商品
商品编号
价格
商品价格
商品名称
拍卖者编号
起始价
拍卖
拍卖者
拍卖者编号
用户名
密码
信用度
真实姓名
该系统数据库的E-R图,如图3-3所示:
该数据库的数据逻辑结构图如下表所示:
表3-3-1 auction_user用户信息表
Field
Type
Null
Key
Default
Comment
user_id
int
-
PRI
-
用户标识
username
varchar
-
-
-
用户名
password
varchar
-
-
-
用户密码
email
varchar
-
-
-
用户邮箱
如表4-2所示为商品分类信息表,记录了所有商品分类的信息。
表3-3-2 kind商品子分类信息表
Field
Type
Null
Key
Default
Comment
kind_id
int
-
PRI
-
分类的标识
kind_name
varchar
-
-
-
分类的名称
kind_desc
int
Yes
-
-
分类的描述
如表4-3所示为记录用户所发布的商品的详细信息的表。
表中item_id为主键设为自动增长。owner_id为auction_user表中user_id的外键,kind_id为kind表中kind_id的外键,csub为subsort表中ssid的外键,这些外键能保证商品的完整性。cend表示商品的拍卖是否已经结束。
表3-3-3 item商品信息表
Field
Type
Null
Key
Default
Comment
item_id
int
-
PRI
-
主键,递增
owner_id
int
-
FK
-
发布者的标识
item_name
varchar
-
-
-
商品名称
kind_id
int
-
FK
-
商品分类
item_pic
varchar
Yes
-
-
商品图片地址
item_desc
varchar
Yes
-
-
商品描述
winer_id
int
Yes
FK
-
拍买者的标识
addtime
date
-
-
-
开始日期
endtime
date
-
-
-
结束日期
init_price
double
-
-
0
初始价钱
max_price
double
-
-
0
最高价钱
state_id
int
-
-
-
商品状态
如表4-4所示为记录用户对商品出价情况的信息表。
表中bid_id为主键设为自动增长。item_id为商品表item中item_id的外键,这样可以保证用户的出价都是针对已经发布的商品发出的。user_id为出价的用标识。howmuch代表用户对此商品出了多少钱。
表3-3-4 bid用户出价信息表
Field
Type
Null
Key
Default
Comment
bid
int
-
PRI
-
出价的标识
item_id
int
-
FK
-
对就的商品标识
user_id
int
-
-
-
出价的用户名
bid_date
date
-
-
-
出价的时间
bid_price
double
-
-
-
出了多少钱
如表4-5所示为记录用户发布的商品的状态的信息表。
表中state_id为主键设为自动增长。
表3-3-5 state用户出价信息表
Field
Type
Null
Key
Default
Comment
state_id
int
-
PRI
-
商品状态的标识
state_name
varchar
-
-
-
商品状态的名称
4 网上拍卖网站的实现
4.1实现浏览拍卖物品种类页面功能实现
1.表示层实现
点击浏览拍卖物品种类链接时,就直接将请求转发给动作viewKind.do处理。它由Struts的Action类的子类实现,在其中加入业务逻辑并将主页实际所需要的数据从数据库中提取出来保存到request对象或其他对象中,最后转向实际的主页面(页面名称为“viewKind.jsp”)即可。在struts-config.xml文件中的设置如下:
<action path="/viewKind"
type="org.springframework.web.struts.DelegatingActionProxy"
scope="request"
validate="false"
parameter="method">
<forward name="success" path="/WEB-INF/jsp/viewKind.jsp"/>
</action>
点击主页导航栏上浏览拍卖物品链接即可进入浏览物品种类页面。如图5-1所示。
图4-1 浏览物品种类界面
商品分类区动态实现代码如下:
<logic:iterate id="kind" name="kinds" indexId="index">
<tr class="pt9" height="24">
<td bgcolor="#FFFFFF">种类名</td>
<td bgcolor="#FFFFFF"><a href='viewItem.do kindId=<bean:write name="kind" property="id"/>'><bean:write name="kind" property="kindName"/></a></td>
</tr>
<tr class="pt9" height="24">
<td bgcolor="#FFFFFF">种类描述</td>
<td bgcolor="#FFFFFF"><bean:writename="kind"
property="kindDesc"/>
</td>
</tr>
</logic:iterate>
其中,使用Struts的logic及bean标签循环显示商品分类信息。在遍历中用bean:write元素输出。
2.实现业务逻辑
浏览拍卖物品种类页面的显示涉及到得业务逻辑为org.yeeku.struts包下的ViewKindAction类,他用于从数据库中调出数据供页面显示。其中涉及商品类别的分类显示代码如下:
import javax.servlet.http.HttpSession;
import java.util.List;
import org.yeeku.service.AuctionManager;
import org.yeeku.exception.AuctionException;
import org.yeeku.struts.base.BaseAction;
/**
* @author shm songhongmei_529@
* @version 1.0
* 处理商品种类显示动作
*/
public class ViewKindAction extends BaseAction
{
public ViewKindAction()
{
}
public ActionForward execute(ActionMapping mapping, ActionForm form,
javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response)
throws AuctionException
{
List kinds = mgr.getAllKind();
request.setAttribute("kinds" , kinds);//将找到的对象保存到request对象再传入
request.setAttribute("errMsg" , request.getAttribute("errMsg"));
return mapping.findForward("success");
}
}
其中BaseAction封装了系统所有逻辑功能的实现类org.yeeku.service包下的AuctionManager接口,其实现类为AuctionManagerImpl。主要包含的方法如下:
List getItemByWiner(int winerId) throws AuctionException;//根据赢取者查询物品
List getFailItems() throws AuctionException;//查询全部流拍的物品
Integer validLogin(String username , String pass) throws AuctionException;//根据用户名,密码验证登陆是否成功
List getBidByUser(int userId) throws AuctionException;//查询用户的全部出价
List getItemsByOwner(int userId) throws AuctionException;//根据用户id查找目前仍在拍卖中的物品
List getAllKind()throws AuctionException;//查询全部种类
void addItem(String name , String desc , String remark , double initPrice , int avail , int kind , int userId) throws AuctionException;//添加物品
void addKind(String name , String desc ) throws AuctionException;//添加种类
List getItemsByKind(int kindId) throws AuctionException;//根据产品分类,获取当前拍卖的全部商品
Sring getKind(int kindId) throws AuctionException;//根据分类id,获取种类名
ItemBean getItem(int itemId) throws AuctionException;//根据物品id,获取物品
void addBid(int userId , int itemId , double bidPrice)throws AuctionException;//增加新的竞价
void updateWiner()throws AuctionException;//根据时间来修改物品的赢取者
void addAuctionUser(String username, String userpass, String email) throws AuctionException;//增加新的用户
3.实现数据访问层
涉及到显示商品种类的数据访问层方法AuctionManager的getAllKind()方法,并在该方法中调用为KindDao的findAll()方法,实现代码如下:
public List getAllKind() throws AuctionException
{
try
{
return kindDao.findAll(); //通过调用此方法
}
catch (Exception e)
{
log.debug(e.getMessage());
throw new AuctionException("底层业务异常,请重新试");
}
}
public List findAll()
{
return getHibernateTemplate().find("from Kind");
}
其中使用的HQL语句为“from Kind”,即从kind数据表中取出所有记录。
4.2实现浏览拍卖物品页面功能
1.表示层实现
通过查看商品种类界面,点击某一种类链接时,就直接将请求转发给动作viewItem.do处理。最后转向实际的主页面(页面名称为“viewItem.jsp”)即可。在struts-config.xml文件中的设置如下:
<action path="/viewItem"
type="org.springframework.web.struts.DelegatingActionProxy"
scope="request"
validate="false"
parameter="method">
<forward name="input" path="/WEB-INF/jsp/viewKind.do"/>
<forward name="success" path="/WEB-INF/jsp/viewItem.jsp"/>
</action>
点击主页导航栏上浏览拍卖物品链接即可进入浏览物品种类页面。如图5-2所示。
图5-2 浏览某类所有物品界面
查看某中类所有商品界面主要代码如下:
<table width="780" align="center" cellspacing=0 background="images/bodybg.jpg">
<tr>
<td>
<br>
<table width=80% border=0 align="center" cellpadding=0 cellspacing="1" bgcolor="#CCCCCC">
<tr bgcolor="#e1e1e1" >
<td colspan="5" ><div class="mytitle">当前种类是:<bean:write name="kind"/></div></td>
</tr>
<tr class="pt9" height="30">
<td bgcolor="#FFFFFF"><b>物品名</b></td>
<td bgcolor="#FFFFFF"><b>起拍时间</b></td>
<td bgcolor="#FFFFFF"><b>最高价格</b></td>
<td bgcolor="#FFFFFF"><b>所有者</b></td>
<td bgcolor="#FFFFFF"><b>物品备注</b></td>
</tr>
<logic:iterate id="item" name="items" indexId="index">
<tr class="pt9" height="24">
<td bgcolor="#FFFFFF">< ahref='viewDetail.do?itemId=<bean:write name="item" property="id"/>'><bean:write name="item" property="name"/></a></td>
<td bgcolor="#FFFFFF"><bean:write name="item" property="addTime"/></td>
<td bgcolor="#FFFFFF"><bean:write name="item" property="maxPrice"/></td>
<td bgcolor="#FFFFFF"><bean:write name="item" property="owner"/></td>
<td bgcolor="#FFFFFF"><bean:write name="item" property="pic"/></td>
</tr>
</logic:iterate>
</table>其中,使用Struts的logic及bean标签循环显示商品分类信息。在遍历中用bean:write元素输出。
2.实现业务逻辑
浏览某一种类拍卖物品页面的显示涉及到得业务逻辑为org.yeeku.struts包下的ViewItemAction类,他用于从数据库中调出数据供页面显示。其中涉及商品类别的分类显示代码如下:
import java.util.List;
import org.yeeku.service.AuctionManager;
import org.yeeku.exception.AuctionException;
import org.yeeku.struts.base.BaseAction;
import org.yeeku.model.*;
/**
* @author shm songhongmei_529@
* @version 1.0
* 处理商品显示动作
*/
public class ViewItemAction extends BaseAction
{
public ViewItemAction()
{ }
public ActionForward execute(ActionMapping mapping, ActionForm form, javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws AuctionException
{
String id = request.getParameter("kindId");
if (id == null || id.trim().equals("") )
{
request.setAttribute("errMsg" , "您必须选择有效的种类");
return mapping.findForward("input");
}
else
{
String kind = mgr.getKind(Integer.parseInt(id) );
List items = mgr.getItemsByKind(Integer.parseInt(id) );
request.setAttribute("kind" , kind); request.setAttribute("items" , items);
return mapping.findForward("success");
}
}
3.实现数据访问层
涉及到显示商品种类的数据访问层方法AuctionManager的getAllItem()方法,并在该方法中调用为ItemDao的findItemByKind(Integer kindId)方法,实现代码如下:
public List getItemsByKind(int kindId) throws AuctionException
{
try
{
List result = new ArrayList();
List items = itemDao.findItemByKind(new Integer(kindId));
for (Iterator it = items.iterator() ; it.hasNext() ; )
{
Item item = (Item)it.next();
ItemBean ib = new ItemBean();
initItem(ib,item);
result.add(ib);
}
return result;
}
catch (Exception e)
{
log.debug(e.getMessage());
throw new AuctionException("底层业务异常,请重新试");
}
}
public List findItemByKind(Integer kindId)
{
return getHibernateTemplate().find("from Item as i where i.kind.id = ? and i.itemState.id = 1" , kindId);
}
其中使用的HQL语句为“from Item as i where i.kind.id = ? and i.itemState.id = 1 , kindId”,即从kind数据表中取出所有记录。
4.3实现查看物品详细信息及出价界面功能
在显示同一种类所有物品的界面(viewItem.jsp),通过点击商品名称进入显示商品详细信息界面(ItemDetail.jsp)。此时可以对自己喜欢的商品进行出价。如图5-3所示
图5-3 商品详细信息界面
商品竞拍界面代码如下:
<html:form action="/bid.do" onsubmit="return validateBidForm(this);">
<tr class="pt9" height="32">
<td bgcolor="#FFFFFF">竞拍价:
<input type="hidden" name="itemId" value='<bean:write name="item" property="id"/>'/>
<input type="hidden" name="maxPrice" value='<bean:write name="item" property="maxPrice"/>'/></td>
<td bagcolor="#FFFFFF"><html:text property="bidPrice" size="15"/>
</td>
</tr>
<tr class="pt9" height="32">
<td bgcolor="#FFFFFF">验证码:</td>
<td bgcolor="#FFFFFF"><input name="vercode" type="text" size=15 maxlength="6"></td>
</tr>
<tr class="pt9" height="32">
<td bgcolor="#FFFFFF">验证码:</td>
<td bgcolor="#FFFFFF"><img name="d" src="authImg"></td>
</tr>
<tr class="pt9" height="32">
<td bgcolor="#FFFFFF"><input type="submit" value="竞价"/></td>
<td bgcolor="#FFFFFF"><input type="submit" value="清除"/></td>
</tr>
</html:form>
<html:javascript formName="bidForm"/>
struts-config.xml中的配置
此页面结合表达式语言及struts的标签库。处理此表单的动作为bid.do。它由Struts的Action类的子类addBidAction实现,在其中加入业务逻辑并将主页实际所需要的数据从数据库中提取出来保存到request对象或其他对象中,竞价成功后页面会通过viewBid.do跳转到查看自己竞标页面(页面名称为“viewBid.jsp”)。
在struts-config.xml文件中的设置如下:
<!-- ===============全局ActionForm逻辑名称及路径配置 -->
<form-beans>
<form-bean name="bidForm"type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="itemId" type="java.lang.String"/>
<form-property name="bidPrice" type="java.lang.String"/>
<form-property name="maxPrice" type="java.lang.String"/>
<form-property name="vercode" type="java.lang.String"/>
</form-bean>
</form-beans>
<!-- ============Action类及其访问路径的映射配置 -->
<action-mappings>
<action path="/viewBid" type="org.springframework.web.struts.DelegatingActionProxy"
scope="request"
validate="false"
parameter="method">
<forward name="success" path="/WEB-INF/jsp/viewBid.jsp"/>
<forward name="login" path="/WEB-INF/jsp/login.jsp"/>
<action path="/viewDetail" type="org.springframework.web.struts.DelegatingActionProxy"
scope="request"
validate="false"
parameter="method">
<forward name="error" path="/WEB-INF/jsp/error.jsp"/>
<forward name="success" path="/WEB-INF/jsp/viewDetail.jsp"/>
</action>
<action path="/bid" type="org.springframework.web.struts.DelegatingActionProxy"
name="bidForm"
scope="request"
validate="true"
input="input">
<forward name="input" path="/viewDetail.do"/>
<forward name="success" path="/viewBid.do"/>
<forward
展开阅读全文