vue-elementUI节点

1.配置好springboot-mybatis项目配置
1.1 oracle数据库表的创建

create table TB_POWER
(
  id       NUMBER(10) not null,
  name     VARCHAR2(20) not null,
  state    VARCHAR2(20) not null,
  iconcls  VARCHAR2(20),
  url      VARCHAR2(50),
  parentid NUMBER(10)
)
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (1, '首页', '1', 'el-icon-menu', 'https://www.baidu.com', 0);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (2, '网站管理', '1', 'el-icon-menu', 'https://www.baidu.com', 0);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (3, '公共管理', '1', 'el-icon-menu', 'https://www.baidu.com', 0);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (4, '系统管理', '1', 'el-icon-menu', 'https://www.baidu.com', 0);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (5, '系统统计', '1', 'el-icon-menu', 'https://www.baidu.com', 0);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (6, '审核管理', '1', 'el-icon-menu', 'https://www.baidu.com', 0);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (7, '意见管理', '1', 'el-icon-menu', 'https://www.so.com', 3);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (8, '权限管理', '1', 'el-icon-menu', 'https://www.so.com', 4);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (9, '广告管理', '1', 'el-icon-menu', 'https://www.so.com', 2);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (10, '实名认证', '1', 'el-icon-menu', 'https://www.so.com', 6);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (11, '员工管理', '1', 'el-icon-menu', '/emp/toList', 4);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (12, '角色管理', '1', 'el-icon-menu', '/role/toRole', 4);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (13, '视频认证', '1', 'el-icon-menu', 'https://www.so.com', 6);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (14, '部门管理', '1', 'el-icon-menu', '/dept/toDept', 4);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (15, '招标审核', '1', 'el-icon-menu', 'https://www.so.com', 6);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (16, '消息管理', '1', 'el-icon-menu', 'https://www.so.com', 3);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (17, '用户省份分布', '1', 'el-icon-menu', 'https://www.so.com', 5);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (18, '满标一审', '1', 'el-icon-menu', 'https://www.so.com', 6);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (19, '满标二审', '1', 'el-icon-menu', 'https://www.so.com', 6);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (20, '重置密码', '1', 'el-icon-menu', 'https://www.so.com', 4);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (21, '历史审核记录', '1', 'el-icon-menu', 'https://www.so.com', 6);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (22, '时间段登入统计', '1', 'el-icon-menu', 'https://www.so.com', 5);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (23, '标的数量统计', '1', 'el-icon-menu', 'https://www.so.com', 5);
insert into TB_POWER (id, name, state, iconcls, url, parentid)
values (24, '月或者日盈利统计', '1', 'el-icon-menu', 'https://www.so.com', 5);
commit;

2.创建实体类Node

public class Node {

    private Integer id;
    private String label;//节点名称
    private Integer pid;
    private String iconClass;//节点图标
    private String url;//地址
    private List<Node> children;

    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getLabel() {
        return label;
    }
    public void setLabel(String label) {
        this.label = label;
    }
    public Integer getPid() {
        return pid;
    }
    public void setPid(Integer pid) {
        this.pid = pid;
    }
    public String getIconClass() {
        return iconClass;
    }
    public void setIconClass(String iconClass) {
        this.iconClass = iconClass;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public List<Node> getChildren() {
        return children;
    }
    public void setChildren(List<Node> children) {
        this.children = children;
    }
}

3.dao层代码

public interface PowerDao {
    /**
     * 权限列表查询
     * @return
     */
    @Select("select id, name as label, iconcls as iconClass, url, parentid pid from tb_power")
    List<Node> getList();
}

4.service层代码

public interface PowerService {
    /**
     * 列表查询方法
     * @return
     */
    List<Node> getList();
}
@Service
public class PowerServiceImpl implements PowerService{
@Autowired
private PowerDao powerDao;
    @Override
    public List<Node> getList() {
        List<Node> list=powerDao.getList();
        //拼装后的临时集合,用于返回数据
        List<Node> tempList=new ArrayList<>();
       if(list!=null&&list.size()>0){
           for (Node node : list) {
               //找到父节点为0的一级节点
            if(node.getPid()==0){
                tempList.add(node);
                //调用递归方法,找当前节点的子节点
                bindChildren(node,list);
            }
           }
       }
        return tempList;
    }

    /**
     * 递归绑定子节点
     * @param curNode
     * @param list
     */
    private void bindChildren(Node curNode,List<Node> list){
        for (Node node : list) {
            //如果当前节点的id和循环节点的父id相等,说明是当前节点的孩子
            if(curNode.getId()==node.getPid()){
                //取出当前节点的孩子集合
                List<Node> children=curNode.getChildren();
                //如果是没有孩子,孩子集合第一次取出是空的
                if(children==null){
                    children=new ArrayList<Node>();
                    children.add(node);
                }
                //设置当前孩子集合
                curNode.setChildren(children);
                //自己调用自己找孩子
                bindChildren(node,list);
            }
        }
    }
}

5.controller层代码

@Controller
@RequestMapping("power")
public class PowerController {
@Autowired
    private PowerService powerService;
/**
 * 跳转权限树页面
 * @return
 */
@RequestMapping("toTree")
public String toTree(){
    return "power/tree";
}
    /**
     * 权限树数据
     * @return
     */
    @ResponseBody
    @RequestMapping("tree")
    public Object tree(){
        return powerService.getList();
    }
}
@Controller
@RequestMapping("index")
public class IndexController {
    /**
     * 跳转首页
     * @return
     */
    @RequestMapping("toHome")
    public String toHome(){
        return "index";
    }
}

6.JSP页面代码
6.1 tree.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>权限树</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <script type="text/javascript" src="../js/axios.min.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div class="diva">
    <el-tree
            :data="treeData"
            accordion
            @node-click="handleNodeClick">
    </el-tree>
</div>
<script>
    var vm = new Vue({
        el:".diva",
        data:{
            treeData:[]
        },
        created:function(){
            var _self =this
            axios.post("/power/tree").then(function(response){
                _self.treeData = response.data;
            })
        },
        methods:{
            handleNodeClick:function(n){
                alert(n.label+",url"+n.url);
            }
        }
    })
</script>

</body>
</html>

6.2 index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
    <script type="text/javascript" src="../js/vue.js"></script>
    <script type="text/javascript" src="../js/axios.min.js"></script>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <!-- 引入组件库 -->
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <style>
        .el-header, .el-footer {
            background-color: #B3C0D1;
            color: #333;
            text-align: center;
            line-height: 60px;
        }

        .el-aside {
            background-color: #D3DCE6;
            color: #333;
            text-align: center;
            line-height: 200px;
        }

        .el-main {
            background-color: #E9EEF3;
            color: #333;
            text-align: center;
            line-height: 160px;
        }

        body > .el-container {
            margin-bottom: 40px;
        }

        .el-container:nth-child(5) .el-aside,
        .el-container:nth-child(6) .el-aside {
            line-height: 260px;
        }

        .el-container:nth-child(7) .el-aside {
            line-height: 320px;
        }
    </style>
</head>
<body>
<div class="diva">
    <el-container>
        <el-header style="height: 160px;">Header</el-header>
        <el-container>
            <el-aside width="200px" style="height: 600px;">
                <el-tree
                        :data="treeData"
                        accordion
                        @node-click="handleNodeClick"
                        :icon-class="icon"
                >
                </el-tree>
            </el-aside>
            <el-main style="height: 600px;">
                <el-tabs v-model="editableTabsValue2" type="card" closable @tab-remove="removeTab">
                    <el-tab-pane
                            v-for="(item, index) in editableTabs2"
                            :key="item.name"
                            :label="item.title"
                            :name="item.name"
                    >
                        <iframe :src="item.url" style="width:100%;height:550px;border: 0px;" scrolling="auto"  ></iframe>
                    </el-tab-pane>
                </el-tabs>

            </el-main>
        </el-container>
    </el-container>
</div>
<script>
    var vm = new Vue({
        el:".diva",
        data:{
            icon:'el-icon-menu',
            treeData:[],
            editableTabsValue2: '2',
            editableTabs2: [ {
                title: 'Tab 2',
                name: '2',
                url: 'https://www.baidu.com'
            }],
            tabIndex: 2
        },
        created:function(){
            var _self =this
            axios.post("/power/tree").then(function(response){
                _self.treeData = response.data;
            })
        },
        methods: {
            handleNodeClick: function (n) {
                // alert(n.label+",url"+n.url);
                if (n.url != null && n.url != 'null' && n.url != '')
                    this.addTab(n.label, n.url);
            },
            addTab: function (targetName, url) {
                var newTabName = targetName;
                if (JSON.stringify(this.editableTabs2).indexOf(newTabName) == -1) {
                    this.editableTabs2.push({
                        title: newTabName,
                        name: newTabName,
                        url: url
                    });
                }
                this.editableTabsValue2 = newTabName;
            },
            removeTab(targetName) {
                let tabs = this.editableTabs2;
                let activeName = this.editableTabsValue2;
                if (activeName === targetName) {
                    tabs.forEach((tab, index) => {
                        if (tab.name === targetName) {
                            let nextTab = tabs[index + 1] || tabs[index - 1];
                            if (nextTab) {
                                activeName = nextTab.name;
                            }
                        }
                    });
                }
                this.editableTabsValue2 = activeName;
                this.editableTabs2 = tabs.filter(tab => tab.name !== targetName);
            }
        }
    })
</script>
</body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_44001965/article/details/86625498