首页 > 其他 > 详细

校园商铺-8商品模块-7商品编辑之后段开发下

时间:2020-03-16 22:38:02      阅读:60      评论:0      收藏:0      [点我收藏+]

1.商品编辑之Service层

这里需要2个接口方法:

  • getProductById:去编辑之前先获取商品的信息
  • modifyProduct:修改商品
package com.csj2018.o2o.service;

import java.util.List;

import com.csj2018.o2o.dto.ImageHolder;
import com.csj2018.o2o.dto.ProductExecution;
import com.csj2018.o2o.entity.Product;
import com.csj2018.o2o.exceptions.ProductOperationException;

public interface ProductService {
    /**
     * 查询商品列表并分页,可输入的条件有:商品名(模糊),商品状态,店铺id,商品类别
     * @param productCondition
     * @param pageIndex
     * @param pageSize
     * @return
     */
    ProductExecution getProductList(Product productCondition, int pageIndex, int pageSize);
    /**
     * 通过商品id查询唯一的商品信息
     * @param productId
     * @return
     */
    Product getProductById(long productId);
    /**
     * 添加商品信息以及图片处理
     * @param product
     * @param thumbnail 缩略图
     * @param productImgList 详情图
     * @return
     * @throws ProductOperationException
     */
    ProductExecution addProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgList) throws ProductOperationException;
    /**
     * 修改商品信息以及图片处理
     * @param product
     * @param thumbnail
     * @param productImgList
     * @return
     * @throws ProductOperationException
     */
    ProductExecution modifyProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgList) throws ProductOperationException;
}

2.商品编辑Service实现类

package com.csj2018.o2o.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.csj2018.o2o.dao.ProductDao;
import com.csj2018.o2o.dao.ProductImgDao;
import com.csj2018.o2o.dto.ImageHolder;
import com.csj2018.o2o.dto.ProductExecution;
import com.csj2018.o2o.entity.Product;
import com.csj2018.o2o.entity.ProductImg;
import com.csj2018.o2o.enums.ProductStateEnum;
import com.csj2018.o2o.exceptions.ProductOperationException;
import com.csj2018.o2o.service.ProductService;
import com.csj2018.o2o.util.*;

@Service
public class ProductServiceImpl implements ProductService{
    @Autowired
    private ProductDao productDao;
    @Autowired
    private ProductImgDao productImgDao;
    /*
     * 1.处理缩略图,获取缩略图相对路径并赋值给product
     * 2.往tb_product写入商品信息,获取productId
     * 3.结合productId批量处理商品详情图
     * 4.将商品详情图列表批量插入tb_product_img中
     * 通过spring的事务管理去执行这4不操作,任何一步出错就回滚,不会往表里写入
     */
    @Override
    @Transactional
    public ProductExecution addProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgHolderList)
            throws ProductOperationException {
        //空值判断
        if(product != null && product.getShop() != null && product.getShop().getShopId() != null) {
            //给商品设置默认属性
            product.setCreateTime(new Date());
            product.setLastEditTime(new Date());
            //默认为上架的状态
            product.setEnableStatus(1);
            //若商品缩略图不为空,则添加缩略图信息到商品
            if(thumbnail != null) {
                addThumbnail(product,thumbnail);
            }
            try {
                int effectedNum = productDao.insertProduct(product);
                if(effectedNum <= 0) {
                    throw new ProductOperationException("创建商品失败");
                }
            }catch (Exception e) {
                throw new ProductOperationException("创建商品失败:"+e.toString());
            }
            //若商品详情图不为空,则向tb_product_img添加商品详情图
            if(productImgHolderList != null && productImgHolderList.size() >0) {
                addProductImgList(product,productImgHolderList);
            }
            return new ProductExecution(ProductStateEnum.SUCCESS,product);
        }else {
            //传参为空,则返回控制错误信息
            return new ProductExecution(ProductStateEnum.EMPTY);
        }
    }
    /**
     * 向product对象添加缩略图
     * @param product
     * @param thumbnail
     */
    private void addThumbnail(Product product, ImageHolder thumbnail) {
        String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
        String thumbnailAddr = ImageUtil.generateThumbnail(thumbnail, dest);
        product.setImgAddr(thumbnailAddr);
    }
    private void addProductImgList(Product product, List<ImageHolder> productImgHolderList) {
        //获取图片存储路径,这里直接存放到相应店铺的文件夹下,同缩略图
        String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
        List<ProductImg> productImgList = new ArrayList<ProductImg>();
        //遍历,获得详情图片列表
        for(ImageHolder productImgHolder:productImgHolderList) {
            String imgAddr = ImageUtil.generateNormalImg(productImgHolder, dest);
            ProductImg productImg = new ProductImg();
            productImg.setImgAddr(imgAddr);
            productImg.setProductId(product.getProductId());
            productImg.setCreateTime(new Date());
            productImgList.add(productImg);
        }
        if(productImgList.size() > 0) {
            try {
                int effectedNum = productImgDao.batchInsertProductImg(productImgList);
                if(effectedNum <= 0) {
                    throw new ProductOperationException("创建商品详情图片失败");
                }
            }catch (Exception e) {
                throw new ProductOperationException("创建商品详情图片失败:"+e.toString());
            }
        }
    }
    @Override
    public ProductExecution getProductList(Product productCondition, int pageIndex, int pageSize) {
        // TODO Auto-generated method stub
        return null;
    }
    @Override
    public Product getProductById(long productId) {
        return productDao.queryProductById(productId);
    }
    //1.若缩略图参数有值,则处理缩略图
    //2.若原先存在缩略图则先删除再添加新图,之后获取缩略图相对路径并赋值给product
    //3.将tb_product_img下面的该商品原先的商品详情记录全部清除
    //4.更新tb_product,tb_product_img的信息
    @Override
    @Transactional
    public ProductExecution modifyProduct(Product product, ImageHolder thumbnail, List<ImageHolder> productImgList)
            throws ProductOperationException {
        //空值判断。存放商品缩略图和详情图需要用到shopId做路径,因此需要针对shop做空值判断
        if(product != null && product.getShop() != null && product.getShop().getShopId() != null) {
            //给商品设置添加默认属性
            product.setLastEditTime(new Date());
            //若商品缩略图不为空且原有缩略图不为空,则删除原有缩略图并添加
            if(thumbnail != null) {
                //先获取一遍原有信息,因为原来的信息里有原图片地址
                Product tempProduct = productDao.queryProductById(product.getProductId());
                if(tempProduct.getImgAddr() != null) {
                    //从磁盘中删除缩略图
                    ImageUtil.deleteFileOfPath(tempProduct.getImgAddr());
                }
                addThumbnail(product,thumbnail);
            }
            //如果有新存入的商品详情图,则将原先的删除,并添加新的图片
            if(productImgList != null && productImgList.size() > 0) {
                deleteProductImgList(product.getProductId());
                addProductImgList(product,productImgList);
            }
            try {
                //更新商品信息
                int effectedNum = productDao.updateProduct(product);
                if(effectedNum <= 0) {
                    throw new ProductOperationException("更新商品信息失败");
                }
                return new ProductExecution(ProductStateEnum.SUCCESS,product);
            }catch (Exception e) {
                throw new ProductOperationException("更新商品信息失败:"+e.toString());
            }
        }else {
            return new ProductExecution(ProductStateEnum.EMPTY);
        }
    }
    /**
     * 删除某个商品下的所有详情图
     * @param productId
     */
    private void deleteProductImgList(long productId) {
        //根据productId获取原来的图片
        List<ProductImg> productImgList = productImgDao.queryProductImgList(productId);
        //从磁盘删除原来的图片
        for(ProductImg productImg:productImgList) {
            ImageUtil.deleteFileOfPath(productImg.getImgAddr());
        }
        //从数据库删除原有图片的信息
        productImgDao.deleteProductImgByProductId(productId);
    }
}

3.针对修改商品方法的单元测试

package com.csj2018.o2o.service;

import static org.junit.Assert.assertEquals;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.junit.Ignore;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.csj2018.o2o.BaseTest;
import com.csj2018.o2o.dto.ImageHolder;
import com.csj2018.o2o.dto.ProductExecution;
import com.csj2018.o2o.entity.Product;
import com.csj2018.o2o.entity.ProductCategory;
import com.csj2018.o2o.entity.Shop;
import com.csj2018.o2o.enums.ProductStateEnum;
import com.csj2018.o2o.exceptions.ProductOperationException;
import com.csj2018.o2o.exceptions.ShopOperationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ProductServiceTest extends BaseTest{
    @Autowired
    private ProductService productService;
    @Test
    @Ignore
    public void testAddProduct() throws ProductOperationException,FileNotFoundException{
        //创建shopID为1且productCategory为1的商品实例,并给其成员变量赋值
        Product product = new Product();
        Shop shop = new Shop();
        shop.setShopId(1L);
        ProductCategory pc = new ProductCategory();
        pc.setProductCategoryId(10L);
        product.setShop(shop);
        product.setProductCategory(pc);
        product.setProductName("测试商品1");
        product.setProductDesc("测试商品1");
        product.setPriority(20);
        product.setCreateTime(new Date());
        product.setEnableStatus(1);
        //创建缩略图
        File thumbnailFile = new File("/Users/chenshanju/Downloads/Y61.jpeg");
        InputStream is = new FileInputStream(thumbnailFile);
        ImageHolder thumbnail = new ImageHolder(thumbnailFile.getName(),is);
        //创建2个详情图片
        File productImg1 = new File("/Users/chenshanju/Downloads/Prado.jpg");
        InputStream is1 = new FileInputStream(thumbnailFile);
        File productImg2 = new File("/Users/chenshanju/Downloads/Pajero.jpg");
        InputStream is2 = new FileInputStream(thumbnailFile);
        List<ImageHolder> productImgList = new ArrayList<ImageHolder>();
        productImgList.add(new ImageHolder(productImg1.getName(),is1));
        productImgList.add(new ImageHolder(productImg2.getName(),is2));
        
        ProductExecution pe = productService.addProduct(product, thumbnail, productImgList);
        assertEquals(ProductStateEnum.SUCCESS.getState(),pe.getState());
    }
    @Test
    public void testModifyProduct() throws ShopOperationException,FileNotFoundException{
        //创建shopId为1且productCategory为1的商品示例,并给其成员变量赋值
        Product product = new Product();
        Shop shop = new Shop();
        shop.setShopId(1L);
        ProductCategory pc = new ProductCategory();
        pc.setProductCategoryId(12L);
        product.setProductId(1L);
        product.setShop(shop);
        product.setProductCategory(pc);
        product.setProductName("正式的商品");
        product.setProductDesc("正式的商品");
        //创建缩略图文件流
        File thumbnailFile = new File("/Users/chenshanju/Downloads/tq91.jpg");
        InputStream is = new FileInputStream(thumbnailFile);
        ImageHolder thumbnail = new ImageHolder(thumbnailFile.getName(),is);
        //创建2个商品详情图文件流并将它们添加到详情图列表中
        File productImg1 = new File("/Users/chenshanju/Downloads/Pajero.jpg");
        InputStream is1 = new FileInputStream(productImg1);
        File productImg2 = new File("/Users/chenshanju/Downloads/Prado.jpg");
        InputStream is2 = new FileInputStream(productImg2);
        List<ImageHolder> productImgList = new ArrayList<>();
        productImgList.add(new ImageHolder(productImg1.getName(),is1));
        productImgList.add(new ImageHolder(productImg2.getName(),is2));
        //添加商品并验证
        ProductExecution pe = productService.modifyProduct(product, thumbnail, productImgList);
        assertEquals(ProductStateEnum.SUCCESS.getState(),pe.getState());
    }
}

技术分享图片

校园商铺-8商品模块-7商品编辑之后段开发下

原文:https://www.cnblogs.com/csj2018/p/12506506.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!