购物车与管理模块

一、加入与展示购物车

加入购物车

传参数:price,pid,后端获取uid,生成购物车-添加或修改

//CartController中创建购物车
public String createCart(HttpServletRequest request, HttpServletResponse response){
    //获取参数及从凭证中获取凭证
    User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
    if(u==null){
        request.setAttribute("msg","加入购物车前,先登录");
        return ConstUtils.FOR+"/login.jsp";
    }
    String pid = request.getParameter("pid");
    String price = request.getParameter("price");
    int res = cartService.createCart(pid,price,u.getU_id()); //创建购物车
    return ConstUtils.RED+"/cartSuccess.jsp";
}

在购物车业务层进行处理添加或修改购物车

public int createCart(String pid, String price, int uid) {
    //1.根据匹配uid与pid,查找是否有对应的购物车
    int res = 0;
    try{
        Cart cart = cartDao.selectCart(pid,uid);
        if(cart==null){//没有购物车记录,则添加
            cart = new Cart();
            cart.setP_id(Integer.parseInt(pid));
            cart.setC_num(1);
            cart.setU_id(uid);
            cart.setC_count(new BigDecimal(price));
            res = cartDao.addCart(cart);  //添加购物车
            System.out.println("添加--->"+res);
        }else{  //有对应购物车记录,则修改数量和小计
            cart.setC_num(cart.getC_num()+1); //数量+1
            BigDecimal big = new BigDecimal(price);
            cart.setC_count(big.multiply(new BigDecimal(cart.getC_num()+"")));
            res = cartDao.updateCart(cart); //修改购物车
            System.out.println("修改--->"+res);
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return res;
}

展示购物车

添加完购物车后,需要进行展示购物车数据;展示购物车中需要关联商品表,进行关联表查询

  1. 在控制层根据uid得到购物车集合
public String show(HttpServletRequest request, HttpServletResponse response){
    User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
    if(u==null){
        request.setAttribute("msg","查看购物车前,先登录");
        return ConstUtils.FOR+"/login.jsp";
    }
    List<Cart> list = cartService.showCarts(u.getU_id()); //查询购物车
    request.setAttribute("carts",list);
    return ConstUtils.FOR+"/cart.jsp";
}

购物车实体类添加商品属性

public class Cart {
  private int c_id;  //购物车ID
  private int u_id;  //用户ID
  private int p_id;  //商品ID
  private BigDecimal c_count;  //商品小计
  private int c_num;  //商品数量

  private Product goods;  //购物车包含商品  针对前端展示;ORM无法注入值,我们手动注入
}

在cart.jsp中需要修改显示的购物车及商品的属性(略)

  1. 在DAO层进行关联查询
public List<Cart> selectCarts(int u_id) throws SQLException, InvocationTargetException, IllegalAccessException {
    //关联查询:购物车与商品表
    String sql = "select * from cart c inner join product p on c.p_id=p.p_id and c.u_id=?";
    //查询后返回封装Map的List集合
    //Map代表一条记录-注入到实体中; List对应多条记录
    List<Map<String, Object>> list = runner.query(sql, new MapListHandler(), u_id);
    List<Cart> carts = new ArrayList<>();
    for(Map<String, Object> m:list){
        //只要map的key与实体属性名一致,则值注入
        Cart cart = new Cart();
        BeanUtils.populate(cart,m);  //符合购物车数据注入到cart
        Product product = new Product();
        BeanUtils.populate(product,m);  //符合商品数据注入到product
        cart.setGoods(product);  //手动商品数据设置到购物车
        carts.add(cart);
    }
    return carts;
}

二、购物车管理

修改数量

在cart.jsp中需要增加和减少购物车数据,对应的小计和总结也要改变

cart.jsp的的代码:

function pNum(cid,p,no){ //增加数量
    var nums = parseInt($("#num_count"+no).val())+1; //取数量
    location.href="cart?action=update&cid="+cid+"&num="+nums+"&price="+p;
}

在控制层完成修改功能:

public String update(HttpServletRequest request, HttpServletResponse response){
    //接收参数:
    String cid = request.getParameter("cid");
    String num = request.getParameter("num");
    String price = request.getParameter("price");
    int res = cartService.updateCart(cid,num,price); //修改购物车
    System.out.println("修改购物车:"+res);
    return ConstUtils.RED+"/cart?action=show"; //直接跳到展示页面
}

在业务层进行购物车对象的封装

public int updateCart(String cid, String num, String price) {
    try {
        Cart cart = new Cart();
        cart.setC_id(Integer.parseInt(cid));
        cart.setC_num(Integer.parseInt(num));
        BigDecimal big = new BigDecimal(price);
        //小计=数量*价格
        cart.setC_count(big.multiply(new BigDecimal(num)));
        return cartDao.updateCart(cart);
    }catch (Exception e){
        e.printStackTrace();
    }
    return 0;
}

删除与清空

删除购物车,直接点击”删除购物车“进行删除,以及减少购物车数量如果为0,也是要删除

//删除购物车  数量为1再点击也会删除
function mNum(cid,p,no){ //减少数量
    var nums = $("#num_count"+no).val()-1; //获取数量
    if(Number(nums)==0){
        if(confirm("确认要删除吗?")){
            location.href="cart?action=delete&cid="+cid;
        }
    }else{
        location.href="cart?action=update&cid="+cid+"&num="+nums+"&price="+p;
    }
}
function deleteCart(cid){  //删除购物车
    if(confirm("确认要删除吗")){
        location.href="cart?action=delete&cid="+cid;
    }
}

在控制层进行删除功能

//删除购物车
public String delete(HttpServletRequest request, HttpServletResponse response){
    String cid = request.getParameter("cid");
    int res = cartService.deleteByCid(cid);  //删除购物车
    System.out.println("删除购物车:"+res);
    return ConstUtils.RED+"/cart?action=show"; //直接跳到展示页面
}

清空购物车:根据uid删除购物车

function clearCart(){  //清空购物车
    if(confirm("确认要清空吗")){
        location.href="cart?action=clear";
    }
}
//清空购物车
public String clear(HttpServletRequest request, HttpServletResponse response){
    User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
    int res = cartService.clearCart(u.getU_id()); //清空购物车
    System.out.println("清空购物车:"+res);
    return ConstUtils.RED+"/cart?action=show"; //直接跳到展示页面
}

三、订单预览

创建订单模块

创建订单实体类,控制层,业务层,DAO层

预览实现

先查看需要显示的页面中(order.jsp),用到的数据-购物车集合,地址集合;在控制层中准备回传这些数据;

还需要创建地址的实体,控制层,业务层,DAO层

@WebServlet("/order")
public class OrderController extends BaseServlet {
    //需要反馈购物车与地址的集合,此处需要购物车业务助手和地址的业务助手
    private CartService cartService = new CartServiceImpl();
    private AddrService addrService = new AddrServiceImpl(); //地址助理
    //订单预览功能
    public String preview(HttpServletRequest request, HttpServletResponse response){
        User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
        List<Cart> list = cartService.showCarts(u.getU_id()); //获取购物车集合
        request.setAttribute("cartList",list);

        List<Address> addresses = addrService.showAddrs(u.getU_id());
        request.setAttribute("addList",addresses);
        return ConstUtils.FOR+"/order.jsp";
    }
}

再将获取的集合信息,返回到order.jsp中

<c:forEach items="${cartList}" var="c" varStatus="i">
    <tr>
        <th>${i.count}</th>
        <th>${c.goods.p_name}</th>
        <th>${c.goods.p_price}</th>
        <th>${c.c_num}</th>
        <th>${c.c_count}</th>
    </tr>
    <c:set var="sum" value="${sum+c.c_count}"></c:set>
</c:forEach>
<tr>
    <td colspan="5">
        <h5>收货地址</h5>
        <select id="address" style="width:60%" class="form-control">
            <c:forEach items="${addList}" var="a" varStatus="ai">
                <option value="${a.a_id}">${a.a_name}&nbsp;&nbsp;${a.a_phone}&nbsp;&nbsp;${a.a_detail}</option>
            </c:forEach>
        </select>
        <c:if test="${empty addList}">
            <a href="self_info.jsp">添加收货地址</a>
        </c:if>
    </td>
</tr>

四、地址管理

添加地址

在地址管理的控制层进行添加

//添加地址
public String add(HttpServletRequest request, HttpServletResponse response) throws InvocationTargetException, IllegalAccessException {
    Map<String, String[]> map = request.getParameterMap();
    Address addr = new Address();
    BeanUtils.populate(addr,map); //将map信息注入到地址实体
    int res = addrService.addAddress(addr);  //添加地址
    System.out.println("修改地址:"+res);
    return ConstUtils.RED+"/addr?action=show";
}

显示地址

添加成功后,需要展示地址信息,或在首页头部的地址管理中也可以点击计入地址管理的展示页面

//展示地址信息
public String show(HttpServletRequest request, HttpServletResponse response) {
    User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
    List<Address> addresses = addrService.showAddrs(u.getU_id());
    request.setAttribute("addList",addresses);
    return ConstUtils.FOR+"/self_info.jsp";
}
//在self_info.jsp中获取集合并填充数据展示
<c:forEach var="address" items="${addList}" varStatus="i" >
    <tr>
        <td>${i.count}</td>
        <td>${address.a_name}</td>
        <td>${address.a_phone}</td>
        <td>${address.a_detail}</td>
        ...

删除地址

根据aid进行地址删除

function deleteAddr(id){
    var res = confirm("是否删除");
    if(res==true){
        window.location.href="http://localhost:8080/addr?action=delete&aid="+id;
    }
}
public String delete(HttpServletRequest request, HttpServletResponse response){
    String aid = request.getParameter("aid");
    int res = addrService.deleteByAid(aid); //根据aid进行删除
    System.out.println("删除地址:"+res);
    return ConstUtils.RED+"/addr?action=show"; //到达地址展示
}

修改地址

点击”修改“按钮,弹出模态框,根据ID匹配唯一模态框的弹出窗口并展示修改数据,修改里面的值,并传到后端,匹配aid删除地址记录。

<button class="btn btn-default btn-sm" data-toggle="modal" data-target="#myModal${address.a_id}">修改</button>&nbsp;&nbsp;
<!-- 弹出模态框 -->
<div class="modal fade" tabindex="-1" role="dialog" id="myModal${address.a_id}">
//修改地址
public String update(HttpServletRequest request, HttpServletResponse response) throws InvocationTargetException, IllegalAccessException {
    Map<String, String[]> map = request.getParameterMap();
    Address addr = new Address();
    BeanUtils.populate(addr,map);
    int res = addrService.updateAddr(addr);  //修改地址
    System.out.println("修改:"+res);
    return ConstUtils.RED+"/addr?action=show"; //到达地址展示
}

修改默认状态

设置当前用户的所有地址为非默认,然后指定用户的aid为默认地址。

//创建默认地址
public String createDefault(HttpServletRequest request, HttpServletResponse response){
    String aid = request.getParameter("aid");
    User u = (User) request.getSession().getAttribute(ConstUtils.LOGIN);
    int res = addrService.createDefault(aid,u.getU_id()); //设置默认地址
    return ConstUtils.RED+"/addr?action=show"; //到达地址展示
}
//在业务层处理默认和非默认地址
public int createDefault(String aid, int u_id) {
    int res = 0;
    try {
        //1.设置当前用户所有状态为0
        res = addrDao.updateNoDefault(u_id);
        System.out.println("设置非默认:"+res);
        //2.设置当前aid状态为1
        res = addrDao.updateDefault(aid);
        System.out.println("设置默认:"+res);
    }catch (Exception e){
        e.printStackTrace();
    }
    return res;
}

五、总结与作业

总结

1.加入与展示购物车
加入购物车-根据uid和pid获取购物车;判断购物车是否存在;存在则修改,不存在则添加
展示购物车-根据uid返回购物车集合(关联查询-购物车与商品表)(重点)
2.购物车管理(重点)
修改数量-添加和减少数量,在后台修改数量与小计
删除与清空-删除(根据cid),清空(根据uid)
3.订单预览
创建订单模块-控制层,业务层、DAO层;预览实现-根据uid,获取地址集合,购物车集合
4.地址管理(重点)
添加地址、显示地址-根据uid显示地址集合;删除地址-根据aid删
修改地址-根据aid修改;修改默认状态-指定用户设置非默认;指定aid设置默认

作业

在订单预览中,应该显示默认的地址状态
有两种方式可处理:
1. 后端处理,在DAO层,将展示地址按状态降序排列,默认地址即可放到前面
2. 在前端使用jsp进行if判断(推荐)