zoukankan      html  css  js  c++  java
  • 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;
        }
    

      

  • 相关阅读:
    扫面线模板
    (动态规划、栈)leetcode 84. Largest Rectangle in Histogram, 85. Maximal Rectangle
    tmux 常见命令汇总
    leetcode 221
    leetcode 319 29
    (贪心)leetcode 392. Is Subsequence, 771. Jewels and Stones, 463. Island Perimeter
    leetcode 982 668
    Python import 同文件夹下的py文件的函数,pycharm报错
    Windows里Anaconda-Navigator无法打开的解决方案
    Windows下 gpu版 Tensorflow 安装
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/9000103.html
Copyright © 2011-2022 走看看