第18階段硅谷電商03筆記12訂單_第1頁(yè)
第18階段硅谷電商03筆記12訂單_第2頁(yè)
第18階段硅谷電商03筆記12訂單_第3頁(yè)
第18階段硅谷電商03筆記12訂單_第4頁(yè)
第18階段硅谷電商03筆記12訂單_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、谷粒商城版本:V 1.0訂單一、業(yè)務(wù)介紹訂單業(yè)務(wù)在整個(gè)中處于位置,也是比較復(fù)雜的一塊業(yè)務(wù)。是把“物”變?yōu)椤板X”的一個(gè)中轉(zhuǎn)站。整個(gè)訂單模塊一共分四部分組成:結(jié)算1.下單2.對(duì)接支付服務(wù)3.對(duì)接庫(kù)存管理系統(tǒng):4.當(dāng)前的位置二、結(jié)算頁(yè):購(gòu)物車點(diǎn)擊計(jì)算按鈕1 搭建模塊1.1gmall-order-web(模塊已添加)perties拷貝靜態(tài)資源文件和 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分析分析頁(yè)面需要的數(shù)據(jù):1、 得到用戶信息2、 購(gòu)物車中選擇的商品列表3購(gòu)物車中選擇的商品列表結(jié)算的時(shí)候,需要將信息添加到 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 訂單明細(xì)的數(shù)據(jù)結(jié)構(gòu):在 bean 下建立 order_detail其中 hasStock 是一個(gè)非持久化屬性,用戶傳遞【是否還有庫(kù)存】的標(biāo)志。如果商品在庫(kù)存中有足夠數(shù)據(jù),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/ 得到選中購(gòu)物車列表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);/ 得到選中的購(gòu)物車列表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;要把查詢出來(lái)的 cartInfoList 裝配到 orderDetailList 中3.4 結(jié)算頁(yè)面商品部分總價(jià)錢應(yīng)付總額: ¥99999商家:自營(yíng)商品名稱 111111111111 X 1 有貨 無(wú)貨 收件人 AAAA 具

10、體地址 111 return newCartList;接口 CartServicepublic List getCartCheckedList(String userId)三、下訂單1 數(shù)據(jù)結(jié)構(gòu)id主鍵,自動(dòng)生成id主鍵。自動(dòng)生成consignee收貨人名稱。頁(yè)面獲取consignee_收貨人。頁(yè)面獲取deliveryAddress收貨地址。頁(yè)面獲取total_amount總金額。計(jì)算order_sus訂單狀態(tài),用于顯示給用戶查看。設(shè)定初始值。userId用戶 Id。從器已放到請(qǐng)求屬性中。payment_way支付方式(網(wǎng)上支付、貨到付款)。頁(yè)面獲取ment訂單狀態(tài)。頁(yè)面獲取out_trade

11、_no第支付。按規(guī)則生成create_time創(chuàng)建時(shí)間。設(shè)當(dāng)前時(shí)間expire_time默認(rèn)當(dāng)前時(shí)間+1 天pros_sus訂單進(jìn)度狀態(tài),程序控制、管理查看。設(shè)定初始值,tracking_no物流,初始為空,發(fā)貨后補(bǔ)充parent_order_id拆單時(shí)產(chǎn)生,默認(rèn)為空增加實(shí)體 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 頁(yè)面?zhèn)鬟fsku_name商品名稱,添加img_url路徑,添加order_price商品單價(jià),從

13、頁(yè)面中獲取,并驗(yàn)價(jià)。sku_num商品個(gè)數(shù),從頁(yè)面中獲取增加枚舉類枚舉類路徑放到 gmall-bean 模塊中和 bean 同級(jí)目錄。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(已通知倉(cāng)儲(chǔ),OrderSus.PAID),WAITING_DELEVER(待發(fā)貨,OrderSus.WAITING_DELEVER),STOCK_EXCEPTION(庫(kù)存異常,OrderSus.PAID), DELEVERED(已發(fā)貨,OrderSus.DELEVERED),CLOSED(已關(guān)閉,OrderSus.CLOSED),public enum OrderSus UNPAID(未支付),PAID(已支付 ),W

16、AITING_DELEVER(待發(fā)貨), DELEVERED(已發(fā)貨),CLOSED(已關(guān)閉),FINISHED(已完結(jié)) ,SPLIT(訂單已拆分);private String comment ;OrderSus(String comment )ment;public Stringment() return comment;public voidment(String comment) ment = comment;由于涉及枚舉類所以 perties 中要加入這個(gè)配置會(huì)把枚舉類當(dāng)成字符串處理。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(已完結(jié),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.保存單據(jù)前要做交易:驗(yàn)庫(kù)存

19、2.保存單據(jù): orderInfo orderDetail。3.保存以后把購(gòu)物車中的商品刪除4.重定向到支付頁(yè)面。3 訂單服務(wù)模塊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,保存完,應(yīng)該調(diào)到支付,根據(jù) 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)/ 設(shè)

25、置創(chuàng)建時(shí)間orderInfo.setCreateTime(new Date();/ 設(shè)置失效時(shí)間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);/訂單詳細(xì)信息List orderDetailList = orderInfo.getOrderDetailList();for (OrderDetail orderDetail : orderDetailList) orderDetail.setOrderId(orderInfo.getId();orderDetailMapper.insertSelective(orderDetail);/ 為了跳轉(zhuǎn)到支付頁(yè)面使用。支付會(huì)根據(jù)訂單 id 進(jìn)行支付。String orderId = orderInfo.getId();return ord

27、erId;3.5 頁(yè)面 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);/ 初始化參數(shù)orderInfo.setOrderSus(OrderSus.UNPAID);orderInfo.setProsSus(ProsSus.UNPAID);orderInfo.sumTotalAmount();orderInfo.setUserId(userId);/ 保存String orderId = orderServiaveOrder(orderInfo);/ 重定向return redirect:/index?orderId=+orderId;4 如

29、何解決用戶利用瀏覽器回退重復(fù)提交訂單?在進(jìn)入結(jié)算頁(yè)面時(shí),生成一個(gè)結(jié)算流水號(hào),然后保存到結(jié)算頁(yè)面的隱藏元素中,每次用戶提交都檢查該流水號(hào)與頁(yè)面提交的是否相符,訂單保存以后把的流水號(hào)刪除掉。那么第二次用戶用同一個(gè)頁(yè)面提交的話流水號(hào)就會(huì)匹配失敗,無(wú)法重復(fù)保存訂單。4.1 修改結(jié)算頁(yè)增加流水號(hào)的生成。4.1.1OrderServiceImpl/ 生成流水號(hào)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;/ 驗(yàn)證流水號(hào)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 號(hào)String tradeNo =

33、 orderService.getTradeNo(userId); request.setribute(tradeCode,tradeNo);在頁(yè)面表單提交的時(shí)候,將 TradeNo 進(jìn)行保存將三個(gè)方法添加到接口中return true;elsereturn false;/ 刪除流水號(hào)public void delTradeCode(String userId) Jedis jedis = redisUtil.getJedis();String tradeNoKey = user:+userId+:tradeCode;jedis.del(tradeNoKey);jedis.close();5

34、驗(yàn)庫(kù)存通過(guò) restful 接口查詢商品是否有庫(kù)存一般系統(tǒng)的商品庫(kù)存,都不由系統(tǒng)本身來(lái)管理,由另外一套倉(cāng)庫(kù)管理系統(tǒng),或者進(jìn)銷存系統(tǒng)來(lái)管理,系統(tǒng)通過(guò)第接口調(diào)用該系統(tǒng)。由于庫(kù)管系統(tǒng)可能是異構(gòu)的系統(tǒng),所以不在 dubbo 的分布式體系之內(nèi)。只支持 restful風(fēng)格的 webservice 調(diào)用和消息隊(duì)列的調(diào)用。詳見(jiàn)庫(kù)存管理系統(tǒng)手冊(cè)根據(jù)手冊(cè)中的接口文檔,編寫調(diào)用代碼。if (!flag)request.setribute(errMsg,該頁(yè)面已失效,請(qǐng)重新結(jié)算!); return tradeFail;/ 初始化參數(shù)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導(dǎo)入項(xiàng)目 gware-manage 項(xiàng)目1. 將 WareConsumer 類上的注解去掉詳情查看庫(kù)存管理系統(tǒng)文檔導(dǎo)入 相應(yīng)的數(shù)據(jù)庫(kù)表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查詢倉(cāng)庫(kù)數(shù)量,進(jìn)行校驗(yàn)現(xiàn)在驗(yàn)證庫(kù)存數(shù)量方法upstreamserver :9001;server listen80;server_name location /proxy_pass ht;proxy_set_header X-forwar

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論