spring项目篇14 --- 编写商品展示以及购物车信息
肺炎形势严峻,人心惶惶,愿祖国早日解决,社会早点稳定。
这次主要实现的功能就是商品展示以及购物车,购物车信息保存在mysql数据库中。我们先来看商品数据库层
// IProductDao
package com.yang.dao;
import com.yang.domain.Product;
import java.util.List;
public interface IProductDao {
// 获取商品
List<Product> getList();
// 获取单个商品
Product getProduct(Integer id);
// 增加单个商品
boolean addProduct(Product product);
// 删除单个商品
boolean deleteProduct(Integer id);
}
// ProductDaoImpl
package com.yang.dao.impl;
import com.yang.dao.IProductDao;
import com.yang.domain.Product;
import com.yang.handler.BeanHandler;
import com.yang.handler.BeanListHandler;
import com.yang.util.CRUDTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class ProductDaoImpl implements IProductDao {
// 获取商品列表
@Override
public List<Product> getList() {
// 创建sql语句
String sql = "select * from product";
//执行
return CRUDTemplate.executeQuery(sql, new BeanListHandler<Product>(Product.class));
}
// 获取单个商品
@Override
public Product getProduct(Integer id) {
// 创建sql语句
String sql = "select * from product where id = ?";
// 执行
return CRUDTemplate.executeQuery(sql, new BeanHandler<Product>(Product.class), id);
}
// 增加单个商品
@Override
public boolean addProduct(Product product) {
// 创建插入语句
String sql = "insert into product(name, price, description, pictureUrl) values(?,?,?,?)";
// 使用工具类执行插入操作,返回值为int,成功返回1,失败为0
int result = CRUDTemplate.executeUpdate(sql, product.getName(), product.getPrice(), product.getDescription(), product.getPictureUrl());
return result == 1;
}
// 删除某个商品
@Override
public boolean deleteProduct(Integer id) {
// 创建删除语句
String sql = "delete from product where id = ?";
// 根据id,删除商品
int result = CRUDTemplate.executeUpdate(sql, id);
return result == 1;
}
}server层不看了,东西不多,与dao层类似,直接看controller层
package com.yang.controller;
import com.yang.domain.Product;
import com.yang.domain.User;
import com.yang.service.IProductService;
import com.yang.service.IUserService;
import com.yang.util.TokenUse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
@Controller
public class ProductController {
@Autowired
private IProductService iProductService;
@Autowired
private IUserService iUserService;
@RequestMapping("/product")
public String productList(String token, Model model) {
// 根据token获取用户id
Integer userId = TokenUse.getUserID(token);
User user = iUserService.get(userId);
// 获取商品列表
List<Product> list = iProductService.getList();
// 向model中塞模型
model.addAttribute("productList", list);
model.addAttribute("user", user);
return "product";
}
@RequestMapping("/detail/{id}/{userId}")
public String detail(@PathVariable(value = "id") Integer id, @PathVariable(value = "userId") Integer userId, Model model) {
// 查询商品详情
Product product = iProductService.getProduct(id);
// 查询用户
User user = iUserService.get(userId);
// 如果没有值,就返回错误页面
if (product == null | user == null) {
return "error";
}
// 向model中塞模型
model.addAttribute("product", product);
model.addAttribute("user", user);
return "detail";
}
}看一下商品展示前端页面
<%--
Created by IntelliJ IDEA.
User: yangshixiong
Date: 2020/1/28
Time: 上午9:48
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>网上商城</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="yang">
<!-- Bootstrap core CSS -->
<link href="${pageContext.request.contextPath}/static/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">杨的购物广场</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="${pageContext.request.contextPath}/">回欢迎页</a></li>
<li><a href="#" id="backProduct">返回商品列表</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">购物车</a></li>
<li class="dropdown">
<img src="${pageContext.request.contextPath}/${user.avatarUrl}" alt=""
style=" max-width: 30px; display: inline-block;">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false" style="display: inline-block; padding-left: 3px;">${user.username}<span
class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="${pageContext.request.contextPath}/userinfo/${user.id}">个人信息</a></li>
<li><a href="${pageContext.request.contextPath}/order/${user.id}">查看订单</a></li>
<li id="logout"><a>退出</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div class="row" style="max-width: 1440px; margin: 0 auto">
<c:forEach items="${productList}" var="product">
<div class="col-sm-6 col-md-4">
<div class="thumbnail">
<img src="${pageContext.request.contextPath}/${product.pictureUrl}" alt="商品照片">
<div class="caption">
<a href="${pageContext.request.contextPath}/detail/${product.id}/${user.id}">
<h3>${product.name}</h3>
<h4 style="color: orange">价格:${product.price}</h4>
<p>${product.description}</p>
</a>
</div>
</div>
</div>
</c:forEach>
</div>
<!-- Jquery -->
<script src="${pageContext.request.contextPath}/static/js/jquery-1.11.1.min.js"></script>
<!-- Bootstrap -->
<script src="${pageContext.request.contextPath}/static/js/bootstrap.min.js"></script>
<script type="application/javascript">
$(function () {
let token = sessionStorage.getItem("token") || null;
// 验证是否存在token,没有则返回登陆
if (token == null) {
alert("请先登陆!");
window.location = "${pageContext.request.contextPath}/login";
return false;
}
document.getElementById("backProduct").href = "${pageContext.request.contextPath}/product?token=" + token;
$("#logout").click(function () {
sessionStorage.removeItem("token");
window.location = "${pageContext.request.contextPath}/login"
})
})
</script>
</body>
</html>接下来看一下购物车的相关操作
看一下dao层
// ICarDao
package com.yang.dao;
import com.yang.domain.Car;
import java.util.List;
public interface ICarDao {
// 根据用户Id获取购物车内容
List<Car> getList(Integer userId);
// 加入购物车
boolean addCar(Car car);
// 根据Id从购物车中删除
boolean deleteCar(Integer id);
// 根据productId判断是否在购物车中存在
boolean checkCar(Integer userId, Integer productId);
}
// CarDaoImpl
package com.yang.dao.impl;
import com.yang.dao.ICarDao;
import com.yang.domain.Car;
import com.yang.handler.BeanHandler;
import com.yang.handler.BeanListHandler;
import com.yang.util.CRUDTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class CarDaoImpl implements ICarDao {
// 查询购物车列表
@Override
public List<Car> getList(Integer userId) {
String sql = "select * from car where userId = ?";
return CRUDTemplate.executeQuery(sql, new BeanListHandler<>(Car.class), userId);
}
// 添加至购物车
@Override
public boolean addCar(Car car) {
String sql = "insert into car(userId, productId, price) values(?, ?, ?)";
int result = CRUDTemplate.executeUpdate(sql, car.getUserId(), car.getProductId(), car.getPrice());
return result == 1;
}
// 从购物车中删除
@Override
public boolean deleteCar(Integer id) {
String sql = "delete from car where id = ?";
int result = CRUDTemplate.executeUpdate(sql, id);
return result == 1;
}
// 根据userId以及productId判断购物车中是否存在
@Override
public boolean checkCar(Integer userId, Integer productId) {
String sql = "select * from car where userId = ? and productId = ?";
Car car = CRUDTemplate.executeQuery(sql, new BeanHandler<>(Car.class), userId, productId);
return car != null;
}
}同样道理,不需要看server层,直接看controller层
CarController
package com.yang.controller;
import com.yang.domain.Car;
import com.yang.domain.Product;
import com.yang.domain.User;
import com.yang.service.ICarService;
import com.yang.service.IProductService;
import com.yang.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Controller
public class CarController {
@Autowired
ICarService iCarService;
@Autowired
IUserService iUserService;
@Autowired
IProductService iProductService;
// 添加购物车信息,提前检测,如果有就不允许添加
@ResponseBody
@RequestMapping(value = "/car/add")
public String addCar(Car car) {
boolean exist = iCarService.checkCar(car.getUserId(), car.getProductId());
if (exist) {
return "exist";
}
boolean result = iCarService.addCar(car);
if (result) {
return "ok";
}
return "fail";
}
// 根据购物id值进行删除
@ResponseBody
@RequestMapping(value = "/car/delete/{id}")
public String deleteCar(@PathVariable Integer id) {
boolean result = iCarService.deleteCar(id);
if (result) {
return "ok";
}
return "fail";
}
// 根据userid获取购物车信息
@RequestMapping("/car/{userId}")
public String car(@PathVariable(value = "userId") Integer userId, Model model) {
// 获取购物车列表
List<Car> carList = iCarService.getList(userId);
// 获取用户信息
User user = iUserService.get(userId);
if (user == null) {
return "error";
}
Map<Integer, Product> productMap = new HashMap<>();
float totalPrice = 0;
// 循环购物车,根据里面的商品id去获取商品详情,并保存到字典中
for (Car car : carList) {
Product product = iProductService.getProduct(car.getProductId());
productMap.put(car.getId(), product);
totalPrice += product.getPrice();
}
// 为model添值
model.addAttribute("carList", carList);
model.addAttribute("productMap", productMap);
model.addAttribute("user", user);
model.addAttribute("totalPrice", totalPrice);
return "car";
}
}接下来看一下购物车的部分前端代码
<%--
Created by IntelliJ IDEA.
User: yangshixiong
Date: 2020/1/28
Time: 下午9:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>${user.username}的购物车</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="yang">
<!-- Bootstrap core CSS -->
<link href="${pageContext.request.contextPath}/static/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-default">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">杨的购物广场</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="${pageContext.request.contextPath}/">回欢迎页</a></li>
<li><a href="#" id="backProduct">返回商品列表</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="${pageContext.request.contextPath}/car/${user.id}">购物车</a></li>
<li class="dropdown">
<img src="${pageContext.request.contextPath}/${user.avatarUrl}" alt=""
style=" max-width: 30px; display: inline-block;">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false" style="display: inline-block; padding-left: 3px;">${user.username}<span
class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="${pageContext.request.contextPath}/userinfo/${user.id}">个人信息</a></li>
<li><a href="${pageContext.request.contextPath}/order/${user.id}">查看订单</a></li>
<li id="logout"><a>退出</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<div style="max-width: 1440px; margin: 0 auto">
<table class="table table-striped">
<caption>${user.username}的购物车</caption>
<thead>
<tr>
<th>照片</th>
<th>商品</th>
<th>描述</th>
<th>价格</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${carList}" var="car">
<tr>
<td><img src="${pageContext.request.contextPath}/${productMap[car.id].pictureUrl}" alt=""
class="img-circle" style="max-width: 30px;"></td>
<td>${productMap[car.id].name}</td>
<td>${productMap[car.id].description}</td>
<td>${productMap[car.id].price}</td>
<td>
<button href="${pageContext.request.contextPath}/car/delete/${car.id}" type="button"
class="btn btn-danger delete">删除
</button>
<button href="" type="button" class="btn btn-success">单独结算</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
<div style="display: flex; justify-content: flex-end; align-items: center; border-top:1px solid #333333">
<div style="color: red; font-size: 40px">总计:${totalPrice}</div>
<div style="margin: 0 200px 0 20px;">
<button type="button" class="btn btn-primary">结算</button>
</div>
</div>
</div>
<!-- Jquery -->
<script src="${pageContext.request.contextPath}/static/js/jquery-1.11.1.min.js"></script>
<!-- Bootstrap -->
<script src="${pageContext.request.contextPath}/static/js/bootstrap.min.js"></script>
<script type="application/javascript">
$(function () {
let token = sessionStorage.getItem("token") || null;
// 验证是否存在token,没有则返回登陆
if (token == null) {
alert("请先登陆!");
window.location = "${pageContext.request.contextPath}/login";
return false;
}
document.getElementById("backProduct").href = "${pageContext.request.contextPath}/product?token=" + token;
$(‘.delete‘).click(function (e) {
let url = e.toElement.getAttribute("href");
$.ajax({
type: "get",
url: url,
success: function (data) {
if (data === "ok") {
alert("删除成功!");
document.location.reload();
return false;
}
alert("删除失败,请刷新重试!")
},
error: function (err) {
console.log(err);
alert("服务器故障!")
}
})
});
$("#logout").click(function () {
sessionStorage.removeItem("token");
window.location = "${pageContext.request.contextPath}/login"
})
})
</script>
</body>
</html> 相关推荐
lmllouk 2020-11-02
jiong 2020-10-31
Youda 2020-08-29
thunderstorm 2020-08-19
guodaoying 2020-08-16
whyname 2020-08-16
zjyzz 2020-08-16
nan00zzu 2020-08-08
zyjj 2020-07-26
xwb 2020-07-19
云之飞踢 2020-07-08
chenjiazhu 2020-07-08
明月清风精进不止 2020-07-05