尚品汇-(十六)

商品详情功能开发

(1)搭建service-item

点击service,选择New-->Module,操作如下

修改配置pom.xml

添加配置文件bootstrap.properties

复制代码
spring.application.name=service-item
spring.profiles.active=dev
spring.cloud.nacos.discovery.server-addr=192.168.254.165:8848
spring.cloud.nacos.config.server-addr=192.168.254.165:8848
spring.cloud.nacos.config.prefix=${spring.application.name}
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml

添加启动类

因为父模块引入了mysql的依赖,由于自动配置,如果没有配置会报错,我们把他关了

exclude = DataSourceAutoConfiguration.class 排除数据库链接 jar

表示当前项目 {service-item} 不参与数据库查询

复制代码
package com.atguigu.gmall.item;


@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)//取消数据源自动配置
@ComponentScan({"com.atguigu.gmall"})
@EnableDiscoveryClient
@EnableFeignClients(basePackages= {"com.atguigu.gmall"})
public class ServiceItemApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceItemApplication.class, args);
    }

}

service-item服务接口封装

复制代码
package com.atguigu.gmall.item.service;

public interface ItemService {

    /**
     * 获取sku详情信息
     * @param skuId
     * @return
     */
    Map<String, Object> getBySkuId(Long skuId);
}

实现类:

复制代码
@Service
public class ItemServiceImpl implements ItemService {


   @Autowired
   private ProductFeignClient  productFeignClient;

    @Override
    public Map<String, Object> getBySkuId(Long skuId) {
        Map<String, Object> result = new HashMap<>();

        
        return result;
    }
}

@RestController
@RequestMapping("api/item")
public class ItemApiController {


    @Autowired
    private ItemService itemService;

    /**
     * 获取sku详情信息
     * @param skuId
     * @return
     */
    @GetMapping("{skuId}")
    public Result getItem(@PathVariable Long skuId){
        Map<String,Object> result = itemService.getBySkuId(skuId);
        return Result.ok(result);
    }
}

说明:商品详情相关信息在service-product微服务都可以获取,所以我们在service-product模块编写所需要的接口

在service-product微服务提供api接口

(2)获取sku基本信息与图片信息

实体类:

复制代码
package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;

/**
 * <p>
 * SpuInfo
 * </p>
 *
 */
@Data
@ApiModel(description = "SpuInfo")
@TableName("spu_info")
public class SpuInfo extends BaseEntity {
	
	private static final long serialVersionUID = 1L;
	
	@ApiModelProperty(value = "商品名称")
	@TableField("spu_name")
	private String spuName;

	@ApiModelProperty(value = "商品描述(后台简述)")
	@TableField("description")
	private String description;

	@ApiModelProperty(value = "三级分类id")
	@TableField("category3_id")
	private Long category3Id;

	@ApiModelProperty(value = "品牌id")
	@TableField("tm_id")
	private Long tmId;

	// 销售属性集合
	@TableField(exist = false)
	private List<SpuSaleAttr> spuSaleAttrList;

	// 商品的图片集合
	@TableField(exist = false)
	private List<SpuImage> spuImageList;

	// 商品的海报图片集合
	@TableField(exist = false)
	private List<SpuPoster> spuPosterList;
}

编写接口与实现类

在ManageService接口中添加

复制代码
/**
 * 根据skuId 查询skuInfo
 * @param skuId
 * @return
 */
SkuInfo getSkuInfo(Long skuId);

实现类

复制代码
@Override
public SkuInfo getSkuInfo(Long skuId) {
    SkuInfo skuInfo = skuInfoMapper.selectById(skuId);
    // 根据skuId 查询图片列表集合
    QueryWrapper<SkuImage> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("sku_id", skuId);
    List<SkuImage> skuImageList = skuImageMapper.selectList(queryWrapper);

    skuInfo.setSkuImageList(skuImageList);
    return skuInfo;
}

编写控制器

复制代码
package com.atguigu.gmall.product.api.ProductApiController
@RestController
@RequestMapping("api/product")
public class ProductApiController {

    @Autowired
    private ManageService manageService;

    /**
     * 根据skuId获取sku信息
     * @param skuId
     * @return
     */
    @GetMapping("inner/getSkuInfo/{skuId}")
    public SkuInfo getAttrValueList(@PathVariable("skuId") Long skuId){
        SkuInfo skuInfo = manageService.getSkuInfo(skuId);
        return skuInfo;
    }

(3)获取分类信息(查看三级分类)

需求分析

sku是挂在三级分类下面的,我们的分类信息分别在base_category1、base_category2、base_category3这三张表里面,目前需要通过sku表的三级分类id获取一级分类名称、二级分类名称和三级分类名称

|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。 特点: 数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表中。 |

解决方案:

我们可以建立一个视图 (view),把三张表关联起来,视图id就是三级分类id,这样通过三级分类id就可以查询到相应数据,效果如下:

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 创建视图 CREATE VIEW base_category_view AS select c3.id as id, c1.id as category1_id, c1.name as category1_name, c2.id as category2_id, c2.name as category2_name, c3.id as category3_id, c3.name as category3_name from base_category1 c1 inner join base_category2 c2 on c2.category1_id = c1.id inner join base_category3 c3 on c3.category2_id = c2.id |

对应实体类:

复制代码
//
//
package com.atguigu.gmall.model.product;

import com.atguigu.gmall.model.base.BaseEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * <p>
 * BaseCategoryView
 * </p>
 *
 */
@Data
@ApiModel(description = "BaseCategoryView")
@TableName("base_category_view")
public class BaseCategoryView implements Serializable {
	
	private static final long serialVersionUID = 1L;

	@ApiModelProperty(value = "id")
	private Long id;
	
	@ApiModelProperty(value = "一级分类编号")
	@TableField("category1_id")
	private Long category1Id;

	@ApiModelProperty(value = "一级分类名称")
	@TableField("category1_name")
	private String category1Name;

	@ApiModelProperty(value = "二级分类编号")
	@TableField("category2_id")
	private Long category2Id;

	@ApiModelProperty(value = "二级分类名称")
	@TableField("category2_name")
	private String category2Name;

	@ApiModelProperty(value = "三级分类编号")
	@TableField("category3_id")
	private Long category3Id;

	@ApiModelProperty(value = "三级分类名称")
	@TableField("category3_name")
	private String category3Name;

}

创建mapper:BaseCategoryViewMapper

复制代码
@Mapper
public interface BaseCategoryViewMapper extends BaseMapper<BaseCategoryView> {

}
复制代码
ManageService接口
复制代码
/**
 * 通过三级分类id查询分类信息
  * @param category3Id
 * @return
 */
BaseCategoryView getCategoryViewByCategory3Id(Long category3Id);

接口实现

复制代码
@Autowired 
private BaseCategoryViewMapper  baseCategoryViewMapper;


@Override
public BaseCategoryView getCategoryViewByCategory3Id(Long category3Id) {
    return baseCategoryViewMapper.selectById(category3Id);
}

编写控制器ProductApiController

复制代码
/**
 * 通过三级分类id查询分类信息
 * @param category3Id
 * @return
 */
@GetMapping("inner/getCategoryView/{category3Id}")
public BaseCategoryView getCategoryView(@PathVariable("category3Id")Long category3Id){
    return manageService.getCategoryViewByCategory3Id(category3Id);
}
相关推荐
你不是我我5 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
雪碧聊技术6 小时前
大模型爆火!Java后端如何抓住Agent全栈开发的风口
java·大模型·agent·全栈开发
逻辑驱动的ken7 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ9 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D10 小时前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X10 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手11 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦11 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw