Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十一(商品的功能实现-商品的增删改查)
Posted 蓝盒子bluebox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十一(商品的功能实现-商品的增删改查)相关的知识,希望对你有一定的参考价值。
Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十一(商品的功能实现)
一、商品的新增
1、页面分析
(1)点击新增商品触发事件弹出窗口
show对应的true和false使其显示和隐藏
点击上面的叉关闭窗口
在Goods当中点击下面的切换按钮
在GoodsForm当中
2、功能实现
(1)实现表单页面品牌查询(根据当前商品分类查询)
1)完善BrandController当中的queryBrandByCid方法
/*
根据cid查询品牌
*/
@GetMapping("/cid/{cid}")
public ResponseEntity<List<Brand>> queryBrandByCid(@PathVariable("cid") Long cid ){
return ResponseEntity.ok(brandService.queryBrandByCid(cid));
}
2)完善brandService当中的queryBrandByCid方法
public List<Brand> queryBrandByCid(Long cid) {
/*
select b.id,b.`name`,b.letter,b.image from tb_brand b
INNER JOIN tb_category_brand cb
ON b.id = cb.brand_id
WHERE cb.category_id = 76
*/
return brandMapper.queryBrandByCid(cid);
}
3)完善brandMapper
@Select("select b.* from tb_brand b INNER JOIN tb_category_brand cb ON b.id = cb.brand_id WHERE cb.category_id = #{cid}")
List<Brand> queryBrandByCid(@Param("cid")Long cid);
4)完善BrandService做判空抛出异常
public List<Brand> queryBrandByCid(Long cid) {
/*
select b.id,b.`name`,b.letter,b.image from tb_brand b
INNER JOIN tb_category_brand cb
ON b.id = cb.brand_id
WHERE cb.category_id = 76
*/
List<Brand> list = brandMapper.queryBrandByCid(cid);
if(CollectionUtils.isEmpty(list)){
//查询失败抛出自定义的通用异常
throw new LyException(ExceptionEnum.CATEGORY_NOT_FOND);
}
return list;
}
5)运行测试
继续下一步
富文本编辑器(vue-quill-editor)
官网:https://gitee.com/jeffka/vue-quill-editor
演示地址:https://github.surmon.me/vue-quill-editor/
本项目当中的使用,需要完善一下
修改
填充内容
下一步
(2)完善表单页面规格参数的查询
1)在第一页面的时候会发起两次请求,第一次是查询商品分类,第二次是查询规格参数
2)修改SpecificationController当中queryParamByGid方法的参数以及方法名称
/*
根据参数的集合
*/
@GetMapping("params")
public ResponseEntity<List<SpecParam>> queryParamList(
@RequestParam(value = "gid",required = false) Long gid,
@RequestParam(value = "cid",required = false) Long cid, //require当前参数设置可有可无
@RequestParam(value = "searching",required = false) boolean searching //searching设置是否搜索
){
return ResponseEntity.ok(specificationService.queryParamList(gid,cid,searching));
}
3)完善specificationService
public List<SpecParam> queryParamList(Long gid,long cid,boolean searching) {
SpecParam specParam = new SpecParam();
specParam.setGroupId(gid);
specParam.setCid(cid);
specParam.setSearching(searching);
List<SpecParam> list = specParamMapper.select(specParam);
if(CollectionUtils.isEmpty(list)){
// 没有查询到
throw new LyException(ExceptionEnum.SPEC_PARAM_NOT_FOND);
}
return list;
}
4)运行测试
下一步
(5)实现表单提交(后台实现)
1)分析提交的参数
2)编写对应的实体类
a、Sku
package com.leyou.item.pojo;
import com.sun.org.apache.xpath.internal.operations.Bool;
import tk.mybatis.mapper.annotation.KeySql;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Date;
@Table(name = "tb_sku")
@Data
public class Sku {
@Id
@KeySql(useGeneratedKeys = true)
private Long id;
private Long spuId;
private String title;
private String images;
private Long price;
private String ownSpec;//商品特殊规格的键值对
private String indexes;//商品特殊规格下标
private Boolean enable;//是否有效,逻辑删除用
private Date createTime; //创建时间
private Date lastUpdateTime; //最后修改时间
@Transient
private Integer stock;//库存
}
b、Stock
package com.leyou.item.pojo;
import javax.persistence.Id;
import javax.persistence.Table;
@Table(name = "tb_stock")
@Data
public class Stock {
@Id
private Long skuId;
private Integer seckillStock;//秒杀可以用缓存
private Integer seckillTotal;//已经秒杀数量
private Integer stock;//正常库存
}
c、完善Spu用于接收页面的参数
package com.leyou.item.pojo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import tk.mybatis.mapper.annotation.KeySql;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Date;
import java.util.List;
@Table(name = "tb_spu")
@Data
public class Spu {
@Id
@KeySql(useGeneratedKeys = true)
private Long id;
private Long brandId;
private Long cid1; //1级类目
private Long cid2; //2级类目
private Long cid3; //2级类目
private String title;//标题
private String subTitle;//子标题
private Boolean saleable;//是否上架
@JsonIgnore //设置返回页面数据的时候,忽略当前字段
private Boolean valid;//是否有效。逻辑删除用
private Date createTime;//创建时间
@JsonIgnore //设置返回页面数据的时候,忽略当前字段
private Date lastUpdateTime;//最后修改时间
@Transient //Transient声明当前字段不是数据对应的字段
private String cname;
@Transient //Transient声明当前字段不是数据库对应的字段
private String bname;
@Transient //Transient声明当前字段不是数据库对应的字段
private List<Sku> skus;
@Transient
private SpuDetail spuDetail;
}
3)创建对应的Mapper
a)SkuMapper
package com.leyou.item.mapper;
import com.leyou.item.pojo.Sku;
import tk.mybatis.mapper.common.Mapper;
public interface SkuMapper extends Mapper<Sku> {
}
b)SkuMapper
package com.leyou.item.mapper;
import com.leyou.item.pojo.Stock;
import tk.mybatis.mapper.common.Mapper;
public interface StockMapper extends Mapper<Stock> {
}
4)对应的Service,不需要直接使用GoodsService
5)GoodsController创建saveGoods方法
/*
商品的新增
*/
@PostMapping("goods")
public ResponseEntity<Void> saveGoods(@RequestBody Spu spu){
goodsService.saveGoods(spu);
return ResponseEntity.status(HttpStatus.CREATED).build();
}
6)完善Service层
a、设置新增商品失败的枚举
GOODS_SAVE_ERROR(500,"新增商品失败"),
b、完善SpuDetail的get和set方法
package com.leyou.item.pojo;
import lombok.Data;
import javax.persistence.Id;
import javax.persistence.Table;
@Data
@Table(name = "tb_spu_detail")
public class SpuDetail {
@Id
private Long spuId;//对应SPU的id
private String description ; //商品描述
private String specialSpec ; //商品特殊规格的名称及可选值模板
private String genericSpec; //商品的全局规格属性
private String packingList; //包装清单
private String afterService ; //售后服务
}
c、扩展 StockMapper
-
在common当中定义一个通用的Mapper
-
- 先引入依赖
-
-
- 定义通用Mapper
package com.leyou.common.mapper;
import tk.mybatis.mapper.additional.idlist.IdListMapper;
import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.Mapper;
@RegisterMapper
public interface BaseMapper<T> extends Mapper<T>, IdListMapper<T,Long>, InsertListMapper<T> {
}
-
- 完善StockMapper当中继承自定义的BaseMapper(注意包路径)
package com.leyou.item.mapper;
import com.leyou.common.mapper.BaseMapper;
import com.leyou.item.pojo.Stock;
public interface StockMapper extends BaseMapper<Stock> {
}
d、完善GoodsService
@Transient
public void saveGoods(Spu spu) {
//新增SPU
spu.setId(null);
spu.setCreateTime(new Date());
spu.setLastUpdateTime(spu.getCreateTime());
spu.setSaleable(true);
spu.setValid(false);//设置默认不删除
int count = spuMapper.insert(spu);
if(count != 1){
throw new LyException(ExceptionEnum.GOODS_SAVE_ERROR);
}
//新增spu_detail
SpuDetail spuDetail = spu.getSpuDetail();
spuDetail.setSpuId(spu.getId());//spu新增完善会回显,然后就有spu.getId())
spuDetailMapper.insert(spuDetail);
//定义库存的集合
List<Stock> stockList = new ArrayList<Stock>();
//新增sku
List<Sku> skus = spu.getSkus();
for (Sku sku : skus) {
sku.setCreateTime(new Date());
sku.setLastUpdateTime(sku.getCreateTime());
sku.setSpuId(spu.getId());
count = skuMapper.insert(sku);
if(count != 1){
throw new LyException(ExceptionEnum.GOODS_SAVE_ERROR);
}
//将库存放入到库存集合当中
Stock stock = new Stock();
stock.setSkuId(sku.getId(以上是关于Java网络商城项目 SpringBoot+SpringCloud+Vue 网络商城(SSM前后端分离项目)十一(商品的功能实现-商品的增删改查)的主要内容,如果未能解决你的问题,请参考以下文章
(超详解)SpringBoot高级部分-自动配置+监听机制+监控+项目部署