日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图书商城:订单模块

發布時間:2025/4/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图书商城:订单模块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、創建相關類

  • domain:
  • Order
  • OrderItem
  • dao:OrderDao
  • service:OrderService
  • web.servlete:OrderServlet
/*** 訂單條目類*/ public class OrderItem {private String iid;private int count;// 數量private double subtotal;// 小計private Order order;// 所屬訂單private Book book;// 所要購買的圖書 } /*** 訂單類*/ public class Order {private String oid;private Date ordertime;// 下單時間private double total;// 合計private int state;// 訂單狀態有四種:1未付款 2已付款但未發貨 3已發貨但未確認收貨 4已確認交易成功private User owner;// 訂單所有者private String address;// 收貨地址private List<OrderItem> orderItemList;//當前訂單下所有條目 } public class OrderDao {private QueryRunner qr = new TxQueryRunner();/*** 添加訂單* @param order*/public void addOrder(Order order) {try {String sql = "insert into orders values(?,?,?,?,?,?)";/** 處理util的Date轉換成sql的Timestamp*/Timestamp timestamp = new Timestamp(order.getOrdertime().getTime());Object[] params = {order.getOid(), timestamp, order.getTotal(),order.getState(), order.getOwner().getUid(),order.getAddress()};qr.update(sql, params);} catch(SQLException e) {throw new RuntimeException(e);}}/*** 插入訂單條目* @param orderItemList*/public void addOrderItemList(List<OrderItem> orderItemList) {/*** QueryRunner類的batch(String sql, Object[][] params)* 其中params是多個一維數組!* 每個一維數組都與sql在一起執行一次,多個一維數組就執行多次*/try {String sql = "insert into orderitem values(?,?,?,?,?)";/** 把orderItemList轉換成兩維數組* 把一個OrderItem對象轉換成一個一維數組*/Object[][] params = new Object[orderItemList.size()][];// 循環遍歷orderItemList,使用每個orderItem對象為params中每個一維數組賦值for(int i = 0; i < orderItemList.size(); i++) {OrderItem item = orderItemList.get(i);params[i] = new Object[]{item.getIid(), item.getCount(), item.getSubtotal(), item.getOrder().getOid(),item.getBook().getBid()}; }qr.batch(sql, params);//執行批處理} catch(SQLException e) {throw new RuntimeException(e);}}/*** 按uid查詢訂單* @param uid* @return*/public List<Order> findByUid(String uid) {/** 1. 通過uid查詢出當前用戶的所有List<Order>* 2. 循環遍歷每個Order,為其加載他的所有OrderItem*/try {/** 1. 得到當前用戶的所有訂單*/String sql = "select * from orders where uid=?";List<Order> orderList = qr.query(sql, new BeanListHandler<Order>(Order.class), uid);/** 2. 循環遍歷每個Order,為其加載它自己所有的訂單條目*/for(Order order : orderList) {loadOrderItems(order);//為order對象添加它的所有訂單條目}/** 3. 返回訂單列表*/return orderList;} catch(SQLException e) {throw new RuntimeException(e);}}/*** 加載指定的訂單所有的訂單條目* @param order* @throws SQLException */private void loadOrderItems(Order order) throws SQLException {/** 查詢兩張表:orderitem、book*/String sql = "select * from orderitem i, book b where i.bid=b.bid and oid=?";/** 因為一行結果集對應的不再是一個javabean,所以不能再使用BeanListHandler,而是MapListHandler*/List<Map<String,Object>> mapList = qr.query(sql, new MapListHandler(), order.getOid());/** mapList是多個map,每個map對應一行結果集* 一行:* {iid=C7AD5492F27D492189105FB50E55CBB6, count=2, subtotal=60.0, oid=1AE8A70354C947F8B81B80ADA6783155, bid=7, bname=精通Hibernate,price=30.0, author=張衛琴, image=book_img/8991366-1_l.jpg, cid=2}* ...* * 我們需要使用一個Map生成兩個對象:OrderItem、Book,然后再建立兩者的關系(把Book設置給OrderItem)*//** 循環遍歷每個Map,使用map生成兩個對象,然后建立關系(最終結果一個OrderItem),把OrderItem保存起來*/List<OrderItem> orderItemList = toOrderItemList(mapList);order.setOrderItemList(orderItemList);}/*** 把mapList中每個Map轉換成兩個對象,并建立關系* @param mapList* @return*/private List<OrderItem> toOrderItemList(List<Map<String, Object>> mapList) {List<OrderItem> orderItemList = new ArrayList<OrderItem>();for(Map<String,Object> map : mapList) {OrderItem item = toOrderItem(map);orderItemList.add(item);}return orderItemList;}/*** 把一個Map轉換成一個OrderItem對象* @param map* @return*/private OrderItem toOrderItem(Map<String, Object> map) {OrderItem orderItem = CommonUtils.toBean(map, OrderItem.class);Book book = CommonUtils.toBean(map, Book.class);orderItem.setBook(book);return orderItem;}/*** 加載訂單* @param oid* @return*/public Order load(String oid) {try {/** 1. 得到當前用戶的所有訂單*/String sql = "select * from orders where oid=?";Order order = qr.query(sql, new BeanHandler<Order>(Order.class), oid);/** 2. 為order加載它的所有條目*/loadOrderItems(order);/** 3. 返回訂單列表*/return order;} catch(SQLException e) {throw new RuntimeException(e);}}/*** 通過oid查詢訂單狀態* @param oid* @return*/public int getStateByOid(String oid) {try {String sql = "select state from orders where oid=?";return (Integer)qr.query(sql, new ScalarHandler(), oid);} catch(SQLException e) {throw new RuntimeException(e);}}/*** 修改訂單狀態* @param oid* @param state* @return*/public void updateState(String oid, int state) {try {String sql = "update orders set state=? where oid=?";qr.update(sql, state, oid);} catch(SQLException e) {throw new RuntimeException(e);}} } public class OrderService {private OrderDao orderDao = new OrderDao();/*** 支付方法* @param oid*/public void zhiFu(String oid) {/** 1. 獲取訂單的狀態* * 如果狀態為1,那么執行下面代碼* * 如果狀態不為1,那么本方法什么都不做*/int state = orderDao.getStateByOid(oid);if(state == 1) {// 修改訂單狀態為2orderDao.updateState(oid, 2);}}/*** 添加訂單* 需要處理事務* @param order*/public void add(Order order) {try {// 開啟事務JdbcUtils.beginTransaction();orderDao.addOrder(order);//插入訂單orderDao.addOrderItemList(order.getOrderItemList());//插入訂單中的所有條目// 提交事務JdbcUtils.commitTransaction();} catch(Exception e) {// 回滾事務try {JdbcUtils.rollbackTransaction();} catch (SQLException e1) {}throw new RuntimeException(e);}}/*** 我的訂單* @param uid* @return*/public List<Order> myOrders(String uid) {return orderDao.findByUid(uid);}/*** 加載訂單* @param oid* @return*/public Order load(String oid) {return orderDao.load(oid);}/*** 確認收貨* @param oid* @throws OrderException*/public void confirm(String oid) throws OrderException {/** 1. 校驗訂單狀態,如果不是3,拋出異常*/int state = orderDao.getStateByOid(oid);//獲取訂單狀態if(state != 3) throw new OrderException("訂單確認失敗,您不是什么好東西!");/** 2. 修改訂單狀態為4,表示交易成功*/orderDao.updateState(oid, 4);} } public class OrderServlet extends BaseServlet {private OrderService orderService = new OrderService();/*** 支付之去銀行* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String zhiFu(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Properties props = new Properties();InputStream input = this.getClass().getClassLoader().getResourceAsStream("merchantInfo.properties");props.load(input);/** 準備13參數*/String p0_Cmd = "Buy";String p1_MerId = props.getProperty("p1_MerId");String p2_Order = request.getParameter("oid");String p3_Amt = "0.01";String p4_Cur = "CNY";String p5_Pid = "";String p6_Pcat = "";String p7_Pdesc = "";String p8_Url = props.getProperty("p8_Url");String p9_SAF = "";String pa_MP = "";String pd_FrpId = request.getParameter("pd_FrpId");String pr_NeedResponse = "1";/** 計算hmac*/String keyValue = props.getProperty("keyValue");String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt,p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP,pd_FrpId, pr_NeedResponse, keyValue);/** 連接易寶的網址和13+1個參數*/StringBuilder url = new StringBuilder(props.getProperty("url"));url.append("?p0_Cmd=").append(p0_Cmd);url.append("&p1_MerId=").append(p1_MerId);url.append("&p2_Order=").append(p2_Order);url.append("&p3_Amt=").append(p3_Amt);url.append("&p4_Cur=").append(p4_Cur);url.append("&p5_Pid=").append(p5_Pid);url.append("&p6_Pcat=").append(p6_Pcat);url.append("&p7_Pdesc=").append(p7_Pdesc);url.append("&p8_Url=").append(p8_Url);url.append("&p9_SAF=").append(p9_SAF);url.append("&pa_MP=").append(pa_MP);url.append("&pd_FrpId=").append(pd_FrpId);url.append("&pr_NeedResponse=").append(pr_NeedResponse);url.append("&hmac=").append(hmac);System.out.println(url);/** 重定向到易寶*/response.sendRedirect(url.toString());return null;}/*** 這個方法是易寶回調方法 我們必須要判斷調用本方法的是不是易寶!* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String back(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 獲取11 + 1*/String p1_MerId = request.getParameter("p1_MerId");String r0_Cmd = request.getParameter("r0_Cmd");String r1_Code = request.getParameter("r1_Code");String r2_TrxId = request.getParameter("r2_TrxId");String r3_Amt = request.getParameter("r3_Amt");String r4_Cur = request.getParameter("r4_Cur");String r5_Pid = request.getParameter("r5_Pid");String r6_Order = request.getParameter("r6_Order");String r7_Uid = request.getParameter("r7_Uid");String r8_MP = request.getParameter("r8_MP");String r9_BType = request.getParameter("r9_BType");String hmac = request.getParameter("hmac");/** 2. 校驗訪問者是否為易寶!*/Properties props = new Properties();InputStream input = this.getClass().getClassLoader().getResourceAsStream("merchantInfo.properties");props.load(input);String keyValue = props.getProperty("keyValue");boolean bool = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd,r1_Code, r2_TrxId, r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid,r8_MP, r9_BType, keyValue);if(!bool) {//如果校驗失敗request.setAttribute("msg", "您不是什么好東西!");return "f:/jsps/msg.jsp";}/** 3. 獲取狀態訂單,確定是否要修改訂單狀態,以及添加積分等業務操作*/orderService.zhiFu(r6_Order);//有可能對數據庫進行操作,也可能不操作!/** 4. 判斷當前回調方式* 如果為點對點,需要回饋以success開頭的字符串*/if(r9_BType.equals("2")) {response.getWriter().print("success");}/** 5. 保存成功信息,轉發到msg.jsp*/request.setAttribute("msg", "支付成功!等待賣家發貨!你慢慢等~");return "f:/jsps/msg.jsp";}/*** 確認收貨* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String confirm(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {/** 1. 獲取oid參數 2. 調用service方法 > 如果有異常,保存異常信息,轉發到msg.jsp 3.* 保存成功信息,轉發到msg.jsp*/String oid = request.getParameter("oid");try {orderService.confirm(oid);request.setAttribute("msg", "恭喜,交易成功!");} catch (OrderException e) {request.setAttribute("msg", e.getMessage());}return "f:/jsps/msg.jsp";}/*** 加載訂單* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String load(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 得到oid參數 2. 使用oid調用service方法得到Order 3.* 保存到request域,轉發到/jsps/order/desc.jsp*/request.setAttribute("order",orderService.load(request.getParameter("oid")));return "f:/jsps/order/desc.jsp";}/*** 我的訂單* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String myOrders(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {/** 1. 從session得到當前用戶,再獲取其uid 2.* 使用uid調用orderService#myOrders(uid)得到該用戶的所有訂單List<Order> 3.* 把訂單列表保存到request域中,轉發到/jsps/order/list.jsp*/User user = (User) request.getSession().getAttribute("session_user");List<Order> orderList = orderService.myOrders(user.getUid());request.setAttribute("orderList", orderList);return "f:/jsps/order/list.jsp";}/*** 添加訂單 把session中的車用來生成Order對象* * @param request* @param response* @return* @throws ServletException* @throws IOException*/public String add(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/** 1. 從session中得到cart 2. 使用cart生成Order對象 3. 調用service方法完成添加訂單 4.* 保存order到request域中,轉發到/jsps/order/desc.jsp*/// 從session中獲取cartCart cart = (Cart) request.getSession().getAttribute("cart");// 把cart轉換成Order對象/** 創建Order對象,并設置屬性* * Cart --> Order*/Order order = new Order();order.setOid(CommonUtils.uuid());// 設置編號order.setOrdertime(new Date());// 設置下單時間order.setState(1);// 設置訂單狀態為1,表示未付款User user = (User) request.getSession().getAttribute("session_user");order.setOwner(user);// 設置訂單所有者order.setTotal(cart.getTotal());// 設置訂單的合計,從cart中獲取合計/** 創建訂單條目集合* * cartItemList --> orderItemList*/List<OrderItem> orderItemList = new ArrayList<OrderItem>();// 循環遍歷Cart中的所有CartItem,使用每一個CartItem對象創建OrderItem對象,并添加到集合中for (CartItem cartItem : cart.getCartItems()) {OrderItem oi = new OrderItem();// 創建訂單條目oi.setIid(CommonUtils.uuid());// 設置條目的idoi.setCount(cartItem.getCount());// 設置條目的數量oi.setBook(cartItem.getBook());// 設置條目的圖書oi.setSubtotal(cartItem.getSubtotal());// 設置條目的小計oi.setOrder(order);// 設置所屬訂單orderItemList.add(oi);// 把訂單條目添加到集合中}// 把所有的訂單條目添加到訂單中order.setOrderItemList(orderItemList);// 清空購物車cart.clear();// /** 3. 調用orderService添加訂單*/orderService.add(order);/** 4. 保存order到request域,轉發到/jsps/order/desc.jsp*/request.setAttribute("order", order);return "/jsps/order/desc.jsp";} }

2、生成訂單

3、我的訂單(按用戶查)

4、加載訂單(按id查)

5、確認收貨

總結

以上是生活随笔為你收集整理的图书商城:订单模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。