商城项目第四天

商城项目第四天

今日任务

  • 生成订单
  • 订单详细信息
  • 在线支付

生成订单分页显示

创建订单实体对象

public class OrderItemView {
    private String pid;
    private int count;
    private double subTotal;
    private String pname;
    private String pimage;
    private double shop_price;

    public String getPid() {
        return pid;
    }
    public void setPid(String pid) {
        this.pid = pid;
    }
    public int getCount() {
        return count;
    }
    public void setCount(int count) {
        this.count = count;
    }
    public double getSubTotal() {
        return subTotal;
    }
    public void setSubTotal(double subTotal) {
        this.subTotal = subTotal;
    }
    public String getPname() {
        return pname;
    }
    public void setPname(String pname) {
        this.pname = pname;
    }
    public String getPimage() {
        return pimage;
    }
    public void setPimage(String pimage) {
        this.pimage = pimage;
    }
    public double getShop_price() {
        return shop_price;
    }
    public void setShop_price(double shop_price) {
        this.shop_price = shop_price;
    }
}
在header.html中将 我的订单 地址 改为
        "\t\t\t<li><a href=\"http://www.itheima338.com:8020/web/view/order/list.html\">我的订单</a></li>";

实现步骤

  • 订单列表页面发送AJAX请求
  • Servlet获取当前页数
  • 从session中取出用户对象,判断用户是否登录
  • 调用业务层方法返回PageBean对象,传递当前页数,和用户主键
  • 业务层调用持久层方法获取订单数据,并封装PageBean对象
  • Servlet将数据格式化为JSON返回客户端
  • 客户端拼接字符串,显示订单列表

list.html 记得加id

 // 页面加载 
		   $(function(){
		   	   //页面加载完成  发送ajax请求 获取当前用户的  订单信息 (以分页形式)
		   	   var url = "/orders?method=showOrders";
		   	   
		   	   var  pageNumber = HM.getParameter("pageNumber");
		   	   if(!pageNumber){
		   	   	  pageNumber = 1 ;
		   	   }
		   	   var params = "pageNumber="+pageNumber;
		   	   
		   	   // 发送请求
		   	   HM.ajax(url,params,function(data){
		   	   	   if(data.code==2){//没有登陆 
		   	   	   	  alert("您未登录,无法查询订单!!")
		   	   	   	  location.href="http://www.itheima342.com:8020/web/login.html";
		   	   	   }
		   	   	   
		   	   	   if(data.code==1){//登陆了 查询成功 
		   	   	   	   //解析 data.data数据~!
//		   	   	   	   alert(data.message);
                    var  pb = data.data;//这就是pageBean对象 
                    var ordersArr =  pb.data;//当前页的 所有订单
                    //  将订单都展示到页面上
		   	   	   	  // 遍历 得到每个订单  并 拼接字符串 
		   	   	   	    $.each(ordersArr, function(index,o) {
		   	   	   	    	// o 代表某一个订单 
		   	   	   	    	var str = `<tr class="success">
									<th colspan="2">
										订单编号:
										<a href="http://www.itheima342.com:8020/web/view/order/info.html?oid=${o.oid}">
											${o.oid}
										</a>
									</th>
									<th colspan="1">订单状态:${getState(o.state)} </th>
									<th colspan="2">下单时间:${o.ordertime}</th>
								</tr>
								<tr class="warning">
									<th>图片</th>
									<th>商品</th>
									<th>价格</th>
									<th>数量</th>
									<th>小计</th>
								</tr>`;
								
								// 上半部分内容 跟订单相关  下半部分内容 就是 每个订单展示项 
								var views = o.orderItemViews;//当前订单中的所有的订单展示项
								// 遍历得到每一个订单展示项 
								$.each(views, function(index,view) {
									 //view 订单展示项
									 str+=`<tr class="active">
												<td width="60" width="40%">
													<input type="hidden" name="id" value="22">
													<img src="http://www.itheima342.com:8020/web/${view.pimage}" width="70" height="60">
												</td>
												<td width="30%">
													<a target="_blank">${view.pname}</a>
												</td>
												<td width="20%">
													¥${view.shop_price}
												</td>
												<td width="10%">
													${view.count}
												</td>
												<td width="15%">
													<span class="subtotal">${view.subTotal}元</span>
												</td>
								</tr>`;
								});								
								
								
								
								$("#showOrders").append(str);
								
								// 分页操作
								
								
								$("#page").html(HM.page(pb,"http://www.itheima342.com:8020/web/view/order/list.html"));
		   	   	   	    });
		   	   	   }
		   	   })
		   })
		   
		   function getState(state){
		   	   if(state==0){
		   	   	  return "未付款";
		   	   }
		   	    if(state==1){
		   	   	  return "已付款";
		   	   }
		   	     if(state==2){
		   	   	  return "已发货";
		   	   }
		   	      if(state==3){
		   	   	  return "已完成";
		   	   }
		   }

OrderServlet

  /*
     提交订单生成订单
    */
    public void showOrders(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // 1: 检验用户
        // 判断用户是否登陆
        User user = (User)request.getSession().getAttribute("user");

        if(user==null){
            // 没有登陆
            // 封装 Result对象 转换成 json传递给页面
            Result result = new Result(Constant.LOGOUT,"您还没有登陆,请登录");

            String s = JSONObject.fromObject(result).toString();

            response.getWriter().write(s);

            return;
        }
        //2: 获取参数
        int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
        // 设置 每页条数
        int pageSize = 3;

        // 3: 获取uid
        String uid = user.getUid();

        // 4:三个参数传递给service
        PageBean<Orders> pageBean = ordersService
                .getPageBean(uid, pageNumber, pageSize);



        // 封装 Result对象 转换成 json传递给页面
        Result result = new Result(Constant.SUCCESS,"我的订单查询成功",pageBean);

        String s = JSONObject.fromObject(result).toString();

        response.getWriter().write(s);
    }

OrderService

 /**
     *   封装 pageBean对象
     * @param uid
     * @param pageNumber
     * @param pageSize
     * @return
     */
    public PageBean<Orders> getPageBean(String uid, int pageNumber,
                                        int pageSize) {
        PageBean<Orders> pb = null;
        try {
            // 创建一个 空对象
            pb = new PageBean<Orders>();

            // 设置属性
            pb.setPageNumber(pageNumber);
            pb.setPageSize(pageSize);
            int total = (int)ordersDao.total(uid);
            pb.setTotal(total);
            // 总页数
            pb.setPageTotal((int)Math.ceil(total*1.0/pageSize));

            // 获取当前页 数据
            List<Orders> data = ordersDao
                    .findOrdersByPage(uid, pageNumber, pageSize);
            pb.setData(data);

        }catch(SQLException e){
            e.printStackTrace();
        }

        return pb;
    }

OrderDao

 /*
      某个用户下 所有的订单条数
     */
    public long total(String uid) throws SQLException {
         //
        String sql = "select count(*) from orders where uid=?";

        Object[] params = {uid};

       return (Long)qr.query(sql, new ScalarHandler<>(), params);
    }

    /*
       查询 某个用户下的 某一页的订单信息
     */
    public List<Orders> findOrdersByPage(String uid,int pageNumber,int pageSize) throws SQLException {
         //查询 某个用户的 订单信息
        String sql = "SELECT * FROM orders WHERE uid =? LIMIT ?,?";
        Object[] params = {uid,pageSize*(pageNumber-1),pageSize};

        List<Orders> ordersList = qr
                .query(sql, new BeanListHandler<>(Orders.class), params);
        // 遍历得到每个订单
        for (Orders orders : ordersList) {
            //orders 就是 其中的一个订单
            // 通过订单 查询出来  它里面所包含的订单显示项"们"啊!
            String  sql2 = "SELECT p.pid, p.pimage,p.pname,p.shop_price,o.count,o.subtotal FROM product p,orderitem o \n" +
                           "WHERE p.pid=o.pid AND o.oid=?";
            List<OrderItemView> views = qr
                    .query(sql2, new BeanListHandler<>(OrderItemView.class),
                           orders.getOid());
            // 将  订单中对应的 订单显示项们 存储到(关联到) 订单中
            orders.setOrderItemViews(views);
        }


        return ordersList;
    }

订单详情功能

实现步骤

  • 点击订单编号,调转到info.html并传递订单编号
  • 订单编号页面发起AJAX请求,提交订单编号
  • Servlet获取订单编号,查询订单数据
  • 业务层查询订单数据,查询订单项数据
  • Servlet接收业务层返回的订单数据
  • 响应回浏览器JSON数据

info.html 记得加id

// 页面加载
			$(function(){
				// 页面加载成功之后 根据oid 发送一个查询当前订单的 ajax请求
				var url="/orders?method=info";
				var params = "oid="+HM.getParameter("oid");
				HM.ajax(url,params,function(data){
					
					 if(data.code==2){//没有登陆 
		   	   	   	  alert("您未登录,无法查询订单!!")
		   	   	   	  location.href="http://www.itheima342.com:8020/web/login.html";
		   	   	   }
		   	   	   
		   	   	   if(data.code==1){//登陆了 查询成功 
		   	   	         // data.data 就是查询回来的数据  
		   	   	         var o = data.data;//就是 orders 订单对象
		   	   	         // o 代表某一个订单 
		   	   	   	    	var str = `<tr class="success">
									<th colspan="2">
										订单编号:
										<a href="http://www.itheima342.com:8020/web/view/order/info.html?oid=${o.oid}">
											${o.oid}
										</a>
									</th>
									<th colspan="1">订单状态:${getState(o.state)} </th>
									<th colspan="2">下单时间:${o.ordertime}</th>
								</tr>
								<tr class="warning">
									<th>图片</th>
									<th>商品</th>
									<th>价格</th>
									<th>数量</th>
									<th>小计</th>
								</tr>`;
								
								// 上半部分内容 跟订单相关  下半部分内容 就是 每个订单展示项 
								var views = o.orderItemViews;//当前订单中的所有的订单展示项
								// 遍历得到每一个订单展示项 
								$.each(views, function(index,view) {
									 //view 订单展示项
									 str+=`<tr class="active">
												<td width="60" width="40%">
													<input type="hidden" name="id" value="22">
													<img src="http://www.itheima342.com:8020/web/${view.pimage}" width="70" height="60">
												</td>
												<td width="30%">
													<a target="_blank">${view.pname}</a>
												</td>
												<td width="20%">
													¥${view.shop_price}
												</td>
												<td width="10%">
													${view.count}
												</td>
												<td width="15%">
													<span class="subtotal">${view.subTotal}元</span>
												</td>
								</tr>`;
								});								
								
								
								
								$("#showOrders").append(str);
								
								$("#total").html(o.total+"元");
								
		   	   	   }
				})
			})
			
			  function getState(state){
		   	   if(state==0){
		   	   	  return "未付款";
		   	   }
		   	    if(state==1){
		   	   	  return "已付款";
		   	   }
		   	     if(state==2){
		   	   	  return "已发货";
		   	   }
		   	      if(state==3){
		   	   	  return "已完成";
		   	   }
		   }

OrderServlet

  /*
      根据oid查订单信息
   */
    public void info(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        // 1: 检验用户
        // 判断用户是否登陆
        User user = (User)request.getSession().getAttribute("user");

        if(user==null){
            // 没有登陆
            // 封装 Result对象 转换成 json传递给页面
            Result result = new Result(Constant.LOGOUT,"您还没有登陆,请登录");

            String s = JSONObject.fromObject(result).toString();

            response.getWriter().write(s);

            return;
        }
        //2: 获取参数
        String oid = request.getParameter("oid");

        // 参数传递给service
        Orders orders = ordersService.info(oid);

        // 封装 Result对象 转换成 json传递给页面
        Result result = new Result(Constant.SUCCESS,"当前订单查询成功",orders);

        String s = JSONObject.fromObject(result).toString();

        response.getWriter().write(s);
    }

OrderService

 // 根据oid查 订单
    public Orders info(String oid) {
        Orders orders = null;

        try {
            orders = ordersDao.info(oid);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return orders;
    }

OrderDao

 /**
     *   根据oid 查询订单
     */
    public Orders info(String oid) throws SQLException {
        // 根据oid 查询到对应的订单
        String sql = "select * from orders where oid = ? ";
        Orders orders = qr.query(sql, new BeanHandler<>(Orders.class), oid);

        // 查询 oid对应的订单展示项
        // 通过订单 查询出来  它里面所包含的订单显示项"们"啊!
        String  sql2 = "SELECT p.pid, p.pimage,p.pname,p.shop_price,o.count,o.subtotal FROM product p,orderitem o \n" +
                       "WHERE p.pid=o.pid AND o.oid=?";
        List<OrderItemView> views = qr
                .query(sql2, new BeanListHandler<>(OrderItemView.class),
                       orders.getOid());
        // 将  订单中对应的 订单显示项们 存储到(关联到) 订单中
        orders.setOrderItemViews(views);


        return orders;
    }

在线支付功能

实现步骤

  • 订单页面发起AJAX请求
  • 提交订单编号,收货人,地址,电话
  • 并选择付款银行
  • Servlet获取数据,并组装第三方支付平台需要的数据
  • 数据响应回浏览器
  • 浏览器跳转到第三方平台,传递数据
  • 支付成功后,由Servlet接收支付结果

into.html

 /*
			   *  点击 发起支付 
			   */
			  function pay(){
			  	  var url="/orders?method=pay";
			  	  
				  var params = $("#payForm").serialize()+"&oid="+HM.getParameter("oid");
				HM.ajax(url,params,function(data){
				     if(data.code==1){//跳转到支付页面成功
				     	location.href=data.data;
				     }
				})
			  }

OrderServlet

/**
     * 发起支付
     * @param request
     * @param response
     * @throws Exception
     */
    public void pay(HttpServletRequest request,HttpServletResponse response) throws Exception{
        //接受参数
        String address=request.getParameter("address");
        String name=request.getParameter("name");
        String telephone=request.getParameter("telephone");
        String oid=request.getParameter("oid");



        //业务层方法,修改订单信息
        ordersService.updateOrders(oid,address,name,telephone);


        // 组织发送支付公司需要哪些数据
        String pd_FrpId = request.getParameter("pd_FrpId");
        String p0_Cmd = "Buy";
        String p1_MerId = ResourceBundle.getBundle("merchantInfo").getString("p1_MerId");
        String p2_Order = oid;
        String p3_Amt = "0.01";
        String p4_Cur = "CNY";
        String p5_Pid = "";
        String p6_Pcat = "";
        String p7_Pdesc = "";
        // 支付成功回调地址 ---- 第三方支付公司会访问、用户访问
        // 第三方支付可以访问网址
        String p8_Url = ResourceBundle.getBundle("merchantInfo").getString("responseURL");
        String p9_SAF = "";
        String pa_MP = "";
        String pr_NeedResponse = "1";
        // 加密hmac 需要密钥
        String keyValue = ResourceBundle.getBundle("merchantInfo").getString("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);


        //发送给第三方
        StringBuffer sb = new StringBuffer("https://www.yeepay.com/app-merchant-proxy/node?");
        sb.append("p0_Cmd=").append(p0_Cmd).append("&");
        sb.append("p1_MerId=").append(p1_MerId).append("&");
        sb.append("p2_Order=").append(p2_Order).append("&");
        sb.append("p3_Amt=").append(p3_Amt).append("&");
        sb.append("p4_Cur=").append(p4_Cur).append("&");
        sb.append("p5_Pid=").append(p5_Pid).append("&");
        sb.append("p6_Pcat=").append(p6_Pcat).append("&");
        sb.append("p7_Pdesc=").append(p7_Pdesc).append("&");
        sb.append("p8_Url=").append(p8_Url).append("&");
        sb.append("p9_SAF=").append(p9_SAF).append("&");
        sb.append("pa_MP=").append(pa_MP).append("&");
        sb.append("pd_FrpId=").append(pd_FrpId).append("&");
        sb.append("pr_NeedResponse=").append(pr_NeedResponse).append("&");
        sb.append("hmac=").append(hmac);

        //        respone.sendRedirect(sb.toString());
        Result re = new Result(Constant.SUCCESS,"",sb.toString());
        response.getWriter().print(JSONObject.fromObject(re));

    }

    //支付成功后的回调方法
    public void callback(HttpServletRequest request,HttpServletResponse response) throws Exception{
        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 rb_BankId = request.getParameter("rb_BankId");
        String ro_BankOrderId = request.getParameter("ro_BankOrderId");
        String rp_PayDate = request.getParameter("rp_PayDate");
        String rq_CardNo = request.getParameter("rq_CardNo");
        String ru_Trxtime = request.getParameter("ru_Trxtime");
        // 身份校验 --- 判断是不是支付公司通知你
        String hmac = request.getParameter("hmac");
        String keyValue = ResourceBundle.getBundle("merchantInfo").getString(
                "keyValue");

        // 自己对上面数据进行加密 --- 比较支付公司发过来hamc
        boolean isValid = 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 (isValid) {
            // 响应数据有效
            if (r9_BType.equals("1")) {
                // 浏览器重定向
                System.out.println("111");
                request.setAttribute("msg", "您的订单号为:"+r6_Order+",金额为:"+r3_Amt+"已经支付成功,等待发货~~");

                request.setAttribute("oid",r6_Order);
                request.getRequestDispatcher("/success.jsp").forward(request, response);
            } else if (r9_BType.equals("2")) {
                // 服务器点对点 --- 支付公司通知你
                System.out.println("付款成功!222");
                // 修改订单状态 为已付款
                // 回复支付公司
                response.getWriter().print("success");
            }
            //订单状态,修改为已经付款
          ordersService.updateState(r6_Order);

        } else {
            // 数据无效
            System.out.println("数据被篡改!");
        }
    }

OrderService

 @Override
    public void updateOrders(String oid, String address, String name,
                             String telephone) {
        try {
            ordersDao.updateOrders(oid,address,name,telephone);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void updateState(String oid) {
        try {
            ordersDao.updateState(oid);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

OrderDao

/*
      在发起支付时  修改订单表中  地址 姓名 电话信息!!
     */
    public void updateOrders(String oid, String address, String name,
                             String telephone) throws SQLException {
        String sql = "update orders set address=?,name=?,telephone=? where oid=?";
        Object[] params = {address,name,telephone,oid};
        qr.update(sql,params);
    }

    /*
      支付成功之后 修改订单状态信息 !
     */
    public void updateState(String oid) throws SQLException {
        String sql = "update orders set state=? where oid=?";
        Object[] params = { Constant.YI_FU_KUAN, oid};
        qr.update(sql,params);
    }

猜你喜欢

转载自blog.csdn.net/qq_35670694/article/details/89080141