精华内容
下载资源
问答
  • 无限级菜单

    2018-03-21 11:22:17
    扩展lu的无限级菜单,护展文件有:layuiExt.css,menuExt.js,测试页面:sysIndex.html
  • 无限级菜单

    2018-11-14 10:01:40
    javascript ,jquery就够了无需太麻烦的库,简洁美观,只需传入json对象,即可生成无限级菜单
  • 主要介绍了使用jquery菜单插件HoverTree仿京东无限级菜单,需要的朋友可以参考下
  • js无限级菜单

    2018-11-14 10:07:32
    javascript ,jquery就够了无需太麻烦的库,简洁美观,只需传入json对象,即可生成无限级菜单
  • 本篇文章主要是对jQuery 无限级菜单的简单实例进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
  • 主要介绍了vue Element左侧无限级菜单实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • js实现无限级菜单js实现无限级菜单js实现无限级菜单
  • 策略:数据库就一张表,前端查询出所有的可显示的菜单,在前端进行循环展示。1,数据库表的设计CREATE TABLEsys_menu (idINT NOT NULLAUTO_INCREMENT,nameVARCHAR(64) NOT NULL,urlVARCHAR(255),pidINT NOT NULL ...

    策略:数据库就一张表,前端查询出所有的可显示的菜单,在前端进行循环展示。

    1,数据库表的设计

    CREATE TABLEsys_menu (

    idINT NOT NULLAUTO_INCREMENT,

    nameVARCHAR(64) NOT NULL,

    urlVARCHAR(255),

    pidINT NOT NULL DEFAULT 0,

    isLeafTINYINT NOT NULL DEFAULT 1COMMENT'0表示不是叶子,1表示是叶子',

    statusTINYINT NOT NULL DEFAULT 1COMMENT'0表示禁用,1表示启用',

    seqTINYINT NOT NULL DEFAULT 0COMMENT'同级中的顺序,0-n,从上到下',PRIMARY KEY(id)

    );

    把菜单当作一个多叉树,root节点为虚拟节点,id为0。第一层节点表示一级菜单,以此类推。其中,isLeaf表示该菜单是不是叶子节点。

    简单的填充数据如下所示:

    1001215-20170925231241776-1259880470.png

    2,查询所有菜单的接口(略,简单的sql查询)

    需要过滤status=0,也就是禁用的菜单。

    3,前端展示

    3.1 html代码和css样式

    body中就是如下简单的代码

    css样式(从网上随便找的)

    a{text-decoration:none;

    }ul, li{list-style:none;margin:0;padding:0;

    }

    /*定义菜单*/.Menue li{background:#111;color:#fff;height:30px;line-height:30px;position:relative;float:left;margin-right:5px;width:100px;text-align:center;font-family:Arial, Helvetica, sans-serif;

    }.Menue li a{color:#fff;font-size:14px;display:block;

    }

    /*下拉菜单样式*/ul.sub_menu{position:absolute;width:100px;display:none;z-index:999;

    }.Menue li ul.sub_menu li{background:none;color:#555;font-size:12px;border-bottom:1px #333 solid;position:relative;width:100px;height:30px;

    }.Menue li ul.sub_menu li.last{border-bottom:none;

    }

    /*js会对最后一个li添加该class,去掉border-bottom效果*/.Menue li ul.sub_menu li a{background:#222;color:#888;display:block;height:30px;

    }.Menue li ul.sub_menu li a:hover, .Menue li ul.sub_menu li a.now{background:#f90;color:#fff;

    }.Menue li.now, .Menue li.current{background:#f60;color:#fff;

    }

    /*如果有下拉菜单添加的class*/.hasmenu{background:url(arrow.png) no-repeat right;padding-right:15px;

    }

    /*主导航箭头向下*/.Menue li a.hasmenu{background:url(arrow.png) no-repeat right;padding-right:15px;background-position:right -30px;

    }

    /*下拉菜单箭头向右*/.Menue li ul.sub_menu li a.hasmenu{background:#222 url(arrow.png) no-repeat right top;

    }.Menue li ul.sub_menu li a.hasmenu:hover{background:#f90 url(arrow.png) no-repeat right top;color:#fff;

    }

    3.2 jquery ajax获取所有的菜单数据

    $.ajax({

    type:"GET",

    url:"/menu/getMenus.do",

    dataType:"json",

    success:function(result) {if (result.status > 0) {//获取到菜单数据,进行展示

    //1,展示顶级菜单

    var list =result.body;vari;for (i = 0; i < list.length; i++) {//console.log(typeof list[i].url == 'undefined');//如果url不存在,则为undefined,应该用typeof判断

    }//$(".Menue").html("");

    $(".Menue").html(showFirstLevelMenu(list));

    console.log(showFirstLevelMenu(list))//在菜单全部显示后,增加hover件事

    addHover();

    }else{

    alert(result.message);

    }

    },

    error:function() {

    alert("服务器故障,请刷新或稍后重试!");

    }

    })

    当获取到数据后,将数据拼装成节点html数据,设置到class=Menu的ul中。然后对动态添加的html代码段加上hover事件

    $(".Menue").html(showFirstLevelMenu(list));

    //在菜单全部显示后,增加hover事件

    addHover();

    3.3 递归拼接

    使用递归调用实现拼接子菜单

    functionshowFirstLevelMenu(list) {//class = Menu_li

    //遍历list找到

    var menu = "";var subList = newArray();vari;for (i = 0; i < list.length; i++) {if (list[i].pid == 0) {

    subList.push(list[i]);

    }

    }

    subList.sort(function(a, b) {return a.seq - b.seq;//从小到大排序

    });

    alert(subList.length)for (i = 0; i < subList.length; i++) {

    menu+= '

    ' + showSubMenu(list, subList[i]) + '';

    }returnmenu;

    }functionshowSubMenu(list, menuInfo) {//class = sub_menu

    var menu = '' + menuInfo.name + '';if (menuInfo.isLeaf == 0) {//有子菜单

    var subList = newArray();vari;for (i = 0; i < list.length; i++) {if (list[i].pid ==menuInfo.id) {

    subList.push(list[i]);

    }

    }if (subList.length != 0) {

    subList.sort(function(a, b) {return a.seq - b.seq;//从小到大排序

    });

    menu+= '

    menu+= '

    ' + showSubMenu(list, subList[i]) + '';

    }

    menu+= '

    ';

    }

    }returnmenu;

    }

    3.4 hover事件(网上粘贴的)

    functionaddHover() {//为导航设置默认高亮 与本菜单无关

    $("ul.Menue li.Menue_li:eq(0)").addClass("current")/*jquery menu 开始*/

    //为子菜单的最后一个li添加样式,适合为li添加下划线时去除最后一个的下划线

    $(".sub_menu").find("li:last-child").addClass("last")//遍历全部li,判断是否包含子菜单,如果包含则为其添加箭头指示状态

    $(".Menue li").each(function() {if ($(this).find("ul").length != 0) {

    $(this).find("a:first").addClass("hasmenu")

    }

    })//$(".Menue li").hover(function() {

    $(this).addClass("now");var menu = $(this);

    menu.find("ul.sub_menu:first").show();

    },function() {

    $(this).removeClass("now");

    $(this).find("ul.sub_menu:first").hide();

    });var submenu = $(".sub_menu").find(".sub_menu")

    submenu.css({left:"100px", top: "0px"})

    $(".sub_menu li").hover(function() {

    $(this).find("a:first").addClass("now")

    $(this).find("ul:first").show();

    },function() {

    $(this).find("a:first").removeClass("now")

    $(this).find("ul:first").hide()

    });/*jquery menu 结束*/}

    3.5 最终页面显示结果

    1001215-20170925233215010-433743404.png=====>>

    370ab730e9441a6a02aeb206643a3550.png=====>>

    f4501286e2efa0776ad280ba9c765ab7.png

    展开全文
  • js无限级菜单

    2008-06-10 12:27:09
    js无限级菜单实例代码
  • js javascript 无限级菜单超强终极完善 我自己做的,兼容主流浏览器 包括臭名昭著的IE6
  • 万能无限级菜单(包含水平和垂直菜单)。这是我做站时经常用到的一个效果,稍微修改下图片或角度,就能直接使用。
  • 数据结构menudata.json{"data":[{"id": 1,"path": "/home","menuName": "商业数据统计","component": "Home","childMenu":[{"id": 2,"path": "/commercial/dataAccount/Day","menuName": "日统计1","component": ...

    数据结构

    menudata.json

    {"data":[

    {

    "id": 1,

    "path": "/home",

    "menuName": "商业数据统计",

    "component": "Home",

    "childMenu":[{

    "id": 2,

    "path": "/commercial/dataAccount/Day",

    "menuName": "日统计1",

    "component": "DataAccountDay"

    },

    {

    "id": 3,

    "path": "/commercial/dataAccount/Month",

    "menuName": "月统计1",

    "component": "DataAccountMonth"

    }]

    },

    {

    "id": 4,

    "path": "/home",

    "menuName": "商业报表中心",

    "component": "Home",

    "childMenu":[{

    "id": 5,

    "path": "/commercial/baobiao/Day",

    "menuName": "日报表1",

    "component": "BaobiaoDay"

    },

    {

    "id": 6,

    "path": "/commercial/baobiao/Month",

    "menuName": "月报表1",

    "component": "BaobiaoMonth"

    }]

    }

    ]}

    Home.vue

    header

    router

    :default-active="routePath"

    unique-opened

    background-color="#1f3146"

    text-color="#32acca"

    active-text-color="#ffd04b"

    >

    footer

    import NavMenu from "@/components/NavMenu.vue";

    export default {

    data() {

    return {

    containerHeight: "",

    menuData: [],

    routePath:"",

    currentModuleChinese:"",

    user: window.sessionStorage.getItem("user")

    };

    },

    created() {

    this.$axios.get("/mock/menudata + ".json").then(res => {-

    this.menuData = res.data.data;

    });

    },

    components: { NavMenu },

    // watch:{

    // $route(){

    // console.log(this.$route.path)

    // this.routePath = this.$route.path

    // }

    // },

    mounted() {

    console.log("mounted")

    this.containerHeight = window.innerHeight + "px";

    console.log($)

    $(window).resize(function() {

    console.log("hi")

    $("#con").height($(window).height()-2);

    });

    }

    };

    .el-header {

    background-color: #377fa9;

    color: #fff;

    height: 50px !important;

    line-height: 50px !important;

    }

    .el-header .left img {

    width: 120px;

    vertical-align: middle;

    }

    .el-header .left span {

    font-size: 20px;

    color: #edf8ff;

    margin-left: 15px;

    }

    .el-header .right {

    float: right;

    }

    .el-header .right a {

    color: #fff;

    }

    .el-aside {

    /* color: #32acca !important; */

    background: #1f3146 !important;

    }

    .el-menu {

    border-right: none !important;

    /* background: #1f3146 !important; */

    }

    .el-footer {

    background: gray;

    height: 40px !important;

    line-height: 40px !important;

    }

    .el-footer {

    border-top: 1px solid #ccc;

    background: #f8fafd;

    padding: 10px;

    margin-left: 0;

    }

    .el-footer img {

    vertical-align: middle;

    width: 65px;

    margin-right: 10px;

    }

    NavMenu.vue

    {{item.menuName}}

    {{item.menuName}}

    展开全文
  • 前言在开发中我们经常会遇到:导航菜单、部门菜单、权限树、评论等功能。这些功能都有共同的特点:有父子关系可无限递归我们以导航菜单为例, 我们将导航菜单设置为动态的, 即从动态加载菜单数据。数据库设计适用于...

    前言

    在开发中我们经常会遇到:导航菜单、部门菜单、权限树、评论等功能。

    这些功能都有共同的特点:

    有父子关系

    可无限递归

    我们以导航菜单为例, 我们将导航菜单设置为动态的, 即从动态加载菜单数据。

    数据库设计

    适用于数据库存储的设计如下:

    create table `menus`

    (

    `id` int primary key auto_increment,

    `name` varchar(20) comment '菜单名称',

    `pid` int default 0 comment '父级 ID, 最顶级为 0',

    `order` int comment '排序, 序号越大, 越靠前'

    )

    前端渲染

    对于前端来说, 我们一般需要这种效果:

    菜单配置页面:

    1d1d469faf7f

    image

    对应的导航菜单:

    1d1d469faf7f

    image

    这些插件一般需要这两种格式:

    基础格式:

    [

    {

    "id": 1,

    "name": "权限管理",

    "pid": 0,

    "order": 1

    },

    {

    "id": 2,

    "name": "用户管理",

    "pid": 1,

    "order": 2

    },

    {

    "id": 3,

    "name": "角色管理",

    "pid": 1,

    "order": 3

    },

    {

    "id": 4,

    "name": "权限管理",

    "pid": 1,

    "order": 4

    }

    ]

    树形格式:

    [

    {

    "id": 1,

    "name": "权限管理",

    "pid": 0,

    "order": 1,

    "children": [

    {

    "id": 2,

    "name": "用户管理",

    "pid": 1,

    "order": 2,

    "children": []

    },

    {

    "id": 3,

    "name": "角色管理",

    "pid": 1,

    "order": 3,

    "children": []

    },

    {

    "id": 4,

    "name": "权限管理",

    "pid": 1,

    "order": 4,

    "children": []

    }

    ]

    }

    ]

    有的插件这两种格式都支持, 而有些只支持树形结构, 但我们数据库查询出来的结果往往又是普通结构, 这时候我们就需要将普通格式转换成树形格式。

    这个转换一般是在服务端进行(因为前端插件大多都是请求后台的一个 URL 来接收 JSON 数据, 没有提供加载数据后 - 渲染前的事件, 所以无法在前端完成转换.)

    数据转换

    首先有 Java 实体类:

    public class Menu {

    private int id,

    private String name,

    private int pid

    // getter setter 略

    }

    数据库查询后的一般是在 List 中:

    List

    然后我们需要将这个 List 转换为树形结构, 首先定义一个树形结构的 VO 类:

    public class MenuTreeVO {

    private int id,

    private String name,

    private int pid,

    private List children,

    // getter setter 略

    }

    转换工具类:

    package im.zhaojun.util;

    import im.zhaojun.model.vo.MenuTreeVO;

    import java.util.ArrayList;

    import java.util.List;

    public class TreeUtil {

    /**

    * 所有待用"菜单"

    */

    private static List all = null;

    /**

    * 转换为树形

    * @param list 所有节点

    * @return 转换后的树结构菜单

    */

    public static List toTree(List list) {

    // 最初, 所有的 "菜单" 都是待用的

    all = new ArrayList<>(list);

    // 拿到所有的顶级 "菜单"

    List roots = new ArrayList<>();

    for (MenuTreeVO menuTreeVO : list) {

    if (menuTreeVO.getParentId() == 0) {

    roots.add(menuTreeVO);

    }

    }

    // 将所有顶级菜单从 "待用菜单列表" 中删除

    all.removeAll(roots);

    for (MenuTreeVO menuTreeVO : roots) {

    menuTreeVO.setChildren(getCurrentNodeChildren(menuTreeVO));;

    }

    return roots;

    }

    /**

    * 递归函数

    * 递归目的: 拿到子节点

    * 递归终止条件: 没有子节点

    * @param parent 父节点

    * @return 子节点

    */

    private static List getCurrentNodeChildren(MenuTreeVO parent) {

    // 判断当前节点有没有子节点, 没有则创建一个空长度的 List, 有就使用之前已有的所有子节点.

    List childList = parent.getChildren() == null ? new ArrayList<>() : parent.getChildren();

    // 从 "待用菜单列表" 中找到当前节点的所有子节点

    for (MenuTreeVO child : all) {

    if (parent.getMenuId().equals(child.getParentId())) {

    childList.add(child);

    }

    }

    // 将当前节点的所有子节点从 "待用菜单列表" 中删除

    all.removeAll(childList);

    // 所有的子节点再寻找它们自己的子节点

    for (MenuTreeVO menuTreeVO : childList) {

    menuTreeVO.setChildren(getCurrentNodeChildren(menuTreeVO));

    }

    return childList;

    }

    }

    调用方式:

    // 从数据库获取

    List

    // Menu 转为 MenuTreeVO

    List menuTreeVOS = new ArrayList<>();

    for (Menu menu : menus) {

    MenuTreeVO menuTreeVO = new MenuTreeVO();

    BeanUtils.copyProperties(menu, menuTreeVO);

    menuTreeVOS.add(menuTreeVO);

    }

    // 调用转换方法

    xxxUtil.toTree(menuTreeVOS);

    // 通过 Json 或 ModelAndView 返回给前台.

    附:模板引擎渲染

    有时我们会使用模板引擎来渲染菜单, 但由于菜单是树形结构的, 所以在模板引擎中单纯的使用 for 是无法完成无限极菜单的渲染的.

    这里有一个很新奇的方法, 我以 thymeleaf 引擎为例:

    index.html 的导航部分:

    public.html 公共模板部分:

    系统管理

    基本逻辑就是使用 include 引用模板, 各种模板引擎都有这种功能, 然后判断当前节点有没有子节点, 有的话, 模板文件引用自身, 来完成递归.

    结语

    上述代码是在开发一个 Shiro 的权限管理后台的时候的一些思路和代码, 完整的代码可以参考: https://github.com/zhaojun1998/Shiro-Action

    展开全文
  • JS左侧无限级菜单导航,兼容各大浏览器,很实用。
  • javascript树型无限级菜单.,还是很好用的
  • CSS js抽右展开的无限级菜单,相信这款CSS和JavaScript共同实现的折叠展开式菜单会满足你的需求,因为它可以增加无限级子菜单,有多少分类都可以加进去,即使我们用不了那么多分类,不过学习研究下制作思路也是值得...
  • 无限级菜单,无限增加,删除,更换,插入。
  • Golang Datastructures: Trees, 标准树型结构,和无限级菜单有区别。 https://ieftimov.com/post/golang-datastructures-trees/ 数据表结构 和golang结构体 menu_id是主键, pid是上级ID, pid=0是顶级菜单 CREATE ...

    说明与参考

    找一圈没有找到合式的库包和结构比较好的一点的公共代码。 按自已心意封装一个。

    找的过程中找到比较好的文章有:
    Golang Datastructures: Trees, 标准树型结构,和无限级菜单有区别。

    https://ieftimov.com/post/golang-datastructures-trees/

    数据表结构 和golang结构体

    menu_id是主键, pid是上级ID, pid=0是顶级菜单

    CREATE TABLE `menu` (
      `menu_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '{"name":"文档ID","desc":"哈哈哈哈哈哈","type":"password"}',
      `title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '标题',
      `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '{"name":"上级ID","desc":"","type":"select", "options":{"callback":"getMenuTree"}}',
      `sort` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '排序(同级有效)',
      `hide` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '{"name":"是否隐藏","options":{"1":"否","2": "是"}}',
      `pathname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '路由',
      `iconfont` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '' COMMENT '{"name":"图标"}',
      `status` tinyint(4) DEFAULT '1',
      `created_at` datetime DEFAULT CURRENT_TIMESTAMP,
      `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `is_deleted` tinyint(4) DEFAULT '0',
      `deleted_at` datetime DEFAULT NULL,
      PRIMARY KEY (`menu_id`) USING BTREE,
      KEY `pid` (`pid`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=234 DEFAULT CHARSET=utf8;
    
    package models
    
    type Menu struct {
    	MenuId    int      `json:"menu_id" xorm:"not null pk autoincr comment('{"name":"文档ID","desc":"哈哈哈哈哈哈","type":"password"}') INT(10)"`
    	Title     string   `json:"title" xorm:"not null default '' comment('标题') VARCHAR(50)"`
    	Pid       int      `json:"pid" xorm:"not null default 0 comment('{"name":"上级ID","desc":"","type":"select", "options":{"callback":"getMenuTree"}}') index INT(10)"`
    	Sort      int      `json:"sort" xorm:"not null default 0 comment('排序(同级有效)') INT(10)"`
    	Hide      int      `json:"hide" xorm:"not null default 0 comment('{"name":"是否隐藏","options":{"1":"否","2": "是"}}') TINYINT(1)"`
    	Pathname  string   `json:"pathname" xorm:"comment('路由') VARCHAR(255)"`
    	Iconfont  string   `json:"iconfont" xorm:"default '' comment('{"name":"图标"}') VARCHAR(255)"`
    	Status    int      `json:"status" xorm:"default 1 TINYINT(4)"`
    	CreatedAt DateTime `json:"created_at" xorm:"default 'CURRENT_TIMESTAMP' DATETIME"`
    	UpdatedAt DateTime `json:"updated_at" xorm:"default 'CURRENT_TIMESTAMP' DATETIME"`
    	IsDeleted int      `json:"id_deleted" xorm:"default 0 TINYINT(4)"`
    	DeletedAt DateTime `json:"deleted_at" xorm:"DATETIME"`
    }
    
    

    生成菜单树go代码

    package admin
    
    import (
    	"owen2020/app/models"
    	"owen2020/app/models/dao"
    	"owen2020/app/resp/out"
    
    	"github.com/gin-gonic/gin"
    )
    
    type menuList []models.Menu
    
    type menuItem struct {
    	models.Menu
    	Child []menuItem `json:"_child"`
    }
    
    //GetSideBarList 获取无限级菜单
    func GetSideBarList(c *gin.Context) {
    	list := dao.GetMenuList()
    	ml := menuList(list)
    	//ret := processToTree(list, 0, 0)
    	ret := ml.processToTree(0, 0)
    	out.NewSuccess(ret).JSONOK(c)
    }
    
    func (m *menuList) processToTree(pid int, level int) []menuItem {
    	var menuTree []menuItem
    	if level == 10 {
    		return menuTree
    	}
    
    	list := m.findChildren(pid)
    	if len(list) == 0 {
    		return menuTree
    	}
    
    	for _, v := range list {
    		child := m.processToTree(v.MenuId, level+1)
    		menuTree = append(menuTree, menuItem{v, child})
    	}
    
    	return menuTree
    }
    
    func (m *menuList) findChildren(pid int) []models.Menu {
    	child := []models.Menu{}
    
    	for _, v := range *m {
    		if v.Pid == pid {
    			child = append(child, v)
    		}
    	}
    	return child
    }
    

    最终接口输出

    {
    	code: 200,
    	msg: "success",
    	data: [
    		{
    			menu_id: 203,
    			title: "资源列表",
    			pid: 0,
    			sort: 0,
    			hide: 0,
    			pathname: "/admin/resource/list.html",
    			iconfont: "fa-tag",
    			status: 1,
    			created_at: "2020-02-16 09:14:38",
    			updated_at: "2020-07-22 13:48:42",
    			id_deleted: 0,
    			deleted_at: "2020-07-20 22:42:20",
    			_child: null
    		},
    		{
    			menu_id: 205,
    			title: "权限管理",
    			pid: 0,
    			sort: 0,
    			hide: 0,
    			pathname: "",
    			iconfont: "fa-share",
    			status: 1,
    			created_at: "2020-02-16 09:14:38",
    			updated_at: "2020-07-22 13:48:29",
    			id_deleted: 0,
    			deleted_at: "0000-00-00 00:00:00",
    			_child: [
    				{
    					menu_id: 206,
    					title: "权限节点列表",
    					pid: 205,
    					sort: 0,
    					hide: 0,
    					pathname: "/admin/permissions/list.html",
    					iconfont: "fa-tag",
    					status: 1,
    					created_at: "2020-02-16 09:14:38",
    					updated_at: "2020-07-22 13:48:33",
    					id_deleted: 0,
    					deleted_at: "0000-00-00 00:00:00",
    					_child: null
    				},
    				{
    					menu_id: 207,
    					title: "角色列表",
    					pid: 205,
    					sort: 0,
    					hide: 0,
    					pathname: "/admin/roles/list.html",
    					iconfont: "fa-tag",
    					status: 1,
    					created_at: "2020-02-16 09:14:38",
    					updated_at: "2020-07-22 13:48:36",
    					id_deleted: 0,
    					deleted_at: "2020-07-20 22:42:33",
    					_child: null
    				}
    			]
    		}
    	]
    }
    
    
    展开全文
  • 看了上面效果图,你或许已经...当然这个HoverTree菜单的功能更加强大,可以实现无限级菜单。这是买手机的页面,买安卓手机须知:http://keleyi.com/a/bjad/rx7ma1oy.htm HTML代码: <!DOCTYPE html> <...
  • 无限级菜单制作软件

    2008-05-05 10:47:09
    无限级菜单制作软件 很好.很好的
  • Vue2右键无限级菜单

    2019-08-08 05:40:02
    Vue2 无限级右键菜单组件,菜单内容,图标,点击事件可自定义
  • 无限级菜单或者说无限级分类,在实际项目中比较实用,目前比较主流的设计是通过关系型数据库进行存储,通常一个表中包含id,content,fid三个字段,content是菜单的名称,id是菜单的id,而fid是该菜单的上一级菜单,...
  • 关于Angluar + zorro 实现无限级菜单 该文章为思路+代码,为通用式前端无限级菜单。 首先通过后台接收到的数据是这样的 "table":[ { "id": 1017.0, "menuName": "用户管理&...
  • 艾恩JS无限级菜单树-ASP带数据库及菜单管理版艾恩JS无限级菜单树-ASP带数据库及菜单管理版

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,488
精华内容 595
关键字:

无限级菜单