商品服务-品牌管理
在之前做好的品牌管理中,有两个问题需要解决:
查询端口没有后台支持,无法完成查询功能,分页功能无法正确显示分页的内容。
引入Mybatis分页插件
参考官方文档,springboot的使用方法是添加PaginationInterceptor的bean组件。新建config包,之后创建对应的文件:
package com.lastingwar.mall.product.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* 引入分页插件
*/
@Configuration
@EnableTransactionManagement //开启事务
@MapperScan("com.lastingwar.mall.product.dao")
public class MyBatisConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInterceptor.setOverflow(true);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInterceptor.setLimit(1000);
return paginationInterceptor;
}
}
之后重启服务,打开人人界面,发现已经配置完成:
品牌的模糊查询功能
首先来到品牌管理的服务层:
package com.lastingwar.mall.product.service.impl;
import org.springframework.stereotype.Service;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lastingwar.common.utils.PageUtils;
import com.lastingwar.common.utils.Query;
import com.lastingwar.mall.product.dao.BrandDao;
import com.lastingwar.mall.product.entity.BrandEntity;
import com.lastingwar.mall.product.service.BrandService;
@Service("brandService")
public class BrandServiceImpl extends ServiceImpl<BrandDao, BrandEntity> implements BrandService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
IPage<BrandEntity> page = this.page(
new Query<BrandEntity>().getPage(params),
new QueryWrapper<BrandEntity>()
);
return new PageUtils(page);
}
}
可以看到查询内容是直接返回,没有查询条件。添加查询条件,首先获取查询的关键字“key”,修改如下;
package com.lastingwar.mall.product.service.impl;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lastingwar.common.utils.PageUtils;
import com.lastingwar.common.utils.Query;
import com.lastingwar.mall.product.dao.BrandDao;
import com.lastingwar.mall.product.entity.BrandEntity;
import com.lastingwar.mall.product.service.BrandService;
@Service("brandService")
public class BrandServiceImpl extends ServiceImpl<BrandDao, BrandEntity> implements BrandService {
@Override
public PageUtils queryPage(Map<String, Object> params) {
//接受关键字的值
String key = (String) params.get("key");
//添加查询条件
QueryWrapper<BrandEntity> queryWrapper = new QueryWrapper<>();
//如果关键字不为空,启动查询条件,搜索品牌ID的值或者模糊搜索名称
if (StringUtils.isNotEmpty(key)){
queryWrapper.eq("brand_id",key).or().like("name",key);
}
//将queryWrapper封装进page返回
IPage<BrandEntity> page = this.page(
new Query<BrandEntity>().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
}
保存重启服务,前端测试没问题:
地址上传位置修改
在品牌管理中也有对应的图片上传功能,需要自己根据OSS地址进行修改,将前端代码中的src\components\upload文件夹替换为自己之前写好的OSS连接的vue组件。主要区别是地址不同
之后记得打开第三方的微服务然后对品牌添加进行测试。测试没问题:
关联分类
品牌管理中多出来一个关联分类功能:
需要把添加的这些手机品牌关联到手机的三级分类中,对应的接口文档:
按照接口文档,首先添加响应控制:
/**
* 获取当前品牌关联的所以分类列表
*/
@GetMapping("/catelog/list")
//@RequiresPermissions("product:categorybrandrelation:list")
//只需要接收品牌ID即可,
public R cateloglist(@RequestParam("brandId")Long brandId){
//使用Service的列表功能直接返回一个列表
List<CategoryBrandRelationEntity> data=categoryBrandRelationService.list(
//添加搜索规则brandId相同
new QueryWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId)
);
return R.ok().put("data", data);
}
之后还要有关联关系的保存功能:,对应文档:
来到控制层,会发现这个响应控制已经有了。这里有一个细节,电商网站大表数据内容比较多,所以在做关联表格的时候,通过添加冗余的字段,到小表格中查找,数据库中不仅保存有品牌ID和分类ID同时还保存有品牌和分类名称。
所以在进行关联保存时,要先查到对应的名称,再一起保存进去。
修改控制响应的方法,
/**
* 保存
*/
@RequestMapping("/save")
//@RequiresPermissions("product:categorybrandrelation:save")
public R save(@RequestBody CategoryBrandRelationEntity categoryBrandRelation){
categoryBrandRelationService.saveDrtail(categoryBrandRelation);
return R.ok();
}
之后添加saveDrtail方法,并在服务层实现方法:
package com.lastingwar.mall.product.service.impl;
@Service("categoryBrandRelationService")
public class CategoryBrandRelationServiceImpl extends ServiceImpl<CategoryBrandRelationDao, CategoryBrandRelationEntity> implements CategoryBrandRelationService {
@Autowired
BrandDao brandDao;
@Autowired
CategoryDao categoryDao;
...
/**
* 保存品牌和分类id时同时保存名称
* @param categoryBrandRelation 品牌和分类关联表
*/
@Override
public void saveDrtail(CategoryBrandRelationEntity categoryBrandRelation) {
Long brandId = categoryBrandRelation.getBrandId();
Long catalogId = categoryBrandRelation.getCatelogId();
//查询详细的名字
BrandEntity brandEntity = brandDao.selectById(brandId);
CategoryEntity categoryEntity = categoryDao.selectById(catalogId);
categoryBrandRelation.setBrandName(brandEntity.getName());
categoryBrandRelation.setCatelogName(categoryEntity.getName());
this.save(categoryBrandRelation);
}
}
这样两个品牌关联的方法就写完了,保存并重启项目,之后到前端进行测试:
关联成功。
保证冗余字段的一致性
由于电商网站使用了冗余字段来避免频繁查询大表,作用在对品牌名称进行修改时,要确保冗余的字段也一起修改,可以通过修改品牌的save响应来修改。
package com.lastingwar.mall.product.controller;
...
/**
* 品牌
*
* @author yhm
* @email 403627000@qq.com
* @date 2020-05-29 16:37:08
*/
@RestController
@RequestMapping("product/brand")
public class BrandController {
@Autowired
private BrandService brandService;
...
/**
* 修改
*/
@RequestMapping("/update")
//@RequiresPermissions("product:brand:update")
public R update(@Validated({UpdateGroup.class}) @RequestBody BrandEntity brand){
brandService.updateDetail(brand);
return R.ok();
}
...
}
自定义一个updateDetail,快捷键添加方法并实现:
package com.lastingwar.mall.product.service.impl;
import com.lastingwar.mall.product.dao.CategoryBrandRelationDao;
import com.lastingwar.mall.product.service.CategoryBrandRelationService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Map;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lastingwar.common.utils.PageUtils;
import com.lastingwar.common.utils.Query;
import com.lastingwar.mall.product.dao.BrandDao;
import com.lastingwar.mall.product.entity.BrandEntity;
import com.lastingwar.mall.product.service.BrandService;
@Service("brandService")
public class BrandServiceImpl extends ServiceImpl<BrandDao, BrandEntity> implements BrandService {
@Autowired
CategoryBrandRelationService categoryBrandRelationService;
@Override
public PageUtils queryPage(Map<String, Object> params) {
//接受关键字的值
String key = (String) params.get("key");
//添加查询条件
QueryWrapper<BrandEntity> queryWrapper = new QueryWrapper<>();
//如果关键字不为空,启动查询条件,搜索品牌ID的值或者模糊搜索名称
if (StringUtils.isNotEmpty(key)){
queryWrapper.eq("brand_id",key).or().like("name",key);
}
//将queryWrapper封装进page返回
IPage<BrandEntity> page = this.page(
new Query<BrandEntity>().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
/**
* 保存品牌和分类id时同时保存名称
* @param categoryBrandRelation 品牌和分类关联表
*/
@Override
public void updateDetail(BrandEntity brand) {
//调用之前的方法,保证自身的表先更新
this.updateById(brand);
//品牌名不为空保存冗余字段
if (StringUtils.isNotEmpty(brand.getName())){
categoryBrandRelationService.updateBrand(brand.getBrandId(),brand.getName());
//TODO 更新其他方法
}
}
}
之后要让categoryBrandRelationService实现一个updateBrand方法,根据获取到的ID和名称对表格进行更新。同样快捷键添加方法,实现方法:
/**
* 请求对品牌进行信息更改时同时更新关联表的品牌信息
* @param brandId 品牌ID
* @param name 品牌名称
*/
@Override
public void updateBrand(Long brandId, String name) {
//创建一个ID和名称的关联类
CategoryBrandRelationEntity relationEntity = new CategoryBrandRelationEntity();
relationEntity.setBrandId(brandId);
relationEntity.setBrandName(name);
//添加一个更新的判断条件,只要品牌ID相同就更新所有关联表中的内容
this.update(relationEntity,new UpdateWrapper<CategoryBrandRelationEntity>().eq("brand_id",brandId));
}
之后来到前端进行测试,修改品牌名称,打开管理,会看到关联中的名称也发生了更改:
同理修改关联分类的名称
来到CategoryController,修改方法:
/**
* 修改
*/
@RequestMapping("/update")
//@RequiresPermissions("product:category:update")
public R update(@RequestBody CategoryEntity category){
categoryService.updateCascade(category);
return R.ok();
}
之后创建方法,实现方法:
package com.lastingwar.mall.product.service.impl;
@Service("categoryService")
public class CategoryServiceImpl extends ServiceImpl<CategoryDao, CategoryEntity> implements CategoryService {
@Autowired
CategoryBrandRelationService categoryBrandRelationService;
...
@Override
public void updateCascade(CategoryEntity category) {
//调用之前的方法,更新大表
this.updateById(category);
//编写方法修改关联表
categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());
}
...
}
同样对categoryBrandRelationService 创建和实现方法updateCategory:
/**
* 对分类进行请求更改时,同时修改关联的分类信息
* @param catId 分类ID
* @param name 分类名称
*/
@Override
public void updateCategory(Long catId, String name) {
this.baseMapper.updateCategory(catId,name);
}
这里使用mybatis提供的方法,自动生成可以写sql语句的方法。之后创建baseMapper的updateCategory方法并实现它。
代码:
package com.lastingwar.mall.product.dao;
import com.lastingwar.mall.product.entity.CategoryBrandRelationEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 品牌分类关联
*
* @author yhm
* @email 403627000@qq.com
* @date 2020-05-29 16:37:08
*/
@Mapper
public interface CategoryBrandRelationDao extends BaseMapper<CategoryBrandRelationEntity> {
void updateCategory(@Param("catId") Long catId, @Param("name") String name);
}
点击实现接口,即可通过sql语句进行操作。
<?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.lastingwar.mall.product.dao.CategoryBrandRelationDao">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.lastingwar.mall.product.entity.CategoryBrandRelationEntity" id="categoryBrandRelationMap">
<result property="id" column="id"/>
<result property="brandId" column="brand_id"/>
<result property="catelogId" column="catelog_id"/>
<result property="brandName" column="brand_name"/>
<result property="catelogName" column="catelog_name"/>
</resultMap>
<update id="updateCategory">
UPDATE `pms_category_brand_relation` SET catelog_name=#{name} WHERE catelog_id=#{catId};
</update>
</mapper>
最后重启服务,来到前端进行测试,修改分类名称:
可以看到关联分类中的名称也发生了修改: