无限菜单
因为业务需求我得写一个无限菜单功能 我就去网上找 然后我发现网上的都是一张表的 但是我的是设置了两张表 一张菜单 一张中间表 于是我就只能自己写一个方法了
第一步 首先先创建表 menu_category_info ,menu_category_category
CREATE TABLE `menu_category_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu_category_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '菜单分类id',
`menu_category_name_en` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '英文名',
`menu_category_name_cn` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '中文名',
`menu_jump_path` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '页面跳转路径',
`menu_category_level` int(11) NULL DEFAULT NULL COMMENT '等级',
`is_show` int(11) NULL DEFAULT 1 COMMENT '是否显示 1正常 0禁用',
`sort` int(11) NULL DEFAULT 0 COMMENT '排序',
`create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE
)
-------------------------------------
CREATE TABLE `menu_category_category` (
`menu_category_id_p` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`menu_category_id` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
)
第二步 表设计完了以后 写个实体类 childMenuCategoryInfos用来存放子菜单
@Getter
@Setter
public class MenuCategoryInfo implements Serializable {
private Integer id;
private String menuCategoryId;
private String menuCategoryNameEn;
private String menuCategoryNameCn;
private String menuJumpPath;
private Integer menuCategoryLevel;
private Integer isShow;
private Integer sort;
private LocalDateTime createTime;
private LocalDateTime updateTime;
private List<MenuCategoryInfo> childMenuCategoryInfos;//用来放子集的
}
第三步 Mapper里准备两个方法 一个是根据等级获取(只需要获取一级的) 一个是根据父类id获取子类信息
@Mapper
public interface MenuCategoryInfoMapper {
List<MenuCategoryInfo> findMenuCategoryInfos(Integer menuCategoryLevel);
List<MenuCategoryInfo> findMenuCategoryInfoChilds(String categoryIdP);
}
------------------------------------------------------------------------------------------------------
// MenuCategoryInfoMapper.xml
<?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="compound.website.mapper.MenuCategoryInfoMapper">
<sql id="Base_Column_List">
id,menu_category_id,menu_category_name_en,menu_category_name_cn,menu_jump_path,menu_category_level,is_show,sort,create_time,update_time
</sql>
<select id="findMenuCategoryInfos" resultType="compound.website.entity.MenuCategoryInfo">
select
<include refid="Base_Column_List" />
from menu_category_info where menu_category_level = #{menuCategoryLevel} order by sort
</select>
<select id="findMenuCategoryInfoChilds" resultType="compound.website.entity.MenuCategoryInfo">
SELECT b.* FROM `menu_category_category` a
inner join menu_category_info b
on a.menu_category_id=b.menu_category_id
where a.menu_category_id_p = #{categoryIdP}
</select>
</mapper>
第四步 整一个service 所有业务层代码都在service层写
public interface MenuCategoryInfoService {
List<MenuCategoryInfo> findMenuCategoryInfos();
}
------------------------------------------------------------------------------------------------------------
@Service
@RequiredArgsConstructor
public class MenuCategoryInfoServiceImpl implements MenuCategoryInfoService {
private final MenuCategoryInfoMapper menuCategoryInfoMapper;
@Cacheable("findMenuCategoryInfos") //开启缓存
@Override
public List<MenuCategoryInfo> findMenuCategoryInfos() {
List<MenuCategoryInfo> menuCategoryInfos = menuCategoryInfoMapper.findMenuCategoryInfos(1); //找到所有一级菜单
List<MenuCategoryInfo> menus = findMenuCategoryInfoChilds(menuCategoryInfos);//调用查找子菜单方法
return menus;
}
//查找子菜单
private List<MenuCategoryInfo> findMenuCategoryInfoChilds(List<MenuCategoryInfo> menus){
menus.forEach(m->{
List<MenuCategoryInfo> menuCategoryInfoChilds = menuCategoryInfoMapper.findMenuCategoryInfoChilds(m.getMenuCategoryId()); //子菜单
m.setChildMenuCategoryInfos(menuCategoryInfoChilds);//将子菜单放进父菜单中
menuCategoryInfoChilds.forEach(m2->{//循环子菜单
List<MenuCategoryInfo> menuCategoryInfoChilds2 = menuCategoryInfoMapper.findMenuCategoryInfoChilds(m2.getMenuCategoryId());//是否存在下一子菜单
if (menuCategoryInfoChilds2.size() != 0) {
findMenuCategoryInfoChilds(menuCategoryInfoChilds);//如果存在 调用自己
}
});
});
return menus;
}
}
第五步 controller层 把结果转成json格式看看效果
@Controller
@AllArgsConstructor
public class MenuCategoryInfoController {
private final MenuCategoryInfoService menuCategoryInfoService;
@RequestMapping("/menuCategoryInfo")
@ResponseBody
public JSONArray findMenuCategoryInfo(){
List<MenuCategoryInfo> menuCategoryInfos = menuCategoryInfoService.findMenuCategoryInfos();
JSONArray array= JSONArray.parseArray(JSON.toJSONString(menuCategoryInfos)); //转成json格式看是否正常
return array;
}
}
最后看看json格式下的效果 我的数据太多 截不全