开发流程如下: 开发需求,就像在线接口文档如下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); } }