购物车与管理模块
一、加入与展示购物车
加入购物车
传参数: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;
}
展示购物车
添加完购物车后,需要进行展示购物车数据;展示购物车中需要关联商品表,进行关联表查询
- 在控制层根据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中需要修改显示的购物车及商品的属性(略)
- 在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} ${a.a_phone} ${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>
<!-- 弹出模态框 -->
<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判断(推荐)