博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
idea新建springCloud项目(4)- 商品服务
阅读量:5902 次
发布时间:2019-06-19

本文共 7479 字,大约阅读时间需要 24 分钟。

  hot3.png

需要实现商品服务的这4个功能:36506a8290036d2538563681d665ba0b5dd.jpg

1.先从商品api文档入手,查看商品结构,如下:

请求方式:GET    请求URL:/product/list   

返回参数:

{

    "code": 0,
    "msg": "成功",
    "data": [
        {
            "name": "热榜",
            "type": 1,
            "foods": [
                {
                    "id": "123456",
                    "name": "皮蛋粥",
                    "price": 1.2,
                    "description": "好吃的皮蛋粥",
                    "icon": "http://xxx.com",
                }
            ]
        },
        {
            "name": "好吃的",
            "type": 2,
            "foods": [
                {
                    "id": "123457",
                    "name": "慕斯蛋糕",
                    "price": 10.9,
                    "description": "美味爽口",
                    "icon": "http://xxx.com",
                }
            ]
        }
    ]
}

2.新建数据库

4379969df28e09cd0259e2f5f5fcb09d228.jpg

3.新建类目、商品表

-- 商品
create table `product_info` (
    `product_id` varchar(32) not null,
    `product_name` varchar(64) not null comment '商品名称',
    `product_price` decimal(8,2) not null comment '单价',
    `product_stock` int not null comment '库存',
    `product_description` varchar(64) comment '描述',
    `product_icon` varchar(512) comment '小图',
    `product_status` tinyint(3) DEFAULT '0' COMMENT '商品状态,0正常1下架',
    `category_type` int not null comment '类目编号',
    `create_time` timestamp not null default current_timestamp comment '创建时间',
    `update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改时间',
    primary key (`product_id`)
);
INSERT INTO `product_info` (`product_id`, `product_name`, `product_price`, `product_stock`, `product_description`, `product_icon`, `product_status`, `category_type`, `create_time`, `update_time`)
VALUES
    ('157875196366160022','皮蛋粥',0.01,39,'好吃的皮蛋粥','//fuss10.elemecdn.com/0/49/65d10ef215d3c770ebb2b5ea962a7jpeg.jpeg',0,1,'2017-03-28 19:39:15','2017-07-02 11:45:44'),
    ('157875227953464068','慕斯蛋糕',10.90,200,'美味爽口','//fuss10.elemecdn.com/9/93/91994e8456818dfe7b0bd95f10a50jpeg.jpeg',1,1,'2017-03-28 19:35:54','2017-04-21 10:05:57'),
    ('164103465734242707','蜜汁鸡翅',0.02,982,'好吃','//fuss10.elemecdn.com/7/4a/f307f56216b03f067155aec8b124ejpeg.jpeg',0,1,'2017-03-30 17:11:56','2017-06-24 19:20:54');

4.在IDEA新建springCloud项目-商品服务

cdf4afc5496c0cabb1a11b3289739227c6f.jpg

c78b17e6176c8a31afe3153e2237afdd2cd.jpg

c6b1ddc5b6073be0d7577ec95aaf3e6db16.jpg

修改版本,和之前建的eureka项目版本一致,修改完记得刷新:

2618ffa346e4f15ba790295398b2e7f3938.jpg

删除掉不需要的文件:

3e761139c32b8bfdb5203e6a20c3616bf83.jpg

5.把商品服务注册到eureka上去,启动项目

将application.properties修改为application.yml

9620f1ac82bdb1fd72c66d0c532ad523e17.jpg

记得加上这个注解,再启动项目:

76575afc76297b888316edaaa164864c5d9.jpg

打开8761的eureka,有如下页面则成功将商品服务注册到8761的eureka上:

6614b69f095a7ddb3e629d72ec2bfe2c1a5.jpg

6.商品业务实现

在pom.xml添加spring-boot-starter-data-jpa和mysql-connector-java依赖,且刷新:

7613441210c4d68e22589458daca1c5a6b8.jpg

在application.yml配置数据库信息

959e36c7ccc193c2c2b2b40bbfb530ffab8.jpg

新建ResultVO.java——http请求返回的最外层对象

ResultVO.java

/**

 * http请求返回的最外层对象
 */
public class ResultVO<T> {

    /**

     * 错误码
     */
    private Integer code;

    /**

     * 提示信息
     */
    private String msg;

    /**

     * 具体内容
     */
    private T data;
}

测试类,不需每次都去拷贝这2个注解了,4590a28ce6ced9c65765438e02f435feff2.jpg,直接用@Component注解,且继承公共测试类:

2f3bb9dd25efa1828e5a8758b0208c6e9d4.jpg

新建ResultVOUtil.java

ResultVOUtil.java

public class ResultVOUtil {

    public static ResultVO success(Object object) {

        ResultVO resultVO = new ResultVO();
        resultVO.setData(object);
        resultVO.setCode(0);
        resultVO.setMsg("成功");
        return resultVO;
    }
}

 

1) model 配置表对应的实体类,类名、字段最好和表中一致

a.使用这个插件,可以省略getter/setter方法

在pom.xml加入lombok依赖

ec10c51cb8ed44a9cb9d18cf60948aad65a.jpg

还需要在idea下载这个插件

0a5326ed886b43bd56d9f7438bc5324ee54.jpg

只需要在实体类加上@Data注解,就可以不用在实体类生成getter/setter方法了

新建实体类ProductInfo.java、ProductCategory.java

ProductInfo.java

//@Table(name = "T_proxxx")
public class ProductInfo {

   

    private String productId;

    /** 名字. */

    private String productName;

    /** 单价. */

    private BigDecimal productPrice;

    /** 库存. */

    private Integer productStock;

    /** 描述. */

    private String productDescription;

    /** 小图. */

    private String productIcon;

    /** 状态, 0正常1下架. */

    private Integer productStatus;

    /** 类目编号. */

    private Integer categoryType;

    private Date createTime;

    private Date updateTime;

}

 

ProductCategory.java

@Data

@Entity
public class ProductCategory {

    @Id

    @GeneratedValue
    private Integer categoryId;

    /** 类目名字. */

    private String categoryName;

    /** 类目编号. */

    private Integer categoryType;

    private Date createTime;

    private Date updateTime;

}

 

2) dao

接口1:查询所有在架的商品——新建dao,ProductInfoRepository.java

5c352fab9c4e9a3a2cb493f20b46e33d0a2.jpg

可以单元测试一下:

b52368ea8f6607c5097ba8f6aaa771bf768.jpg

 

接口2:查询类目type列表——新建dao,ProductCategoryRepository.java

3e7597267510e51e1bd62c4b0c693df1b49.jpg

3) service 

新建ProductService.java、ProductServiceImpl.java

ProductService.java

public interface ProductService {

    /**

     * 查询所有在架商品列表
     */
    List<ProductInfo> findUpAll();

    /**

     * 查询商品列表
     * @param productIdList
     * @return
     */
    List<ProductInfoOutput> findList(List<String> productIdList);
}

ProductServiceImpl.java

@Service

public class ProductServiceImpl implements ProductService {

    @Autowired

    private ProductInfoRepository productInfoRepository;

    @Override

    public List<ProductInfo> findUpAll() {
        return productInfoRepository.findByProductStatus(ProductStatusEnum.UP.getCode());
    }

    @Override

    public List<ProductInfoOutput> findList(List<String> productIdList) {
        return productInfoRepository.findByProductIdIn(productIdList).stream()
                .map(e -> {
                    ProductInfoOutput output = new ProductInfoOutput();
                    BeanUtils.copyProperties(e, output);
                    return output;
                })
                .collect(Collectors.toList());
    }
}
 

新建CategoryService.java、CategoryServiceImpl.java

CategoryService.java

public interface CategoryService {

    List<ProductCategory> findByCategoryTypeIn(List<Integer> categoryTypeList);

}

CategoryServiceImpl.java

@Service

public class CategoryServiceImpl implements CategoryService {

    @Autowired

    private ProductCategoryRepository productCategoryRepository;

    @Override

    public List<ProductCategory> findByCategoryTypeIn(List<Integer> categoryTypeList) {
        return productCategoryRepository.findByCategoryTypeIn(categoryTypeList);
    }
}

4) vo 

新建ProductVO.java、ProductInfoVO.java 

ProductVO.java

@Data

public class ProductVO {

    @JsonProperty("name") //@JsonProperty返回给前端的字段

    private String categoryName;

    @JsonProperty("type")

    private Integer categoryType;

    @JsonProperty("foods")

    List<ProductInfoVO> productInfoVOList;
}

ProductInfoVO.java

@Data

public class ProductInfoVO {

    @JsonProperty("id")

    private String productId;

    @JsonProperty("name")

    private String productName;

    @JsonProperty("price")

    private BigDecimal productPrice;

    @JsonProperty("description")

    private String productDescription;

    @JsonProperty("icon")

    private String productIcon;
}

5)  controller 

新建ProductController.java 

ProductController.java 

@RestController

@RequestMapping("/product")
public class ProductController {

    @Autowired

    private ProductService productService;

    @Autowired

    private CategoryService categoryService;

    /**

     * 1. 查询所有在架的商品
     * 2. 获取类目type列表
     * 3. 查询类目
     * 4. 构造数据
     */
    @GetMapping("/list")
    public ResultVO<ProductVO> list() {
        //1. 查询所有在架的商品
        List<ProductInfo> productInfoList = productService.findUpAll();

        //2. 获取类目type列表

        List<Integer> categoryTypeList = productInfoList.stream()
                .map(ProductInfo::getCategoryType)
                .collect(Collectors.toList());

        //3. 从数据库查询类目

        List<ProductCategory> categoryList = categoryService.findByCategoryTypeIn(categoryTypeList);

        //4. 构造数据

        List<ProductVO> productVOList = new ArrayList<>();
        for (ProductCategory productCategory: categoryList) {
            ProductVO productVO = new ProductVO();
            productVO.setCategoryName(productCategory.getCategoryName());
            productVO.setCategoryType(productCategory.getCategoryType());

            List<ProductInfoVO> productInfoVOList = new ArrayList<>();

            for (ProductInfo productInfo: productInfoList) {
                if (productInfo.getCategoryType().equals(productCategory.getCategoryType())) {
                    ProductInfoVO productInfoVO = new ProductInfoVO();
                    BeanUtils.copyProperties(productInfo, productInfoVO);
                    productInfoVOList.add(productInfoVO);
                }
            }
            productVO.setProductInfoVOList(productInfoVOList);
            productVOList.add(productVO);
        }

        return ResultVOUtil.success(productVOList);

    }

    /**

     * 获取商品列表(给订单服务用的)
     *
     * @param productIdList
     * @return
     */
    @PostMapping("/listForOrder")
    public List<ProductInfoOutput> listForOrder(@RequestBody List<String> productIdList) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return productService.findList(productIdList);
    }

    @PostMapping("/decreaseStock")

    public void decreaseStock(@RequestBody List<DecreaseStockInput> decreaseStockInputList) {
        productService.decreaseStock(decreaseStockInputList);
    }
}

 

7.访问成功

5051a8d674ff9cd2f57499450133b51da9d.jpg

转载于:https://my.oschina.net/monroe/blog/1927698

你可能感兴趣的文章
微信nickname乱码(emoji)及mysql编码格式设置(utf8mb4)解决的过程
查看>>
【转】C++ 笔试面试题目
查看>>
同步和异步的区别
查看>>
[Leetcode] Search in Rotated Sorted Array
查看>>
委托、Lambda表达式、事件系列02,什么时候该用委托
查看>>
在ASP.NET MVC控制器中获取链接中的路由数据
查看>>
使用ASP.NET Atlas SortBehavior实现客户端排序
查看>>
LightOJ 1274 Beating the Dataset(期望)
查看>>
图像滤镜处理算法:灰度、黑白、底片、浮雕
查看>>
多线程一个错误的例子
查看>>
默认网关及route print
查看>>
Servlet如何处理一个请求?
查看>>
Nginx系列二:(Nginx Rewrite 规则、Nginx 防盗链、Nginx 动静分离、Nginx+keepalived 实现高可用)...
查看>>
1497 取余运算
查看>>
容器平台选型的十大模式:Docker、DC/OS、K8S谁与当先?
查看>>
Windows 2003 IIS 不支持ASP的问题
查看>>
了解 JavaScript (2)- 需要了解的一些概念
查看>>
图像对比度理解
查看>>
【跃迁之路】【472天】程序员高效学习方法论探索系列(实验阶段229-2018.05.23)...
查看>>
响应式Tab选项卡
查看>>