概述
购物车和订单是电商项目的核心,本文将简单介绍一下两者的实现。
一、购物车功能实现
1.功能说明
1、商品加入购物车时,不是必须要求登录。
2、计算购物车中商品的总价。当商品数量发生变化时需要重新计算。
3、用户可以删除购物车中的商品。
4、用户下单后,删除购物车的功能。
2.功能分析
1、在用户不登陆的清空下也可以使用购物车,那么就需要把购物车信息放入cookie中。
2、可以把商品信息,存放到pojo中,然后序列化成json存入cookie中。
3、取商品信息可以从cookie中把json数据取出来,然后转换成java对象即可。
4、此功能只需要操作cookie不需要数据库的支持,所以只需要在taotao-portal中实现即可。
5、购物车分有四种动作
a) 添加商品
b) 修改商品数量
c) 删除购物车中的商品
d) 展示购物车商品列表
缺点:换一台电脑后购物车的商品不能同步。
实现的工程:taotao-protal中实现购物车功能。只需要调用商品信息的服务,除此之外不需要和其他系统交互。
3.添加购物车商品
3.1流程分析
在商品详情页面点击“加入购物车”按钮提交一个请求吧商品id传递给Controller,Controller接收id,Controller调用Service根据商品id查询商品基本信息。把商品写入cookie中,加入cookie之前先从cookie中把购物车的商品取出来判断当前购物车商品列表中是否有此商品,如果有数量加一,如果没有添加一个商品,数量为1。展示给用户购物车列表。
创建购物车商品POJO:
1 | public class CartItem { |
3.2Service层
功能:接收一个商品id,数量(默认为1),根据商品id查询商品信息。调用taotao-rest的服务。把商品添加到购物车,先把购物车商品列表取出来,判断列表中是否有此商品,如果有就增加数量就可以了。如果没有把此商品添加到商品列表。返回添加成功Taotaoresult。
1 | //添加购物车商品 |
3.3Controller层
接收商品的id和商品的数量,商品数量如果为空默认为1.调用Service向购物车添加商品。展示添加成功页面。
请求的url:http://localhost:8082/cart/add/144141542125084.html
1 |
|
4.展示购物车列表
需要展示购物车页面,没有参数,只需要从cookie中把商品列表取出来,展示到页面即可。
4.1Service层
1 |
|
4.2Controller层
1 |
|
5.购物车商品数量修改
5.1Service层
1 |
|
5.2Controller层
1 |
|
6.删除购物车商品
在购物车页面中点击删除连接,接收要删除的商品id,从cookie中把商品找到删除,重新写入cookie,重新展示购物车页面。
6.1Service层
1 |
|
6.2Controller层
1 |
|
7.目前购物车存在的问题
1、更换设备购物车商品不能同步
a) 不能把购物车商品保存到数据库
b) 要求用户登录才能同步信息
c) 可以把购物车信息保存到redis中,key就是用户,value就是购物车列表
d) 购物车商品合并的问题。
2、提交订单后购物车商品需要清空。
二、订单系统的实现
1.系统架构
2.订单表结构
订单表:
订单商品表:
物流表:
3.创建工程
创建taotao-order工程,ssm整合参照taotao-rest
pom.xml:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
4.接口服务说明
4.1创建接口
用户使用portal创建订单、android、ios、微信商城提交订单时使用。
4.2根据订单ID查询订单
请求方法 | GET |
---|---|
URL | http://order.taotao.com/order/info/{orderId} |
参数说明 | orderId:订单编号 |
示例 | http://order.taotao.com/order/info/31414485440695 |
返回值 | { “status”: 200, “msg”: “OK”, “data”: { “orderId”:”100544”, “payment”: 5288, “paymentType”:1 “status”:1 “createTime”:”2015-01-01 08:22:14” “postFee”: 0, “userId”: “3”, “buyerMessage”: null, “buyerNick”: “zhang123”, “orderItems”: [ { “itemId”: “9”, “num”: 1, “title”: “苹果(Apple)iPhone 6 (A1586) 16GB 金色 移动联通电信4G手机3”, “price”: 5288, “totalFee”: 5288, “picPath”: “http://image.taotao.com/images/2015/03/06/2015030610045320609720.jpg“ } ], “orderShipping”: { “receiverName”: “张三”, “receiverPhone”: “”, “receiverMobile”: “15800000000”, “receiverState”: “上海”, “receiverCity”: “上海”, “receiverDistrict”: “闵行区”, “receiverAddress”: “三鲁公路3279号 明浦广场 3号楼 205室”, “receiverZip”: “200000” } } } |
4.3根据用户分页查询订单
4.4修改订单状态
请求方法 | POST |
---|---|
URL | http://order.taotao.com/order/changeStatus |
参数说明 | { “orderId”: “100544”,//订单编号 “status”: 2, //订单状态 “paymentTime”: “1414489420444” //付款时间 } |
示例 | http://sso.taotao.com/user/check/zhangsan;t=1 |
返回值 | { status: 200 //200 成功 msg: “OK” // 返回信息消息 data: null // 返回数据 } |
5.创建订单接口
5.1订单号的生成
解决方案一(不能使用):
使用mysql的自增长。
优点:不需要我们自己生成订单号,mysql会自动生成。
缺点:如果订单表数量太大时需要分库分表,此时订单号会重复。如果数据备份后再恢复,订单号会变。
方案二:日期+随机数
采用毫秒+随机数。
缺点:仍然有重复的可能。不建议采用此方案。在没有更好的解决方案之前可以使用。
方案三:使用UUID
优点:不会重复。
缺点:长。可读性查。不建议使用。
方案四:可读性好,不能太长。一般订单都是全数字的。可以使用redis的incr命令生成订单号。
优点:可读性好,不会重复
缺点:需要搭建redis服务器。
使用方案四,在resource.properties配置
1 | #订单号生成key |
5.2Service层
1 |
|
5.3Controller层
接收一个json格式的字符串作为参数。需要使用@RequestBody注解。需要使用一个pojo接收参数。
创建一个对应json格式的pojo。
1 | public class Order extends TbOrder { |
1 |
|
6.根据订单ID查询订单
6.1Service层
1 |
|
6.2Controller层
1 |
|
三、前端系统实现下单功能
1.下单流程
2.订单确认页面
1、要求用户登录。
2、根据用户id查询用户的收货地址列表。
3、在此页面展示购物车的商品列表。
4、需要计算订单的总金额(包括运费)展示给用户。
2.1要求用户登录
修改springmvc.xml拦截所有以:/order/**形式的url
2.2根据用户id查询用户的收货地址列表
在实际的商城中是必须有此功能,需要taotao-rest发布服务,由taotao-portal根据用户查询用户的收货地址列表。
在此,使用静态数据模拟。
2.3展示购物车的商品列表
需要从cookie中把购物车商品列表取出,传递给order-cart.jsp。
1 |
|
3.提交订单
3.1需求分析
点击“提交订单”按钮把用户已经确认的订单信息,提交给后台。提交一个隐藏的表单,其中包含订单基本信息,订单名称以及配送信息。需要使用一个包装的pojo接收表单中的内容。
在resource.properties配置
1 | #订单系统基础url |
3.2Service层
接收Order对象,调用taotao-order提供的服务,提交订单。需要把pojo转换成json数据。调用taotao-order提供的服务返回taotaoResult,包含订单号。
参数:Order 返回值:String(订单号)
1 |
|
3.3Controller层
1 |
|
4.成品
结语
常用词汇:啊这。就这。有一说一。寻思。建议。👴嗷汁宁呐呐。xx也就图一乐,真xx还得xx。凑弟弟往后稍稍⑧。说话带emoji。不会吧不会吧不会真有人以为用不会真有人以为就真有人这么认为了吧。不是吧不是吧。
你有你的绿色,我听我的黄歌😏