shop--10.商品--商品添加(后端)

商品添加dao层

1     /**
2      * 插入商品
3      *
4      * @param product
5      * @return
6      */
7     int insertProduct(Product product);

商品添加映射文件

<?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.ryanxu.o2o.dao.ProductDao">
    <insert id="insertProduct"
        parameterType="com.ryanxu.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>

批量添加商品图片dao层

    /**
     * 批量添加商品详情图片
     * @param productImgList
     * @return
     */
    int batchInsertProductImg(List<ProductImg> productImgList);

批量添加商品图片映射文件

<?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.ryanxu.o2o.dao.ProductImgDao">
      <insert id="batchInsertProductImg" parameterType="java.util.List">
          INSERT INTO
          tb_product_img(img_addr,img_desc,priority,
          create_time,product_id)
          VALUES
          <foreach collection="list" item="productImg" index="index"
              separator=",">
              (
               #{productImg.imgAddr},
               #{productImg.imgDesc},
               #{productImg.priority},
               #{productImg.createTime},
               #{productImg.productId}
              )
          </foreach>
      </insert>
  </mapper>
在做单元测试的时候需要继承BaseTest

Service层

步骤如下:

  • 1.处理商品的缩略图,获取相对路径,为了调用dao层的时候写入 tb_product中的 img_addr字段有值
  • 2.写入tb_product ,得到product_id(Mybatis自动映射进去的)
  • 3.集合product_id 批量处理商品详情图片
  • 4.将商品详情图片 批量更新到 tb_proudct_img表
 1     /**
 2      * 添加商品信息以及图片处理
 3      *
 4      * @param product
 5      * @param thumbnail 缩略图
 6      * @param productImgs 详情图
 7      * @return
 8      * @throws ProductCategoryOperationException
 9      */
10     ProductExecution addProduct(Product product,ImageHolder thumbanil,List<ImageHolder> productImgList) throws ProductCategoryOperationException;
因为每次都需要传入文件流和文件名 所以使用ImageHolder来专门包装这两个属性
public class ImageHolder {
    private String imageName;
    private InputStream image;

    public ImageHolder(String imageName, InputStream image) {
        this.imageName = imageName;
        this.image = image;
    }

    public String getImageName() {
        return imageName;
    }

    public void setImageName(String imageName) {
        this.imageName = imageName;
    }

    public InputStream getImage() {
        return image;
    }

    public void setImage(InputStream image) {
        this.image = image;
    }

}

Service层的实现类

 1 @Service
 2 public class ProductServiceImpl implements ProductService{
 3     @Autowired
 4     private ProductDao productDao;
 5     @Autowired
 6     private ProductImgDao productImgDao;
 7
 8     @Override
 9     @Transactional
10     //1.处理缩略图,获取缩略图相对路径并赋值给product
11     //2.往tb_product写入商品信息,获取productId
12     //3.结合productId批量处理商品详情图
13     //4.将商品详情图列表批量插入tb_product_img中
14     public ProductExecution addProduct(Product product, ImageHolder thumbanil, List<ImageHolder> productImgList)
15             throws ProductCategoryOperationException {
16         //空值判断
17         if(product!=null&&product.getShop()!=null&&product.getShop().getShopId()!=null) {
18             //给商品设置默认属性
19             product.setCreateTime(new Date());
20             product.setLastEditTime(new Date());
21             //默认为上架的状态
22             product.setEnableStatus(1);
23             //若商品缩略图不为空则添加
24             if(thumbanil!=null) {
25                 addThumbnail(product,thumbanil);
26             }
27             try {
28                 //创建商品信息
29                 int effectedNum = productDao.insertProduct(product);
30                 if(effectedNum<=0) {
31                     throw new ProductOperationException("创建商品失败");
32                 }
33             }catch (Exception e) {
34                 throw new ProductOperationException("创建商品失败 :" +e.toString());
35             }
36             //若商品详情图不为空则添加
37             if(productImgList != null && productImgList.size() >0) {
38                 addProductImgList(product,productImgList);
39             }
40             return new ProductExecution(ProductStateEnum.SUCCESS,product);
41         }else {
42             //传参为空则返回空值错误信息
43             return new ProductExecution(ProductStateEnum.NULL_PRODUCT);
44         }
45     }
46
47
48     /**
49      * 将商品缩略图添加到用户相对的文件夹下,并将店铺信息中的商品图片信息更新
50      *
51      * @param product
52      * @param imageHolder
53      */
54     private void addThumbnail(Product product,ImageHolder imageHolder) {
55         //获取缩略图的存储途径,直接存储在店铺的文件夹下
56         String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
57         //返回相对路径
58         String thumbnailAddr = ImageUtil.generateThumbnail(imageHolder, dest);
59         product.setImgAddr(thumbnailAddr);
60     }
61
62     /**
63      * 批量添加商品详情图片到用户相对的文件夹下,并将其批量插入到数据库中
64      *
65      * @param product
66      * @param productImgHolderList
67      */
68     private void addProductImgList(Product product, List<ImageHolder> productImgHolderList) {
69         //获取图片存储路径,这里直接存放到相应店铺的文件夹底下
70         String dest = PathUtil.getShopImagePath(product.getShop().getShopId());
71         List<ProductImg> productImgList = new ArrayList<>();
72         //遍历图片一次去处理,并添加进productImg实体类里
73         for(ImageHolder productImgHolder:productImgHolderList) {
74             String imgAddr = ImageUtil.generateNormalImg(productImgHolder,dest);
75             ProductImg productImg  = new ProductImg();
76             productImg.setImgAddr(imgAddr);
77             productImg.setProductId(product.getProductId());
78             productImg.setCreateTime(new Date());
79             productImgList.add(productImg);
80         }
81         //如果确实是有图片需要添加的,就执行批量添加操作
82         if(productImgList.size() > 0) {
83             try {
84                 int effectedNum = productImgDao.batchInsertProductImg(productImgList);
85                 if(effectedNum <= 0) {
86                     throw new ProductOperationException("创建商品详情图片失败");
87                 }
88             }catch (Exception e) {
89                 throw new ProductOperationException("创建商品详情图片失败: "+e.toString());
90             }
91         }
92     }
93 }

Controller层

步骤如下:

  • 获取前端传递过来的Product对象,通过FastJson提供的api将其转换为Product对象
  • 获取前端传递过来的商品缩略图以及商品详情图片,通过CommonsMultipartResolver来处理
  • 调用Service层的服务来持久化数据及图片的操作
  1 @Controller
  2 @RequestMapping("/shopadmin")
  3 public class ProductManagementController {
  4     @Autowired
  5     private ProductService productService;
  6
  7     //支持上传商品详情图的最大数量
  8     private static final int IMAGEMAXCOUNT=6;
  9
 10     /**
 11      *     前端页面通过post方式传递一个包含文件上传的Form会以multipart/form-data请求发送给服务器,
 12      *
 13      *  需要告诉DispatcherServlet如何处理MultipartRequest,我们在spring-web.
 14      *  xml中定义了multipartResolver。
 15      *
 16      *  如果某个Request是一个MultipartRequest,它就会首先被MultipartResolver处理,
 17      *  然后再转发相应的Controller。
 18      *
 19      *  在Controller中,
 20      *  将HttpServletRequest转型为MultipartHttpServletRequest
 21      *  ,可以非常方便的得到文件名和文件内容
 22      * @param request
 23      * @return
 24      * @throws IOException
 25      */
 26     @RequestMapping(value="/addproduct",method=RequestMethod.POST)
 27     @ResponseBody
 28     private Map<String, Object> addproduct(HttpServletRequest request) throws IOException{
 29         Map<String, Object> modelMap = new HashMap<>();
 30
 31         //初始化各种参数!!!!
 32         //接收前端传递过来的product
 33         Product product = null;
 34         String productStr = HttpServletRequestUtil.getString(request, "productStr");
 35         //处理文件流
 36         MultipartHttpServletRequest multipartHttpServletRequest = null;
 37         //接收前端传递过来的product
 38         ImageHolder thumbnail = null;
 39         // 接收商品详情图片
 40         List<ImageHolder> productImgList = new ArrayList<>();
 41         //在本次会话的上下文获取上传的文件
 42         CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
 43
 44         //步骤1:验证码校验
 45         if(!CodeUtil.checkVerifyCode(request)) {
 46             modelMap.put("success", false);
 47             modelMap.put("errMsg", "验证码错误");
 48             return modelMap;
 49         }
 50         //步骤2:使用FastJson提供的api,实例化Product 构造调用service层的第一个参数
 51         //接受前端参数变量的初始化,商品,缩略图,详情图列表实体类
 52         ObjectMapper objectMapper = new ObjectMapper();
 53         // 获取前端传递过来的product,约定好使用productStr
 54         try {
 55             product = objectMapper.readValue(productStr, Product.class);
 56         } catch (Exception e) {
 57             modelMap.put("success", false);
 58             modelMap.put("errMsg", e.toString());
 59             return modelMap;
 60         }
 61         //步骤3: 商品缩略图 和 商品详情图 构造调用service层的第二个参数和第三个参数
 62         try {
 63             //若请求中存在文件流,则取出相关的文件(包括缩略图和详情图)
 64             if(commonsMultipartResolver.isMultipart(request)) {
 65                 // 将HttpServletRequest转型为MultipartHttpServletRequest,可以很方便地得到文件名和文件内容
 66                 multipartHttpServletRequest = (MultipartHttpServletRequest) request;
 67
 68                 //1.接收商品缩略图  取出缩略图并构建ImageHolder对象
 69                 CommonsMultipartFile thumbnailFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile("thumbnail");
 70                 //2.转化为ImageHolder,使用service层的参数类型要求
 71                 thumbnail = new ImageHolder(thumbnailFile.getOriginalFilename(), thumbnailFile.getInputStream());
 72                 //3.取出详情图列表并构建List<ImageHolder>列表对象,最多支持六张图上传
 73                 for(int i = 0; i < IMAGEMAXCOUNT; i++){
 74                     CommonsMultipartFile commonsMultipartFile = (CommonsMultipartFile) multipartHttpServletRequest.getFile("productImg" + i);
 75                     if(commonsMultipartFile != null){
 76                         //若取出的第i个详情图片文件流不为空,则将其加入详情图列表
 77                         ImageHolder productImg = new ImageHolder(commonsMultipartFile.getName(), commonsMultipartFile.getInputStream());
 78                         productImgList.add(productImg);
 79                     } else {
 80                         //若取出的第i个详情图片文件流为空,则终止循环
 81                         break;
 82                     }
 83                 }
 84
 85             } else{
 86                 modelMap.put( "success", false );
 87                 modelMap.put( "errMsg", "上传图片不能为空" );
 88             }
 89         } catch (Exception e){
 90             modelMap.put( "success", false );
 91             modelMap.put( "errMsg", e.toString() );
 92             return modelMap;
 93         }
 94
 95         //步骤4:调用service层
 96         //若product,thumbnail(缩略图),productImgList(商品详情图片列表)不为空,则进行商品添加
 97         if(product != null && thumbnail != null && productImgList.size() > 0){
 98             try{
 99                 //从session中获取当前shop的id赋值给product,减少对前端数据的依赖
100                 Shop currentShop = (Shop) request.getSession().getAttribute( "currentShop" );
101
102 /*                Shop currentShop = new Shop();
103                 currentShop.setShopId( 1L );*/
104                 Shop shop = new Shop();
105                 shop.setShopId(currentShop.getShopId());
106                 product.setShop(shop);
107                 //执行添加操作
108                 ProductExecution productExecution = productService.addProduct( product, thumbnail, productImgList );
109                 if(productExecution.getState() == ProductStateEnum.SUCCESS.getState()){
110                     modelMap.put( "success", true );
111                 }else{
112                     modelMap.put( "success", false );
113                     modelMap.put( "errMsg", productExecution.getStateInfo() );
114                 }
115             } catch(ProductOperationException e){
116                 modelMap.put( "success", false );
117                 modelMap.put( "errMsg", e.toString() );
118                 return modelMap;
119             }
120         }else{
121             modelMap.put( "success", false );
122             modelMap.put( "errMsg", "请输入商品信息" );
123         }
124         return modelMap;
125     }
126 }

原文地址:https://www.cnblogs.com/windbag7/p/9403277.html

时间: 2024-10-10 00:07:04

shop--10.商品--商品添加(后端)的相关文章

estore商城案例(二)------登录&amp;添加商品&amp;商品列表(下)

撸完了登录模块,接着撸商品添加,和商品列表模块: 先亮出数据库: 1 DROP TABLE IF EXISTS products; 2 CREATE TABLE products ( 3 id varchar(100) NOT NULL, 4 name varchar(100) DEFAULT NULL, 5 price double DEFAULT NULL, 6 category varchar(100) DEFAULT NULL, 7 pnum int(11) DEFAULT NULL,

estore商城案例(二)------登录&amp;添加商品&amp;商品列表(上)

今天继续写一下第二个功能:登录&添加商品&商品列表 1.登录页面,很简单做个表单提交一下就可以了,记住登录的功能也先简单写一下,明天写filter过滤器会完善自动登录的功能,以及权限管理. 登录页面代码: 1 <html> 2 <head> 3 4 <title>My JSP 'login.jsp' starting page</title> 5 6 <script type="text/javascript">

一个可以添加商品、查询商品的程序,登录成功的话,再去操作,添加、查询商品,添加商品也是写在文件里面

#写一个可以添加商品.查询商品的这么程序#1.先登录,登录的用户名和密码都是写在文件里面的#1.读文件.字符串分割#2.登录成功的话,再去操作,添加.查询商品,添加商品也是写在文件里面#1.读写文件,# 字典添加元素,取元素,# str()强制类型转换,# eval()#用它把字符串转成字典'''{ 'mac':{ 'id':1, 'price':2222.22 }, 'iphone':{ 'id':2, 'price':22222 }} { 'mac':{ 'id':1, 'price':22

指尖上的电商---(10)SolrAdmin中添加多核

在Solr中有的时候,我们并不只是需要一种形式的索引文件,可能需要多种不同数据的索引文件,这时我们就可以在同一个Solr下面创建 多核.比如,我们在solr下面想把产品信息和分类信息各存放一个索引,并且各自有独立的配置和索引文件,不同核心的SOLRF放在不同的目录下, 这时候,我们就需要创建多核模式. 看如下图,创建了collection1和Product两个索引,每个有自己的配置和文件存储的地方. 具体操作步骤如下: 1.在tomcat下solr所指向的目录下创建一个Product目录,我这里

Java Web之网上购物系统(注册、登录、浏览商品、添加购物车)

眼看就要期末了,我的专业课也迎来了第二次的期末作业---------<网上购物系统>.虽然老师的意图是在锻炼我们后台的能力,但是想着还是不利用网上的模板,准备自己写,以来别人写的静态页看不懂,再着可以锻炼自己做网页的能力.所以趁有点小进展就想分享自己的作业进展状态.下面是我页面运行的截图. 可能粘贴的图片没有任何的效果可言,下面.jsp字体可以运行你想要的页面效果. index.jsp register.jsp login.jsp product.jsp 后台代码: User.java pac

【SSH网上商城项目实战10】商品类基本模块的搭建

前面我们完成了与商品类别相关的业务逻辑,接下来我们开始做具体商品部分. 1. 数据库建表并映射Model 首先我们在数据库中新建一张表,然后使用逆向工程将表映射成Model类,表如下: /*=============================*/ /* Table: 商品表结构 */ /*=============================*/ create table product ( /* 商品编号,自动增长 */ id int primary key not null aut

校园商铺-7商品类别模块-5商品类别删除后端开发

1.Dao层 1.1Dao接口 package com.csj2018.o2o.dao; import java.util.List; import org.apache.ibatis.annotations.Param; import com.csj2018.o2o.entity.ProductCategory; public interface ProductCategoryDao { /** * 查询某个店铺下的商品分类 * @param shopId * @return */ List<

网店系统H5版(五) 给商品图片添加二维码水印并下载

2020-4-5 21:32:41 星期日 网店需要提供分享并下载商品图片的功能, 这里使用jquery-qrcode + h5的canvas实现这个功能 并没有请求后端, 全是在客户端浏览器上执行的 1 function createShareImage(goodsId, goodsImgUrl) { 2 let urlGoodsDetail = location.origin + '/vstore_goodsinfo_' + goodsId; //商品详情页链接 3 let urlGoods

ECSHOP商品页添加任意字段方法

一.在数据库添加字段,会手写的就后台添加,不会就进入phpmyadmin默认的就行.      这是通用的写法ALTER TABLE `ecs_goods` ADD `goods_sz` VARCHAR( 32 ) NOT NULL AFTER `goods_weight` ;复制代码表名做下修改即可.二.修改admin/good.php      找到  /* 处理商品数据 */$shop_price = !empty($_POST['shop_price']) ? $_POST['shop_