SpringBoot秒杀系统实战12-商品列表页
2020-07-14 06:02
316 查看
文章目录
1、先创建商品的服务类GoodsService ,注入GoodsDao
[code]@Service public class GoodsService { public static final String COOKIE1_NAME_TOKEN="token"; @Autowired GoodsDao goodsDao; @Autowired RedisService redisService; //获取商品信息列表 public List<GoodsVo> getGoodsVoList() { return goodsDao.getGoodsVoList(); } //获取商品根据商品Id public GoodsVo getGoodsVoByGoodsId(long goodsId) { return goodsDao.getGoodsVoByGoodsId(goodsId); } //减少商品的库存 public void reduceStock(GoodsVo goodsvo) { MiaoshaGoods goods=new MiaoshaGoods(); goods.setGoodsId(goodsvo.getId()); //goods.setStockCount(goodsvo.getGoodsStock()-1); sql里面去运算 //goodsDao.reduceStock(goods.getGoodsId()); goodsDao.reduceStock(goods); } }
2、创建GoodsDao
注意:这里我们查数据库的时候,不只是查找的商品的信息,我们同时想把商品的秒杀信息也一起查出来,但是这两个不同数据在两个表里面,我们就想办法封装一个GoodsVo,将两张表的数据封装到一起。
下面是GoodsVo对象,因为继承Goods,拥有Goods的所有字段
然后再自己定义MiaoshaGoods里面的字段,最终拼接成一个GoodsVo对象。
[code]//将Goods表和MiaoshaGoods表合并 public class GoodsVo extends Goods{ private Integer stockCount; private Date startDate; private Date endDate; private Double miaoshaPrice; public Double getMiaoshaPrice() { return miaoshaPrice; } public void setMiaoshaPrice(Double miaoshaPrice) { this.miaoshaPrice = miaoshaPrice; } public Integer getStockCount() { return stockCount; } public void setStockCount(Integer stockCount) { this.stockCount = stockCount; } public Date getStartDate() { return startDate; } public void setStartDate(Date startDate) { this.startDate = startDate; } public Date getEndDate() { return endDate; } public void setEndDate(Date endDate) { this.endDate = endDate; } }
这里是将两个表做连接查询(miaosha_goods mg left join goods g),我们需要查找的数据库表里面的各个字段对应到我们GoodsVo里面的属性,那么就可以给其赋值。
g.*,mg.stock_count,mg.start_date,mg.end_date,mg.miaosha_price:代表goods 表里面的所有字段加上miaosha_goods里面的stock_count,start_date,end_date,miaosha_price
注意:使用注解@Param(“goodsId”)指定@Select语句中的#{goodsId}字段,一一对应起来
[code]@Mapper public interface GoodsDao { //两个查询 @Select("select g.*,mg.stock_count,mg.start_date,mg.end_date,mg.miaosha_price from miaosha_goods mg left join goods g on mg.goods_id=g.id") public List<GoodsVo> getGoodsVoList(); @Select("select g.*,mg.stock_count,mg.start_date,mg.end_date,mg.miaosha_price from miaosha_goods mg left join goods g on mg.goods_id=g.id where g.id=#{goodsId}") public GoodsVo getGoodsVoByGoodsId(@Param("goodsId")long goodsId); //stock_count>0的时候才去更新,数据库本身会有锁,那么就不会在数据库中同时多个线程更新一条记录,使用数据库特性来保证超卖的问题 @Update("update miaosha_goods set stock_count=stock_count-1 where goods_id=#{goodsId} and stock_count>0") public void reduceStock(MiaoshaGoods goods); } }
3、前端goods_list.html页面代码:
[code]<!DOCTYPE html> <!-- 使用thymeleaf,配置相应的 --> <html xmlns:th="http://www.thymeleaf.org"> <!-- th!!! 命名空间使用 --> <head> <meta charset="UTF-8"/><!--<meta charset="UTF-8" /> thymeleaf模板引擎默认是Template modes:HTML5解析的,所以解析比较严格。 --> <title>商品详情</title> <!-- thymeleaf引入静态资源的方式,@加大括弧 "/" 代表static路径--> <!-- jquery --> <!-- <script type="text/javascript" th:src="@{/js/jequery.min.js}"></script> --> <script type="text/javascript" th:src="@{/jquery-validation/lib/jquery-1.11.1.js}"></script> <!-- bootstrap --> <!-- <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"/> --> <link type="text/css" rel="stylesheet" th:href="@{/bootstrap/css/bootstrap.css}"/> <script type="text/javascript" th:src="@{/bootstrap/js/bootstrap.min.js}"></script> </head> <body> <div class="panel panel-default"> <div class="panel-heading">秒杀商品列表</div> <table class="table" id="goodslist"> <tr><td>商品名称</td><td>商品图片</td><td>商品原价</td><td>秒杀价</td><td>库存数量</td><td>详情</td></tr> <tr th:each="goods,goodsStat:${goodsList}"> <td th:text="${goods.goodsName}"></td> <td><img th:src="@{${goods.goodsImg}}" width="80" height="60"></img></td> <td th:text="${goods.goodsPrice}"></td> <td th:text="${goods.miaoshaPrice}"></td> <td th:text="${goods.stockCount}"></td> <td><a th:href="'/goods/to_detail/'+${goods.id}">详情</a></td> </tr> </table> </div> </body> </html>
4、效果
相关文章推荐
- 【SpringBoot商城秒杀系统项目实战12】商品列表页
- 【SpringBoot商城秒杀系统项目实战13】秒杀商品详情页+秒杀倒计时功能实现
- 【SpringBoot商城秒杀系统项目实战18】页面优化技术-商品详情页面静态化(前后端分离)
- SpringBoot秒杀系统实战18-页面优化技术-商品详情页面静态化(前后端分离)...
- 【SpringBoot商城秒杀系统项目实战15】订单详情页
- SpringBoot秒杀系统实战08-两次MD5加密设计
- 【SpringBoot商城秒杀系统项目实战16】使用JMeter压测秒杀系统
- 【SpringBoot商城秒杀系统项目实战19】秒杀静态化+订单详情静态化
- 【SpringBoot商城秒杀系统项目实战07】通用缓存Key的设计与封装
- 【SpringBoot商城秒杀系统项目实战23】安全优化 数学图形验证码
- 【SpringBoot商城秒杀系统项目实战02】优雅代码编写之封装json输出
- 【SpringBoot商城秒杀系统项目实战04】集成Mybatis与druid
- 【SpringBoot商城秒杀系统项目实战22】安全优化 秒杀接口地址隐藏
- 【SpringBoot商城秒杀系统项目实战17】页面优化技术(页面缓存+URL缓存+对象缓存)
- 基于SpringBoot实现高并发商品秒杀系统
- 【SpringBoot商城秒杀系统项目实战20】高并发秒杀接口优化
- SpringBoot秒杀系统实战19-秒杀静态化+订单详情静态化
- 【SpringBoot商城秒杀系统项目实战03】集成Thymeleaf做页面模板
- 【SpringBoot商城秒杀系统项目实战05】数据库设计与对应的domain对象
- 最新基于SpringBoot Java商城秒杀系统的设计与实战教程