From e9d284f5950d70fa8b609135688847c4c5fa2a28 Mon Sep 17 00:00:00 2001 From: Junling Bu Date: Sun, 1 Dec 2019 22:26:59 +0800 Subject: [PATCH] fix[litemall-admin, litemall-admin-api]: #293 --- .../admin/service/AdminGoodsService.java | 83 ++++--- .../admin/web/AdminGoodsController.java | 5 +- litemall-admin/src/views/goods/create.vue | 76 +++--- litemall-admin/src/views/goods/edit.vue | 229 +++++++----------- litemall-admin/src/views/goods/list.vue | 22 +- .../litemall/core/express/ExpressService.java | 8 +- .../db/service/LitemallCartService.java | 12 + .../LitemallGoodsAttributeService.java | 5 + .../service/LitemallGoodsProductService.java | 5 + .../db/service/LitemallGoodsService.java | 5 +- .../LitemallGoodsSpecificationService.java | 5 + 11 files changed, 239 insertions(+), 216 deletions(-) diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java index 03c1504b..1ebee041 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/service/AdminGoodsService.java @@ -37,13 +37,14 @@ public class AdminGoodsService { private LitemallCategoryService categoryService; @Autowired private LitemallBrandService brandService; - + @Autowired + private LitemallCartService cartService; @Autowired private QCodeService qCodeService; - public Object list(String goodsSn, String name, + public Object list(Integer goodsId, String goodsSn, String name, Integer page, Integer limit, String sort, String order) { - List goodsList = goodsService.querySelective(goodsSn, name, page, limit, sort, order); + List goodsList = goodsService.querySelective(goodsId, goodsSn, name, page, limit, sort, order); return ResponseUtil.okList(goodsList); } @@ -119,19 +120,25 @@ public class AdminGoodsService { /** * 编辑商品 - *

- * TODO - * 目前商品修改的逻辑是 - * 1. 更新litemall_goods表 - * 2. 逻辑删除litemall_goods_specification、litemall_goods_attribute、litemall_goods_product - * 3. 添加litemall_goods_specification、litemall_goods_attribute、litemall_goods_product - *

- * 这里商品三个表的数据采用删除再添加的策略是因为 - * 商品编辑页面,支持管理员添加删除商品规格、添加删除商品属性,因此这里仅仅更新是不可能的, - * 只能删除三个表旧的数据,然后添加新的数据。 - * 但是这里又会引入新的问题,就是存在订单商品货品ID指向了失效的商品货品表。 - * 因此这里会拒绝管理员编辑商品,如果订单或购物车中存在商品。 - * 所以这里可能需要重新设计。 + * + * NOTE: + * 由于商品涉及到四个表,特别是litemall_goods_product表依赖litemall_goods_specification表, + * 这导致允许所有字段都是可编辑会带来一些问题,因此这里商品编辑功能是受限制: + * (1)litemall_goods表可以编辑字段; + * (2)litemall_goods_specification表只能编辑pic_url字段,其他操作不支持; + * (3)litemall_goods_product表只能编辑price, number和url字段,其他操作不支持; + * (4)litemall_goods_attribute表支持编辑、添加和删除操作。 + * + * NOTE2: + * 前后端这里使用了一个小技巧: + * 如果前端传来的update_time字段是空,则说明前端已经更新了某个记录,则这个记录会更新; + * 否则说明这个记录没有编辑过,无需更新该记录。 + * + * NOTE3: + * (1)购物车缓存了一些商品信息,因此需要及时更新。 + * 目前这些字段是goods_sn, goods_name, price, pic_url。 + * (2)但是订单里面的商品信息则是不会更新。 + * 如果订单是未支付订单,此时仍然以旧的价格支付。 */ @Transactional public Object update(GoodsAllinone goodsAllinone) { @@ -145,8 +152,6 @@ public class AdminGoodsService { LitemallGoodsSpecification[] specifications = goodsAllinone.getSpecifications(); LitemallGoodsProduct[] products = goodsAllinone.getProducts(); - Integer id = goods.getId(); - //将生成的分享图片地址写入数据库 String url = qCodeService.createGoodShareImage(goods.getId().toString(), goods.getPicUrl(), goods.getName()); goods.setShareUrl(url); @@ -157,26 +162,42 @@ public class AdminGoodsService { } Integer gid = goods.getId(); - specificationService.deleteByGid(gid); - attributeService.deleteByGid(gid); - productService.deleteByGid(gid); // 商品规格表litemall_goods_specification for (LitemallGoodsSpecification specification : specifications) { - specification.setGoodsId(goods.getId()); - specificationService.add(specification); - } - - // 商品参数表litemall_goods_attribute - for (LitemallGoodsAttribute attribute : attributes) { - attribute.setGoodsId(goods.getId()); - attributeService.add(attribute); + // 目前只支持更新规格表的图片字段 + if(specification.getUpdateTime() == null){ + specification.setSpecification(null); + specification.setValue(null); + specificationService.updateById(specification); + } } // 商品货品表litemall_product for (LitemallGoodsProduct product : products) { - product.setGoodsId(goods.getId()); - productService.add(product); + if(product.getUpdateTime() == null) { + productService.updateById(product); + } + } + + // 商品参数表litemall_goods_attribute + for (LitemallGoodsAttribute attribute : attributes) { + if (attribute.getId() == null || attribute.getId().equals(0)){ + attribute.setGoodsId(goods.getId()); + attributeService.add(attribute); + } + else if(attribute.getDeleted()){ + attributeService.deleteByGid(attribute.getId()); + } + else if(attribute.getUpdateTime() == null){ + attributeService.updateById(attribute); + } + } + + // 这里需要注意的是购物车litemall_cart有些字段是拷贝商品的一些字段,因此需要及时更新 + // 目前这些字段是goods_sn, goods_name, price, pic_url + for (LitemallGoodsProduct product : products) { + cartService.updateProduct(product.getId(), goods.getGoodsSn(), goods.getName(), product.getPrice(), product.getUrl()); } return ResponseUtil.ok(); diff --git a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java index edf2792a..c0fe6de0 100644 --- a/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java +++ b/litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminGoodsController.java @@ -27,6 +27,7 @@ public class AdminGoodsController { /** * 查询商品 * + * @param goodsId * @param goodsSn * @param name * @param page @@ -38,12 +39,12 @@ public class AdminGoodsController { @RequiresPermissions("admin:goods:list") @RequiresPermissionsDesc(menu = {"商品管理", "商品管理"}, button = "查询") @GetMapping("/list") - public Object list(String goodsSn, String name, + public Object list(Integer goodsId, String goodsSn, String name, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer limit, @Sort @RequestParam(defaultValue = "add_time") String sort, @Order @RequestParam(defaultValue = "desc") String order) { - return adminGoodsService.list(goodsSn, name, page, limit, sort, order); + return adminGoodsService.list(goodsId, goodsSn, name, page, limit, sort, order); } @GetMapping("/catAndBrand") diff --git a/litemall-admin/src/views/goods/create.vue b/litemall-admin/src/views/goods/create.vue index babd012c..8e69634c 100644 --- a/litemall-admin/src/views/goods/create.vue +++ b/litemall-admin/src/views/goods/create.vue @@ -5,10 +5,10 @@

商品介绍

- + - + @@ -46,9 +46,10 @@ :headers="headers" :on-success="uploadPicUrl" class="avatar-uploader" - accept=".jpg,.jpeg,.png,.gif"> + accept=".jpg,.jpeg,.png,.gif" + > - + @@ -62,13 +63,14 @@ :on-remove="handleRemove" multiple accept=".jpg,.jpeg,.png,.gif" - list-type="picture-card"> - + list-type="picture-card" + > + - + @@ -82,26 +84,27 @@ class="input-new-keyword" @keyup.enter.native="handleInputConfirm" - @blur="handleInputConfirm"/> + @blur="handleInputConfirm" + /> + 增加 - + - + - + - + @@ -121,7 +124,7 @@ - + - - + +