原因
使用到了PubSub 但是没有依赖
解决
- npm install --save pubsub-js
- 在src下的main.js中引用:
① import PubSub from pubsub-js
② Vue.prototype.PubSub = PubSub
效果
报错消失了,取而代之的是找不到接口,问题解决
2.编写根据商品分类查询品牌列表接口新增品牌vo对象
gulimall-product/src/main/java/site/zhourui/gulimall/product/vo/BrandVo.java
@Data public class BrandVo { private Long brandId; private String brandName; }
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/CategoryBrandRelationService.java
新增接口
ListgetBrandsByCatId(Long catId);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/CategoryBrandRelationServiceImpl.java
新增接口实现
@Override //获取目录下所有品牌列表 public ListgetBrandsByCatId(Long catId) { List catelogId = relationDao.selectList(new QueryWrapper ().eq("catelog_id", catId)); List collect = catelogId.stream().map(item -> { Long brandId = item.getBrandId(); BrandEntity byId = brandService.getById(brandId); return byId; }).collect(Collectors.toList()); return collect; }
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/CategoryBrandRelationController.java 新增接口
@GetMapping("/catelog/list") //@RequiresPermissions("product:categorybrandrelation:list") public R cateloglist(@RequestParam("brandId")Long brandId){ Listdata = categoryBrandRelationService.list( new QueryWrapper ().eq("brand_id",brandId) ); return R.ok().put("data", data); }
3.获取会员等级列表重启gulimall-product服务
观察效果 商品列表出现
1.网关配置发现还需要会员等级接口
因为之前配置过会员模块,这里就不配置了
但是在网关中需要配置会员服务路由,并重启网关
gulimall-gateway/src/main/resources/application.yml
- id: member_route uri: lb://gulimall-member predicates: - Path=/api/member/** filters: - RewritePath=/api/(?2.添加会员等级.*),/${segment}
启动 gulimall-member服务
设置会员等级
2.规格参数页面此时会员列表接口也能查询到会员等级列表信息了
规格参数属如果需要多选
3.销售属性页面 1.根据分类id查出所有的分组以及这些组里面的属性需要在对应的属性
com/atguigu/gulimall/product/vo/AttrGroupWithAttrsVo.java
属性分组带有属性集合的vo
package site.zhourui.gulimall.product.vo; import lombok.Data; import site.zhourui.gulimall.product.entity.AttrEntity; import java.util.List; @Data public class AttrGroupWithAttrsVo { private Long attrGroupId; private String attrGroupName; private Integer sort; private String descript; private String icon; private Long catelogId; private List attrs; }
com/atguigu/gulimall/product/service/AttrGroupService.java
新增根据分类id查出所有的分组以及这些组里面的属性接口
//根据分类id查出所有的分组以及这些组里面的属性 List getAttrGroupWithAttrsByCatelogId(Long catelogId);
com/atguigu/gulimall/product/service/impl/AttrGroupServiceImpl.java
@Override public List getAttrGroupWithAttrsByCatelogId(Long catelogId) { //com.atguigu.gulimall.product.vo //1、查询分组信息 List attrGroupEntities = this.list(new QueryWrapper().eq("catelog_id", catelogId)); //2、查询所有属性 List collect = attrGroupEntities.stream().map(group -> { AttrGroupWithAttrsVo attrsVo = new AttrGroupWithAttrsVo(); BeanUtils.copyProperties(group,attrsVo); List attrs = attrService.getRelationAttr(attrsVo.getAttrGroupId()); attrsVo.setAttrs(attrs); return attrsVo; }).collect(Collectors.toList()); return collect; }
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/AttrGroupController.java
编写获取会员等级列表接口
///product/attrgroup/{catelogId}/withattr @GetMapping("/{catelogId}/withattr") public R getAttrGroupWithAttrs(@PathVariable("catelogId")Long catelogId){ //1、查出当前分类下的所有属性分组, //2、查出每个属性分组的所有属性 List vos = attrGroupService.getAttrGroupWithAttrsByCatelogId(catelogId); return R.ok().put("data",vos); }
4.SKU信息页面效果
此页面主要是前端生成的
根据步骤二中选中的属性进行笛卡尔乘积生成的数据
具体实现代码
generateSkus() { this.step = 3; //根据笛卡尔积运算进行生成sku let selectValues = []; this.dataResp.tableAttrColumn = []; this.dataResp.tempSaleAttrs.forEach(item => { if (item.attrValues.length > 0) { selectValues.push(item.attrValues); this.dataResp.tableAttrColumn.push(item); } }); let descartes = this.descartes(selectValues); //[["黑色","6GB","移动"],["黑色","6GB","联通"],["黑色","8GB","移动"],["黑色","8GB","联通"], //["白色","6GB","移动"],["白色","6GB","联通"],["白色","8GB","移动"],["白色","8GB","联通"], //["蓝色","6GB","移动"],["蓝色","6GB","联通"],["蓝色","8GB","移动"],["蓝色","8GB","联通"]] console.log("生成的组合", JSON.stringify(descartes)); //有多少descartes就有多少sku let skus = []; descartes.forEach((descar, descaridx) => { let attrArray = []; //sku属性组 descar.forEach((de, index) => { //构造saleAttr信息 let saleAttrItem = { attrId: this.dataResp.tableAttrColumn[index].attrId, attrName: this.dataResp.tableAttrColumn[index].attrName, attrValue: de }; attrArray.push(saleAttrItem); }); //先初始化几个images,后面的上传还要加 let imgs = []; this.spu.images.forEach((img, idx) => { imgs.push({ imgUrl: "", defaultImg: 0 }); }); //会员价,也必须在循环里面生成,否则会导致数据绑定问题 let memberPrices = []; if (this.dataResp.memberLevels.length > 0) { for (let i = 0; i < this.dataResp.memberLevels.length; i++) { if (this.dataResp.memberLevels[i].priviledgeMemberPrice == 1) { memberPrices.push({ id: this.dataResp.memberLevels[i].id, name: this.dataResp.memberLevels[i].name, price: 0 }); } } } //;descaridx,判断如果之前有就用之前的值; let res = this.hasAndReturnSku(this.spu.skus, descar); if (res === null) { skus.push({ attr: attrArray, skuName: this.spu.spuName + " " + descar.join(" "), price: 0, skuTitle: this.spu.spuName + " " + descar.join(" "), skuSubtitle: "", images: imgs, descar: descar, fullCount: 0, discount: 0, countStatus: 0, fullPrice: 0.0, reducePrice: 0.0, priceStatus: 0, memberPrice: new Array().concat(memberPrices) }); } else { skus.push(res); } }); this.spu.skus = skus; console.log("结果!!!", this.spu.skus, this.dataResp.tableAttrColumn); }, //判断如果包含之前的sku的descar组合,就返回这个sku的详细信息; hasAndReturnSku(skus, descar) { let res = null; if (skus.length > 0) { for (let i = 0; i < skus.length; i++) { if (skus[i].descar.join(" ") == descar.join(" ")) { res = skus[i]; } } } return res; },
5.新增商品vo抽取 1.新增商品保存json生成效果
保存时会向后端发送一个这样的json对象
{"spuName":"2","spuDescription":"2","catalogId":225,"brandId":9,"weight":0.1,"publishStatus":0,"decript":["https://zr-gulimall-images.oss-cn-chengdu.aliyuncs.com/2021-10-14/04854fc0-7f1b-4505-8b34-e53f97f7fb81_2021-07-07.png"],"images":["https://zr-gulimall-images.oss-cn-chengdu.aliyuncs.com/2021-10-14/6697a7e5-294a-4e74-8389-4fd5fd1b826b_2021-06-28.png"],"bounds":{"buyBounds":0,"growBounds":0},"baseAttrs":[{"attrId":7,"attrValues":"A2217;C3J","showDesc":1},{"attrId":8,"attrValues":"2018","showDesc":0},{"attrId":11,"attrValues":"白色","showDesc":1},{"attrId":13,"attrValues":"135.9","showDesc":0},{"attrId":14,"attrValues":"以官网信息为准;陶瓷","showDesc":0},{"attrId":15,"attrValues":"高通(Qualcomm)","showDesc":1},{"attrId":16,"attrValues":"骁龙665","showDesc":0}],"skus":[{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"黑色"},{"attrId":10,"attrName":"内存","attrValue":"6GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"158.3"}],"skuName":"2 黑色 6GB 158.3","price":0,"skuTitle":"2 黑色 6GB 158.3","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["黑色","6GB","158.3"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]},{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"黑色"},{"attrId":10,"attrName":"内存","attrValue":"6GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"135.9"}],"skuName":"2 黑色 6GB 135.9","price":0,"skuTitle":"2 黑色 6GB 135.9","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["黑色","6GB","135.9"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]},{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"黑色"},{"attrId":10,"attrName":"内存","attrValue":"4GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"158.3"}],"skuName":"2 黑色 4GB 158.3","price":0,"skuTitle":"2 黑色 4GB 158.3","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["黑色","4GB","158.3"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]},{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"黑色"},{"attrId":10,"attrName":"内存","attrValue":"4GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"135.9"}],"skuName":"2 黑色 4GB 135.9","price":0,"skuTitle":"2 黑色 4GB 135.9","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["黑色","4GB","135.9"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]},{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"白色"},{"attrId":10,"attrName":"内存","attrValue":"6GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"158.3"}],"skuName":"2 白色 6GB 158.3","price":0,"skuTitle":"2 白色 6GB 158.3","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["白色","6GB","158.3"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]},{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"白色"},{"attrId":10,"attrName":"内存","attrValue":"6GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"135.9"}],"skuName":"2 白色 6GB 135.9","price":0,"skuTitle":"2 白色 6GB 135.9","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["白色","6GB","135.9"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]},{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"白色"},{"attrId":10,"attrName":"内存","attrValue":"4GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"158.3"}],"skuName":"2 白色 4GB 158.3","price":0,"skuTitle":"2 白色 4GB 158.3","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["白色","4GB","158.3"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]},{"attr":[{"attrId":9,"attrName":"颜色","attrValue":"白色"},{"attrId":10,"attrName":"内存","attrValue":"4GB"},{"attrId":13,"attrName":"机身长度(mm)","attrValue":"135.9"}],"skuName":"2 白色 4GB 135.9","price":0,"skuTitle":"2 白色 4GB 135.9","skuSubtitle":"","images":[{"imgUrl":"","defaultImg":0}],"descar":["白色","4GB","135.9"],"fullCount":0,"discount":0,"countStatus":0,"fullPrice":0,"reducePrice":0,"priceStatus":0,"memberPrice":[{"id":2,"name":"铜牌会员","price":0},{"id":3,"name":"银牌会员","price":0}]}]}2.将json字符串格式化
json在线格式化网站
{ "spuName": "2", "spuDescription": "2", "catalogId": 225, "brandId": 9, "weight": 0.1, "publishStatus": 0, "decript": ["https://zr-gulimall-images.oss-cn-chengdu.aliyuncs.com/2021-10-14/04854fc0-7f1b-4505-8b34-e53f97f7fb81_2021-07-07.png"], "images": ["https://zr-gulimall-images.oss-cn-chengdu.aliyuncs.com/2021-10-14/6697a7e5-294a-4e74-8389-4fd5fd1b826b_2021-06-28.png"], "bounds": { "buyBounds": 0, "growBounds": 0 }, "baseAttrs": [{ "attrId": 7, "attrValues": "A2217;C3J", "showDesc": 1 }, { "attrId": 8, "attrValues": "2018", "showDesc": 0 }, { "attrId": 11, "attrValues": "白色", "showDesc": 1 }, { "attrId": 13, "attrValues": "135.9", "showDesc": 0 }, { "attrId": 14, "attrValues": "以官网信息为准;陶瓷", "showDesc": 0 }, { "attrId": 15, "attrValues": "高通(Qualcomm)", "showDesc": 1 }, { "attrId": 16, "attrValues": "骁龙665", "showDesc": 0 }], "skus": [{ "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "黑色" }, { "attrId": 10, "attrName": "内存", "attrValue": "6GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "158.3" }], "skuName": "2 黑色 6GB 158.3", "price": 0, "skuTitle": "2 黑色 6GB 158.3", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["黑色", "6GB", "158.3"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }, { "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "黑色" }, { "attrId": 10, "attrName": "内存", "attrValue": "6GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "135.9" }], "skuName": "2 黑色 6GB 135.9", "price": 0, "skuTitle": "2 黑色 6GB 135.9", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["黑色", "6GB", "135.9"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }, { "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "黑色" }, { "attrId": 10, "attrName": "内存", "attrValue": "4GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "158.3" }], "skuName": "2 黑色 4GB 158.3", "price": 0, "skuTitle": "2 黑色 4GB 158.3", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["黑色", "4GB", "158.3"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }, { "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "黑色" }, { "attrId": 10, "attrName": "内存", "attrValue": "4GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "135.9" }], "skuName": "2 黑色 4GB 135.9", "price": 0, "skuTitle": "2 黑色 4GB 135.9", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["黑色", "4GB", "135.9"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }, { "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "白色" }, { "attrId": 10, "attrName": "内存", "attrValue": "6GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "158.3" }], "skuName": "2 白色 6GB 158.3", "price": 0, "skuTitle": "2 白色 6GB 158.3", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["白色", "6GB", "158.3"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }, { "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "白色" }, { "attrId": 10, "attrName": "内存", "attrValue": "6GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "135.9" }], "skuName": "2 白色 6GB 135.9", "price": 0, "skuTitle": "2 白色 6GB 135.9", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["白色", "6GB", "135.9"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }, { "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "白色" }, { "attrId": 10, "attrName": "内存", "attrValue": "4GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "158.3" }], "skuName": "2 白色 4GB 158.3", "price": 0, "skuTitle": "2 白色 4GB 158.3", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["白色", "4GB", "158.3"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }, { "attr": [{ "attrId": 9, "attrName": "颜色", "attrValue": "白色" }, { "attrId": 10, "attrName": "内存", "attrValue": "4GB" }, { "attrId": 13, "attrName": "机身长度(mm)", "attrValue": "135.9" }], "skuName": "2 白色 4GB 135.9", "price": 0, "skuTitle": "2 白色 4GB 135.9", "skuSubtitle": "", "images": [{ "imgUrl": "", "defaultImg": 0 }], "descar": ["白色", "4GB", "135.9"], "fullCount": 0, "discount": 0, "countStatus": 0, "fullPrice": 0, "reducePrice": 0, "priceStatus": 0, "memberPrice": [{ "id": 2, "name": "铜牌会员", "price": 0 }, { "id": 3, "name": "银牌会员", "price": 0 }] }] }3.生成JavaBean
下载代码
4.使用lombok将生成的代码放入
gulimall-product/src/main/java/site/zhourui/gulimall/product/vo
将所有生成的的实体类删除getter/setter方法,替换为@Data
将所有Double类型的字段换成BigDecimal
5.完整示例 1.Attr将所有id的类型换成Long
package site.zhourui.gulimall.product.vo; import lombok.Data; @Data public class Attr { private Long attrId; private String attrName; private String attrValue; }2.baseAttrs
package site.zhourui.gulimall.product.vo; import lombok.Data; @Data public class baseAttrs { private Long attrId; private String attrValues; private int showDesc; }3.Bounds
package site.zhourui.gulimall.product.vo; import lombok.Data; import java.math.BigDecimal; @Data public class Bounds { private BigDecimal buyBounds; private BigDecimal growBounds; }4.BrandVo
package site.zhourui.gulimall.product.vo; import lombok.Data; @Data public class BrandVo { private Long brandId; private String brandName; }5.Images
package site.zhourui.gulimall.product.vo; import lombok.Data; @Data public class Images { private String imgUrl; private int defaultImg; }6.MemberPrice
package site.zhourui.gulimall.product.vo; import lombok.Data; import java.math.BigDecimal; @Data public class MemberPrice { private Long id; private String name; private BigDecimal price; }7.Skus
package site.zhourui.gulimall.product.vo; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data public class Skus { private List attr; private String skuName; private BigDecimal price; private String skuTitle; private String skuSubtitle; private List8.SpuSaveVoimages; private List descar; private int fullCount; private BigDecimal discount; private int countStatus; private BigDecimal fullPrice; private BigDecimal reducePrice; private int priceStatus; private List memberPrice; }
package site.zhourui.gulimall.product.vo; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data public class SpuSaveVo { private String spuName; private String spuDescription; private Long catalogId; private Long brandId; private BigDecimal weight; private int publishStatus; private List6.商品新增业务流程分析decript; private List images; private Bounds bounds; private List baseAttrs; private List skus; }
修改商品保存接口
com/atguigu/gulimall/product/controller/SpuInfoController.java
@RequestMapping("/save") //@RequiresPermissions("product:spuinfo:save") public R save(@RequestBody SpuSaveVo vo){ //spuInfoService.save(spuInfo); spuInfoService.saveSpuInfo(vo); return R.ok(); }
新增saveSpuInfo方法
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/SpuInfoService.java
void saveSpuInfo(SpuSaveVo vo);
1.商品新增业务流程分析gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/SpuInfoServiceImpl.java
新增saveSpuInfo方法实现(完整示例)
-
保存spu基本信息 pms_spu_info
-
保存Spu的描述图片 pms_spu_info_desc
-
保存spu的图片集 pms_spu_images
-
保存spu的规格参数;pms_product_attr_value
-
保存spu的积分信息;gulimall_sms->sms_spu_bounds (此处需要调用优惠模块服务(gulimall-coupon)的积分接口)
-
保存当前spu对应的所有sku信息;
-
sku的基本信息;pms_sku_info
-
sku的图片信息;pms_sku_image
-
sku的销售属性信息:pms_sku_sale_attr_value
-
sku的优惠、满减等信息;gulimall_sms->sms_sku_laddersms_sku_full_reductionsms_member_price
(此处需要调用优惠模块服务(gulimall-coupon)优惠阶段接口满减优惠接口会员价接口)
-
@Transactional @Override public void saveSpuInfo(SpuSaveVo vo) { //1、保存spu基本信息 pms_spu_info SpuInfoEntity infoEntity = new SpuInfoEntity(); BeanUtils.copyProperties(vo,infoEntity); infoEntity.setCreateTime(new Date()); infoEntity.setUpdateTime(new Date()); this.savebaseSpuInfo(infoEntity); //2、保存Spu的描述图片 pms_spu_info_desc List7.流程分析所需接口 1.保存spu基本信息decript = vo.getDecript(); SpuInfoDescEntity descEntity = new SpuInfoDescEntity(); descEntity.setSpuId(infoEntity.getId()); descEntity.setDecript(String.join(",",decript)); spuInfoDescService.saveSpuInfoDesc(descEntity); //3、保存spu的图片集 pms_spu_images List images = vo.getImages(); imagesService.saveImages(infoEntity.getId(),images); //4、保存spu的规格参数;pms_product_attr_value List baseAttrs = vo.getbaseAttrs(); List collect = baseAttrs.stream().map(attr -> { ProductAttrValueEntity valueEntity = new ProductAttrValueEntity(); valueEntity.setAttrId(attr.getAttrId()); AttrEntity id = attrService.getById(attr.getAttrId()); valueEntity.setAttrName(id.getAttrName()); valueEntity.setAttrValue(attr.getAttrValues()); valueEntity.setQuickShow(attr.getShowDesc()); valueEntity.setSpuId(infoEntity.getId()); return valueEntity; }).collect(Collectors.toList()); attrValueService.saveProductAttr(collect); //5、保存spu的积分信息;gulimall_sms->sms_spu_bounds Bounds bounds = vo.getBounds(); SpuBoundTo spuBoundTo = new SpuBoundTo(); BeanUtils.copyProperties(bounds,spuBoundTo); spuBoundTo.setSpuId(infoEntity.getId()); R r = couponFeignService.saveSpuBounds(spuBoundTo); if(r.getCode() != 0){ log.error("远程保存spu积分信息失败"); } //5、保存当前spu对应的所有sku信息; List skus = vo.getSkus(); if(skus!=null && skus.size()>0){ skus.forEach(item->{ String defaultImg = ""; for (Images image : item.getImages()) { if(image.getDefaultImg() == 1){ defaultImg = image.getImgUrl(); } } // private String skuName; // private BigDecimal price; // private String skuTitle; // private String skuSubtitle; SkuInfoEntity skuInfoEntity = new SkuInfoEntity(); BeanUtils.copyProperties(item,skuInfoEntity); skuInfoEntity.setBrandId(infoEntity.getBrandId()); skuInfoEntity.setCatalogId(infoEntity.getCatalogId()); skuInfoEntity.setSaleCount(0L); skuInfoEntity.setSpuId(infoEntity.getId()); skuInfoEntity.setSkuDefaultImg(defaultImg); //5.1)、sku的基本信息;pms_sku_info skuInfoService.saveSkuInfo(skuInfoEntity); Long skuId = skuInfoEntity.getSkuId(); List imagesEntities = item.getImages().stream().map(img -> { SkuImagesEntity skuImagesEntity = new SkuImagesEntity(); skuImagesEntity.setSkuId(skuId); skuImagesEntity.setImgUrl(img.getImgUrl()); skuImagesEntity.setDefaultImg(img.getDefaultImg()); return skuImagesEntity; }).filter(entity->{ //返回true就是需要,false就是剔除 return !StringUtils.isEmpty(entity.getImgUrl()); }).collect(Collectors.toList()); //5.2)、sku的图片信息;pms_sku_image skuImagesService.saveBatch(imagesEntities); //TODO 没有图片路径的无需保存 List attr = item.getAttr(); List skuSaleAttrValueEntities = attr.stream().map(a -> { SkuSaleAttrValueEntity attrValueEntity = new SkuSaleAttrValueEntity(); BeanUtils.copyProperties(a, attrValueEntity); attrValueEntity.setSkuId(skuId); return attrValueEntity; }).collect(Collectors.toList()); //5.3)、sku的销售属性信息:pms_sku_sale_attr_value skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities); // //5.4)、sku的优惠、满减等信息;gulimall_sms->sms_sku_laddersms_sku_full_reductionsms_member_price SkuReductionTo skuReductionTo = new SkuReductionTo(); BeanUtils.copyProperties(item,skuReductionTo); skuReductionTo.setSkuId(skuId); if(skuReductionTo.getFullCount() >0 || skuReductionTo.getFullPrice().compareTo(new BigDecimal("0")) == 1){ R r1 = couponFeignService.saveSkuReduction(skuReductionTo); if(r1.getCode() != 0){ log.error("远程保存sku优惠信息失败"); } } }); } }
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/SpuInfoService.java
void savebaseSpuInfo(SpuInfoEntity infoEntity);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/SpuInfoServiceImpl.java
@Override public void savebaseSpuInfo(SpuInfoEntity infoEntity) { this.baseMapper.insert(infoEntity); }2.保存Spu的描述图片
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/SpuInfoDescService.java
void saveSpuInfoDesc(SpuInfoDescEntity descEntity);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/SpuInfoDescServiceImpl.java
@Override public void saveSpuInfoDesc(SpuInfoDescEntity descEntity) { this.baseMapper.insert(descEntity); }3.保存spu的图片集
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/SpuImagesService.java
void saveImages(Long id, Listimages);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/SpuImagesServiceImpl.java
@Override public void saveImages(Long id, List4.保存spu的规格参数images) { if(images == null || images.size() == 0){ }else{ List collect = images.stream().map(img -> { SpuImagesEntity spuImagesEntity = new SpuImagesEntity(); spuImagesEntity.setSpuId(id); spuImagesEntity.setImgUrl(img); return spuImagesEntity; }).collect(Collectors.toList()); this.saveBatch(collect); } }
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/ProductAttrValueService.java
void saveProductAttr(Listcollect);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/ProductAttrValueServiceImpl.java
@Override public void saveProductAttr(List5.保存spu的积分信息(远程调用)collect) { this.saveBatch(collect); }
此处需要调用远程服务
新增新增spu积分传输对象
调用者和被调用者可能都需要这个对象,所以放在gulimall-common模块下
gulimall-common/src/main/java/site/zhourui/common/to/SpuBoundTo.java
调用者
调用者需要开启远程调用@EnableFeignClients
gulimall-product/src/main/java/site/zhourui/gulimall/product/GulimallProductApplication.java
@EnableFeignClients不加属性值会默认扫描主类同级下的所有包下带有@FeignClient的接口,加了会扫描指定包下的所有接口
//@EnableFeignClients @EnableFeignClients("site.zhourui.gulimall.product.feign") @SpringBootApplication @EnableDiscoveryClient public class GulimallProductApplication { public static void main(String[] args) { SpringApplication.run(GulimallProductApplication.class, args); } }
@FeignClient("gulimall-coupon") public interface CouponFeignService { @PostMapping("/coupon/spubounds/save") R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo); }
被调用者
gulimall-coupon/src/main/java/site/zhourui/gulimall/coupon/controller/SpuBoundsController.java
此方法是逆向生成的
@RequestMapping("/save") public R save(@RequestBody SpuBoundsEntity spuBounds){ spuBoundsService.save(spuBounds); return R.ok(); }
gulimall-common/src/main/java/site/zhourui/common/to/SpuBoundTo.java
package site.zhourui.common.to; import lombok.Data; import java.math.BigDecimal; @Data public class SpuBoundTo { private Long spuId; private BigDecimal buyBounds; private BigDecimal growBounds; }
调用者传的参数是SpuBoundTo,被调用者接收的参数是SpuBoundsEntity,这样使用的原因是@RequestBody将对象转化为json,这样只需要属性名相同就可以接收,如果不这样就需要相同的对象才能接收
6.保存当前spu对应的所有sku信息 1.sku的基本信息gulimall-product/src/main/java/site/zhourui/gulimall/product/service/SkuInfoService.java
void saveSkuInfo(SkuInfoEntity skuInfoEntity);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/SkuInfoServiceImpl.java
@Override public void saveSkuInfo(SkuInfoEntity skuInfoEntity) { this.baseMapper.insert(skuInfoEntity); }2.sku的图片信息
保存sku图片信息是利用逆向工程生成的批量保存方法saveBatch
skuImagesService.saveBatch(imagesEntities);3.sku的销售属性信息
保存sku销售属性是利用逆向工程生成的批量保存方法saveBatch
skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);4.sku的优惠、满减等信息(远程调用)
所需to
gulimall-common/src/main/java/site/zhourui/common/to/SkuReductionTo.java
package site.zhourui.common.to; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data public class SkuReductionTo { private Long skuId; private int fullCount; private BigDecimal discount; private int countStatus; private BigDecimal fullPrice; private BigDecimal reducePrice; private int priceStatus; private ListmemberPrice; }
gulimall-coupon/src/main/java/site/zhourui/gulimall/coupon/controller/SpuBoundsController.java
新增方法
@PostMapping("/coupon/skufullreduction/saveinfo") R saveSkuReduction(@RequestBody SkuReductionTo skuReductionTo);
被调用者
gulimall-coupon/src/main/java/site/zhourui/gulimall/coupon/controller/SkuFullReductionController.java
@PostMapping("/saveinfo") public R saveInfo(@RequestBody SkuReductionTo reductionTo){ skuFullReductionService.saveSkuReduction(reductionTo); return R.ok(); }
被调用者中需要实现对优惠信息的保存的接口
gulimall-coupon/src/main/java/site/zhourui/gulimall/coupon/service/SkuFullReductionService.java
新增接口
void saveSkuReduction(SkuReductionTo reductionTo);
gulimall-coupon/src/main/java/site/zhourui/gulimall/coupon/service/impl/SkuFullReductionServiceImpl.java
新增接口实现
@Override public void saveSkuReduction(SkuReductionTo reductionTo) { //1、// //5.4)、sku的优惠、满减等信息;gulimall_sms->sms_sku_laddersms_sku_full_reductionsms_member_price //sms_sku_ladder SkuLadderEntity skuLadderEntity = new SkuLadderEntity(); skuLadderEntity.setSkuId(reductionTo.getSkuId()); skuLadderEntity.setFullCount(reductionTo.getFullCount()); skuLadderEntity.setDiscount(reductionTo.getDiscount()); skuLadderEntity.setAddOther(reductionTo.getCountStatus()); if(reductionTo.getFullCount() > 0){ skuLadderService.save(skuLadderEntity); } //2、sms_sku_full_reduction SkuFullReductionEntity reductionEntity = new SkuFullReductionEntity(); BeanUtils.copyProperties(reductionTo,reductionEntity); if(reductionEntity.getFullPrice().compareTo(new BigDecimal("0"))==1){ this.save(reductionEntity); } //3、sms_member_price List8.分组批量启用模块,及设置模块最大内存 1.分组批量启用模块memberPrice = reductionTo.getMemberPrice(); List collect = memberPrice.stream().map(item -> { MemberPriceEntity priceEntity = new MemberPriceEntity(); priceEntity.setSkuId(reductionTo.getSkuId()); priceEntity.setMemberLevelId(item.getId()); priceEntity.setMemberLevelName(item.getName()); priceEntity.setMemberPrice(item.getPrice()); priceEntity.setAddOther(1); return priceEntity; }).filter(item->{ return item.getMemberPrice().compareTo(new BigDecimal("0")) == 1; }).collect(Collectors.toList()); memberPriceService.saveBatch(collect); }
选着需要批量保存的服务并添加
添加完成后重命名后就可批量启动了
2.设置模块最大使用内存每个模块都设置相同的值
9.新增商品测试 1.mysql设置事务隔离级别(方便事务调试)mysql默认的隔离级别为读已提交,为了能够在调试过程中,获取到数据库中的数据信息,可以调整隔离级别为读未提交:
但是它对于当前的事务窗口生效,如果想要设置全局的,需要加上global字段。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT * FROM `pms_spu_info`
2.数据库自增,存入自己的数据一旦报错了事务回滚了,该条数据就消失了
1.解决方案一比如此处报错信息
Cause: java.sql.SQLException: Field ‘spu_id’ doesn’t have a default value解释:数据库spu_id字段有默认值,但是我们传入了值
原因:数据库spu_id字段设置了自增,但是我们传入了值
将该字段实体类的@TableId加上type = IdType.INPUT,表示可输入
@TableId(type = IdType.INPUT) private Long spuId;2.解决方法二
将该字段的自动递增关闭
3.存入空图片地址问题原因:
前端传入spu图片时没有选中图片时该路径会是空
10.SPU检索 1.检索条件 2.后端增加接口解决保存sku的图片信息时,先筛选一次,imgurl为空的话就不保存了
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/SpuInfoService.java
新增接口
PageUtils queryPageByCondition(Mapparams);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/SpuInfoServiceImpl.java
新增接口实现
@Override public PageUtils queryPageByCondition(Mapparams) { QueryWrapper wrapper = new QueryWrapper<>(); String key = (String) params.get("key"); if(!StringUtils.isEmpty(key)){ wrapper.and((w)->{ w.eq("id",key).or().like("spu_name",key); }); } // status=1 and (id=1 or spu_name like xxx) String status = (String) params.get("status"); if(!StringUtils.isEmpty(status)){ wrapper.eq("publish_status",status); } String brandId = (String) params.get("brandId"); if(!StringUtils.isEmpty(brandId)&&!"0".equalsIgnoreCase(brandId)){ wrapper.eq("brand_id",brandId); } String catelogId = (String) params.get("catelogId"); if(!StringUtils.isEmpty(catelogId)&&!"0".equalsIgnoreCase(catelogId)){ wrapper.eq("catalog_id",catelogId); } IPage page = this.page( new Query ().getPage(params), wrapper ); return new PageUtils(page); }
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/SpuInfoController.java
修改查询方法,调用条件查询
@RequestMapping("/list") //@RequiresPermissions("product:spuinfo:list") public R list(@RequestParam Map3.时间格式问题params){ PageUtils page = spuInfoService.queryPageByCondition(params); return R.ok().put("page", page); }
解决
gulimall-product/src/main/resources/application.yml加上如下配置
该配置会将该模块下的所有时间转化为指定格式
jackson: date-format: yyyy-MM-dd HH:mm:ss4.重启并测试
11.SKU检索 1.检索条件 2.后端新增接口测试结果
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/SkuInfoService.java
新增接口
PageUtils queryPageByCondition(Mapparams);
gulimall-product/src/main/java/site/zhourui/gulimall/product/service/impl/SkuInfoServiceImpl.java
新增接口实现
@Override public PageUtils queryPageByCondition(Mapparams) { QueryWrapper queryWrapper = new QueryWrapper<>(); String key = (String) params.get("key"); if(!StringUtils.isEmpty(key)){ queryWrapper.and((wrapper)->{ wrapper.eq("sku_id",key).or().like("sku_name",key); }); } String catelogId = (String) params.get("catelogId"); if(!StringUtils.isEmpty(catelogId)&&!"0".equalsIgnoreCase(catelogId)){ queryWrapper.eq("catalog_id",catelogId); } String brandId = (String) params.get("brandId"); if(!StringUtils.isEmpty(brandId)&&!"0".equalsIgnoreCase(catelogId)){ queryWrapper.eq("brand_id",brandId); } String min = (String) params.get("min"); if(!StringUtils.isEmpty(min)){ queryWrapper.ge("price",min); } String max = (String) params.get("max"); if(!StringUtils.isEmpty(max) ){ try{ BigDecimal bigDecimal = new BigDecimal(max); if(bigDecimal.compareTo(new BigDecimal("0"))==1){ queryWrapper.le("price",max); } }catch (Exception e){ } } IPage page = this.page( new Query ().getPage(params), queryWrapper ); return new PageUtils(page); }
gulimall-product/src/main/java/site/zhourui/gulimall/product/controller/SkuInfoController.java
修改list方法
@RequestMapping("/list") //@RequiresPermissions("product:skuinfo:list") public R list(@RequestParam Map3.重启并测试params){ PageUtils page = skuInfoService.queryPageByCondition(params); return R.ok().put("page", page); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)