乐优商城--服务(三) : 商品微服务(LyItemApplication)--后半部分

: 由于商品微服务内容太多,所以做了优化,拆分成两部分写。地址:商品微服务–前半部分

4.6 商品规格数据结构与商品表结构分析

内容偏多,重新写了一篇商品规格数据结构与商品表结构分析

4.7 实现商品规格参数管理

4.7.1 规格组查询

4.7.1.1 SpecGroup数据表

由于在商品规格数据结构与商品表结构分析中SpecGroup数据表已给出,这里就不再附一遍了。

4.7.1.2 SpecGroup实体类
@Data
@Table(name = "tb_spec_group")
public class SpecGroup {
   
    @Id
    @KeySql(useGeneratedKeys = true)
    private Long id;
    private Long cid;
    private String name;

    @Transient  //数据库表中没有params这一字段,因此要加上@Transient注解
    private List<SpecParam> params;
}
  • @Transient注解
    • serialization会忽略掉
      Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。
      为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient

    • 不跟数据库表做映射 就是表中没有这个字段
      @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性.

4.7.1.3 业务
4.7.1.3.1 web
4.7.1.3.1.1 页面分析

在这里插入图片描述

  • 请求方式:get
  • 请求路径:/spec/groups/cid
  • 请求参数:cid
  • 返回结果:group集合
4.7.1.3.1.2 实现业务
@RestController
@RequestMapping("spec")
public class SpecificationController {
   

    @Autowired
    private SpecificationService specificationService;

	// 根据分类id查询规格组
    @GetMapping("groups/{cid}")
    public ResponseEntity<List<SpecGroup>>  queryGroupByCid(@PathVariable("cid")Long cid){
   
        return ResponseEntity.ok(specificationService.queryGroupByCid(cid));
    }
4.7.1.3.2 service
@Service
public class SpecificationService {
   

    @Autowired
    private SpecGroupMapper groupMapper;

    @Autowired
    private SpecParamMapper paramMapper;

    // 根据分类id查询规格组
    public List<SpecGroup> queryGroupByCid(Long cid) {
   

        SpecGroup group = new SpecGroup();
        group.setCid(cid);
		//根据非空字段进行查询
        List<SpecGroup> list = groupMapper.select(group);

        if(CollectionUtils.isEmpty(list)){
   
            throw new LyException(ExceptionEnum.SPEC_GROUP_NOT_FOUND);
        }

        return list;
    }
}
4.7.1.3.3 mapper
public interface SpecGroupMapper extends Mapper<SpecGroup> {
   
}

4.7.2 规格参数查询

当我们点击规格组,切换到规格参数显示

4.7.2.1 SpecParam数据表

表结构见商品规格数据结构与商品表结构分析

4.7.2.2 SpecParam实体类
@Data
@Table(name = "tb_spec_param")
public class SpecParam {
   
    @Id
    @KeySql(useGeneratedKeys = true)
    private Long id;
    private Long cid;
    private Long groupId;
    private String name;
    //通用mapper生成sql语句时,不要直接拼接numeric,而要拼接`numeric`,反引号是转义为字符串,numeric是一个关键字
    @Column(name = "`numeric`")
    private Boolean numeric;
    private String unit;
    private Boolean generic;
    private Boolean searching;
    private String segments;
}
4.7.2.3 业务
4.7.2.3.1 web
4.7.2.3.1.1 页面分析

在这里插入图片描述

  • 请求方式:get
  • 请求路径:/spec/params
  • 请求参数:gid,分组id
  • 返回结果:当前组下的所有规格参数
4.7.2.3.1.2 实现业务
// 根据组id查询规格参数
@GetMapping("/params")
public ResponseEntity<List<SpecParam>> querySpecParams(@RequestParam("gid")Long gid){
   
	return ResponseEntity.ok(specificationService.querySpecParams(gid));
}
4.7.2.3.1 service
// 根据组id查询规格参数
public List<SpecParam> querySpecParams(Long gid) {
   
    SpecParam param = new SpecParam();
    param.setGroupId(gid);
    List<SpecParam> params = paramMapper.select(param);

    if(CollectionUtils.isEmpty(params)){
   
        throw new LyException(ExceptionEnum.SPEC_PARAM_NOT_FOUND);
    }

    return params;
}
4.7.2.3.1 mapper
public interface SpecParamMapper extends Mapper<SpecParam> {
   
}

4.8 商品查询

4.8.1 spu与spuDetail数据表

表结构见商品规格数据结构与商品表结构分析

4.8.1 spu与spuDetail实体类

@Data
@Table(name = "tb_spu")
public class Spu {
   
    @Id
    @KeySql(useGeneratedKeys=true)
    private Long id;
    private Long brandId;
    private Long cid1;// 1级类目
    private Long cid2;// 2级类目
    private Long cid3;// 3级类目
    private String title;// 标题
    private String subTitle;// 子标题
    private Boolean saleable;// 是否上架
    @JsonIgnore     //在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
    private Boolean valid;// 是否有效,逻辑删除用
    private Date createTime;// 创建时间
    @JsonIgnore
    private Date lastUpdateTime;// 最后修改时间

    @Transient
    private String cname;
    @Transient
    private String bname;
    @Transient
    private List<Sku> skus;
    @Transient
    private SpuDetail spuDetail;
}

注:

  • po:persisent object,持久对象;它的字段必须和数据库字段完全一致
  • 由于数据库里没有商品分类和品牌的name字段,应该写成专门的vo对象(专门返回页面上的)
  • 查出来的是spu po,应该转成vo。但将来从页面接收到vo转成spu po才能往数据库传,可能会有各种对象转换的错误
  • 为了方便,我们把 商品分类和品牌的name字段 等字段添加到spu里去,由于这些字段数据库中没有,因此都应逐个添加@Transient注解(javax.persistence包下的)
  • 不想返回到界面的字段 可以加一个@JsonIgnore注解
@Data
@Table(name="tb_spu_detail")
public class SpuDetail {
   
    @Id  // id没有加上自增主键,因为这张表id不是自增的,而是和spu表的id关联的
    private Long spuId;// 对应的SPU的id
    private String description;// 商品描述
    private String genericSpec;// 商品特殊规格的名称及可选值模板
    private String specialSpec;// 商品的全局规格属性
    private String packingList;// 包装清单
    pr
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值