实战SSM_O2O商铺_33【商品】商品编辑之Service层的实现

举报
小工匠 发表于 2021/09/09 23:29:46 2021/09/09
【摘要】 文章目录 概述Service接口Service接口实现类单元测试Github地址 概述 在完成了 Dao层的部分之后,顺其自然的我们来到了Service层,需要调用Dao层提供的操作数据库...

概述

在完成了 Dao层的部分之后,顺其自然的我们来到了Service层,需要调用Dao层提供的操作数据库的方法。

主要步骤如下:

1. 如用户上传了缩略图,则将原有的缩略图删除(磁盘上删除),并更新tb_product表的img_addr字段,否则不做任何处理。

2. 如果用户上传了新的商品详情图片,则将原有的属于该productId下的全部的商品详情图删除(磁盘上删除),同时删除productId对应的tb_product_img中的全部数据。

3. 更新tb_product的信息


Service接口

新增两个接口如下:

/**
	 * 
	 * 
	 * @Title: queryProductById
	 * 
	 * @Description: 根据productId查询product
	 * 
	 * @param productId
	 * 
	 * @return: Product
	 */
	Product queryProductById(long productId);

	/**
	 * 
	 * 
	 * @Title: modifyProduct
	 * 
	 * @Description: TODO
	 * 
	 * @param product
	 *            产品信息
	 * @param imageHolder
	 *            产品缩略图的封装信息
	 * @param prodImgDetailList
	 *            产品详情图片的封装信息
	 * @throws ProductOperationException
	 * 
	 * @return: ProductExecution
	 */
	ProductExecution modifyProduct(Product product, ImageHolder imageHolder, List<ImageHolder> prodImgDetailList) throws ProductOperationException;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

Service接口实现类


	/**
	 * 注意事务控制@Transactional
	 */
	@Override
	@Transactional
	public ProductExecution modifyProduct(Product product, ImageHolder imageHolder, List<ImageHolder> prodImgDetailList) throws ProductOperationException {
		if (product != null && product.getShop() != null && product.getShop().getShopId() != null && product.getProductCategory().getProductCategoryId() != null) {
			// 设置默认的属性
			product.setLastEditTime(new Date());

			// Step1. 处理缩略图
			if (imageHolder != null) {
				Product tempProduct = productDao.selectProductById(product.getProductId());
				// 1.1 删除旧的缩略图
				if (tempProduct.getImgAddr() != null) {
					ImageUtil.deleteStorePath(tempProduct.getImgAddr());
				}
				// 1.2 添加新的缩略图
				addProductImg(product, imageHolder);
			}

			// Step2. 处理商品详情

			// 如果添加商品成功,继续处理商品详情图片,并写入tb_product_img
			if (prodImgDetailList != null && prodImgDetailList.size() > 0) {
				// 2.1 删除库表中productId对应的tb_product_img的信息
				deleteProductImgs(product.getProductId());
				// 2.2 处理商品详情图片,并写入tb_product_img
				addProductDetailImgs(product, prodImgDetailList);
			}
			try {
				// Step3.更新tb_product
				int effectNum = productDao.updateProduct(product);
				if (effectNum <= 0) {
					throw new ProductOperationException("商品更新失败");
				}
				return new ProductExecution(ProductStateEnum.SUCCESS, product);
			} catch (Exception e) {
				throw new ProductOperationException("商品更新失败:" + e.getMessage());
			}

		} else {
			return new ProductExecution(ProductStateEnum.NULL_PARAMETER);
		}
	}

	private void deleteProductImgs(Long productId) {
		// 获取该商铺下对应的productImg信息
		List<ProductImg> productImgList = productImgDao.selectProductImgList(productId);
		// 遍历删除该目录下的全部文件
		for (ProductImg productImg : productImgList) {
			ImageUtil.deleteStorePath(productImg.getImgAddr());
		}
		// 删除tb_product_img中该productId对应的记录
		productImgDao.deleteProductImgById(productId);

	}

	@Override
	public Product queryProductById(long productId) {
		return productDao.selectProductById(productId);
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

单元测试

@Test
	public void testModifyProduct() throws Exception {

		// 注意表中的外键关系,确保这些数据在对应的表中的存在
		ProductCategory productCategory = new ProductCategory();
		productCategory.setProductCategoryId(36L);

		// 注意表中的外键关系,确保这些数据在对应的表中的存在
		Shop shop = new Shop();
		shop.setShopId(5L);

		// 构造Product
		Product product = new Product();
		product.setProductName("offical_product");
		product.setProductDesc("product offical desc");

		product.setNormalPrice("100");
		product.setPromotionPrice("80");
		product.setPriority(66);
		product.setLastEditTime(new Date());
		product.setProductCategory(productCategory);
		product.setShop(shop);

		product.setProductId(7L);
		// 构造 商品图片
		File productFile = new File("D:/o2o/1.jpg");
		InputStream ins = new FileInputStream(productFile);
		ImageHolder imageHolder = new ImageHolder(ins, productFile.getName());

		// 构造商品详情图片
		List<ImageHolder> prodImgDetailList = new ArrayList<ImageHolder>();

		File productDetailFile1 = new File("D:/o2o/artisan.jpg");
		InputStream ins1 = new FileInputStream(productDetailFile1);
		ImageHolder imageHolder1 = new ImageHolder(ins1, productDetailFile1.getName());

		File productDetailFile2 = new File("D:/o2o/TIM.jpg");
		InputStream ins2 = new FileInputStream(productDetailFile2);
		ImageHolder imageHolder2 = new ImageHolder(ins2, productDetailFile2.getName());

		prodImgDetailList.add(imageHolder1);
		prodImgDetailList.add(imageHolder2);

		// 调用服务
		ProductExecution pe = productService.modifyProduct(product, imageHolder, prodImgDetailList);
		Assert.assertEquals(ProductStateEnum.SUCCESS.getState(), pe.getState());

	}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

这里写图片描述

SQL日志如下:

JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@6f63b475] will be managed by Spring
==>  Preparing: 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, 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 = ? ORDER BY pm.priority DESC 
==> Parameters: 7(Long)
<==    Columns: product_id, product_name, product_desc, img_addr, normal_price, promotion_price, priority, create_time, last_edit_time, enable_status, product_category_id, shop_id, product_img_id, img_addr, img_desc, priority, create_time
<==        Row: 7, 香飘飘, test添加商品, \upload\item\shopImage\5\2018062911342810920.png, 5, 3.5, 99, 2018-06-29 11:34:28.0, 2018-06-29 11:34:28.0, 1, 36, 5, 11, \upload\item\shopImage\5\20180629113433657450.jpg, null, null, 2018-06-29 11:34:37.0
<==        Row: 7, 香飘飘, test添加商品, \upload\item\shopImage\5\2018062911342810920.png, 5, 3.5, 99, 2018-06-29 11:34:28.0, 2018-06-29 11:34:28.0, 1, 36, 5, 13, \upload\item\shopImage\5\20180629113434424572.jpg, null, null, 2018-06-29 11:34:37.0
<==        Row: 7, 香飘飘, test添加商品, \upload\item\shopImage\5\2018062911342810920.png, 5, 3.5, 99, 2018-06-29 11:34:28.0, 2018-06-29 11:34:28.0, 1, 36, 5, 12, \upload\item\shopImage\5\20180629113433541021.jpg, null, null, 2018-06-29 11:34:37.0
<==      Total: 3
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: SELECT product_img_id, img_addr, img_desc, priority, create_time, product_id FROM tb_product_img WHERE product_id=? ORDER BY product_img_id 
==> Parameters: 7(Long)
<==    Columns: product_img_id, img_addr, img_desc, priority, create_time, product_id
<==        Row: 11, \upload\item\shopImage\5\20180629113433657450.jpg, null, null, 2018-06-29 11:34:37.0, 7
<==        Row: 12, \upload\item\shopImage\5\20180629113433541021.jpg, null, null, 2018-06-29 11:34:37.0, 7
<==        Row: 13, \upload\item\shopImage\5\20180629113434424572.jpg, null, null, 2018-06-29 11:34:37.0, 7
<==      Total: 3
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: DELETE FROM tb_product_img WHERE product_id = ? 
==> Parameters: 7(Long)
<==    Updates: 3
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: INSERT INTO tb_product_img ( img_addr, img_desc, priority, create_time, product_id ) VALUES ( ?, ?, ?, ?, ? ) , ( ?, ?, ?, ?, ? ) 
==> Parameters: \upload\item\shopImage\5\20180701003247930380.jpg(String), null, null, 2018-07-01 00:32:48.299(Timestamp), 7(Long), \upload\item\shopImage\5\20180701003247961681.jpg(String), null, null, 2018-07-01 00:32:48.299(Timestamp), 7(Long)
<==    Updates: 2
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]
Fetched SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280] from current transaction
==>  Preparing: UPDATE tb_product SET product_name = ?, product_desc = ?, img_addr = ?, normal_price = ?, promotion_price = ?, priority = ?, last_edit_time = ?, product_category_id = ? WHERE product_id = ? AND shop_id=? 
==> Parameters: offical_product(String), product offical desc(String), \upload\item\shopImage\5\2018070100324625530.jpg(String), 100(String), 80(String), 66(Integer), 2018-07-01 00:32:45.683(Timestamp), 36(Long), 7(Long), 5(Long)
<==    Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@64a40280]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

检查数据库记录和磁盘上的文件,正确,单元测试通过。


Github地址

代码地址: https://github.com/yangshangwei/o2o

文章来源: artisan.blog.csdn.net,作者:小小工匠,版权归原作者所有,如需转载,请联系作者。

原文链接:artisan.blog.csdn.net/article/details/80873517

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。