java后台修改商品信息_shop--9.商品--商品编辑--修改(后端)
首先获取店铺下的商品信息
dao层
/**
-
由商品Id获取商品信息
-
@param productId
-
@return
*/
Product queryProductByproductId(Long productId);
dao.xml
要重新定义resultMap
由于返回的商品详情图片构成一个List,因此必须采用collection来进行定义。同时,在对数据进行查询的过程中,需要运用多表连接的技术。
javaType="com.shop.bean.ProductCategory">
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
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 getProductById(@RequestParam Long productId){
Map modelMap = new HashMap<>();
//Long productId = HttpServletRequestUtil.getLong( request, "productId" );
if(productId > 0){
//获取商品Id的商品信息
Product product = productService.getProductByProductId( productId );
//获取该店铺下的商品类别列表
List productCategoryList =
categoryService.getCategoryList( 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 queryProductImgByProductId(Long productId);
/**
-
根据传入的productImgId删除所有商品详情图片
-
@param productId
-
@return
*/
int deleteProductImgByProductId(Long productId);
SELECT
product_img_id,
img_addr
FROM
product_img
WHERE
product_id=#{productId}
DELETE FROM product_img WHERE product_id=#{productId}
3.点击提交按钮之后,提交到后台,修改数据库中的信息
dao层
/**
-
更新商品信息
-
@param product
-
@return
*/
int updateProduct(Product product);
UPDATE product
product_name=#{productName},
product_desc=#{productDesc},
img_addr=#{imgAddr},
normal_price=#{normalPrice},
promotion_price=#{promotionPrice},
last_edit_time=#{lastEditTime},
status=#{status},
product_category_id=#{productCategory.productCategoryId}
WHERE product_id=#{productId}
AND shop_id=#{shop.shopId}
service
/**
- 修改商品信息
*1.若缩略图参数有值,则处理缩略图
若文件夹中存在缩略图,则先删除该文件夹中的所有缩略图,并获取新生成的缩略图的相对路径;接着将新路径赋值给变量product。
-
2.若商品详情列表有值,则再处理商品详情图,删除文件夹下的商品详情图
-
3.将product_img数据库中的商品记录删除
-
4.更新数据库product_img和product的信息
-
@param product
-
@return
*/
@Override
@Transactional
public ProductExecution generateProduct(Product product, CommonsMultipartFile thumbnail, List productImgList)
throws ProductOperationException {
if(product != null && product.getShop() != null && product.getShop().getShopId() != null){
try{
//如果商品缩略图改变了的话,就将原来的商品缩略图删除,再放入新的
if(thumbnail != null){
//从数据库获取传入的商品信息
根据产品ID查询对应的产品实例tempProduct
//首先判断是否存在根据商品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){
throws new ProductException( "alter the product error : " + e.getMessage() );
}
} else{
return new ProductExecution(ProductStateEnum.EMPTY);
}
}
/**
为用户提供商品缩略图的存储位置,并同步至店铺信息中的商品图片数据
-
@param product
-
@param thumbnail
*/
private void addThumbnail(Product product, CommonsMOCKABLE thumbnail){
//获取缩略图的存储途径,直接存储在店铺的文件夹下
The variable relativeImgPath is obtained via the method PathUtil.getShopImgPath, which accepts the product's shop ID as an argument.
String realRelativeImgPath = ImageUtil.generateThumbnail(thumbnail, relativeImgPath);
product.setImgAddr( realRelativeImgPath );
}
/**
按批次导入商品详情图片至与该用户相关的文件夹中,并完成将这些图片一次性注入数据库的过程
-
@param product
-
@param productImgList
*/
private void addProductImgList(Product product, List productImgList){
//获取图片的存储途径,直接存储在店铺的文件夹下
String relativeImgPath = getStoreImagePath( product.shop.id );
List 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){
调用Product类构造方法生成图片时出现错误状态会导致资源未被正确释放
}
}
}
private void deleteProductImgList(Long productId){
//从prodcut_img数据库中获取product_id为productId的
ArrayList
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 modifyProduct(HttpServletRequest request){
Map modelMap = new HashMap<>();
//校验验证码
//验证码校验
if(!CodeUtil.checkVerifyCode(request)){
modelMap.put( "success", false );
modelMap.put( "errMsg", "验证码错误" );
return modelMap;
}
//接收前端传来的参数:商品信息,缩略图,商品详情图片
ObjectMapper objectMapper = new ObjectMapper( );
Product product = null;
character str = RequestHandlerUtils.getString(request, str);
CommonsMultipartFile thumbnail = null;
List productImgList = new ArrayList<>();
//在本次会话的上下文session中获取上传的文件
CommonsMultipartResolver commonsMultipartResolver =
创建实例 of CommutativeMultipartResolver by calling request.getSession().getServletContext().
//如果有缩略图,商品详情图的话,就赋值给相应的变量,没有的话,就不管
if(commonsMultipartResolver.isMultipart( request )){
MultipartHttpServletRequest multipartHttpServletRequest = new MultipartHttpServletRequest(request);
通过访问multipartHttpServletRequest并调用其getFile方法来提取名为' thumbnail'的文件
for(int i = 0; i < MAXIMAGECOUNT; i++){
通过()的方式获取变量 commonsMultipartFile = ()调用多部分输入request获取文件,并结合产品图片名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);
该产品执行器 product execution 赋值于 ... propertyResource.modifyProduct( 该产品 图片thumban 产品图片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;
}
