携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
开发流程如下:
开发需求,就像在线接口文档如下https://easydoc.net/s/78237135/ZUqEdvA4/OXTgKobR这里一样, 别人告诉你需要什么功能,需要返回什么样的数据,你就通过接口的形式把他们呢实现出来即可!
这一部分都是CRUD相关的代码,所以要好好练好好写!!!
开发接口就是开发Controller、service、dao
以后工作了也是这种形式,主要是开发接口为多,前端其实不用写太多,能看懂即可!!!
下面为分类规格参数的接口编写
规格参数详情
保存规格参数
controller
/**
* 保存
*/
@RequestMapping("/save")
public R save(@RequestBody AttrVo vo){
attrService.saveAttr(vo);
return R.ok();
}
service
这里注意,因为添加规格参数的时候会有选择属性组,因为
属性组和属性是通过关联关系表连接的所以要有级联操作。在往pms_attr表插入数据的时候,pms_attr_group_relation也要插入
小bug:这里有个注意点,当添加规格参数的时候如果没有指定规格参数所属分组,那么就不应该在关联表中保存关联关系!!!
@Override
public void saveAttr(AttrVo attr) {
AttrEntity attrEntity = new AttrEntity();
//1.将前端接收数据的对象vo赋值给attrEntity对象,从而更新数据库
BeanUtils.copyProperties(attr, attrEntity);
this.save(attrEntity);
if (attr.getAttrType() == ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode() && attr.getAttrGroupId() != null) {
//2.保存关联关系
//因为属性组和属性是通过关联关系表连接的
AttrAttrgroupRelationEntity relationEntity = new AttrAttrgroupRelationEntity();
relationEntity.setAttrGroupId(attr.getAttrGroupId());
relationEntity.setAttrId(attrEntity.getAttrId());
relationService.save(relationEntity);
}
}
显示规格参数
controller
/**
* 显示规格参数
*/
@GetMapping("/base/list/{catelogId}")
public R baseAttrList(@RequestParam Map<String, Object> params,
@PathVariable("catelogId") Integer catelogId) {
PageUtils page = attrService.queryBaseAttrPage(params, catelogId);
return R.ok().put("page", page);
}
service
//分页查询规格参数
@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, Integer catelogId) {
QueryWrapper<AttrEntity> wrapper = new QueryWrapper<>();
if (catelogId != 0) {
//如果不是一级分类,那么查询的时候加上where catelog_id = ?
wrapper.eq("catelog_id", catelogId);
}
//多条件模糊查询
//搜索框里的key不但可以对catelog_id进行模糊查询,对attr_name也模糊查询
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)) {
wrapper.eq("attr_id", key).or().like("attr_name", key);
}
//多条件分页查询
IPage<AttrEntity> page = this.page(
new Query<AttrEntity>().getPage(params),
wrapper);
PageUtils pageUtils = new PageUtils(page);
return pageUtils;
}
测试
如下:
这些属性的分类和所属分组怎么查呢?
规格参数表(pms_attr)中,有所属分类的信息,可以直接调用分类的service进行查询那分组信息怎么查询呢?规格参数表中没有所属分类相关的信息...
这里我们就要借助第三张表,
属性和分组表(pms_attr_attrgroup_relation)进行查询通过
规格参数表(pms_attr)获得attr_id,之后在调用属性和分组表的service获得属性和分组表的实体类,从而获得该属性的分组下面通过
stream流的方式,通过map给list集合中的每一项做映射给新实体类(AttrRespVo)赋值,最后返回AttrRespVo
小bug:这里显示规格参数的时候,会显示规格。参数对应的分组、分类,那么如果它们查出对象分组id或分类id为空那就不设置名字if (attrId != null && attrId.getAttrGroupId() != null) {...}
//分页查询规格参数
@Override
public PageUtils queryBaseAttrPage(Map<String, Object> params, String type, Integer catelogId) {
QueryWrapper<AttrEntity> wrapper = new QueryWrapper<AttrEntity>()
.eq("attr_type", "base".equalsIgnoreCase(type) ? ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode() : ProductConstant.AttrEnum.ATTR_TYPE_SALE.getCode());
if (catelogId != 0) {
//如果不是一级分类,那么查询的时候加上where catelog_id = ?
//IgnoreCase忽略大小写
wrapper.eq("catelog_id", catelogId);
}
//多条件模糊查询
//搜索框里的key不但可以对catelog_id进行模糊查询,对attr_name也模糊查询
String key = (String) params.get("key");
if (!StringUtils.isEmpty(key)) {
wrapper.eq("attr_id", key).or().like("attr_name", key);
}
//多条件分页查询
IPage<AttrEntity> page = this.page(
new Query<AttrEntity>().getPage(params),
wrapper);
PageUtils pageUtils = new PageUtils(page);
List<AttrEntity> list = page.getRecords();
// .map()这个方法是对被筛选过后的流进行映射,一般是对属性进行赋值。
List<AttrRespVo> resultList = list.stream().map(item -> {
AttrRespVo attrRespvo = new AttrRespVo();
BeanUtils.copyProperties(item, attrRespvo);
//设置分类和分组的名字
if ("base".equalsIgnoreCase(type)) {
AttrAttrgroupRelationEntity attrId = relationService.
getOne(new QueryWrapper<AttrAttrgroupRelationEntity>()
.eq("attr_id", item.getAttrId()));
if (attrId != null && attrId.getAttrGroupId() != null) {
//attrgroupRelationEntity.getAttrGroupId()也可以,这里可以直接放进去对象
AttrGroupEntity attrGroupEntity = attrGroupService.getById(attrId.getAttrGroupId());
attrRespvo.setGroupName(attrGroupEntity.getAttrGroupName());
}
}
CategoryEntity categoryEntity = categoryService.getById(item.getCatelogId());
if (categoryEntity != null) {
attrRespvo.setCatelogName(categoryEntity.getName());
}
//返回最后的封装结果
return attrRespvo;
}).collect(Collectors.toList());
//返回的结果是一个集合
pageUtils.setList(resultList);
// 返回分页后的集合对象
return pageUtils;
}
AttrRespVo
@Data
public class AttrRespVo extends AttrVo {
private String catelogName;
private String groupName;
}
测试
规格参数回显
可以看出所属分类和分组都是由这条请求查询的,那么我们改这个接口功能就行
相当于在
原来查询基础上返回分类路径信息,分组信息
controller
/**
* 信息
*/
@RequestMapping("/info/{attrId}")
public R info(@PathVariable("attrId") Long attrId) {
AttrRespVo respVo = attrService.getAttrInfo(attrId);
return R.ok().put("attr", respVo);
}
service
@Override
public AttrRespVo getAttrInfo(Long attrId) {
AttrRespVo respVo = new AttrRespVo();
AttrEntity attrEntity = this.getById(attrId);
BeanUtils.copyProperties(attrEntity, respVo);
/**
* 设置分组信息
*/
AttrAttrgroupRelationEntity attrgroupRelationEntity = relationService.
getOne(new QueryWrapper<AttrAttrgroupRelationEntity>()
.eq("attr_id", attrEntity.getAttrId()));
if (attrgroupRelationEntity != null){
respVo.setAttrGroupId(attrgroupRelationEntity.getAttrGroupId());
Long attrGroupId = attrgroupRelationEntity.getAttrGroupId();
AttrGroupEntity attrGroupEntity = attrGroupService.getById(attrGroupId);
if (attrGroupEntity != null) {
respVo.setGroupName(attrGroupEntity.getAttrGroupName());
}
}
/**
* 设置分类信息
*/
Long catelogId = attrEntity.getCatelogId();
//有了分类的完整路径,接下来就设置分类名字
Long[] catelogPath = categoryService.findCatelogPath(catelogId);
respVo.setCatelogPath(catelogPath);
//获得分类名字
CategoryEntity categoryEntity = categoryService.getById(catelogId);
if (categoryEntity != null) {
respVo.setCatelogName(categoryEntity.getName());
}
return respVo;
}
测试
修改Or增加
提交修改分类和分组是无效的?
更改用的还是默认的update方法,所以我们改update接口!
controller
/**
* 修改
*/
@RequestMapping("/update")
public R update(@RequestBody AttrVo attr) {
attrService.updateAttr(attr);
return R.ok();
}
service
这里做了优化,对于规格参数中没有所属分组的,如果指定了不在是修改而是添加!
怎么判断规格参数有没有所属分组呢?
拿attr_id去
pms_attr_attrgroup_relation表中查询,如果改attr_id存在与该表,那就修改关联关系如果没有数据,那么就在此表添加数据!
@Transactional
@Override
public void updateAttr(AttrVo attr) {
AttrEntity attrEntity = new AttrEntity();
BeanUtils.copyProperties(attr, attrEntity);
this.updateById(attrEntity);
//修改分组关联
AttrAttrgroupRelationEntity attrAttrgroupRelationEntity = new AttrAttrgroupRelationEntity();
attrAttrgroupRelationEntity.setAttrGroupId(attr.getAttrGroupId());
attrAttrgroupRelationEntity.setAttrId(attr.getAttrId());
//统计attr_id的关联属性,如果没有初始分组,则进行添加操作;有则进行修改操作
Integer count = relation.selectCount(new QueryWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attr.getAttrId()));
if (count > 0) {
relation.update(attrAttrgroupRelationEntity, new UpdateWrapper<AttrAttrgroupRelationEntity>().eq("attr_id", attr.getAttrId()));
} else {
relation.insert(attrAttrgroupRelationEntity);
}
}