zoukankan      html  css  js  c++  java
  • 校园商铺-8商品模块-7商品编辑之后段开发上

    1.商品编辑页面

    1.1如何处理已存在的图片

    教程给出的方案是只要上传新的图片,就会将缩略图、商品详情图删除。
    因为缩略图是存在与商品中的,所以只需要判断缩略图不为空即可。
    详情图的处理过于简单粗暴,不会用于真实生产环境。

    1.2操作步骤

    1.获取商品信息
    2.传入新的图片,就会将已存在的商品详情图、缩略图删除
    3.点击提交,修改店铺信息

    2.Dao层

    Dao层已在校园商铺-8商品模块-1商品添加之Dao层建立。而商品图片Dao层及实现,单元测试都已完成。只剩商品Dao层的实现

    // ProductDao 
     
        /**
         * 通过productId查询唯一的商品信息
         * @param productId
         * @return
         */
        Product queryProductById(Long productId);
        /**
         * 更新商品信息
         * @param product
         * @return
         */
        int updateProduct(Product product);
    
    //ProductImgDao 
    
        /**
         * 删除指定商品下的所有详情图
         * @param productId
         * @return
         */
        int deleteProductImgByProductId(long productId);
    
    

    2.1 商品层的实现

    ProductDao.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
     <mapper namespace="com.csj2018.o2o.dao.ProductDao"><!-- 对应接口类名 -->
     	<resultMap id="productMap" type="com.csj2018.o2o.entity.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="enable_status" property="enableStatus" />
     		<association property="productCategory" column="product_category_id" javaType="com.csj2018.o2o.entity.ProductCategory">
     			<id column="product_category_id" property="productCategoryId" />
     			<result column="product_category_name" property="productCategoryName" />
     		</association>
     		<collection property="productImgList" column="product_id" ofType="com.csj2018.o2o.entity.ProductImg">
     			<id column="product_img_id" property="productImgId" />
     			<result column="detail_img" 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="queryProductById" resultMap="productMap" parameterType="long">
     		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.enable_status, p.product_category_id, p.shop_id,
     		pm.product_img_id, pm.img_addr as detail_img, pm.img_desc, pm.priority, pm.create_time
     		from tb_product p left join tb_product_img pm 
     		on p.product_id = pm.product_id
     		where p.product_id = #{productId}
     		order by pm.priority desc
     	</select>
     	<update id="updateProduct" parameterType="com.csj2018.o2o.entity.Product" keyProperty="product_id" useGeneratedKeys="true">
     		update tb_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 = #{promotion_price},</if>
     			<if test="priority != null">priority = #{priority},</if>
     			<if test="lastEditTime != null">last_edit_time = #{lastEditTime},</if>
     			<if test="enableStatus != null">enable_status = #{enableStatus},</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}<!--shop_id = #{shop.shopId}保证了不会操作别的店铺的商品 -->
     	</update>
        <insert id="insertProduct" parameterType="com.csj2018.o2o.entity.Product" useGeneratedKeys="true" keyProperty="productId" keyColumn="product_id">
            insert into tb_product(
                product_name,product_desc,img_addr,normal_price,promotion_price,
                priority,create_time,last_edit_time,enable_status,product_category_id,shop_id
            )values(
                #{productName},#{productDesc},#{imgAddr},#{normalPrice},#{promotionPrice},
                #{priority},#{createTime},#{lastEditTime},#{enableStatus},#{productCategory.productCategoryId},#{shop.shopId}
            )
        </insert>
        
     </mapper>
    

    3. Dao层单元测试

    3.1 商品Dao层单元测试

    package com.csj2018.o2o.dao;
    
    
    import static org.junit.Assert.assertEquals;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import org.junit.FixMethodOrder;
    import org.junit.Ignore;
    import org.junit.Test;
    import org.junit.runners.MethodSorters;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import com.csj2018.o2o.BaseTest;
    import com.csj2018.o2o.entity.Product;
    import com.csj2018.o2o.entity.ProductCategory;
    import com.csj2018.o2o.entity.ProductImg;
    import com.csj2018.o2o.entity.Shop;
    
    @FixMethodOrder(MethodSorters.NAME_ASCENDING)
    public class ProductDaoTest extends BaseTest{
    	@Autowired
    	private ProductDao productDao;
    	@Autowired
    	private ProductImgDao productImgDao;
    	
    	@Test
    	@Ignore
    	public void testAInsertProduct() throws Exception{
    		Shop shop1 = new Shop();
    		shop1.setShopId(1L);
    		ProductCategory pc1 = new ProductCategory();
    		pc1.setProductCategoryId(10L);
    		Product product1 = new Product();
    		product1.setProductName("商品1");
    		product1.setProductDesc("商品1的描述");
    		product1.setImgAddr("商品1的缩略图");
    		product1.setPriority(1);
    		product1.setEnableStatus(1);
    		product1.setCreateTime(new Date());
    		product1.setLastEditTime(new Date());
    		product1.setShop(shop1);
    		product1.setProductCategory(pc1);
    		
    		Product product2 = new Product();
    		product2.setProductName("商品2");
    		product2.setProductDesc("商品2的描述");
    		product2.setImgAddr("商品2的缩略图");
    		product2.setPriority(2);
    		product2.setEnableStatus(0);
    		product2.setCreateTime(new Date());
    		product2.setLastEditTime(new Date());
    		product2.setShop(shop1);
    		product2.setProductCategory(pc1);
    		
    		Product product3 = new Product();
    		product3.setProductName("商品3");
    		product3.setProductDesc("商品3的描述");
    		product3.setImgAddr("商品3的缩略图");
    		product3.setPriority(3);
    		product3.setEnableStatus(1);
    		product3.setCreateTime(new Date());
    		product3.setLastEditTime(new Date());
    		product3.setShop(shop1);
    		product3.setProductCategory(pc1);
    		
    		int effectedNum = productDao.insertProduct(product1);
    		assertEquals(1,effectedNum);
    		effectedNum = productDao.insertProduct(product2);
    		assertEquals(1,effectedNum);
    		effectedNum = productDao.insertProduct(product3);
    		assertEquals(1,effectedNum);
    	}
    	@Test
    	@Ignore
    	public void testBQueryProductList() {}
    	@Test
    	public void testCQueryProductByProductId() throws Exception{
    		long productId = 1;
    		//初始化两个商品详情图实例,作为productId为1的商品下的详情图片
    		//批量插入到商品详情图标中
    		ProductImg productImg1 = new ProductImg();
    		productImg1.setImgAddr("图片1");
    		productImg1.setImgDesc("测试图片1");
    		productImg1.setPriority(1);
    		productImg1.setCreateTime(new Date());
    		productImg1.setProductId(productId);
    		ProductImg productImg2 = new ProductImg();
    		productImg2.setImgAddr("图片1");
    		productImg2.setImgDesc("测试图片1");
    		productImg2.setPriority(1);
    		productImg2.setCreateTime(new Date());
    		productImg2.setProductId(productId);
    		List<ProductImg> productImgList = new ArrayList<>();
    		productImgList.add(productImg1);
    		productImgList.add(productImg2);
    		int effectedNum = productImgDao.batchInsertProductImg(productImgList);
    		assertEquals(2,effectedNum);
    		//查询productId为1的商品信息并校验返回的详情图实例列表size是否为2
    		Product product = productDao.queryProductById(productId);
    		assertEquals(2,product.getProductImgList().size());
    		//删除新增的这两个商品详情图示例,形成闭环
    		effectedNum = productImgDao.deleteProductImgByProductId(productId);
    		assertEquals(2,effectedNum);
    	}
    	@Test
    	public void testDUpdateProduct() {
    		Product product = new Product();
    		ProductCategory pc = new ProductCategory();
    		Shop shop = new Shop();
    		shop.setShopId(1L);
    		pc.setProductCategoryId(12L);
    		
    		product.setProductId(1L);
    		product.setShop(shop);
    		product.setProductCategory(pc);
    		product.setProductName("躺着喝的美式咖啡");
    		
    		int effectedNum = productDao.updateProduct(product);
    		assertEquals(1,effectedNum);
    	}
    	@Test
    	@Ignore
    	public void testEUpdateProductCategoryToNull() {}
    	@Test
    	@Ignore
    	public void testFDeleteShopAutoMap() {}
    }
    

  • 相关阅读:
    Ruby学习笔记5: 动态web app的建立 (2)
    Ruby学习笔记4: 动态web app的建立
    Ruby学习笔记3:Rendering(渲染)和 Redirect(重定向)
    对互联网垂直社交产品的分析
    测试 | 代码覆盖测试工具 | Eclemma
    Jquery | 基础 | 事件的链式写法
    Jquery | 基础 | html()
    Serervlet | 慕课课程实战 | 编写登录逻辑
    Jquery | 外部插入节点
    Jquery | 基础 | .hover()
  • 原文地址:https://www.cnblogs.com/csj2018/p/12500734.html
Copyright © 2011-2022 走看看