栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

无限菜单(两表)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

无限菜单(两表)

无限菜单

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

第一步 首先先创建表 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 childMenuCategoryInfos;//用来放子集的
}

第三步 Mapper里准备两个方法 一个是根据等级获取(只需要获取一级的) 一个是根据父类id获取子类信息

@Mapper
public interface MenuCategoryInfoMapper {

    List findMenuCategoryInfos(Integer menuCategoryLevel);

    List findMenuCategoryInfoChilds(String categoryIdP);
}
------------------------------------------------------------------------------------------------------

// MenuCategoryInfoMapper.xml



    
        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
    

    
        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}
    



第四步 整一个service 所有业务层代码都在service层写

public interface MenuCategoryInfoService {

    List findMenuCategoryInfos();
    
}

------------------------------------------------------------------------------------------------------------

@Service
@RequiredArgsConstructor
public class MenuCategoryInfoServiceImpl implements MenuCategoryInfoService {
    private final MenuCategoryInfoMapper menuCategoryInfoMapper;

    @Cacheable("findMenuCategoryInfos")  //开启缓存
    @Override
    public List findMenuCategoryInfos() {
        List menuCategoryInfos = menuCategoryInfoMapper.findMenuCategoryInfos(1);       //找到所有一级菜单
        List menus = findMenuCategoryInfoChilds(menuCategoryInfos);//调用查找子菜单方法
        return menus;
    }

    //查找子菜单
    private List findMenuCategoryInfoChilds(List menus){
        menus.forEach(m->{
            List menuCategoryInfoChilds = menuCategoryInfoMapper.findMenuCategoryInfoChilds(m.getMenuCategoryId()); //子菜单
            m.setChildMenuCategoryInfos(menuCategoryInfoChilds);//将子菜单放进父菜单中
            menuCategoryInfoChilds.forEach(m2->{//循环子菜单
                List 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 menuCategoryInfos = menuCategoryInfoService.findMenuCategoryInfos();
        JSONArray array= JSONArray.parseArray(JSON.toJSONString(menuCategoryInfos)); //转成json格式看是否正常
        return array;
    }
}

最后看看json格式下的效果 我的数据太多 截不全

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022040.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号