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前后端分离项目)十一(商品的功能实现-商品的增删改查)的主要内容,如果未能解决你的问题,请参考以下文章

IDEA SpringBoot 项目打包成jar包

JavaEE 之 SpringBoot

面试-科大讯飞日常实习面试

(超详解)SpringBoot高级部分-自动配置+监听机制+监控+项目部署

Java项目:超市进销存系统设计和实现(java+Springboot+ssm+mysql+jsp+maven)

SpringBoot核心注解应用