【Spring】Day16

1. 显示品牌列表

由于BrandMapper已经实现了“查询品牌列表”功能,所以,Mapper层无需处理。

IBrandService接口中添加:

/**
 * 查询品牌列表
 *
 * @return 品牌列表,如果没有匹配的品牌,将返回长度为0的列表
 */
List<BrandListItemVO> list();

BrandServiceImpl中调用Mapper对象的查询方法直接实现:

@Override
public List<BrandListItemVO> list() {
    log.debug("开始处理【查询品牌列表】的业务");
    return brandMapper.list();
}

BrandServiceTests中测试:

@Test
void testList() {
    List<?> list = service.list();
    log.debug("查询品牌列表,查询结果中的数据的数量:{}", list.size());
    for (Object brand : list) {
        log.debug("{}", brand);
    }
}

然后,在BrandController中添加处理请求的方法:

// http://localhost:9080/brands
@ApiOperation("查询品牌列表")
@ApiOperationSupport(order = 400)
@GetMapping("")
public JsonResult<List<BrandListItemVO>> list() {
    log.debug("开始处理【查询品牌列表】的请求……");
    List<BrandListItemVO> list = brandService.list();
    return JsonResult.ok(list);
}

完成后,通过Knife4j的API文档可以进行调试(测试访问)。

2. SSO(Single Sign On:单点登录)

在集群甚至分布式系统中,通常只有某1种服务提供登录认证,无论是其它哪个服务需要用户登录,用户都应该在此专门提供登录认证的服务器端进行认证,并且,认证结果对于其它所有服务都是有效的!

SSO的典型实现方案就是使用Token。

关于商品管理的相关功能,也应该是需要经过认证的(需要先登录),并且,可能也会采取某些权限控制!

需要将passport项目的相关代码复制到product项目中:

  • pom.xml中的依赖:spring-boot-starter-securityfastjsonjjwt
  • ServiceCode:补充新的枚举值
  • LoginPrincipal
  • application.properties中的配置:关于JWT的配置,且secretKey必须相同
  • JwtAuthorizationFilter过滤器
  • SecurityConfiguration配置类
    • 删除PasswordEncoder@Bean方法
    • 删除AuthenticationManager@Bean方法
      • 必须删除,否则,在product项目中执行测试时,会出现内存溢出
    • 调整配置的白名单
  • GlobalExceptionHandler:至少补充处理AccessDeniedException

完成后,可以先通过product项目的在线API文档进行测试访问,在没有携带JWT的情况下,所有请求都会响应403错误,需要先在passport项目的在线API文档中执行登录,得到JWT数据,并配置到product项目的API文档中,再次访问,则可以正常访问!

3. 显示类别列表

关于“类别”的显示,需要注意:通常并不需要一次性将所有的、各层级的类别全部查询或显示出来,只需要查询特定的一些类别,例如:查询所有1级类别,或查询某个1级类别的子级类别列表等。

目前,在Mapper层已经实现了List<CategoryListItemVO> listByParentId(Long parentId);,所以,Mapper层无需再开发。

则,在ICategoryService中添加:

/**
 * 根据父级类别的id查询类别列表
 *
 * @param parentId 父级类别的id
 * @return 类别列表
 */
List<CategoryListItemVO> listByParentId(Long parentId);

CategoryServiceImpl中实现:

@Override
public List<CategoryListItemVO> listByParentId(Long parentId) {
    log.debug("开始处理【根据父级类别查询子级类别列表】的业务");
    return categoryMapper.listByParentId(parentId);
}

CategoryServiceTests中测试:

@Test
public void testListByParentId() {
    Long parentId = 0L;
    List<?> list = service.listByParentId(parentId);
    log.info("查询列表完成,结果集中的数据的数量={}", list.size());
    for (Object item : list) {
        log.info("{}", item);
    }
}

CategoryController中添加处理请求的方法:

// http://localhost:9080/categories/list-by-parent
@ApiOperation("根据父级类别查询子级类别列表")
@ApiOperationSupport(order = 410)
@ApiImplicitParam(name = "parentId", value = "父级类别id,如果是一级类别,则此参数值应该为0",
            required = true, dataType = "long")
@GetMapping("/list-by-parent")
public JsonResult<List<CategoryListItemVO>> listByParentId(Long parentId) {
    if (parentId == null || parentId < 0) {
        parentId = 0L;
    }
    List<CategoryListItemVO> list = categoryService.listByParentId(parentId);
    return JsonResult.ok(list);
}

完成后,重启项目,通过API文档应该可以测试访问。

4. 添加属性模板

由于服务器端已经实现了“添加属性模板”的功能,所以,只需完成前端界面即可。

5. 显示属性模板列表

此前已经实现了Mapper层的查询,接下来,需要实现Service层、Controller层和前端界面的处理!

6. 在添加属性界面中显示属性模板列表的下拉菜单

作业

  • 完成“删除品牌”功能(从界面上点击按钮完成)
  • 完成“启用品牌”功能(从界面上点击按钮完成)
  • 完成“禁用品牌”功能(从界面上点击按钮完成)
  • 完成“启用类别”功能(从界面上点击按钮完成)
  • 完成“禁用类别”功能(从界面上点击按钮完成)
  • 完成“显示类别(是否显示在导航栏)”功能(从界面上点击按钮完成)
  • 完成“隐藏类别(是否显示在导航栏)”功能(从界面上点击按钮完成)
  • 完成“删除类别”功能(从界面上点击按钮完成)
  • 完成“删除相册”功能(从界面上点击按钮完成)
  • 完成“删除属性模板”功能(从界面上点击按钮完成)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值