无限菜单(两表)

无限菜单

因为业务需求我得写一个无限菜单功能 我就去网上找 然后我发现网上的都是一张表的 但是我的是设置了两张表 一张菜单 一张中间表 于是我就只能自己写一个方法了

第一步 首先先创建表 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格式下的效果 我的数据太多 截不全

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值