Day06_商品分类(vuetify-nginx-cors)与品牌查询 (9)

Day06_商品分类(vuetify-nginx-cors)与品牌查询

路由路径:/item/brand

根据路由文件知,对应的页面是:src/pages/item/Brand.vue

页面会发送如下请求:

Day06_商品分类(vuetify-nginx-cors)与品牌查询

6.1.后台提供查询接口

前台页面已经准备好,接下来就是后台提供数据接口了。

6.1.1.数据库表 CREATE TABLE `tb_brand` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'品牌id\', `name` varchar(50) NOT NULL COMMENT \'品牌名称\', `image` varchar(200) DEFAULT \'\' COMMENT \'品牌图片地址\', `letter` char(1) DEFAULT \'\' COMMENT \'品牌的首字母\', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=325400 DEFAULT CHARSET=utf8 COMMENT=\'品牌表,一个品牌下有多个商品(spu),一对多关系\';

简单的四个字段,不多解释。

这里需要注意的是,品牌和商品分类之间是多对多关系。因此我们有一张中间表,来维护两者间关系:

CREATE TABLE `tb_category_brand` ( `category_id` bigint(20) NOT NULL COMMENT \'商品类目id\', `brand_id` bigint(20) NOT NULL COMMENT \'品牌id\', PRIMARY KEY (`category_id`,`brand_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=\'商品分类和品牌的中间表,两者是多对多关系\';

但是,你可能会发现,这张表中并没有设置外键约束,似乎与数据库的设计范式不符。为什么这么做?

外键会严重影响数据库读写的效率

数据删除时会比较麻烦

在电商行业,性能是非常重要的。我们宁可在代码中通过逻辑来维护表关系,也不设置外键。

6.1.2.实体类

Day06_商品分类(vuetify-nginx-cors)与品牌查询

@Table(name = "tb_brand") public class Brand { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name;// 品牌名称 private String image;// 品牌图片 private Character letter; // getter setter 略 } 6.1.3.mapper

Day06_商品分类(vuetify-nginx-cors)与品牌查询

通用mapper来简化开发:

public interface BrandMapper extends Mapper<Brand> { } 6.1.4.controller

编写controller先思考四个问题,参照前端页面的控制台

请求方式:查询,肯定是Get

请求路径:分页查询,/brand/page

请求参数:根据我们刚才编写的页面,有分页功能,有排序功能,有搜索过滤功能,因此至少要有5个参数:

page:当前页,int

rows:每页大小,int

sortBy:排序字段,String

desc:是否为降序,boolean

key:搜索关键词,String

响应结果:分页结果一般至少需要两个数据

total:总条数

items:当前页数据

totalPage:有些还需要总页数

这里我们封装一个类,来表示分页结果:

public class PageResult<T> { private Long total;// 总条数 private Integer totalPage;// 总页数 private List<T> items;// 当前页数据 public PageResult() { } public PageResult(Long total, List<T> items) { this.total = total; this.items = items; } public PageResult(Long total, Long totalPage, List<T> items) { this.total = total; this.totalPage = totalPage; this.items = items; } public Long getTotal() { return total; } public void setTotal(Long total) { this.total = total; } public List<T> getItems() { return items; } public void setItems(List<T> items) { this.items = items; } public Long getTotalPage() { return totalPage; } public void setTotalPage(Long totalPage) { this.totalPage = totalPage; } }

另外,这个PageResult以后可能在其它项目中也有需求,因此我们将其抽取到leyou-common中,提高复用性:

Day06_商品分类(vuetify-nginx-cors)与品牌查询

不要忘记在leyou-item-service工程的pom.xml中引入leyou-common的依赖

<dependency> <groupId>com.leyou.common</groupId> <artifactId>leyou-common</artifactId> <version>1.0.0-SNAPSHOT</version> </dependency>

接下来,我们编写Controller

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzfdsz.html