第18阶段硅谷电商03笔记12订单_第1页
第18阶段硅谷电商03笔记12订单_第2页
第18阶段硅谷电商03笔记12订单_第3页
第18阶段硅谷电商03笔记12订单_第4页
第18阶段硅谷电商03笔记12订单_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、谷粒商城版本:V 1.0订单一、业务介绍订单业务在整个中处于位置,也是比较复杂的一块业务。是把“物”变为“钱”的一个中转站。整个订单模块一共分四部分组成:结算1.下单2.对接支付服务3.对接库存管理系统:4.当前的位置二、结算页:购物车点击计算按钮1 搭建模块1.1gmall-order-web(模块已添加)perties拷贝静态资源文件和 html=order-webtocol=zookeeperspring.dubbo.registry.address=02:2181spring.dubb.atguigu.gmall=dubbospring.dubbo.consumer.timeout=1

2、0000spring.dubbo.consumer.check=falseservort=8081spring.thymeleaf.cache=false spring.thymeleaf.mEGACYHTML5mapper.enum-as-simple-type=truehost 文件nginx.conf2分析分析页面需要的数据:1、 得到用户信息2、 购物车中选择的商品列表3购物车中选择的商品列表结算的时候,需要将信息添加到 OrderDetail 表中!upstreamserver :8088;server listen 80;server_name;location / proxy_p

3、ass http;proxy_set_header X-forwarded-for $proxy_add_x_forwarded_for;# gmall63pa3.1 订单明细的数据结构:在 bean 下建立 order_detail其中 hasStock 是一个非持久化属性,用户传递【是否还有库存】的标志。如果商品在库存中有足够数据,suceess = “1”,fail=“0”3.2 OrderController加入 tradeInit 方法Referenceprivate CartService cartService;RequestMap(value = trade,method =

4、RequestMethod.GET) LoginRequiepublic class OrderDetail implements Serializable IdColumnprivate String id; Columnprivate String orderId; Columnprivate String skuId; Columnprivate String skuName; Columnprivate String imgUrl; Columnprivate BigDecimal ordrice; Columnprivateeger skuNum;Transientprivate S

5、tring hasStock;3.1 在 CartServiceImpl.java/ 得到选中购物车列表public List getCartCheckedList(String userId)/ 获得 redis 中的 keyString userCheckedKey = CartConst.USER_KEY_PREFIX + userId +CartConst.USER_CHECKED_KEY_SUFFIX;Jedis jedis = redisUtil.getJedis();List cartCheckedList = jedis.hvals(userCheckedKey);List n

6、ewCartList = new ArrayList();for (String cartJson : cartCheckedList) CartInfo cartInfo = JSON.parseObject(cartJson,CartInfo.class);newCartList.add(cartInfo);public String tradeInit(HttpServletRequest request)String userId = (String) request.getribute(userId);/ 得到选中的购物车列表List cartCheckedList = cartSe

7、rvice.getCartCheckedList(userId);/ 收货人地址List userAddressList = userInfoService.getUserAddressList(userId); request.setribute(userAddressList,userAddressList);/ 订单信息集合List orderDetailList=new ArrayList(cartCheckedList.size();for (CartInfo cartInfo : cartCheckedList) OrderDetail orderDetail = new Orde

8、rDetail();orderDetail.setSkuId(cartInfo.getSkuId();orderDetail.setSkuName(cartInfo.getSkuName();orderDetail.setImgUrl(cartInfo.getImgUrl();orderDetail.setSkuNum(cartInfo.getSkuNum(); orderDetail.setOrdrice(cartInfo.getCartPrice(); orderDetailList.add(orderDetail);request.setribute(orderDetailList,or

9、derDetailList);OrderInfo orderInfOrderInfo();orderInfo.setOrderDetailList(orderDetailList);orderInfo.sumTotalAmount();request.setribute(totalAmount,orderInfo.getTotalAmount();return trade;要把查询出来的 cartInfoList 装配到 orderDetailList 中3.4 结算页面商品部分总价钱应付总额: ¥99999商家:自营商品名称 111111111111 X 1 有货 无货 收件人 AAAA 具

10、体地址 111 return newCartList;接口 CartServicepublic List getCartCheckedList(String userId)三、下订单1 数据结构id主键,自动生成id主键。自动生成consignee收货人名称。页面获取consignee_收货人。页面获取deliveryAddress收货地址。页面获取total_amount总金额。计算order_sus订单状态,用于显示给用户查看。设定初始值。userId用户 Id。从器已放到请求属性中。payment_way支付方式(网上支付、货到付款)。页面获取ment订单状态。页面获取out_trade

11、_no第支付。按规则生成create_time创建时间。设当前时间expire_time默认当前时间+1 天pros_sus订单进度状态,程序控制、管理查看。设定初始值,tracking_no物流,初始为空,发货后补充parent_order_id拆单时产生,默认为空增加实体 Beanpublic class OrderInfo implements Serializable ColumnIdGeneratedValue(strategy = GenerationType.IDENTITY)private String id;Columnprivate String consignee;Col

12、umnprivate String consignee;Columnprivate BigDecimal totalAmount;Columnprivate OrderSus orderSus;Columnprivate ProsSus prosSus;Columnprivate String userId;Columnprivate PaymentWay paymentWay;Columnprivate Date expireTime;order_id订单,主表保存后给从表sku_id商品 id 页面传递sku_name商品名称,添加img_url路径,添加order_price商品单价,从

13、页面中获取,并验价。sku_num商品个数,从页面中获取增加枚举类枚举类路径放到 gmall-bean 模块中和 bean 同级目录。Columnprivate String deliveryAddress;Columnprivate Stringment;Columnprivate Date createTime;Columnprivate String parentOrderId;Columnprivate String trackingNo;Transientprivaist orderDetailList;Transientprivaist orderSubList;Transient

14、private String wareId;Columnprivate String outTradeNo;public void sumTotalAmount()BigDecimal totalAmount=new BigDecimal(0);for (OrderDetail orderDetail : orderDetailList) totalAmount= totalAmount.add(orderDetail.getOrdrice().multiply(new BigDecimal(orderDetail.getSkuNum();this.totalAmount= totalAmou

15、nt;public enum ProsSus UNPAID(未支付,OrderSus.UNPAID),PAID(已支付,OrderSus.PAID),NOTIFIED_WARE(已通知仓储,OrderSus.PAID),WAITING_DELEVER(待发货,OrderSus.WAITING_DELEVER),STOCK_EXCEPTION(库存异常,OrderSus.PAID), DELEVERED(已发货,OrderSus.DELEVERED),CLOSED(已关闭,OrderSus.CLOSED),public enum OrderSus UNPAID(未支付),PAID(已支付 ),W

16、AITING_DELEVER(待发货), DELEVERED(已发货),CLOSED(已关闭),FINISHED(已完结) ,SPLIT(订单已拆分);private String comment ;OrderSus(String comment )ment;public Stringment() return comment;public voidment(String comment) ment = comment;由于涉及枚举类所以 perties 中要加入这个配置会把枚举类当成字符串处理。mapper.enum-as-simple-type=truepublic enum Paymen

17、tWay ONLINE(支付),OUTLINE(货到付款 );private String comment ;PaymentWay(String comment )ment;public Stringment() return comment;public voidment(String comment) ment = comment;FINISHED(已完结,OrderSus.FINISHED) ,PAY_FAIL(支付失败,OrderSus.UNPAID),SPLIT(订单已拆分,OrderSus.SPLIT);private String comment ;private OrderSu

18、s orderSus;ProsSus(String comment, OrderSus orderSus) ment;this.orderSus=orderSus;public Stringment() return comment;public voidment(String comment) ment = comment;public OrderSus getOrderSus() return orderSus;public void setOrderSus(OrderSus orderSus) this.orderSus = orderSus;2 分析下单:1.保存单据前要做交易:验库存

19、2.保存单据: orderInfo orderDetail。3.保存以后把购物车中的商品删除4.重定向到支付页面。3 订单服务模块3.1 搭建 gmall-order-servicepom.xmlpertiesservort=8090 xmlns:xsi=xsi:schemaLocation=4.0.0com.atguigu.gmallgmall-order-service0.0.1-SNAPSHOTjargmall-order-serviceDemo project for Spring Bootcom.atguigu.gmallgmall-parent1.0-SNAPSHOTcom.atg

20、uigu.gmallgmall-erface1.0-SNAPSHOTcom.atguigu.gmallgmall-service-util1.0-SNAPSHOT.springframework.bootspring-boot-maven-pluginprojectxmlns=GmallOrderServiceApplication3.2 OrderService接口:返回 orderId,保存完,应该调到支付,根据 orderId。public String saveOrder(OrderInfo orderInfo);Mapper:publicerface OrderInfoMapper

21、extends MapperSpringBootApplicationMapperScan(basePackages = com.atguigu.gmall.order.mapper) ComponentScan(basePackages = com.atguigu.gmall)public class GmallOrderServiceApplication public sic void main(String args) SpringApplication.run(GmallOrderServiceApplication.class, args);logging.level.root=d

22、ebug=order-service tocol=zookeeper spring.dubbo.registry.address=02:2181 spring.dubb.atguigu.gmall =dubbo spring.dubbo.consumer.timeout=100000 spring.dubbo.consumer.check=falsespring.datasource.url=jdbc:/localhost:3306/gmall?characterEncoding=UTF-8 spring.datasource.username=rootspring.datasource.pa

23、ssword=rootmybatis.mapper-locations=classpath:mapper/*Mapper.xml mybatis.configuration.mapUnderscoreToCamelCase=truespring.redis.host=02 spring.redis.port=6379spring.redis.database=0mapper.enum-as-simple-type=true3.3 CartServiceImpl3.4 OrderControllerRequestMap(value = submitOrder,method = RequestMe

24、thod.T)LoginRequiepublic String submitOrder(OrderInfo orderInfo,HttpServletRequest request)Servicepublic class OrderServiceImpl implements OrderServiceAutowiredprivate OrderInfoMapper orderInfoMapper;Autowiredprivate OrderDetailMapper orderDetailMapper;public String saveOrder(OrderInfo orderInfo)/ 设

25、置创建时间orderInfo.setCreateTime(new Date();/ 设置失效时间Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE,1);orderInfo.setExpireTime(calendar.getTime();/ 生成第支付String outTradeNo=ATGUIGU+System.currentTimeMillis()+new Random().next(1000); orderInfo.setOutTradeNo(outTradeNo);orderInfoMapper

26、.insertSelective(orderInfo);/订单详细信息List orderDetailList = orderInfo.getOrderDetailList();for (OrderDetail orderDetail : orderDetailList) orderDetail.setOrderId(orderInfo.getId();orderDetailMapper.insertSelective(orderDetail);/ 为了跳转到支付页面使用。支付会根据订单 id 进行支付。String orderId = orderInfo.getId();return ord

27、erId;3.5 页面 trade.htmlinput th:name=orderDetailList+$s.index+.ordrice type=hiddenth:value=$orderDetail.ord$(function() $(#submitButton).click(function () / 收货人$(#consignee).val($(inputtype=radio:checked).next().text() ;/ 收获地址$(#deliveryAddress).val( $(inputtype=radio:checked).next().next().text();/

28、检查 tradeCodeString userId = (String) request.getribute(userId);/ 初始化参数orderInfo.setOrderSus(OrderSus.UNPAID);orderInfo.setProsSus(ProsSus.UNPAID);orderInfo.sumTotalAmount();orderInfo.setUserId(userId);/ 保存String orderId = orderServiaveOrder(orderInfo);/ 重定向return redirect:/index?orderId=+orderId;4 如

29、何解决用户利用浏览器回退重复提交订单?在进入结算页面时,生成一个结算流水号,然后保存到结算页面的隐藏元素中,每次用户提交都检查该流水号与页面提交的是否相符,订单保存以后把的流水号删除掉。那么第二次用户用同一个页面提交的话流水号就会匹配失败,无法重复保存订单。4.1 修改结算页增加流水号的生成。4.1.1OrderServiceImpl/ 生成流水号public String getTradeNo(String userId)Jedis jedis = redisUtil.getJedis();String tradeNoKey=user:+userId+:tradeCode;String tr

30、adeCode = UUID.randomUUID().toString();jedis.setex(tradeNoKey,10*60,tradeCode);jedis.close();return tradeCode;/ 验证流水号publiccheckTradeCode(String userId,String tradeCodeNo)Jedis jedis = redisUtil.getJedis();String tradeNoKey = user:+userId+:tradeCode;String tradeCode = jedis.get(tradeNoKey);jedis.clo

31、se();if (tradeCode!=null & tradeCode.equals(tradeCodeNo)$(#paymentWay).val(ONLINE);/ 订单备注$(ment).val($(mentPage).val();console.log($(#orderForm).html();$(#orderForm).submit(););4.1.2在 OrderController 中添加 tradeInit 方法保存 code 编码4.2 OrderController 中的submitOrder 方法中RequestMap(value = submitOrder,method

32、 = RequestMethod.T)LoginRequiepublic String submitOrder(OrderInfo orderInfo,HttpServletRequest request) String userId = (String) request.getribute(userId);/ 检查 tradeCodeString tradeNo = request.getParameter(tradeNo);flag = orderService.checkTradeCode(userId, tradeNo);/ 获取 TradeCode 号String tradeNo =

33、 orderService.getTradeNo(userId); request.setribute(tradeCode,tradeNo);在页面表单提交的时候,将 TradeNo 进行保存将三个方法添加到接口中return true;elsereturn false;/ 删除流水号public void delTradeCode(String userId) Jedis jedis = redisUtil.getJedis();String tradeNoKey = user:+userId+:tradeCode;jedis.del(tradeNoKey);jedis.close();5

34、验库存通过 restful 接口查询商品是否有库存一般系统的商品库存,都不由系统本身来管理,由另外一套仓库管理系统,或者进销存系统来管理,系统通过第接口调用该系统。由于库管系统可能是异构的系统,所以不在 dubbo 的分布式体系之内。只支持 restful风格的 webservice 调用和消息队列的调用。详见库存管理系统手册根据手册中的接口文档,编写调用代码。if (!flag)request.setribute(errMsg,该页面已失效,请重新结算!); return tradeFail;/ 初始化参数orderInfo.setOrderSus(OrderSus.UNPAID); ord

35、erInfo.setProsSus(ProsSus.UNPAID); orderInfo.sumTotalAmount(); orderInfo.setUserId(userId);String orderId = orderServiaveOrder(orderInfo);/ 删除 tradeNoorderService.delTradeNo(userId);return redirect:/index?orderId=+orderId;5.1导入项目 gware-manage 项目1. 将 WareConsumer 类上的注解去掉详情查看库存管理系统文档导入 相应的数据库表create t

36、ableware_sku (idbig/*auto_increment*/ not null,sku_idbig,warehouse_idbig,stock,stock_nameVARCHAR(200),stock_lockedEGER);altertable ware_skuadd constraPK_ware_sku_id primary key (id);create tableware_info (idbig/*auto_increment*/ not null,nameVARCHAR(200),addressVARCHAR(200),areacodeVARCHAR(20);altertable ware_infoadd constraPK_ware_info_id primary key (id);需要配置 nginx5.2查询仓库数量,进行校验现在验证库存数量方法upstreamserver :9001;server listen80;server_name location /proxy_pass ht;proxy_set_header X-forwar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论