购物车功能(一)
一、门户书籍搜索后台功能实现
实现界面上的搜索功能,可以根据书名查询,也可以根据类别查询,名字查询已经做过,所以只需要在查询的方法上加一个条件。
public List<Book> list(Book book,PageBean pageBean) throws InstantiationException, IllegalAccessException, SQLException{
String name = book.getName();
String sql = "select * from t_easyui_book where true ";
long cid=book.getCid();
if(StringUtils.isNotBlank(name)) {
sql += " and name like '%"+name+"%'";
}
if(StringUtils.isNotBlank(name)) {
sql += " and cid ="+cid;
}
return super.executeQuery(sql, Book.class, pageBean);
}
然而在业务逻辑层里的datagrid方法不能用了,因为我们用forEach遍历做信息展示就直接加载数据、跳转页面,就不能用线程的方式了。所以我们要重新写一个方法
public String search(HttpServletRequest req,HttpServletResponse resp) {
PageBean pageBean = new PageBean();
pageBean.setRequest(req);
try {
List<Book> list = this.bookDao.list(book, pageBean);
// 因为search做遍历
req.setAttribute("books", list);
} catch (InstantiationException | IllegalAccessException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "search";
}
再配置一下
<action path="/book" type="com.meng.web.BookAction">
<forward name="search" path="/search.jsp" redirect="false" />
</action>
新建一个js,这个是分类列表
<script src="${pageContext.request.contextPath}/static/js/common.js"></script>
添加事件,
function search(){
location.href="${pageContext.request.contextPath }/book.action?methodName=search&name="+$("#book_name").val();
}
index.js
function searchByType(cid){
var ctx = $("#ctx").val();
location.href=ctx+"/book.action?methodName=search&cid="+cid;
}
二、加入购物车前端页面
需要准备购物车的字段(实体类ShopGoodsVo),放在vo包里
package com.meng.vo;
import java.util.Objects;
public class ShopGoodsVo {
// 购物车列表订单项所需数据
private String name;
private float price;
private int num;
private float total;
// 提交订单所需数据
private String consignee;
private String phone;
private String postalcode;
private String address;
private int sendType;
// 页面的所有传参字符串
private String pageStr;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ShopGoodsVo that = (ShopGoodsVo) o;
return Float.compare(that.price, price) == 0 &&
num == that.num &&
Float.compare(that.total, total) == 0 &&
Objects.equals(name, that.name);
}
@Override
public int hashCode() {
return Objects.hash(name, price, num, total);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public float getTotal() {
return total;
}
public void setTotal(float total) {
this.total = total;
}
public String getConsignee() {
return consignee;
}
public void setConsignee(String consignee) {
this.consignee = consignee;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPostalcode() {
return postalcode;
}
public void setPostalcode(String postalcode) {
this.postalcode = postalcode;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public int getSendType() {
return sendType;
}
public void setSendType(int sendType) {
this.sendType = sendType;
}
public String getPageStr() {
return pageStr;
}
public void setPageStr(String pageStr) {
this.pageStr = pageStr;
}
@Override
public String toString() {
return "ShopGoodsVo [name=" + name + ", price=" + price + ", num=" + num + ", total=" + total + ", consignee="
+ consignee + ", phone=" + phone + ", postalcode=" + postalcode + ", address=" + address + ", sendType="
+ sendType + ", pageStr=" + pageStr + "]";
}
public ShopGoodsVo(String name, float price, int num, float total, String consignee, String phone,
String postalcode, String address, int sendType, String pageStr) {
super();
this.name = name;
this.price = price;
this.num = num;
this.total = total;
this.consignee = consignee;
this.phone = phone;
this.postalcode = postalcode;
this.address = address;
this.sendType = sendType;
this.pageStr = pageStr;
}
public ShopGoodsVo() {
super();
}
}
给加入购物车添加个点击事件跳转购物车页面
href="${pageContext.request.contextPath}/shopping.action?methodName=add&name=${b.name}&price=${b.price}&num=1&total=${b.price}">加入购物车
三、购物车功能实现
编码业务逻辑层ShoppingAction
package com.meng.web;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.meng.dao.OrderDao;
import com.meng.dao.OrderItemDao;
import com.meng.entity.Order;
import com.meng.entity.OrderItem;
import com.meng.entity.User;
import com.meng.util.EasyuiResult;
import com.meng.util.ResponseUtil;
import com.meng.util.StringUtils;
import com.meng.vo.ShopGoodsVo;
import com.zking.framework.ActionSupport;
import com.zking.framework.ModelDriven;
public class ShoppingAction extends ActionSupport implements ModelDriven<ShopGoodsVo>{
private ShopGoodsVo shopGoodsVo = new ShopGoodsVo();
private OrderDao orderDao = new OrderDao();
private OrderItemDao orderItemDao = new OrderItemDao();
// 购物车结算
public String createOrder(HttpServletRequest request, HttpServletResponse response) {
try {
User currentUser = (User) request.getSession().getAttribute("currentUser");
long uid = currentUser.getId();
/*
ShopGoodsVo(name=null, price=0.0, num=0, total=0.0, consignee=8, phone=8, postalcode=8, address=8, sendType=1,
pageStr=,斗破苍穹-0.0-1-66.0,时光走了你还在-0.0-1-33.0,测试-0.0-1-3.0)
*/
String pageStr = shopGoodsVo.getPageStr();
float total = 0;
List<OrderItem> orderItems = new ArrayList<>();
OrderItem orderItem = null;
// 订单项就暂时不做了
for (String s : pageStr.substring(1).split(",")) {
orderItem = new OrderItem();
String[] items = s.split("-");
orderItem.setBid(items[0]);
orderItem.setQuantity(Integer.valueOf(items[2]));
total += Float.valueOf(items[items.length-1]);
orderItems.add(orderItem);
}
// System.out.println(shopGoodsVo);
Order order = new Order();
order.setAddress(shopGoodsVo.getAddress());
order.setConsignee(shopGoodsVo.getConsignee());
order.setOrderPrice(total);
order.setOrderState(1);
order.setPhone(shopGoodsVo.getPhone());
order.setPostalcode(shopGoodsVo.getPostalcode());
order.setSendType(shopGoodsVo.getSendType());
order.setUid(uid);
int res = this.orderDao.add(order);
// 按订单生成时间倒序获取新生成订单的id
Order newest = this.orderDao.newest();
// 然后for入订单项库
for (OrderItem item : orderItems) {
item.setOid(newest.getId());
this.orderItemDao.add(item);
}
ResponseUtil.writeJson(response, res);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 删除购物车
public String del(HttpServletRequest request, HttpServletResponse response) {
ObjectMapper om = new ObjectMapper();
try {
User currentUser = (User) request.getSession().getAttribute("currentUser");
long uid = currentUser.getId();
String shopId = "shopId_" + uid;
String shopVoStr = (String) request.getServletContext().getAttribute(shopId);
List<ShopGoodsVo> shopGoodsVos = om.readValue(shopVoStr, List.class);
int index = Integer.valueOf(shopGoodsVo.getPageStr());
shopGoodsVos.remove(index);
request.getServletContext().setAttribute(shopId,om.writeValueAsString(shopGoodsVos));
} catch (Exception e) {
e.printStackTrace();
}
return list(request,response);
}
// 清空购物车
public String clear(HttpServletRequest request, HttpServletResponse response) {
User currentUser = (User) request.getSession().getAttribute("currentUser");
long uid = currentUser.getId();
String shopId = "shopId_" + uid;
request.getServletContext().removeAttribute(shopId);
try {
ResponseUtil.writeJson(response, EasyuiResult.SUCCESS);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
// 购物列表查询
public String list(HttpServletRequest request, HttpServletResponse response) {
ObjectMapper om = new ObjectMapper();
try {
User currentUser = (User) request.getSession().getAttribute("currentUser");
long uid = currentUser.getId();
String shopId = "shopId_" + uid;
String shopVoStr = (String) request.getServletContext().getAttribute(shopId);
List<ShopGoodsVo> shopGoodsVos = null;
if (StringUtils.isNotBlank(shopVoStr)){
shopGoodsVos = om.readValue(shopVoStr, List.class);
}else
{
shopGoodsVos = new ArrayList<>();
}
request.setAttribute("shopGoodsVos",shopGoodsVos);
} catch (IOException e) {
e.printStackTrace();
}
return "shoppingCar";
}
// 加入购物车
public String add(HttpServletRequest request, HttpServletResponse response) {
ObjectMapper om = new ObjectMapper();
User currentUser = (User) request.getSession().getAttribute("currentUser");
long uid = currentUser.getId();
String shopId = "shopId_" + uid;
String shopVo = (String) request.getServletContext().getAttribute(shopId);
List<ShopGoodsVo> shopGoodsVos = null;
try {
if (StringUtils.isNotBlank(shopVo)) {
// 购物车没有数据处理逻辑
shopGoodsVos = (List<ShopGoodsVo>) om.readValue(shopVo, List.class);
shopGoodsVos.add(shopGoodsVo);
} else {
// 购物车有数据处理逻辑
shopGoodsVos = new ArrayList<>();
shopGoodsVos.add(shopGoodsVo);
}
request.getServletContext().setAttribute(shopId,om.writeValueAsString(shopGoodsVos));
request.setAttribute("shopGoodsVos",shopGoodsVos);
} catch (IOException e) {
e.printStackTrace();
}
return "shoppingCar";
}
// 支付
public String pay(HttpServletRequest request, HttpServletResponse response) {
return null;
}
@Override
public ShopGoodsVo getModel() {
return shopGoodsVo;
}
}
写完业务逻辑层就配置xml,这个就不用说了
<!--购物车功能-->
<action path="/shopping" type="com.meng.web.ShoppingAction">
<forward name="shoppingCar" path="/fg/shoppingCar.jsp" redirect="false"/>
</action>
搜索书籍界面
从主界面搜索跳转到搜索界面,然后点击加入购物车跳转到购物车界面
扫描二维码关注公众号,回复:
11618612 查看本文章
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="z" uri="/meng" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>网上书城首页</title>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/static/css/fg.css" />
</head>
<body>
<div class="container">
<!-- 横幅 -->
<div class="row">
<div class="col-sm-4">
您好,欢迎来到飞凡网上书城 !
</div>
<div class="col-sm-4 col-sm-offset-4">
<a href="#">登录</a> | <a href="#">注册</a> | <b>我的购物车</b> | <i>网站首页</i>
</div>
</div>
<!-- 搜索栏 -->
<div class="row">
<div class="col-sm-12 search-parent">
<!-- 本来这里应该放一张背景图的 -->
<div class="search"></div>
<input type="text" id="book_name" name="name" value="" />
<button type="button" class="btn btn-primary">搜索</button>
</div>
</div>
<!-- 主内容区 -->
<div class="row content">
<div class="col-sm-3 l-content">
<ul class="list-group c-category">
<li class="list-group-item text-white">书籍分类</li>
</ul>
</div>
<div class="col-sm-9">
<c:forEach items="${books }" var="b">
<div class="media">
<img src="${b.image }" class="align-self-center mr-3" alt="...">
<div class="media-body">
<p>${b.name }</p>
<p>作者:${b.author }</p>
<p>价格:¥${b.price }</p>
<p>出版社:${b.publishing }</p>
<p>简介:${b.description }</p>
<p>
<!-- <button class="btn btn-danger" style="width: 150px;" onclick="addShopCar(this);">加入购物车</button> -->
<a type="button" class="btn btn-danger" href="${pageContext.request.contextPath}/shopping.action?methodName=add&name=${b.name}&price=${b.price}&num=1&total=${b.price}">加入购物车</a>
<button class="btn btn-danger" style="width: 150px;">去结算</button>
</p>
</div>
</div>
</c:forEach>
<z:page pageBean="${pageBean }"></z:page>
</div>
</div>
<!-- 底部版权 -->
<div class="row">
<div class="col-sm-12 text-center">
Copyright ©2020 卓京教育,版权所有
</div>
</div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<script src="${pageContext.request.contextPath }/static/js/common.js"></script>
<script type="text/javascript">
/* function addShopCar(){
var $div = $(node).parent().parent();
var name = $div.find("p").eq(0).html();
var price = $div.find("p").eq(1).html();
var name = $div.find("p").eq(0).html();
}; */
</script>
</body>
</html>
购物车界面代码
<meta charset="utf-8">
<title>购物车</title>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/css/bootstrap.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath }/static/css/fg.css" />
</head>
<body>
<div class="container">
<!-- 横幅 -->
<div class="row">
<div class="col-sm-4">
您好,欢迎来到网上书城!
</div>
<div class="col-sm-4 col-sm-offset-4">
<a href="#">登录</a> | <a href="#">注册</a> | <b>我的购物车</b> | <i>网站首页</i>
</div>
</div>
<!-- 搜索栏 -->
<div class="row">
<div class="col-sm-12 search-parent">
<!-- 本来这里应该放一张背景图的 -->
<div class="search"></div>
<input type="text" id="book_name" name="name" value="" />
<button type="button" class="btn btn-primary">搜索</button>
</div>
</div>
<!-- 主内容区 -->
<div class="row content">
<div class="col-sm-3 l-content">
<ul class="list-group c-category ">
<li class="list-group-item" style="color: white;">书籍分类</li>
</ul>
</div>
<div class="col-sm-9">
<table class="table">
<thead class="thead-dark">
<tr style="background-color: papayawhip;">
<th scope="col">书名</th>
<th scope="col">单价</th>
<th scope="col">数量</th>
<th scope="col">小计</th>
<th scope="col">操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${shopGoodsVos }" var="s">
<tr>
<td>${s.name }</td>
<td>${s.price }</td>
<td>
<input type="text" value="${s.num }">
</td>
<td>${s.total }</td>
<td>
<a href="#">删除</a>
<a href="#">更新</a>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="5">
<div class="btn btn-danger" style="width: 200px;">清空购物车</div>
<div class="btn btn-danger shop-table-tab" style="width: 200px;">继续购物</div>
<div class="btn btn-danger" style="width: 200px;">去结算</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- 底部版权 -->
<div class="row">
<div class="col-sm-12 text-center">
Copyright 2020 教育,版权所有
</div>
</div>
</div>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.12.4/jquery.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.5.0/js/bootstrap.js"></script>
<script src="${pageContext.request.contextPath}/static/js/common.js"></script>
</body>
</html>