Spring Boot电商项目42:商品模块八:前台的【商品列表】接口;(这篇博客比较重要;包括:【构建Query查询对象】、【明确限制排序条件】等;)

说明:

(1)本篇博客比较重要的点:

          ●【参数没有放在body中,而是放在了url中】+【后端使用实体类去接收参数】:对于这种情况,不能使用@RequestBody注解,自然也不能使用@RequestParam注解;(只是,我们在写实体类的时候,实体类的属性要比照着接口参数写,不能写错)

          ● 对于那些条件比较多的接口,专门创建一个Query对象,来组织条件;是一个不错的开发技巧;

          ● 对于排序方式这种查询条件,我们最好根据接口要求,在程序中规定好【究竟有哪些排序条件】;这能很好的防止接口乱调用,程序也更加安全;

          ● 本篇博客也涉及到了【mybatis动态SQL,<if></if>】、【MySQL的模糊查询,like】、【MySQL的in子句】、【mybatis的批处理中的<foreack>子标签】等;

(2)本篇博客一个待进一步研究的地方:这人的查询,我们使用的是MySQL的原生查询方式;但是,如果以后我们的项目和大数据结合的时候,似乎可以了解一下【ElasticSearch】这些技术,来更好的实现数据的检索和查询;

目录

一:前台的【商品列表】接口说明;

1.前台的【商品列表】接口,在界面上的表现; 

2.前台的【商品列表】接口文档;

3. 前台的【商品列表】接口,开发分析;

二:正式开发;

1.在ProductController类中,创建查询前台的商品列表的方法:list()方法;

(1)因为前台的【商品列表】接口的参数很多,所以我们创建了一个实体类ProductListReq类,用这个实体类来接收参数;

(2)请求方式,url,接收参数,要写对; 

(3)因为根据接口文档中对接口返回数据格式的要求,我们需要使用PageHelper的PageInfo来包装分页数据,所以我们在开发Service层的方法时,其返回类型就是PageInfo格式的;

(4)Service层的list方法,在下一部分介绍;

2.1.在ProductServiceImpl类中,创建以分页的方式查询符合条件的商品的方法:list()方法;(重点!!!)

(1.1)【categoryId,keyword】这两个查询条件处理:构建一个专门用于组织查询条件的Query对象:ProductListQuery类:用Query对象来组织查询条件,代码会更加有条理,也方便以后的扩展;(这个开发技巧,比较重要!!!)

(1.2)【categoryId,keyword】这两个查询条件处理:构建Query对象之:判断是否有【搜索关键词】这个条件:如果有,就把这个条件构建到Query对象上去;

(1.3)【categoryId,keyword】这两个查询条件处理:构建Query对象之:判断是否有【商品分类Id】这个条件:如果有,就把这个条件处理一下,然后构建到Query对象上去;

(2)【orderBy】这一个条件处理:在构建PageHelper的时候,应用这个排序条件;需要注意:这儿我们需要【在程序中,规定好有哪些字段可以排序】,这非常重要,有关程序的安全;

(3)以前面构建的Query对象作为条件,去调用我们在Dao层编写查询方法:selectList()方法;;这个方法,在下一部分介绍;

(4)把查询结果,包装成PageInfo对象,返回给调用方;

2.2.在ProductService接口中,反向生成方法的声明;

3.1在ProductMapper中,声明根据条件,查询商品的方法:selectList()方法;

3.2在ProductMapper.xml中,编写对应的实现SQL;

三:测试;

测试1:

测试2:

测试3:

测试4:

测试5:一个在目前的项目中,实际上不存在的情况;


一:前台的【商品列表】接口说明;

1.前台的【商品列表】接口,在界面上的表现; 

(1)我们可以不使用任何条件,来分页显示商品数据;

……………………………………………………

(2)我们可以使用【按价格从低到高或从高到低排序】这个条件,来分页显示商品数据;

 ……………………………………………………

(3)我们可以使用【商品名需要包含某个关键词】这个条件,来分页显示商品数据;与此同时,也可以加入【按价格从低到高或从高到低排序】这个条件;

……………………………………………………

(4)我们可以使用【商品需要隶属于“某商品分类及其子分类”】这个条件,来分页显示商品数据;与此同时,也可以加入【按价格从低到高或从高到低排序】这个条件;

PS:上图少标注了一个,id=19的果冻橙这个分类,是id=4的橘子橙子这个分类的子目录;;;所以,id=36的四川果冻橙要需要查询出来;


可以看到,前台的【商品列表】接口,这一个接口需要承担的任务还是挺多的;这就需要我们在开发这个接口时,做好条件判断和处理;

2.前台的【商品列表】接口文档;

……………………………………………………

以这个请求实例为例,来仔细说下前台的【商品列表】接口文档;

接口返回内容:

{
    "status": 10000,
    "msg": "SUCCESS",
    "data": {
        "total": 3,
        "list": [
            {
                "id": 24,
                "name": "智利帝王蟹礼盒装4.4-4.0斤/只 生鲜活鲜熟冻大螃蟹",
                "image": "http://111.231.103.117:8081/images/diwangxie.jpg",
                "detail": "商品毛重:3.0kg商品产地:智利大闸蟹售卖方式:公蟹重量:2000-4999g套餐份量:5人份以上国产/进口:进口海水/淡水:海水烹饪建议:火锅,炒菜,烧烤,刺身,加热即食包装:简装原产地:智利保存状态:冷冻公单蟹重:5.5两及以上分类:帝王蟹特产品类:其它售卖方式:单品",
                "categoryId": 7,
                "price": 222,
                "stock": 222,
                "status": 1,
                "createTime": "2019-12-28T08:06:34.000+0000",
                "updateTime": "2020-02-10T16:05:05.000+0000"
            },
            {
                "id": 21,
                "name": "智利原味三文鱼排(大西洋鲑)240g/袋 4片装",
                "image": "http://111.231.103.117:8081/images/sanwenyu2.jpg",
                "detail": "商品毛重:260.00g商品产地:中国大陆保存状态:冷冻国产/进口:进口包装:简装类别:三文鱼海水/淡水:海水烹饪建议:煎炸,蒸菜,烧烤原产地:智利",
                "categoryId": 8,
                "price": 499,
                "stock": 1,
                "status": 1,
                "createTime": "2019-12-28T07:13:07.000+0000",
                "updateTime": "2020-02-10T15:38:46.000+0000"
            },
            {
                "id": 22,
                "name": "即食海参大连野生辽刺参 新鲜速食 特级生鲜海产 60~80G",
                "image": "http://111.231.103.117:8081/images/haishen.jpg",
                "detail": "商品毛重:1.5kg商品产地:中国大陆贮存条件:冷冻重量:50-99g国产/进口:国产适用场景:养生滋补包装:袋装原产地:辽宁年限:9年以上等级:特级食品工艺:冷冻水产热卖时间:9月类别:即食海参固形物含量:70%-90%特产品类:大连海参售卖方式:单品",
                "categoryId": 13,
                "price": 699,
                "stock": 3,
                "status": 1,
                "createTime": "2019-12-28T07:16:29.000+0000",
                "updateTime": "2020-02-10T16:04:29.000+0000"
            }
        ],
        "pageNum": 1,
        "pageSize": 10,
        "size": 3,
        "startRow": 1,
        "endRow": 3,
        "pages": 1,
        "prePage": 0,
        "nextPage": 0,
        "isFirstPage": true,
        "isLastPage": true,
        "hasPreviousPage": false,
        "hasNextPage": false,
        "navigatePages": 8,
        "navigatepageNums": [
            1
        ],
        "navigateFirstPage": 1,
        "navigateLastPage": 1
    }
}

这儿主要说明两点:

          ● 这儿显示的商品都是扁平的,没有嵌套;

          ● 根据接口文档对返回数据的格式要求,我们可以发现,需要使用PageHelper分页组件的PageInfo对象来组织返回的分页数据;

3. 前台的【商品列表】接口,开发分析;

说明:

(1)前台的【商品列表】接口,这儿主要的地方就是根据不同的条件,去搜索的功能;

(2)入参判空;判断参数是否为空;

          ● orderBy、categoryId、keyword这三个参数,可传可不传;如果传的话,我们才会使用这个参数,把这个参数作为条件去查询;

          ● 所以,对于orderBy、categoryId、keyword这三个参数的判空:就不使用@Valid注解的Validation参数校验的方式,来判空了;

(3)如果传了keyword这个参数,比如传了“桃”,就表示我们搜索所有商品名中有“桃”的商品;对于这种模糊搜索的功能,我们使用%通配符和like关键字,去实现模糊查找;

          ● 在查找的时候,我们会使用【%通配符】和【like关键字】,在SQL中进行拼接,实现查找功能;


二:正式开发;

1.在ProductController类中,创建查询前台的商品列表的方法:list()方法;

    /**
     * 前台的商品列表接口;
     *
     * @return
     */
    @ApiOperation("前台商品列表")
    @GetMapping("/product/list")
    @ResponseBody
    public ApiRestResponse list(ProductListReq productListReq) {
        PageInfo pageInfoList = productService.list(productListReq);
        return ApiRestResponse.success(pageInfoList);
    }

说明:

(1)因为前台的【商品列表】接口的参数很多,所以我们创建了一个实体类ProductListReq类,用这个实体类来接收参数;

ProductListReq类:

package com.imooc.mall.model.request;

import io.swagger.models.auth.In;

/**
 * 在开发【前台的商品列表】接口时,用该类的对象接收参数
 */
public class ProductListReq {

    private String orderBy;//排序方式
    private Integer categoryId;//商品分类Id
    private String keyword;//搜索关键词
    private Integer pageNum = 1;//页数
    private Integer pageSize = 10;//每页条数

    public String getOrderBy() {
        return orderBy;
    }

    public void setOrderBy(String orderBy) {
        this.orderBy = orderBy;
    }

    public Integer getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(Integer categoryId) {
        this.categoryId = categoryId;
    }

    public String getKeyword() {
        return keyword;
    }

    public void setKeyword(String keyword) {
        
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值