JavaWeb实战之开发网上购物系统(超详细) 完整攻略
系统需求
为了方便读者更好地理解开发过程,我们假设我们要开发一个网上购物系统,该系统需要满足以下基本需求:
- 用户可以浏览商品信息,并将商品添加进购物车。
- 用户可以查看购物车中的商品,并对购物车中的商品进行结算。
- 用户可以对订单进行在线支付。
- 管理员可以管理商品信息,包括添加商品、删除商品、修改商品信息等。
- 管理员可以查看所有订单,包括已支付订单和未支付订单。
- 管理员可以对订单进行管理,包括删除订单、修改订单状态等。
开发环境搭建
- 准备开发工具:我们使用的开发工具是 Eclipse IDE for Java EE Developers。
- 准备服务器:我们使用的是 Tomcat 服务器,版本为 Tomcat 8.5.33。
- 准备数据库:我们使用的是 MySQL 数据库,版本为 MySQL 5.7.23。
技术选型
我们选择使用以下技术来实现该系统:
- Spring + Spring MVC
- MyBatis
- Bootstrap、jQuery、AJAX
系统架构
我们采用经典的三层架构模型来设计我们的网上购物系统:
- 表现层:使用Spring MVC框架实现用户与网站的交互操作。
- 业务逻辑层:使用Spring框架实现业务逻辑组件的设计和使用。
- 数据访问层:使用MyBatis框架实现数据访问组件的设计和使用。
数据库设计
我们需要设计以下四张数据表来存储网上购物系统的数据:
- 商品信息表(item)
- 商品类型表(item_category)
- 用户信息表(user)
- 订单信息表(order)
其中,商品信息表包含以下字段:
字段名 | 类型 | 描述 |
---|---|---|
id | int | 商品id |
name | varchar | 商品名称 |
price | float | 商品单价 |
desc | text | 商品描述 |
img | varchar | 商品图片地址 |
stock | int | 商品库存 |
status | tinyint | 商品状态 |
商品类型表包含以下字段:
字段名 | 类型 | 描述 |
---|---|---|
id | int | 类型id |
name | varchar | 类型名称 |
pid | int | 父类型id |
status | tinyint | 类型状态 |
用户信息表包含以下字段:
字段名 | 类型 | 描述 |
---|---|---|
id | int | 用户id |
username | varchar | 用户名 |
password | varchar | 用户密码 |
varchar | 用户邮箱 |
订单信息表包含以下字段:
字段名 | 类型 | 描述 |
---|---|---|
id | int | 订单id |
order_no | bigint | 订单号 |
user_id | int | 下单用户id |
payment | float | 订单总额 |
payment_type | tinyint | 支付方式:1-在线支付,2-货到付款 |
status | tinyint | 订单状态:1-未付款,2-已付款,3-取消 |
create_time | datetime | 订单创建时间 |
update_time | datetime | 订单更新时间 |
部分实现说明
用户注册功能的实现
- 用户填写注册信息后,单击“注册”按钮,系统接收到提交的用户信息并进行校验。
- 如果用户信息校验通过,系统将用户信息写入数据库,并自动生成一个用户id。
- 如果用户信息校验不通过,则返回注册页面,并在页面上显示相应的错误提示信息。
以下是具体实现代码示例:
@RequestMapping(value = "/register", method = RequestMethod.POST)
@ResponseBody
public Object register(User user) {
// 校验表单数据
if (user.getUserName() == null || user.getUserName().length() == 0) {
return ResultUtil.error("用户名不能为空");
}
if (user.getPassword() == null || user.getPassword().length() < 6) {
return ResultUtil.error("密码长度不能小于6位");
}
if (!Pattern.matches("[A-Za-z0-9]{6,16}", user.getUserName())) {
return ResultUtil.error("用户名必须由6-16位字母或数字组成");
}
if (!Pattern.matches("[A-Za-z0-9_\\-\\+\\.]+@[A-Za-z0-9_\\-\\+\\.]+\\.[A-Za-z]{2,6}", user.getEmail())) {
return ResultUtil.error("邮箱格式不正确");
}
// 检查用户名是否重复
if (userService.checkUserName(user.getUserName())) {
return ResultUtil.error("用户名已存在");
}
// 保存用户信息
user.setPassword(DigestUtils.md5Hex(user.getPassword()));
user.setCreateTime(new Date());
try {
int result = userService.addUser(user);
if (result > 0) {
return ResultUtil.success("注册成功");
}
} catch (Exception e) {
e.printStackTrace();
}
return ResultUtil.error("注册失败");
}
商品列表页面的显示与分页功能的实现
- 在页面初始化时,系统从数据库中查询商品信息、商品分类信息以及当前页码。
- 将查询得到的商品信息、商品分类信息以及分页信息分别存放到请求域中。
- 通过在页面上循环遍历商品信息,渲染出商品列表页面。
- 当用户单击“下一页”或“上一页”按钮时,系统重新查询并返回分页后的新数据。
以下是具体实现代码示例:
@RequestMapping(value = "/item/list", method = RequestMethod.GET)
public String showItemList(Model model,
@RequestParam(value = "categoryId", required = false) Integer categoryId,
@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "pageNo", defaultValue = "1") int pageNo) {
// 每页显示4个商品
int pageSize = 4;
PageInfo pageInfo;
try {
pageInfo = itemService.getItemListByPage(pageNo, pageSize, categoryId, keyword);
List<Item> itemList = pageInfo.getList();
List<Category> categoryList = categoryService.getAllCategory();
model.addAttribute("itemList", itemList);
model.addAttribute("categoryList", categoryList);
model.addAttribute("totalPage", pageInfo.getPages());
model.addAttribute("pageNo", pageInfo.getPageNum());
} catch (Exception e) {
e.printStackTrace();
}
return "item-list";
}
总结
本文档详细讲解了开发一个网上购物系统的完整攻略,包括系统需求分析、开发环境搭建、技术选型、系统架构、数据库设计以及部分功能实现说明。同时,本文还提供了两个功能实现的代码示例,供读者参考。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb实战之开发网上购物系统(超详细) - Python技术站