欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 维修 > 基于SprintBoot+Mybatis+Mysql】电脑商城项目之商品热销排行及显示商品详情

基于SprintBoot+Mybatis+Mysql】电脑商城项目之商品热销排行及显示商品详情

2025/6/2 4:00:49 来源:https://blog.csdn.net/m0_74202856/article/details/145534617  浏览:    关键词:基于SprintBoot+Mybatis+Mysql】电脑商城项目之商品热销排行及显示商品详情

🧸安清h:个人主页 

   🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。


目录

🚀1.商品热销排行-创建数据表

🚀2.商品热销排行-创建实体类

🚀3.商品热销排行-持久层

✨3.1规划需要执行的SQL语句

✨3.2接口和抽象方法 

✨3.3配置映射

🚀4.商品热销排行-业务层

✨4.1规划异常

 ✨4.2接口与抽象方法

✨4.3实现抽象方法

🚀5.商品热销排行-控制层

✨5.1处理异常

✨5.2设计请求

✨5.3处理请求

🚀6.商品热销排行-前端页面

🎯1.显示商品详情-持久层

✨1.1规划需要执行的SQL语句

✨1.2接口与抽象方法

✨1.3配置SQL映射

🎯2.显示商品详情-业务层

✨2.1规划异常

✨2.2接口和抽象方法

✨2.3实现抽象方法

🎯3.显示商品详情-控制层

✨3.1处理异常

✨3.2设计请求

✨3.3处理请求

🎯4.显示商品详情-前端页面


🚀1.商品热销排行-创建数据表

1.使用use命令先选中store数据库。

use store

2.在store数据库中创建t_product数据表。

CREATE TABLE t_product (id int(20) NOT NULL COMMENT '商品id',category_id int(20) DEFAULT NULL COMMENT '分类id',item_type varchar(100) DEFAULT NULL COMMENT '商品系列',title varchar(100) DEFAULT NULL COMMENT '商品标题',sell_point varchar(150) DEFAULT NULL COMMENT '商品卖点',price bigint(20) DEFAULT NULL COMMENT '商品单价',num int(10) DEFAULT NULL COMMENT '库存数量',image varchar(500) DEFAULT NULL COMMENT '图片路径',`status` int(1) DEFAULT '1' COMMENT '商品状态  1:上架   2:下架   3:删除',priority int(10) DEFAULT NULL COMMENT '显示优先级',created_time datetime DEFAULT NULL COMMENT '创建时间',modified_time datetime DEFAULT NULL COMMENT '最后修改时间',created_user varchar(50) DEFAULT NULL COMMENT '创建人',modified_user varchar(50) DEFAULT NULL COMMENT '最后修改人',PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据

INSERT INTO t_product VALUES (10000001,238,'牛皮纸记事本','广博(GuangBo)10本装40张A5牛皮纸记事本子日记本办公软抄本GBR0731','经典回顾!超值特惠!'。。。)

🚀2.商品热销排行-创建实体类

创建com.cy.store.entity.Product类,并继承自BaseEntity类。在类中声明与数据表中对应的属性。

public class Product extends BaseEntity implements Serializable {private Integer id;private Integer categoryId;private String itemType;private String title;private String sellPoint;private Long price;private Integer num;private String image;private Integer status;private Integer priority;
......
}

🚀3.商品热销排行-持久层

✨3.1规划需要执行的SQL语句

查询热销商品列表的SQL语句。priority优先级:售卖的个数,售卖越多优先级越大。

select * from t_product where status=1
order by priority DESC limit 0,4

✨3.2接口和抽象方法 

在com.cy.store.mapper包下创建ProductMapper接口并在接口中添加查询热销商品findHotList()的方法。

    /*** 查询热销商品的前四名* @return 热销商品前四名的集合*/List<Product> findHotList();

✨3.3配置映射

1.在main\resources\mapper文件夹下创建ProductMapper.xml文件,并在文件中配置findHotList()方法的映射。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.store.mapper.ProductMapper"><resultMap id="ProductEntityMap" type="com.cy.store.entity.Product"><id property="id" column="id"/><result column="category_id" property="categoryId"/><result column="item_type" property="itemType"/><result column="sell_point" property="sellPoint"/><result column="created_user" property="createdUser"></result><result column="created_time" property="createdTime"></result><result column="modified_user" property="modifiedUser"></result><result column="modified_time" property="modifiedTime"></result></resultMap><select id="findHotList">select * from t_product where status=1order by priority DESC limit 0,4</select>
</mapper>

 2.在com.cy.store.mapper包下创建ProductMapperTests测试类,并添加测试方法。

@SpringBootTest
public class ProductMapperTests {@Autowiredprivate ProductMapper productMapper;@Testpublic void findHotList(){List<Product> list = productMapper.findHotList();System.out.println("count="+list.size());for(Product p : list){System.out.println(p);}}
}

🚀4.商品热销排行-业务层

✨4.1规划异常

无增删改,不会影响数据,无异常

 ✨4.2接口与抽象方法

创建com.cy.store.service.IProductService。

List<Product> findHotList();

✨4.3实现抽象方法

1.创建com.cy.store.service.impl.ProductServiceImpl类,并添加@Service注解;在类中声明持久层对象以及实现接口中的方法。这里在实际上页面中展示时只需要图片,标题,价格,还有隐藏的id,其余的设置为null就可以了。

@Service
public class ProductServiceImpl implements IProductService {@Autowiredprivate ProductMapper productMapper;@Overridepublic List<Product> findHotList() {List<Product> list = productMapper.findHotList();for(Product p : list){p.setPriority(null);p.setCreatedUser(null);p.setCreatedTime(null);p.setModifiedTime(null);p.setModifiedUser(null);}return list;}
}

🚀5.商品热销排行-控制层

✨5.1处理异常

无异常

✨5.2设计请求

1.设计用户的请求,并设计响应的方法。

请求路径:/products/hot_list

请求方式:GET

请求参数:无

响应结果:JsonResult<List<Product>>

是否拦截:否,需要将index.html和products/**添加到白名单

2.在LoginInterceptorConfigurer类中将index.html页面和products/**请求添加到白名单。

        patterns.add("/web/index.html");patterns.add("/products/**");

✨5.3处理请求

1.创建com.cy.store.controller.ProductController类中继承BaseController类,具体代码如下:

@RequestMapping("products")
@RestController
public class ProductController extends BaseController{@Autowiredprivate IProductService productService;@RequestMapping("hot_list")public JsonResult<List<Product>> getHotList(){List<Product> data = productService.findHotList();return new JsonResult<>(OK,data);}
}

🚀6.商品热销排行-前端页面

1.在index.html页面给“热销排行”列表的div标签设置id属性值。

<div id="hot-list" class="panel-body panel-item">
。。。。。。
</div>

2.在index.html页面中body标签内部最后,添加展示热销排行商品的代码。

	<script>$(document).ready(function (){showHotList();});function showHotList(){$("#hot-list").empty();$.ajax({url: "/products/hot_list",type: "GET",dataType: "JSON",success: function(json) {var list = json.data;for (var i = 0; i < list.length; i++) {console.log(list[i].title);var html = '<div class="col-md-12">'+ '<div class="col-md-7 text-row-2"><a href="product.html?id=#{id}">#{title}</a></div>'+ '<div class="col-md-2">¥#{price}</div>'+ '<div class="col-md-3"><img src="..#{image}collect.png" class="img-responsive" /></div>'+ '</div>';html = html.replace(/#{id}/g, list[i].id);html = html.replace(/#{title}/g, list[i].title);html = html.replace(/#{price}/g, list[i].price);html = html.replace(/#{image}/g, list[i].image);$("#hot-list").append(html);}}});}</script>

🎯1.显示商品详情-持久层

✨1.1规划需要执行的SQL语句

根据商品id显示商品详情。

select * from t_product where id=?

✨1.2接口与抽象方法

在ProductMapper中添加抽象方法。

    /*** 根据商品id查询商品详情* @param id 商品id* @return 匹配的商品详情,如果没有匹配的商品返回null*/Product findById(Integer id);

✨1.3配置SQL映射

1.在ProductMapper.xml文件中配置。

    <select id="findById" resultMap="ProductEntityMap">select * from t_product where id=#{id}</select>

2.在ProductMapperTests类中进行测试。

    @Testpublic void findById(){Product list = productMapper.findById(10000001);System.out.println(list);}

🎯2.显示商品详情-业务层

✨2.1规划异常

如果商品数据不存在,应该抛出ProductNotFoundException,需要创建com.cy.store.service.ex.ProductNotFoundException异常。

package com.cy.store.service.ex;public class ProductNotFoundException extends ServiceException{public ProductNotFoundException() {super();}public ProductNotFoundException(String message) {super(message);}public ProductNotFoundException(String message, Throwable cause) {super(message, cause);}public ProductNotFoundException(Throwable cause) {super(cause);}protected ProductNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

✨2.2接口和抽象方法

在IProductService接口中编写抽象方法。

Product findById(Integer id);

✨2.3实现抽象方法

在ProductServiceImpl类中,实现接口中的抽象方法。

    @Overridepublic Product findById(Integer id) {Product p = productMapper.findById(id);if(p == null){throw new ProductNotFoundException("尝试访问的商品数据不存在");}p.setPriority(null);p.setCreatedUser(null);p.setCreatedTime(null);p.setModifiedTime(null);p.setModifiedUser(null);return p;}
}

🎯3.显示商品详情-控制层

✨3.1处理异常

在BaseController类中的handleException中添加如下代码:

else if(e instanceof ProductNotFoundException) {result.setState(4006);result.setMessage("商品数据不存在的异常");}

✨3.2设计请求

设计用户提交的请求,并设计响应方式。

请求路径:/products/{id}/details

请求参数:@PathVariable("id"),Integer id

请求类型:GET

响应结果:JsonResult<Product>

✨3.3处理请求

1.在ProductController类中添加处理请求的getById()方法。

    @RequestMapping("{id}/details")public JsonResult<Product> getById(@PathVariable("id") Integer id){Product data = productService.findById(id);return new JsonResult<>(OK,data);}

2.完成后启动项目,直接访问http://localhost:8080/products/10000003/details

🎯4.显示商品详情-前端页面

1.检查product.html页面body标签内部的最后是否引入jquery-getUrlParam.js文件,如果引入无需重复引入。由于提交过来的id值在一个url地址上,如3.3的2中所示,所以这里就涉及到如何把这个url地址当中的id这一部分截取下来,截取下来是为了拼接到参数列表上发给后端,然后后端才可以完成查询操作。

<script type="text/javascript" src="../js/jquery-getUrlParam.js"></script>

2.在Product.html页面中body标签内部的最后添加获取当前商品详情的代码。

<script type="text/javascript">var id = $.getUrlParam("id");console.log("id=" + id);$(document).ready(function() {$.ajax({url: "/products/" + id + "/details",type: "GET",dataType: "JSON",success: function(json) {if (json.state == 200) {console.log("title=" + json.data.title);//<div></div>//有上面一个div,如果是html("hello"),那么html就会把hello在div容器里面呈现出来。//如果是html("<p></p>"),那么html就会把p标签追加到div内部作为它的一个子标签$("#product-title").html(json.data.title);$("#product-sell-point").html(json.data.sellPoint);$("#product-price").html(json.data.price);//总共有五张大图,一张小图for (var i = 1; i <= 5; i++) {$("#product-image-" + i + "-big").attr("src", ".." + json.data.image + i + "_big.png");$("#product-image-" + i).attr("src", ".." + json.data.image + i + ".jpg");}} else if (json.state == 4006) { // 商品数据不存在的异常location.href = "index.html";} else {alert("获取商品信息失败!" + json.message);}}});});</script>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词