商城项目第四天
今日任务
生成订单分页显示
创建订单实体对象
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(){
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){
var pb = data.data;
var ordersArr = pb.data;
$.each(ordersArr, function(index,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) {
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 {
User user = (User)request.getSession().getAttribute("user");
if(user==null){
Result result = new Result(Constant.LOGOUT,"您还没有登陆,请登录");
String s = JSONObject.fromObject(result).toString();
response.getWriter().write(s);
return;
}
int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
int pageSize = 3;
String uid = user.getUid();
PageBean<Orders> pageBean = ordersService
.getPageBean(uid, pageNumber, pageSize);
Result result = new Result(Constant.SUCCESS,"我的订单查询成功",pageBean);
String s = JSONObject.fromObject(result).toString();
response.getWriter().write(s);
}
OrderService
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) {
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(){
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){
var o = data.data;
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) {
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
public void info(HttpServletRequest request, HttpServletResponse response)
throws IOException {
User user = (User)request.getSession().getAttribute("user");
if(user==null){
Result result = new Result(Constant.LOGOUT,"您还没有登陆,请登录");
String s = JSONObject.fromObject(result).toString();
response.getWriter().write(s);
return;
}
String oid = request.getParameter("oid");
Orders orders = ordersService.info(oid);
Result result = new Result(Constant.SUCCESS,"当前订单查询成功",orders);
String s = JSONObject.fromObject(result).toString();
response.getWriter().write(s);
}
OrderService
public Orders info(String oid) {
Orders orders = null;
try {
orders = ordersDao.info(oid);
} catch (SQLException e) {
e.printStackTrace();
}
return orders;
}
OrderDao
public Orders info(String oid) throws SQLException {
String sql = "select * from orders where oid = ? ";
Orders orders = qr.query(sql, new BeanHandler<>(Orders.class), 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
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";
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);
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");
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);
}