shop--9.商品--商品编辑--修改(后端)

1.首先获取店铺下的商品信息

dao层

/**
     * 由商品Id获取商品信息
     * @param productId
     * @return
     */
    Product queryProductByproductId(Long productId);

  

dao.xml

要重新定义resultMap

因为返回的商品详情图片是一个List,所以要用collection来进行定义,而且在进行数据查询时,要使用多表连接的功能

<resultMap id="productMap" type="com.shop.bean.Product">
        <id column="product_id" property="productId"/>
        <result column="product_name" property="productName"/>
        <result column="product_desc" property="productDesc"/>
        <result column="img_addr" property="imgAddr"/>
        <result column="normal_price" property="normalPrice"/>
        <result column="promotion_price" property="promotionPrice"/>
        <result column="priority" property="priority"/>
        <result column="create_time" property="createTime"/>
        <result column="last_edit_time" property="lastEditTime"/>
        <result column="status" property="status"/>
        <association column="product_category_id" property="productCategory"
                     javaType="com.shop.bean.ProductCategory">
            <id column="product_category_id" property="productCategoryId"/>
            <result column="product_category_name" property="productCategoryName"/>
        </association>
        <association column="shop_id" property="shop" javaType="com.shop.bean.Shop">
            <id column="shop_id" property="shopId"/>
            <result column="shop_name" property="shopName"/>
            <result column="owner_id" property="ownerId"/>
        </association>
        <collection column="product_id" property="productImgList" ofType="com.shop.bean.ProductImg">
            <id column="product_img_id" property="productImgId"/>
            <result column="img_addr" property="imgAddr"/>
            <result column="img_desc" property="imgDesc"/>
            <result column="priority" property="priority"/>
            <result column="create_time" property="createTime"/>
            <result column="product_id" property="productId"/>
        </collection>
    </resultMap>

  

<select id="queryProductByproductId" resultMap="productMap">
        SELECT
        p.product_id,
        p.product_name,
        p.product_desc,
        p.img_addr,
        p.normal_price,
        p.promotion_price,
        p.priority,
        p.create_time,
        p.last_edit_time,
        p.status,
        p.product_category_id,
        p.shop_id,
        pm.product_img_id,
        pm.img_addr,
        pm.img_desc,
        pm.priority,
        pm.create_time,
        pm.product_id
        FROM
        product p
        LEFT JOIN
        product_img pm
        ON
        p.product_id=pm.product_id
        WHERE p.product_id=#{productId}
        ORDER BY
        pm.priority DESC
    </select>

  

service

 /**
     * 由商品Id获取商品信息
     * @param productId
     * @return
     */
    Product getProductByProductId(Long productId);

  

    /**
     * 由商品Id获取商品信息
     * @param productId
     * @return
     */
    @Override
    public Product getProductByProductId(Long productId) {
        return productDao.queryProductByproductId( productId );
    }

  

controller层

@RequestMapping(value="getproductbyid", method=RequestMethod.GET)
    @ResponseBody
    public Map<String, Object> getProductById(@RequestParam Long productId){
        Map<String, Object> modelMap = new HashMap<>();
        //Long productId = HttpServletRequestUtil.getLong( request, "productId" );
        if(productId > 0){
            //获取商品Id的商品信息
            Product product = productService.getProductByProductId( productId );
            //获取该店铺下的商品类别列表
            List<ProductCategory> productCategoryList =
                    productCategoryService.getProductCategoryList( product.getShop().getShopId() );
            modelMap.put("success", true);
            modelMap.put( "product", product );
            modelMap.put( "productCategoryList", productCategoryList );
        } else{
            modelMap.put( "success", false );
            modelMap.put( "errMsg", "empty productId" );
        }
        return modelMap;
    }

  

2.新传入的图片(缩略图或详情图)都会覆盖(删除)掉原来的图片

dao层

/**
     * 根据productId获取商品详情图片列表
     * @param productId
     * @return
     */
    List<ProductImg> queryProductImgByProductId(Long productId);

    /**
     * 根据传入的productImgId删除所有商品详情图片
     * @param productId
     * @return
     */
    int deleteProductImgByProductId(Long productId);

  

<!--List<ProductImg> queryProductImgByProductId(Long productId);-->
    <select id="queryProductImgByProductId" resultType="com.shop.bean.ProductImg">
        SELECT
        product_img_id,
        img_addr
        FROM
        product_img
        WHERE
        product_id=#{productId}
    </select>

    <!--int deleteProductImgByProductId(Long productId);-->
    <delete id="deleteProductImgByProductId" parameterType="java.lang.Long">
        DELETE FROM product_img WHERE product_id=#{productId}
    </delete>

3.点击提交按钮之后,提交到后台,修改数据库中的信息

dao层

/**
     * 更新商品信息
     * @param product
     * @return
     */
    int updateProduct(Product product);

  

<update id="updateProduct" parameterType="com.shop.bean.Product">
        UPDATE product
        <set>
            <if test="productName != null">product_name=#{productName},</if>
            <if test="productDesc != null">product_desc=#{productDesc},</if>
            <if test="imgAddr != null">img_addr=#{imgAddr},</if>
            <if test="normalPrice != null">normal_price=#{normalPrice},</if>
            <if test="promotionPrice != null">promotion_price=#{promotionPrice},</if>
            <if test="lastEditTime != null">last_edit_time=#{lastEditTime},</if>
            <if test="status != null">status=#{status},</if>
            <if test="productCategory != null
            and productCategory.productCategoryId != null">product_category_id=#{productCategory.productCategoryId}</if>
        </set>
        WHERE product_id=#{productId}
        AND shop_id=#{shop.shopId}
    </update>

  

service

/**
     * 修改商品信息
     *1.若缩略图参数有值,则处理缩略图
     * 若原来存在缩略图,则先删除文件夹下的缩略图,然后再获取新的缩略图相对路径,并赋值给product
     * 2.若商品详情列表有值,则再处理商品详情图,删除文件夹下的商品详情图
     * 3.将product_img数据库中的商品记录删除
     * 4.更新数据库product_img和product的信息
     * @param product
     * @return
     */
    @Override
    @Transactional
    public ProductExecution modifyProduct(Product product, CommonsMultipartFile thumbnail, List<CommonsMultipartFile> productImgList)
            throws ProductOperationException {
        if(product != null && product.getShop() != null && product.getShop().getShopId() != null){
            try{
                //如果商品缩略图改变了的话,就将原来的商品缩略图删除,再放入新的
                if(thumbnail != null){
                    //从数据库获取传入的商品信息
                    Product tempProduct = productDao.queryProductByproductId( product.getProductId() );
                    //首先判断是否存在根据商品Id有当前要插入的商品信息
                    if(tempProduct != null && tempProduct.getImgAddr() != null){
                        ImageUtil.deleteFileOrPath( tempProduct.getImgAddr() );
                    }
                    addThumbnail( product, thumbnail );
                }

                //如果添加了商品详情图的话,就把原来的商品详情图删掉,再加入新的
                if(productImgList != null && productImgList.size() > 0){
                    deleteProductImgList(product.getProductId());
                    addProductImgList( product, productImgList );
                }
                //添加商品信息中必要的部分
                product.setLastEditTime( new Date(  ) );
                int effectNum = productDao.updateProduct( product );
                if(effectNum > 0){
                    product = productDao.queryProductByproductId( product.getProductId() );
                    return new ProductExecution(ProductStateEnum.SUCCESS, product);
                } else{
                    return new ProductExecution( ProductStateEnum.INNER_ERROR );
                }
            }catch(ProductOperationException e){
                throw new ProductOperationException( "modify product error : " + e.getMessage() );
            }
        } else{
            return new ProductExecution(ProductStateEnum.EMPTY);
        }
    }

  

/**
     * 将商品缩略图添加到用户相对的文件夹下,并将店铺信息中的商品图片信息更新
     * @param product
     * @param thumbnail
     */
    private void addThumbnail(Product product, CommonsMultipartFile thumbnail){
        //获取缩略图的存储途径,直接存储在店铺的文件夹下
        String relativeImgPath = PathUtil.getShopImgPath(product.getShop().getShopId());
        String realRelativeImgPath = ImageUtil.generateThumbnail(thumbnail, relativeImgPath);
        product.setImgAddr( realRelativeImgPath );
    }


/**
     * 批量添加商品详情图片到用户相对的文件夹下,并将其批量插入到数据库中
     * @param product
     * @param productImgList
     */
    private void addProductImgList(Product product, List<CommonsMultipartFile> productImgList){
        //获取图片的存储途径,直接存储在店铺的文件夹下
        String relativeImgPath = PathUtil.getShopImgPath( product.getShop().getShopId() );
        List<ProductImg> productImgs = new ArrayList<>();

        //遍历图片列表进行处理,并且将结果添加到productImgs中
        for(CommonsMultipartFile proImg : productImgList){
            String imgAddr = ImageUtil.generateNormalImg(proImg, relativeImgPath);
            ProductImg productImg = new ProductImg();
            productImg.setImgAddr( imgAddr );
            productImg.setProductId(product.getProductId());
            productImg.setCreateTime( new Date(  ) );
            productImgs.add( productImg );
        }
        if(productImgs.size() > 0){
            try{
                int effectNum = productImgDao.batchInsertProductImg( productImgs );
                if(effectNum <= 0){
                    throw new ProductOperationException("创建商品详情图片失败");
                }
            } catch(Exception e){
                throw new ProductOperationException("创建商品详情图片失败" + e.toString());
            }
        }
    }

  

private void deleteProductImgList(Long productId){
        //从prodcut_img数据库中获取product_id为productId的
        List<ProductImg> productImgList = productImgDao.queryProductImgByProductId(productId);
        if(productImgList != null && productImgList.size() > 0){
            for(ProductImg tempProductImg : productImgList){
                ImageUtil.deleteFileOrPath( tempProductImg.getImgAddr() );
            }
            //删除数据库中原有的照片
            productImgDao.deleteProductImgByProductId( productId );
        }
    }

  

controller层

@RequestMapping(value="/modifyproduct", method=RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> modifyProduct(HttpServletRequest request){
        Map<String, Object> modelMap = new HashMap<>();
        //校验验证码
        //验证码校验
        if(!CodeUtil.checkVerifyCode(request)){
            modelMap.put( "success", false );
            modelMap.put( "errMsg", "验证码错误" );
            return modelMap;
        }

        //接收前端传来的参数:商品信息,缩略图,商品详情图片
        ObjectMapper objectMapper = new ObjectMapper(  );
        Product product = null;
        String productStr = HttpServletRequestUtil.getString( request, "productStr" );

        CommonsMultipartFile thumbnail = null;
        List<CommonsMultipartFile> productImgList = new ArrayList<>();
        //在本次会话的上下文session中获取上传的文件
        CommonsMultipartResolver commonsMultipartResolver =
                new CommonsMultipartResolver(request.getSession().getServletContext());

        //如果有缩略图,商品详情图的话,就赋值给相应的变量,没有的话,就不管
        if(commonsMultipartResolver.isMultipart( request )){
            MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
            thumbnail = (CommonsMultipartFile) multipartHttpServletRequest.getFile("thumbnail");
            for(int i = 0; i < MAXIMAGECOUNT; i++){
                CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile( "productImg" + i);
                if(commonsMultipartFile != null){
                    productImgList.add( commonsMultipartFile );
                } else{
                    break;
                }
            }
        }

        //从ProductStr字符串中,利用ObjectMapper将productStr转化为其Product实体类
        try{
            product = objectMapper.readValue(productStr, Product.class);
        } catch (Exception e) {
            modelMap.put( "success", false );
            modelMap.put("errMsg", e.toString());
            return modelMap;
        }

        //如果product不是null,则进行商品修改
        if(product != null){
            try{
                Shop shop = new Shop();
                shop.setShopId( 1L );
                product.setShop(shop);

                ProductExecution productExecution = productService.modifyProduct( product, thumbnail, productImgList );
                if(productExecution.getState() == ProductStateEnum.SUCCESS.getState()){
                    modelMap.put("success", true);
                } else{
                    modelMap.put( "success", false );
                    modelMap.put( "errMsg", productExecution.getStateInfo() );
                }
            }catch(RuntimeException e){
                modelMap.put( "success", false );
                modelMap.put( "errMsg", e.toString() );
                return modelMap;
            }
        } else{
            modelMap.put( "success", false );
            modelMap.put( "errMsg", "请输入商品信息");
        }
        return modelMap;
    }

  

原文地址:https://www.cnblogs.com/SkyeAngel/p/9000103.html