分布式电商项目三十三:商品服务-品牌管理

商品服务-品牌管理

在之前做好的品牌管理中,有两个问题需要解决:
在这里插入图片描述
查询端口没有后台支持,无法完成查询功能,分页功能无法正确显示分页的内容。

引入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>

最后重启服务,来到前端进行测试,修改分类名称:
在这里插入图片描述
可以看到关联分类中的名称也发生了修改:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值