up:: SpringBoot电商项目商品分类模块使用Swagger自动生成API文档

说明:

(1) 本篇博客内容说明:【更新目录分类】接口的开发;

(2) 本篇博客需要注意的点:

● 本篇博客,总体上没有什么新的内容;

● UpdateCategoryReq这个类,我们图省事,是复制的AddCategoryReq;然后,我们增加了id属性;;一定要记得添加id属性的get和set方法;否则,接口就会返回【id不能为null】的错误信息;


一:【更新目录分类】接口文档;以及该接口的几点说明;

说明:

(1) 【更新目录分类】接口,请求方式是POST;然后,其参数是放在body中的,JSON格式;

(2) 然后,更新的时候,是必须要传入id;其他四个参(name,type,parentId,orderNum),我们要更新哪个就传哪个值,如果不更新就可以为空;

(3) 因为【我们不允许分类的名字,重名】,所以,我们在更新的时候,也要防止重名的情况;如下图所示:

(4) 然后,更新操作,也要求有用户登录,且是管理员用户登录的情况下,才能操作;


二:正式开发;

1.在CategoryController类中,创建更新目录分类的方法:update()方法;

 
      @ApiOperation("后台更新商品分类目录")
         @PostMapping("/admin/category/update")
         @ResponseBody
         public ApiRestResponse updateCategory(HttpSession session, @Valid @RequestBody UpdateCategoryReq updateCategoryReq) {
             //尝试获取当前登录用户
             User currentUser = (User)
					 session.getAttribute(Constant.IMOOC_MALL_USER);
             //如果获取不到,说明当前没有用户登录;就返回【用户未登录】的信息
             if (currentUser == null) {
                 return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_LOGIN);
             }
             //校验当前用户是否是管理员用户
             boolean isAdminRole = userService.checkAdminRole(currentUser);
 
             if (isAdminRole) {//如果是管理用户;就去执行【更新目录分类】;
                 Category category = new Category();
                 BeanUtils.copyProperties(updateCategoryReq, category);
                 categoryService.update(category);
                 return ApiRestResponse.success();
             } else {//如果不是管理员用户;就返回【无管理员权限】的信息
                 return ApiRestResponse.error(ImoocMallExceptionEnum.NEED_ADMIN);
             }
         }

说明:

(1) update方法的url,参数,参数校验,要比照接口来书写;

(2)同理,创建UpdateCategoryReq这个bean,以在更新接口处接收参数;

UpdateCategoryReq:

     package com.imooc.mall.model.request;
 
     import javax.validation.constraints.Max;
     import javax.validation.constraints.NotNull;
     import javax.validation.constraints.Size;
 
     /**
      * 描述:【更新目录分类】接口的参数类;
      */
     public class UpdateCategoryReq {
         @NotNull(message = "目录id不能为null")
         private Integer id;
 
         @Size(min = 2, max = 5)
         private String name;//目录名
 
         @Max(3)
         private Integer type;//目录级别
 
         private Integer parentId;//上一级目录的id
 
         private Integer orderNum;//同级目录的排序顺序
 
 
         public String getName() {
             return name;
         }
 
         public void setName(String name) {
             this.name = name;
         }
 
         public Integer getType() {
             return type;
         }
 
         public void setType(Integer type) {
             this.type = type;
         }
 
         public Integer getParentId() {
             return parentId;
         }
 
         public void setParentId(Integer parentId) {
             this.parentId = parentId;
         }
 
         public Integer getOrderNum() {
             return orderNum;
         }
 
         public void setOrderNum(Integer orderNum) {
             this.orderNum = orderNum;
         }
 
         public Integer getId() {
             return id;
         }
 
         public void setId(Integer id) {
             this.id = id;
         }
     }
 

UpdateCategoryReq类需要按照更新接口的参数要求来编写; 对于更新接口来说,要求id不能为null;其他四个参(name,type,parentId,orderNum)是可以为空的;

一个特别容易出错的点: UpdateCategoryReq这个类,我们图省事,是复制的AddCategoryReq;然后,我们增加了id属性;;一定要记得添加id属性的get和set方法;否则,接口就会返回【id不能为null】的错误信息;

(3)方法说明;

Service层的update方法,在下一部分介绍;

2.在CategoryServiceImpl类中,创建更新目录分类的方法:update()方法;并在CategoryService接口中反向生成该方法的声明;

 
         /**
          * 更新目录分类
          * @param updateCategory
          */
         @Override
         public void update(Category updateCategory) {
             //因为分类的名字不允许重复;所以,在更新前需要有下面的判断逻辑;
             if (updateCategory.getName() != null) {
                 Category categoryOld = categoryMapper.selectByName(updateCategory.getName());
                 if (categoryOld.getName() != null && !categoryOld.getId().equals(updateCategory.getId())) {
                     throw new ImoocMallException(ImoocMallExceptionEnum.NAME_EXISTED);
                 }
             }
             //如果没有name重名的风险,就调用方法去更新;
             int count = categoryMapper.updateByPrimaryKeySelective(updateCategory);
             if (count == 0) {
                 throw new ImoocMallException(ImoocMallExceptionEnum.UPDATE_FAILED);
             }
         }

说明:

(1)方法说明:为了【防止分类重名】而添加的逻辑;

(2)因为传递参数,可能不全,所以调用updateByPrimaryKeySelective()方法,是非常合适的;

(3)在方法上添加@Override注解,并通过快捷键,在CategoryService接口中,反向生成updat()方法的声明;

3.启动项目,测试;

启动项目;

(1)正常的情况;

(2)失败的情况:没有通过重名的检查;