谷粒商城-高级-55 -商城业务-商品详情-环境搭建及模型抽取

一、导入相关资源

1、导入静态资源

商品详情页面放在templates路径下,即:

gulimall-product/src/main/resources/templates/list.html

该页面所用到的js、css都放在Nginx服务下,创建对应的目录 item, 即动态分离模式。

二、修改服务配置

1、修改hosts配置文件

192.168.10.10 gulimall.com
192.168.10.10 search.gulimall.com  # 搜索域名
192.168.10.10 item.gulimall.com  # 新增商品详情域名

2、添加网关服务
网关服务修改配置文件,添加详情网关item.gulimall.com
gulimall-gateway/src/main/resources/application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: product_route
          uri: lb://gulimall-product
          predicates:
            - Path=/api/product/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: third_party_route
          uri: lb://gulimall-third-party
          predicates:
            - Path=/api/thirdparty/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: member_route
          uri: lb://gulimall-member
          predicates:
            - Path=/api/member/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: ware_route
          uri: lb://gulimall-ware
          predicates:
            - Path=/api/ware/**
          filters:
            - RewritePath=/api/(?<segment>.*),/$\{segment}

        - id: admin_route
          uri: lb://renren-fast
          predicates:
            - Path=/api/**
          filters:
            - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

        - id: gulimall_host_route
          uri: lb://gulimall-product
          predicates:
            - Host=gulimall.com,item.gulimall.com

        - id: gulimall_search_route
          uri: lb://gulimall-search
          predicates:
            - Host=search.gulimall.com

## 前端项定义规则,都带 /api 前缀, lb 表示负载均衡到哪个注册器
## http://localhost:8888/api/captcha.jpg  需要通过注册中心网关8888端口转发到renren-fast 8080端口服务
## http://localhost:8080/renren-fast/captcha.jpg:
## filters 路径重写 /api/ -> /renren-fast/

三、详情页控制器

商品详情页控制器:
gulimall-product/src/main/java/com/atguigu/gulimall/product/web/ItemController.java

package com.atguigu.gulimall.product.web;

import com.atguigu.gulimall.product.service.SkuInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @author: kaiyi
 * @create: 2020-09-05 01:00
 */
@Controller
public class ItemController {

  @Autowired
  SkuInfoService skuInfoService;

  @GetMapping("/{skuId}.html")
  public String skuItem(@PathVariable("skuId") Long skuId){
    System.out.println("准备查询 skuId=" + skuId);
    skuInfoService.item(skuId);
    return "item";
  }
}

相关Vo:

com/atguigu/gulimall/product/vo/SkuItemVo.java

package com.atguigu.gulimall.product.vo;

import com.atguigu.gulimall.product.entity.SkuImagesEntity;
import com.atguigu.gulimall.product.entity.SkuInfoEntity;
import com.atguigu.gulimall.product.entity.SpuInfoDescEntity;
import lombok.Data;
import lombok.ToString;

import java.util.List;

/**
 * @author: kaiyi
 * @create: 2020-09-05 01:24
 */
@ToString
@Data
public class SkuItemVo {

  //1、sku基本信息的获取  pms_sku_info
  private SkuInfoEntity info;

  private boolean hasStock = true;

  //2、sku的图片信息    pms_sku_images
  private List<SkuImagesEntity> images;

  //3、获取spu的销售属性组合
  private List<SkuItemSaleAttrVo> saleAttr;

  //4、获取spu的介绍
  private SpuInfoDescEntity desc;

  //5、获取spu的规格参数信息
  private List<SpuItemAttrGroupVo> groupAttrs;

}

com/atguigu/gulimall/product/vo/SpuItemAttrGroupVo.java

package com.atguigu.gulimall.product.vo;

import lombok.Data;
import lombok.ToString;

import java.util.List;

/**
 * @author: kaiyi
 * @create: 2020-09-05 09:56
 */
@Data
@ToString
public class SpuItemAttrGroupVo {
  private String groupName;

  private List<Attr> attrs;

}

com/atguigu/gulimall/product/vo/Attr.java

/**
  * Copyright 2019 bejson.com 
  */
package com.atguigu.gulimall.product.vo;

import lombok.Data;

/**
 * Auto-generated: 2019-11-26 10:50:34
 *
 * @author bejson.com (i@bejson.com)
 * @website http://www.bejson.com/java2pojo/
 */
@Data
public class Attr {

    private Long attrId;
    private String attrName;
    private String attrValue;

}

Mybatis-plus连表查询相关
com/atguigu/gulimall/product/service/impl/SkuInfoServiceImpl.java

 //5、获取spu的规格参数信息
List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(spuId, catalogId);

完整方法


    @Override
    public SkuItemVo item(Long skuId) {

        SkuItemVo skuItemVo = new SkuItemVo();

        // 1、sku基本信息获取 pms_sku_info
        SkuInfoEntity info = getById(skuId);
        skuItemVo.setInfo(info);

        Long catalogId = info.getCatalogId();
        Long spuId = info.getSpuId();

        //5、获取spu的规格参数信息
        List<SpuItemAttrGroupVo> attrGroupVos = attrGroupService.getAttrGroupWithAttrsBySpuId(spuId, catalogId);

        return skuItemVo;
    }

接口类:com/atguigu/gulimall/product/service/AttrGroupService.java

/**
 * 属性分组
 *
 * @author kaiyi
 * @email corwienwong@gmail.com
 * @date 2020-08-10 15:45:20
 */
public interface AttrGroupService extends IService<AttrGroupEntity> {
  List<SpuItemAttrGroupVo> getAttrGroupWithAttrsBySpuId(Long spuId, Long catalogId);
}

实现类:
com/atguigu/gulimall/product/service/impl/AttrGroupServiceImpl.java

@Service("attrGroupService")
public class AttrGroupServiceImpl extends ServiceImpl<AttrGroupDao, AttrGroupEntity> implements AttrGroupService {

    @Autowired
    AttrService attrService;

         @Override
    public List<SpuItemAttrGroupVo> getAttrGroupWithAttrsBySpuId(Long spuId, Long catalogId) {

        //1、查出当前spu对应的所有属性的分组信息以及当前分组下的所有属性对应的值
        AttrGroupDao baseMapper = this.getBaseMapper();
        List<SpuItemAttrGroupVo> vos = baseMapper.getAttrGroupWithAttrsBySpuId(spuId, catalogId);
        return vos;
    }
}

DAO层:
com/atguigu/gulimall/product/dao/AttrGroupDao.java

package com.atguigu.gulimall.product.dao;

import com.atguigu.gulimall.product.entity.AttrGroupEntity;
import com.atguigu.gulimall.product.vo.SpuItemAttrGroupVo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 属性分组
 * 
 * @author kaiyi
 * @email corwienwong@gmail.com
 * @date 2020-08-10 15:45:20
 */
@Mapper
public interface AttrGroupDao extends BaseMapper<AttrGroupEntity> {

  List<SpuItemAttrGroupVo> getAttrGroupWithAttrsBySpuId(@Param("spuId") Long spuId, @Param("catalogId") Long catalogId);
}

Mapper层:
gulimall-product/src/main/resources/mapper/product/AttrGroupDao.xml

<?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.atguigu.gulimall.product.dao.AttrGroupDao">

    <!-- 可根据自己的需求,是否要使用 -->
    <resultMap type="com.atguigu.gulimall.product.entity.AttrGroupEntity" id="attrGroupMap">
        <result property="attrGroupId" column="attr_group_id"/>
        <result property="attrGroupName" column="attr_group_name"/>
        <result property="sort" column="sort"/>
        <result property="descript" column="descript"/>
        <result property="icon" column="icon"/>
        <result property="catelogId" column="catelog_id"/>
    </resultMap>

  <!-- resultType 返回集合里面元素的类型,只要有嵌套属性就要封装自定义结果(collection) -->
    <resultMap id="spuAttrGroup" type="com.atguigu.gulimall.product.vo.SpuItemAttrGroupVo">

      <!-- spu_id, attr_group_name attr_group_id attr_id attr_name -->
      <result property="groupName" column="attr_group_name"/>
      <collection property="attrs" ofType="com.atguigu.gulimall.product.vo.Attr">
        <result column="attr_name" property="attrName"/>
        <result column="attr_value" property="attrValue"/>
      </collection>

    </resultMap>
  <select id="getAttrGroupWithAttrsBySpuId" resultMap="spuAttrGroup">

 SELECT
            product.spu_id,
            pag.attr_group_id,
            pag.attr_group_name,
            product.attr_id,
            product.attr_name,
            product.attr_value
        FROM
            pms_product_attr_value product
                LEFT JOIN pms_attr_attrgroup_relation paar ON product.attr_id = paar.attr_id
                LEFT JOIN pms_attr_group pag ON paar.attr_group_id = pag.attr_group_id
        WHERE
            product.spu_id = #{spuId}
          AND pag.catelog_id = #{catalogId}
  </select>
</mapper>

小结:对于Mybatis-plus的复杂查询,需要连表查询的,先在Service层里边定义方法传参,然后在对应DAO层定义相关的方法,最后在Mapper.xml文件中生成对应的SQL语句,如果返回集合里面元素的类型,只要有嵌套属性就要封装自定义结果。

为者常成,行者常至