目 录
1 绪论 1
1.1研究背景 1
1.2研究的目的与意义 2
1.3本网站的主要任务 2
2 系统开发工具介绍 3
2.1网站开发平台的选择 3
2.2相关技术的介绍 3
2.2.1 SSM框架技术 3
2.2.2 eclipse简介 5
2.2.3 mySQL简介 5
2.2.4 BUI框架简介 5
3 系统分析 6
3.1 网上购书系统运营的情况及其存在的弊端 6
3.2 可行性分析 6
3.2.1 经济可行性分析 6
3.2.2 技术可行性分析 6
3.2.3 操作可行性分析 7
3.2.4 管理可行性分析 7
3.3 功能需求分析 7
3.3.1 前台功能 7
3.3.2 后台功能 8
3.4网站流程图和结构功能图 9
3.4.1业务流程图 9
3.4.2 数据流程图 11
4 系统设计 15
4.1功能结构设计 15
4.2 数据库设计 17
4.2.1 数据库概念结构设计 17
4.2.2 数据库逻辑结构设计 23
4.2.3 数据库物理结构设计 23
5 系统实现 28
5.1 数据库管理 28
5.2 网站前台模块及相关代码 30
5.2.1门户页面 30
5.2.2 注册页面 31
5.2.3 会员登陆页面 37
5.2.4 商品搜索 39
5.2.5 商品详情页面 41
6 系统测试 50
6.1常用的测试方法和目的介绍 50
6.1.1 Black box 黑盒测试 50
6.1.2 White box 白盒测试 50
6.2本网站采用的测试方法 50
6.2.1测试过程 51
6.2.2网站测试结果 55
7 结论与展望 57
7.1网站的优点 57
7.2网站的缺点 57
7.3展望 57
参考文献 58
致 谢 60
3 系统分析
本章将对购书网站的开发的前中后期进行详细的论述。本章节将介绍网站开发的可行性分析、网站功能、网站运营的流程、数据流程分析,以及数据库设计等方面进行全面的分析和论述。
3.1 网上购书系统运营的情况及其存在的弊端
随着电子商务的发展,人们逐渐习惯于足不出户购物的习惯,并且由于网上购物的价格更低,因此人们更倾向于网上购物。传统的书店属于传统的零售行业,需要面对人力、中间商、库存、高租金等成本压力,在面对网购所带来的流量流失,更加剧了传统书店的经营难度,网购的价格优势和商品的丰富程度对传统的书店造成了越来越大的冲击。因此为了持续的经营,利用“互联网+传统零售”的思想建立在线的购书商城来解决网购所带来的冲击是必要的。
3.2 可行性分析
3.2.1 经济可行性分析
本商城系统的开发技术上,采用的是IBM公司免费的开源集成开发平台Ecli- pse,同时数据库使用的是mySQL,也是免费开源的软件。在商业运行中,服务器免费开源的系统Linux,而在其中搭载的tomcat服务器服务软件也是一个免费软件,它们对JAVA都有良好的支持,而Java本身也是一个开源免费的语言,因此在软件方面可以极大的节约成本,只需要购置一台服务器,技术方面基本花费的都是软件开发人员的人力成本。
所以从经济角度来讲,该商城系统是可行的。
3.2.2 技术可行性分析
本网站开发所使用的技术是JAVAEE,网站的后台系统采用的是SSM框架,前台采用JSP和HTML5结合混写制作动态网页,并使用javaScript代码编写用户反馈事件,数据库开发平台使用的是MySQL存储数据。
商城包含了大量的数据处理,这就要求我们的架构必须满足大量的数据处理,同时严格遵守架构的特殊约束,而SSM框架可以保证实现架构设计的最终目标。不论从功能上还是从性能上都是可以满足系统的需求,因此从技术方面来看,开发购书商城系统是可行的。
3.2.3 操作可行性分析
网站页面布局合理,操作简单。网站的前台页面由几个模块组成,页面的跳转只是刷新用户页面的部分,让客户得到自己想要的信息,降低客户的学习成本。在用户注册、登录等有表单提交的页面,网站在用户输入的时候,会对用户进行提示说明,以帮助客户更快的熟悉操作流程。本网站是在线的购书商城,学习成本低,操作简单,运营的成本较低。因此,本网站在操作方面是可行的。
3.2.4 管理可行性分析
本商城后台采用的是B/S模式,与传统C/S模式客户端不同的是,后台系统是以web网页的工作页面。只要有互联网的地方,管理员就可以通过浏览器进行对商城进行管理。后台系统以列表的方式展列出了商城系统的管理功能,管理员可以根据自己的角色,选择相关的管理功能,不同角色的管理员除了有最高权限的ROOT管理员外,不可使用未授权的功能,后台网站具有明确的角色和权限划分。后台网站简单易懂,管理员只需要学习所负责功能的使用,学习成本低,不需要进行另外的培训,有利于管理员的接受,极大的提高了用户的体验感。因此,该后台是简单、方便、易用的。
3.3 功能需求分析
网站成功建立和运行很大部分取决于网站开发前的规划,因此为了在网站建立过程中避免一些不必要的问题,在开发前需要规划好网站的功能、规模以及费用的投入,充分做好市场调研,使网站能够顺利的运营。前期的设计对于网站的编写具有 重要的指导作用,运营中也有利于网站的维护。其功能设计如下:
3.3.1 前台功能
1)普通游客用户。对于未登录的用户来说,他们的身份为游客。游客用户在进入商城后具有对商城进行一个初步的了解的需求,因此商城需要提供游客用户让他们进行商品浏览,并查看商品详细信息的功能,同时游客也可以对感兴趣商品通过关键字或者目录种类查询商品,并查看网站的公告,了解网站最新的动态。但是游客用户功能会受到限制,不能使用注册用户的一些功能,比如下订单、购物车等功能,如果他们想进一步使用网站的功能就必须登录或者注册。
2)注册用户。当游客用户在注册并登录商城后,注册用户可以使用商城用户的所有功能,而注册用户一般需要购买商品,对商品进行下单或者查看和修改他们自己个人的详细信息,包括姓名、生日、手机号码、注册时间、邮箱等,他们可对手机号码、生日、邮箱进行修改。因此商城为注册用户提供了购物管理、购物车管理、订单管理等功能。注册用户可以浏览商品,也可以查看商品的详细信息,同时通过商品的关键词进行检索,快速搜索到自己喜好的商品。看中的商品可以添加进购物车集中下单,在购物车中用户可以修改商品的数量,清除购物车里的商品,查看商品的详细信息。用户也可以单独对商品进行下单。注册用户下单后,所消费的金额将会累计成积分,即1元等于1积分,用户在消费1000元,即积分累计达1000分,即申请为VIP,待后台确认后,用户便成为VIP用户,并享受购物8折优惠。下单后,每个商品都将生成一条订单的信息,同时商品库存减少,网站后台进行发货和结算,商城用户可查询所有商品订单,并在收到商品后,点击确定收货按钮进行收货,最后用户可以对商品进行售后评论。
3.3.2 后台功能
1)用户管理员角色。由于商城有大量注册用户,用户会产生许多的业务需求,因此客户的信息需要专人管理,而根据此需求在商城后台中用户信息由用户管理员管理。商城用户管理员登录后,可以获得用户管理模块的管理权限。一是可以在用户管理子模块中,进行查看、修改、删除、查询商城用户的相关信息的操作,也可以改变用户的状态,对用户账号进行暂停或者启用。二是可以在VIP的子模块中,查询所有商城用户的积分信息,将商城用户升级为VIP或者将VIP用户降级。两个模块都能通过关键词检索用户信息。
2)商品管理员角色。商城存在的大量商品需要专门的人员负责商品相关信息的管理。商品管理员登录后,可以获得商品管理模块的管理权限。一是可以在产品管理子模块中,进行查看、修改、删除、查询商品信等操作,并且可以改变商品上架下架状态,商品只有上架后,在前台才能被商城用户浏览,管理员可以根据关键词对产品信息进行检索。二是可以在类目管理子模块中,对商品的类目进行查看、修改、删除,并且可以根据关键词检索类目。
3)订单管理员角色。在商城的交易中,用户下单后需要商城后台进行发货,而用户也有可能会对订单进行留言,或者用户需要取消订单,而这些业务都由订单管理员专门负责。订单管理员登录商城后台后,可以管理商城的订单。本文转载自http://www.biyezuopin.vip/onews.asp?id=12195管理员可以直接查看未处理的订单,对未处理的商品订单进行发货处理,也可以取消客户要求放弃购买商品的订单。管理员可以查看历史上所有订单,对自己历史上所负责的订单有个大概的了解。
4)网站管理员角色。在网站的运营中,公告需要更新,产品的评论也需要人工进行审核,防止恶意评论,而这些业务是由网站管理员负责的。网站管理员登录后,可以获得网站管理模块的管理权限。一是在评论管理子模块中,可以查看、删除用户对商品的评论,并可以用户名为关键词对用户名下的评论进行检索。二是在公告管理子模块中,可以查看、增加、修改、查询公告信息,并可根据关键词检索公告。
5)账号管理员角色。网站后台在后期会产生许多的管理员账号,有些账号可能需要改变角色,而有些可能要注销,而这些账号由于自身权限问题没有办法进行这些业务,因此后台需要账号管理员对这些管理员账号进行维护。账号管理员在后台登录后,可以对其他管理员账号进行管理,对他们的信息进行修改,比如修改密码、修改角色等操作,也可以用户名为关键词进行检索。ROOT管理员有系统的最高权限,具有所有管理员角色的功能。
package com.bookshop.service.user;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Service;
import com.bookshop.common.ConstantCode;
import com.bookshop.model.address.AddressFilter;
import com.bookshop.model.address.DeliveryAddress;
import com.bookshop.model.user.ShoppingCart;
import com.bookshop.model.user.UserDetail;
import com.bookshop.model.user.UserFilter;
import com.bookshop.model.user.UserFunds;
import com.bookshop.model.user.UserRecord;
import com.bookshop.system.UserContext;
import com.bookshop.utils.TimeUtils;
import com.bookshop.utils.UUIDGenerator;
@Service
public class UserService
{
@Resource
private SqlSession session;
@Resource
private AddressService addressManager;
/**
* 新增用户
*
* @param record
*/
public void addUser(UserRecord record)
{
// 生成用户ID
String userId = UUIDGenerator.getUUID();
record.setUserId(userId);
session.insert("userManageMapper.insert", record);
}
/**
* 修改
*
* @param record
*/
public void modifyUser(UserRecord record)
{
session.update("userManageMapper.update", record);
}
/**
* 校验用户名是否存在
*
* @param username
* @return
*/
public int checkUsername(String username)
{
UserRecord record = getUserByUserName(username);
if (null == record)
{
return ConstantCode.USER_NOT_EXISTS;
}
return ConstantCode.USER_EXISTS;
}
/**
* 查询
*
* @param username
* @return
*/
public UserRecord getUserRecordByName(UserRecord record)
{
record = session.selectOne("userManageMapper.querySingleByName", record);
return record;
}
/**
* 查询
*
* @return
*/
public UserRecord getUserRecordById(UserRecord record)
{
record = session.selectOne("userManageMapper.querySingleById", record);
return record;
}
/**
* 登陆校验
*
* @return
*/
public int checkLoginInfo(UserRecord record)
{
record = session.selectOne("userManageMapper.querySingleByNameAndPassword", record);
if (null == record)
{
return ConstantCode.USER_NOT_EXISTS;
}
return ConstantCode.USER_EXISTS;
}
/**
* 保存内存中用户信息
*
* @param username
*/
public synchronized Map<String, Object> saveUserLoginInfo(String username)
{
// 创建内存
Map<String, Object> userMap = UserContext.create(username);
// 创建购物车
List<ShoppingCart> cartList = new ArrayList<ShoppingCart>();
userMap.put(ConstantCode.CONTEXT_SHOPPING_CART, cartList);
// 查询用户信息
return userMap;
}
/**
* 根据用户名查询详细信息
*
* @param username
*/
public UserDetail getUserDetail(String username)
{
UserRecord userRecord = getUserByUserName(username);
if (null == userRecord)
{
return null;
}
return convertUserRecordToUserDetail(userRecord);
}
public UserRecord getUserByUserName(String username)
{
UserRecord userRecord = new UserRecord();
userRecord.setUsername(username);
userRecord = session.selectOne("userManageMapper.querySingleByName", userRecord);
return userRecord;
}
/**
* 根据userId查询用户
*/
public UserDetail getUserDetailById(String userId)
{
UserRecord userRecord = new UserRecord();
userRecord.setUserId(userId);
userRecord = session.selectOne("userManageMapper.querySingleById", userRecord);
if (null == userRecord)
{
return null;
}
return convertUserRecordToUserDetail(userRecord);
}
/**
* 查询所有用户
*
* @param username
*/
public List<UserDetail> getUserDetailList(UserFilter filter)
{
List<UserRecord> userRecordList = session.selectList("userManageMapper.queryByCondition", filter);
List<UserDetail> resultList = new ArrayList<UserDetail>();
if (org.springframework.util.CollectionUtils.isEmpty(userRecordList))
{
return resultList;
}
for (UserRecord record : userRecordList)
{
resultList.add(convertUserRecordToUserDetail(record));
}
return resultList;
}
/**
* 0:否,1:是
*
* @param input int数字
* @return 是或者否
*/
public static String convertYesNo(int input)
{
if (ConstantCode.IS_VIP_YES == input)
{
return ConstantCode.IS_VIP_YES_STRING;
}
else if (ConstantCode.IS_VIP_NO == input)
{
return ConstantCode.IS_VIP_NO_STRING;
}
else
{
return ConstantCode.IS_VIP_NO_STRING;
}
}
/**
* 状态转换
*
* @param userStatus
* @return
*/
public static String getUserStatus(int userStatus)
{
switch (userStatus)
{
case ConstantCode.USER_STATUS_NORMAL:
return ConstantCode.USER_STATUS_NORMAL_STRING;
case ConstantCode.USER_STATUS_SUSPEND:
return ConstantCode.USER_STATUS_SUSPEND_STRING;
case ConstantCode.USER_STATUS_NO_ACTIVE:
return ConstantCode.USER_STATUS_NO_ACTIVE_STRING;
default:
return ConstantCode.USER_STATUS_NORMAL_STRING;
}
}
/**
* 状态转换
*
* @param userStatus
* @return
*/
public static String getUserType(int userType)
{
return "普通用户";
}
public UserDetail convertUserRecordToUserDetail(UserRecord userRecord)
{
UserDetail userDetail = new UserDetail();
// 查询地址信息
AddressFilter filter = new AddressFilter();
filter.setUserId(userRecord.getUserId());
List<DeliveryAddress> addressList = addressManager.queryAddressList(filter);
userDetail.setUserId(userRecord.getUserId());
userDetail.setUsername(userRecord.getUsername());
userDetail.setEmail(userRecord.getEmail());
userDetail.setIsAdmin(userRecord.getIsAdmin());
userDetail.setIsVip(convertYesNo(userRecord.getIsVip()));
userDetail.setUserStatus(getUserStatus(userRecord.getUserStatus()));
userDetail.setUserType(getUserType(userRecord.getUserType()));
userDetail.setSex(userRecord.getSex());
userDetail.setPhoneNumber(userRecord.getPhoneNumber());
userDetail.setBirthday(TimeUtils.formate(userRecord.getBirthday(),
ConstantCode.TIME_FORMAT_YYYYMMDD,
ConstantCode.TIME_FORMAT_YYYY_MM_DD));
userDetail.setCreateTime(TimeUtils.formate(userRecord.getCreateTime(),
ConstantCode.TIME_FORMAT_YYYYMMDDHHMMSS,
ConstantCode.TIME_FORMAT_YYYY_MM_DD_HH_MM_SS));
userDetail.setLastLoginTime(TimeUtils.formate(userRecord.getLastLoginTime(),
ConstantCode.TIME_FORMAT_YYYYMMDDHHMMSS,
ConstantCode.TIME_FORMAT_YYYY_MM_DD_HH_MM_SS));
userDetail.setDeliveryAddress(addressList);
return userDetail;
}
public UserFunds getUserFunds(String userId)
{
UserRecord userRecord = new UserRecord();
userRecord.setUserId(userId);
return getUserFunds(userRecord);
}
public UserFunds getUserFunds(UserRecord userRecord)
{
if (userRecord == null)
{
return null;
}
return session.selectOne("userFundsMapper.queryFunds", userRecord);
}
public void updateUserFunds(String userId, int payMoney)
{
updateUserFunds(new UserFunds(userId, payMoney));
}
public void updateUserFunds(UserFunds userFunds)
{
session.update("userFundsMapper.updateFunds", userFunds);
}
public String deleteUser(UserRecord userRecord) {
int result = session.delete("userManageMapper.delete",userRecord);
return String.valueOf(result);
}
}