商品微服务--后半部分:
注: 由于商品微服务内容太多,所以做了优化,拆分成两部分写。地址:商品微服务–前半部分
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