千峰商城-springboot项目搭建-61-商品推荐数据库实现及业务层和控制层实现
1.流程分析
首页 ——————ajax——————> 首页商品推荐
index.html <——销量最高的三个商品——--- 接口
推荐规则:1.根据当前用户的最近搜索进行推荐
2.查询销量最高的商品进行推荐
3.根据平台管理员设置的需要推荐的商品
4.查询最新上架的商品进行推荐
2.数据库实现
商品推荐算法:推荐最新上架的商品
说明:商品推荐算法是根据多个维度进行权重计算,计算出一个匹配值
(1)数据表分析及数据准备
(2)sql
#连接查询: #商品推荐:查询最新上架的商品 #通过创建时间排序查找product表,只查询前三条 SELECT * FROM product p INNER JOIN product_img pimg ON p.product_id = pimg.item_id ORDER BY p.create_time DESC LIMIT 0,3 #子查询: #商品推荐:查询最新上架的商品 SELECT * FROM product ORDER BY create_time DESC LIMIT 0,3; #子查询:根据商品id查询商品图片 SELECT * FROM product_img WHERE item_id=2;
(3)在beans子工程entity包创建ProductVO,相比较Product新增了List<ProductImg> imgs,用于存储商品的图片。
public class ProductVO { /** * 商品主键id */ @Id @Column(name = "product_id") private String productId; /** * 商品名称 商品名称 */ @Column(name = "product_name") private String productName; /** * 分类外键id 分类id */ @Column(name = "category_id") private Integer categoryId; /** * 一级分类外键id 一级分类id,用于优化查询 */ @Column(name = "root_category_id") private Integer rootCategoryId; /** * 销量 累计销售 */ @Column(name = "sold_num") private Integer soldNum; /** * 默认是1,表示正常状态, -1表示删除, 0下架 默认是1,表示正常状态, -1表示删除, 0下架 */ @Column(name = "product_status") private Integer productStatus; /** * 创建时间 */ @Column(name = "create_time") private Date createTime; /** * 更新时间 */ @Column(name = "update_time") private Date updateTime; private List<ProductImg> imgs; public List<ProductImg> getImgs() { return imgs; } public void setImgs(List<ProductImg> imgs) { this.imgs = imgs; } /** * 商品内容 商品内容 */ private String content; /** * 获取商品主键id * * @return product_id - 商品主键id */ public String getProductId() { return productId; } /** * 设置商品主键id * * @param productId 商品主键id */ public void setProductId(String productId) { this.productId = productId; } /** * 获取商品名称 商品名称 * * @return product_name - 商品名称 商品名称 */ public String getProductName() { return productName; } /** * 设置商品名称 商品名称 * * @param productName 商品名称 商品名称 */ public void setProductName(String productName) { this.productName = productName; } /** * 获取分类外键id 分类id * * @return category_id - 分类外键id 分类id */ public Integer getCategoryId() { return categoryId; } /** * 设置分类外键id 分类id * * @param categoryId 分类外键id 分类id */ public void setCategoryId(Integer categoryId) { this.categoryId = categoryId; } /** * 获取一级分类外键id 一级分类id,用于优化查询 * * @return root_category_id - 一级分类外键id 一级分类id,用于优化查询 */ public Integer getRootCategoryId() { return rootCategoryId; } /** * 设置一级分类外键id 一级分类id,用于优化查询 * * @param rootCategoryId 一级分类外键id 一级分类id,用于优化查询 */ public void setRootCategoryId(Integer rootCategoryId) { this.rootCategoryId = rootCategoryId; } /** * 获取销量 累计销售 * * @return sold_num - 销量 累计销售 */ public Integer getSoldNum() { return soldNum; }
(4)mapper接口定义操作方法
ProductMapper :
public interface ProductMapper extends GeneralDAO<Product> { public List<ProductVO> selectRecommendProducts(); }
ProductImgMapper :
public interface ProductImgMapper extends GeneralDAO<ProductImg> {
//根据商品id查询当前商品的图片信息 public List<ProductImg> selectProductImgByProductId(int productId); }
ProductMapper :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.qfedu.fmmall.dao.ProductMapper"> <resultMap id="BaseResultMap" type="com.qfedu.fmmall.entity.Product"> <id column="product_id" jdbcType="VARCHAR" property="productId" /> <result column="product_name" jdbcType="VARCHAR" property="productName" /> <result column="category_id" jdbcType="INTEGER" property="categoryId" /> <result column="root_category_id" jdbcType="INTEGER" property="rootCategoryId" /> <result column="sold_num" jdbcType="INTEGER" property="soldNum" /> <result column="product_status" jdbcType="INTEGER" property="productStatus" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="content" jdbcType="LONGVARCHAR" property="content" /> </resultMap> <resultMap id="ProductVOMap" type="com.qfedu.fmmall.entity.ProductVO"> <id column="product_id" jdbcType="VARCHAR" property="productId" /> <result column="product_name" jdbcType="VARCHAR" property="productName" /> <result column="category_id" jdbcType="INTEGER" property="categoryId" /> <result column="root_category_id" jdbcType="INTEGER" property="rootCategoryId" /> <result column="sold_num" jdbcType="INTEGER" property="soldNum" /> <result column="product_status" jdbcType="INTEGER" property="productStatus" /> <result column="create_time" jdbcType="TIMESTAMP" property="createTime" /> <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" /> <result column="content" jdbcType="LONGVARCHAR" property="content" /> <collection property="imgs" select="com.qfedu.fmmall.dao.ProductImgMapper.selectProductImgByProductId" column="product_id"/> </resultMap> <select id="selectRecommendProducts" resultMap="ProductVOMap"> SELECT product_id, product_name, category_id, root_category_id, sold_num, product_status, content, create_time, update_time FROM product ORDER BY create_time DESC LIMIT 0,3; </select> </mapper>
ProductImgMapper :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.qfedu.fmmall.dao.ProductImgMapper"> <resultMap id="BaseResultMap" type="com.qfedu.fmmall.entity.ProductImg"> <id column="id" jdbcType="VARCHAR" property="id" /> <result column="item_id" jdbcType="VARCHAR" property="itemId" /> <result column="url" jdbcType="VARCHAR" property="url" /> <result column="sort" jdbcType="INTEGER" property="sort" /> <result column="is_main" jdbcType="INTEGER" property="isMain" /> <result column="created_time" jdbcType="TIMESTAMP" property="createdTime" /> <result column="updated_time" jdbcType="TIMESTAMP" property="updatedTime" /> </resultMap> <select id="selectProductImgByProductId" resultMap="BaseResultMap"> SELECT id, item_id, url, sort, is_main, created_time, updated_time FROM product_img WHERE item_id=#{productId}; </select> </mapper>
测试:
@RunWith(SpringRunner.class) @SpringBootTest(classes = ApiApplication.class) public class ApiApplicationTests { @Autowired private ProductMapper productMapper; @Test public void testRecommend(){ List<ProductVO> productVOS = productMapper.selectRecommendProducts(); for (ProductVO p:productVOS) { System.out.println(p); } } }
3.业务层实现
ProductService
public interface ProductService { public ResultVO listRecommendProducts(); }
ProductServiceImpl
@Service public class ProductServiceImpl implements ProductService { @Autowired private ProductMapper productMapper; public ResultVO listRecommendProducts() { List<ProductVO> productVOS = productMapper.selectRecommendProducts(); ResultVO resultVO = new ResultVO(ResStatus.OK, "success", productVOS); return resultVO; } }
IndexController:
@RestController @CrossOrigin @RequestMapping("/index") @Api(value = "提供首页数据显示所需的接口",tags = "首页管理") public class IndexController { @Autowired private IndexImgService indexImgService; @Autowired private CategoryService categoryService; @Autowired private ProductService productService; @GetMapping("/indeximg") @ApiOperation("首页轮播图接口") public ResultVO listIndexImgs(){ return indexImgService.listIndexImgs(); } @GetMapping("/category-list") @ApiOperation("商品分类查询接口") public ResultVO listCategory(){ return categoryService.listCategories(); } @GetMapping("/list-recommends") @ApiOperation("查询推荐商品的接口") public ResultVO listRecommendProducts(){ return productService.listRecommendProducts(); } }