路由路径:/item/brand
根据路由文件知,对应的页面是:src/pages/item/Brand.vue
页面会发送如下请求:
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.实体类 @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通用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中,提高复用性:
不要忘记在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