后台分类model的开发具体功能有:添加分类名称,修改分类名称,查询所有子分类,查询父分类以及它下面的子分类(递归)
- 需要注意的是,在后台管理进行操作的时候,都需要验证当前用户是否是管理员的角色,不管进行哪些操作都需要提前验证身份。具体的实现方法就是,先从session中获取user,判断不为空的条件下再进行角色验证,如果不是管理员直接返回错误信息,提示需要管理员登录,如果是管理员才能进行下面的操作。验证方法的主要代码如下:
User user = (User) session.getAttribute(Const.CURRENT_USER);
if (user == null) {
return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(), "需要管理员登录");
}
//校验是否是管理员
ServerResponse response = userService.checkAdminRole(user);
if (response.isSuccess()) {
//是管理员,才进行操作
} else {
return ServerResponse.createByErrorMessage("您不是管理员,没有权限");
}
checkAdminRole方法如下:
public ServerResponse checkAdminRole(User user) {
if (user!=null&&user.getRole()==Const.Role.ROLE_ADMIN.intValue()){
return ServerResponse.createBySuccess();
}
return ServerResponse.createByError();
}
这里主要记录一下查询父分类以及它下面的子类的实现方法;首先我们先搞明白想要获取的数据到底是什么?例如父分类就是一个大的方向的分类,例如家用电器,家用电器下又有许多子分类,像格力,小米,海尔等,而像小米下面又有许多分类。所以我们想要获取的就是当一个父分类没有子分类的时候我们只要返回它本身,如果他下面还有其他的子分类那就返回它本身加上他他的所有子分类下的分类。
因此可以采用递归的形式获取:
/**
* 递归查询 当前分类下的子分类
* 0->1->2;当前节点是0,返回0,1,2;当前节点是1,返回1,2;
* @param categories
* @param categoryId
* @return
*/
private Set<Category> findChildCategory(Set<Category> categories,Integer categoryId){
Category category = categoryMapper.selectByPrimaryKey(categoryId);
if (category!=null){
categories.add(category);
}
List<Category> categoryList = categoryMapper.selectChildrenCategoryByParentId(categoryId);
for (Category category1 : categoryList) {
findChildCategory(categories, category1.getId());
}
return categories;
}
递归结束的条件就是当前分类没有子分类,也就是子分类等于null;否者就把当前分类放到一个set集合中,我妈知道set集合是不重复并且无序的,那他是怎样保证排除重复的呢?没错就是通过对象的equals方法和hashcode方法来判断两个对象是否相等,这里需要知道,如果两个对象通过equals方法比较返回true,那么他俩的hashCode方法也返回true,但是反过来hashcode一样,equals不一定返回true。
所以这里需要重写Category的hashCode方法和equals方法。按照id比较,来半段这两个实例是否相等。
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Category)) {
return false;
}
Category category = (Category) o;
return Objects.equals(getId(), category.getId());
}
@Override
public int hashCode() {
return Objects.hash(getId());
}
mapper的selectByPrimaryKey方法是根据id从数据库中查询到这一个分类,selectChildrenCategoryByParentId是根据父类id查询他下面所有的子类对象封装成list集合,然后在递归。