乐优商城(七)
这部分没有特别难的地方,可能更多的是一些知识点。
商品新增
分析参数
点击新增品牌,弹出新增品牌所需要填写的参数
点击提交之后会失败,这是当然的,我们爱没有编写接口调用。但是我们可以看到前端传给后端的参数,如图:
方法是post方法,可以看到name,image,letter等这些参数都是我们Brand类里的成员变量,cids是所选品牌分类的id,那么我们的api只需要写两个参数就好了。
api
http://api.leyou.com/api/item/brand
这个路径正好到达BrandController类
那没有具体指定的方法,该怎么办?这时候就想到了一种编程风格—REST编程,类似于方法重载,他可以根据不同的请求(get,put,post等)来调用不同的接口。顺便简单说一点rest的http规范:
- GET请求对应Rest里面的访问。
- POST请求对应Rest里面的新增。
- PUT请求对应Rest里面的修改。
- DELETE对应Rest里面的删除。
代码
Controller
ResponseEntity的返回类型是Void,ResponseEntity的参数是引用类,不能是基本类型,更不能用void,void不也是类。新增的状态码是create(201),不是用OK(200)了,当没有返回值时后面可以接build(),有返回值时接body()。可以自己查看方法。
/**
* 新增商品
* @param brand
* @param cids
* @return
*/
@PostMapping
public ResponseEntity<Void> saveBrand(Brand brand,@RequestParam("cids") List<Long> cids){
brandService.saveBrand(brand,cids);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
Service
通用mapper的插入方法有两个,insert和insertSelective,insert是全参数(自增长键除外) ,insertSelective选择性插入数据。
我们再新加一个异常类型BRAND_SAVE_ERROR
这里值得一提的是当我们新增品牌时,要同时把品牌的分类插入到中间表“tb_category_brand”,将商品分类和品牌关联起来。但是这个表没有pojo类,我们需要自己手动写插入语句,希望大家还记得sql的注解方式
void saveBrand(Brand brand, List<Long> cids);
@Override
public void saveBrand(Brand brand, List<Long> cids) {
//新增品牌
brand.setId(null);
int count = brandMapper.insert(brand);
if (count == 0){
throw new LyException(ExceptionEnum.BRAND_SAVE_ERROR);
}
//新增中间表
for (Long cid : cids) {
count = brandMapper.insertCategoryBrand(cid, brand.getId());
if (count == 0){
throw new LyException(ExceptionEnum.BRAND_SAVE_ERROR);
}
}
}
BRAND_SAVE_ERROR(500,"商品添加失败"),
Mapper
/**
* 新增商品分类和品牌中间表数据
* @param cid
* @param bid
* @return
*/
@Insert("INSERT INTO tb_category_brand VALUES(#{cid},#{bid})")
public int insertCategoryBrand(@Param("cid") Long cid, @Param("bid")Long bid);