根据tree结构数据自动生成多层级勾选自定义tree-table

一、需求

需要根据tree嵌套结构数据渲染出 多层级带勾选的table,想要的对应结构table

二、思路

手撸原生table的demo,然后根据多层级嵌套的遍历,写成html拼接,

由于有几层的遍历逻辑和 tr只能包裹td元素,html拼接后改成元素生成createElement和子级插入appendChild 方式,自动生成对应解构的table

三、代码

效果图

1.获取 tree数据结构 及将数据内容重构
// 获取 角色权限table-tree
        async queryRoleTree() { 
            const res = await roleApi.roleResourceTree(this.roleId) // id
            console.log('queryRoleTree()-res', res) 
            this.roleStatus = res && res.inAdd && ['1'].includes(String(res.inAdd)) ? true : false
            if (res && res.firstFloor && res.firstFloor.length > 0) {
                this.roleTableTree = res.firstFloor
                if (res.firstFloor[0].children && res.firstFloor[0].children.length > 0) {
                    this.levelOneTree = res.firstFloor[0].children // tree渲染从 firstFloor[0].children 开始
                    this.createTableHtml(this.levelOneTree)
                    const allArr = res.firstFloor
                    allArr.forEach(em1 => {
                        em1.children && em1.children.forEach(em2 => {
                            this.levelOneMap[`${em2.cid}-${em2.pid}`] = em2 // 与 创建的 checkbox--name的值保持一致
                            em2.children && em2.children.forEach(em3 => {
                                em3.children && em3.children.forEach(em4 => {
                                    this.levelThreeMap[`${em4.cid}-${em4.pid}`]=em4   
                                })
                            })
                        })
                    });
                    // console.log('this.levelThreeMap', this.levelThreeMap)
                    this.levelThreeArr = Object.keys(this.levelThreeMap).map(key => (this.levelThreeMap[key]))
                    console.log('this.levelThreeArr', this.levelThreeArr)
                }
            }
        },    
2.根据tree数据嵌套结构及-想要的table结构,创建对应tree-table的demo
createTableHtml(arr) { 
            // <div v-for="(td,idx) in roleTableTree" :key="idx">
            //             <tr>
            //                 <td :rowspan="`${1+td.children.length*2}`" class="bor-r-1">
            //                     <div class="oneLevelCell">{{ td.authName}}</div>
            //                 </td>
            //             </tr>
            //      v-if="td2.pid && td.cid && String(td2.pid) === String(td.cid)" v-for="(td2,idx2) in td.children" :key="`${idx2}-${td2.cid}`"
            //             <tr >
            //                 <td class="bor-r-1 bor-b-1" :rowspan="`${1+1}`">
            //                     <div class="twoLevelCell">{{ td2.authName}}</div>
            //                 </td>
            //             </tr>
            //             <tr >
            //                 <div class="flex flex-j-start flex-wrap">
            //                     <div v-for="(td3,idx3) in td2.children" :key="idx3" class="threeLevelCell">{{td3.authName  }}</div>
            //                 </div>
            //             </tr>
            // </div>
            const theadArr = this.theadArr;
            const div = document.getElementById("table_DIV");
            div.innerHTML = '';
            const table = document.createElement('table');
            table.id = "visitInfoTable";
            table.className = "visitInfoTable";
            const thead = document.createElement("thead");
            thead.className = "bor-l-1 bor-t-1";
            theadArr.forEach(em => {
                const th = document.createElement('th'); // 创建行
                th.className ='bor-r-1'
                th.innerHTML = `<div class="thCell">${em}</div>`;
                thead.appendChild(th);
            }) 
            table.appendChild(thead);
            const tbody = document.createElement("tbody");
            tbody.className = 'bor-l-1 bor-t-1 bor-b-1';
            /** 创建-tbody ***/ 
            arr.forEach((em1,idx1) => { 
                const rowOne = tbody.insertRow(); // 创建行
                /** 创建-一级菜单下属的单元格 ***/ 
                const cellOne = rowOne.insertCell(); // 创建单元格
                cellOne.className = 'bor-r-1 bor-b-1'
                const num = em1.children && em1.children.length > 0 ? (em1.children.length * 2) : 1
                cellOne.rowSpan = `${1 + num}`;
                // dom原例----- cellOne.innerHTML = `<div class="oneLevelCell"> <input type="checkbox" checked="false" /> <span>${em1.authName}</span></div>`;
                const oneLevelCell = this.createCellHtml(em1, 'oneLevelCell', true)
                cellOne.appendChild(oneLevelCell);
                /** 创建-二级菜单下属的单元格 ***/
                em1.children && em1.children.forEach((em2,idx2) => {
                    const rowTwo = tbody.insertRow();
                    const cellTwo = rowTwo.insertCell();
                    cellTwo.className = "bor-r-1 bor-b-1";
                    cellTwo.rowSpan = `${1 + 1}`;
                    const twoLevelCell = this.createCellHtml(em2, 'twoLevelCell', false, true)
                    cellTwo.appendChild(twoLevelCell);
                    // cellTwo.innerHTML = `<div class="twoLevelCell">${em2.authName}</div>`;
                    const rowThree = tbody.insertRow();
                    rowThree.className = 'bor-t-1 bor-r-1';
                    const twoDome = document.createElement('td');
                    twoDome.className = "flex flex-j-start flex-wrap pad-t-10 pad-b-10";
                    em2.children && em2.children.forEach((em3, idx3) => {
                        /** 创建-三级级菜单下属的单元格 ***/
                        // const divLevel3 = `<div class="threeLevelCell">${em3.authName}</div>`;
                        const threeLevelCell = this.createCellHtml(em3, 'threeLevelCell', false, true)
                        twoDome.appendChild(threeLevelCell);
                    })
                    rowThree.appendChild(twoDome);
                })
            })
            table.appendChild(tbody); 
            // console.log('table', table)
            div.appendChild(table); 
        },
3.单元格内-内容:  checkbox+label
/**
         * 创建单元格 -及内容 checkbox + label
         * em 
         * 单元格div带的class样式名
         * isDisabled---checkbox是否设置 disabled
         * isHaveCheckBox ---- 是否创建 checkbox 
         * */ 
        createCellHtml(em, str = 'oneLevelCell', isHaveCheckBox = true, isDisabled = false) { 
            const cell = document.createElement("div");
            cell.className = str // 'oneLevelCell'
            if (isHaveCheckBox) {
                const inputOne = document.createElement('input')
                inputOne.type = 'checkbox'
                inputOne.name = `${em.cid}-${em.pid}`
                inputOne.checked = em.active // boolean ;  em.active && [1].includes(em.active) ? true : false
                inputOne.className = 'checkbox'
                inputOne.value = `${em.cid}`
                inputOne.disabled = isDisabled
                inputOne.addEventListener('change', this.checkboxChange) // 添加 checkbox监听事件
                cell.appendChild(inputOne);
            }
            const spanOne = document.createElement('span')
            spanOne.className = 'textOne'
            spanOne.innerHTML = `${em.authName}`
            cell.appendChild(spanOne);
            return cell
        },
4.单元格内-checkbox勾选,修改对应tree 数据结构节点的active勾选状态 this.roleTableTree[0].children[findIndex].active = checked 
// 监听 checkbox 的勾选状态---根据创建时加的name=`${em.cid}-${em.pid}` 做唯一键判断 
        checkboxChange(event) {
            // console.log('checkboxChange()-event', event)
            const { target } = event
            // console.log('checkboxChange()-target', target)
            const { name, value, checked } = target
            console.log('checkboxChange()-name', name, 'checked', checked, 'value', value)
            if (this.levelOneTree.length > 0) {
                const arr = this.levelOneTree
                const findIndex = arr.findIndex(em => {
                    return String(em.cid) === String(value)
                })
                if (findIndex !== -1) {
                    this.roleTableTree[0].children[findIndex].active = checked
                    const levelOneArr = this.roleTableTree[0].children.map(em => { 
                        em.children = []
                        return em
                    })
                    this.changeRoleModify(levelOneArr)
                    console.log('levelOneArr', levelOneArr)
                }
                console.log('checkboxChange()-arr', arr, 'findIndex', findIndex, 'children[findIndex].active', this.roleTableTree[0].children[findIndex].active)
            }
        },

5. 完整代码

visitInfoTable相关css样式要是放在页面内不生效,就放在 外层项目css相关文件夹内,main.js引入该样式

<template>
    <el-card class="main">
        <div class="body-wrap" id="table_DIV" v-show="levelOneTree.length > 0"></div>
        <div class="body-wrap" v-show="levelOneTree.length === 0">
            <table class="visitInfoTable">
                <thead class="bor-l-1 bor-t-1 bor-b-1">
                    <th class="bor-r-1">
                        <div class="thCell">一级功能</div>
                    </th>
                    <th class="bor-r-1">
                        <div class="thCell">二级功能</div>
                    </th>
                    <th class="bor-r-1">
                        <div class="thCell">三级功能</div>
                    </th>
                </thead>
                <!-- <tbody class="tbodyNoValue" colspan="3">
                    暂无数据
                    <td colspan="3" class="td"></td>
                </tbody> -->
            </table>
            <table class="visitInfoTable">
                <div class="tbodyNoValue bor-b-1 bor-l-1 bor-r-1">
                    暂无数据
                </div>
            </table>
        </div>
    </el-card>
</template>

<script>
//import roleApi from '@/api/baseinfo/roleManagement'

function isEmpty(value) {
    return ['', null, void 0, undefined, 'null', 'undefined'].includes(value)
}
export default {
    name: 'Auth',
    props: {
        typeData: null,
        projectId: null,
        selectName: null,
        roleId: null,
        textarea: null,
    },
    data() {
        return {
            roleStatus: false,
            textareaText: '', // 描述,
            btnLoading: false,
            tableConfig: {
                params: {}
            },
            roleTableTree: [],
            levelOneTree: [],
            levelOneMap: {},
            levelThreeMap: {},
            levelThreeArr: [],
            theadArr: ['一级功能', '二级功能', '三级功能'],
        }
    },
    computed: {
    },
    watch: {
        roleId: {
            immediate: true,
            handler(val) {
                if (!isEmpty(val)) {
                    this.queryRoleTree()
                }
            }
        },
        textarea: {
            immediate: true,
            handler(val) {
                this.textareaText = this.textarea
            }
        },
    },
    mounted() {
        // if (this.roleId) {
        //     this.queryRoleTree() 
        // }
    },
    methods: {
  
        // 获取 角色权限table-tree
        async queryRoleTree() { 
             const res = [] // 用本地数据 见下面 mockRes.json  
             // const res = mockRes.result   
            // const res = await roleApi.roleResourceTree(this.roleId) // id
            console.log('queryRoleTree()-res', res) 
            this.roleStatus = res && res.inAdd && ['1'].includes(String(res.inAdd)) ? true : false
            if (res && res.firstFloor && res.firstFloor.length > 0) {
                this.roleTableTree = res.firstFloor
                if (res.firstFloor[0].children && res.firstFloor[0].children.length > 0) {
                    this.levelOneTree = res.firstFloor[0].children // tree渲染从 firstFloor[0].children 开始
                    this.createTableHtml(this.levelOneTree)
                    const allArr = res.firstFloor
                    allArr.forEach(em1 => {
                        em1.children && em1.children.forEach(em2 => {
                            this.levelOneMap[`${em2.cid}-${em2.pid}`] = em2 // 与 创建的 checkbox--name的值保持一致
                            em2.children && em2.children.forEach(em3 => {
                                em3.children && em3.children.forEach(em4 => {
                                    this.levelThreeMap[`${em4.cid}-${em4.pid}`]=em4   
                                })
                            })
                        })
                    });
                    // console.log('this.levelThreeMap', this.levelThreeMap)
                    this.levelThreeArr = Object.keys(this.levelThreeMap).map(key => (this.levelThreeMap[key]))
                    console.log('this.levelThreeArr', this.levelThreeArr)
                }
            }
        }, 
        // 角色资源编辑
        async changeRoleModify(levelOneArr) { 
            // try {
            //     const params = { firstFloor: levelOneArr, roleId: this.roleId } 
            //     await roleApi.resourceModify(params)
            //     if (this.roleId) {
            //         this.queryRoleTree() 
            //     }
            //     this.$notify({
            //         title: '成功',
            //         message: `${'功能权限编辑'}成功`,
            //         type: 'success',
            //         duration: 2000
            //     })    
            // } catch (e) {
            //     console.error(e)
            // }
        },
        // 监听 checkbox 的勾选状态---根据创建时加的name=`${em.cid}-${em.pid}` 做唯一键判断 
        checkboxChange(event) {
            // console.log('checkboxChange()-event', event)
            const { target } = event
            // console.log('checkboxChange()-target', target)
            const { name, value, checked } = target
            console.log('checkboxChange()-name', name, 'checked', checked, 'value', value)
            if (this.levelOneTree.length > 0) {
                const arr = this.levelOneTree
                const findIndex = arr.findIndex(em => {
                    return String(em.cid) === String(value)
                })
                if (findIndex !== -1) {
                    this.roleTableTree[0].children[findIndex].active = checked
                    const levelOneArr = this.roleTableTree[0].children.map(em => { 
                        em.children = []
                        return em
                    })
                    this.changeRoleModify(levelOneArr)
                    console.log('levelOneArr', levelOneArr)
                }
                console.log('checkboxChange()-arr', arr, 'findIndex', findIndex, 'children[findIndex].active', this.roleTableTree[0].children[findIndex].active)
            }
        },
        createTableHtml(arr) { 
            // <div v-for="(td,idx) in roleTableTree" :key="idx">
            //             <tr>
            //                 <td :rowspan="`${1+td.children.length*2}`" class="bor-r-1">
            //                     <div class="oneLevelCell">{{ td.authName}}</div>
            //                 </td>
            //             </tr>
            //      v-if="td2.pid && td.cid && String(td2.pid) === String(td.cid)" v-for="(td2,idx2) in td.children" :key="`${idx2}-${td2.cid}`"
            //             <tr >
            //                 <td class="bor-r-1 bor-b-1" :rowspan="`${1+1}`">
            //                     <div class="twoLevelCell">{{ td2.authName}}</div>
            //                 </td>
            //             </tr>
            //             <tr >
            //                 <div class="flex flex-j-start flex-wrap">
            //                     <div v-for="(td3,idx3) in td2.children" :key="idx3" class="threeLevelCell">{{td3.authName  }}</div>
            //                 </div>
            //             </tr>
            // </div>
            const theadArr = this.theadArr;
            const div = document.getElementById("table_DIV");
            div.innerHTML = '';
            const table = document.createElement('table');
            table.id = "visitInfoTable";
            table.className = "visitInfoTable";
            const thead = document.createElement("thead");
            thead.className = "bor-l-1 bor-t-1";
            theadArr.forEach(em => {
                const th = document.createElement('th'); // 创建行
                th.className ='bor-r-1'
                th.innerHTML = `<div class="thCell">${em}</div>`;
                thead.appendChild(th);
            }) 
            table.appendChild(thead);
            const tbody = document.createElement("tbody");
            tbody.className = 'bor-l-1 bor-t-1 bor-b-1';
            /** 创建-tbody ***/ 
            arr.forEach((em1,idx1) => { 
                const rowOne = tbody.insertRow(); // 创建行
                /** 创建-一级菜单下属的单元格 ***/ 
                const cellOne = rowOne.insertCell(); // 创建单元格
                cellOne.className = 'bor-r-1 bor-b-1'
                const num = em1.children && em1.children.length > 0 ? (em1.children.length * 2) : 1
                cellOne.rowSpan = `${1 + num}`;
                // dom原例----- cellOne.innerHTML = `<div class="oneLevelCell"> <input type="checkbox" checked="false" /> <span>${em1.authName}</span></div>`;
                const oneLevelCell = this.createCellHtml(em1, 'oneLevelCell', true)
                cellOne.appendChild(oneLevelCell);
                /** 创建-二级菜单下属的单元格 ***/
                em1.children && em1.children.forEach((em2,idx2) => {
                    const rowTwo = tbody.insertRow();
                    const cellTwo = rowTwo.insertCell();
                    cellTwo.className = "bor-r-1 bor-b-1";
                    cellTwo.rowSpan = `${1 + 1}`;
                    const twoLevelCell = this.createCellHtml(em2, 'twoLevelCell', false, true)
                    cellTwo.appendChild(twoLevelCell);
                    // cellTwo.innerHTML = `<div class="twoLevelCell">${em2.authName}</div>`;
                    const rowThree = tbody.insertRow();
                    rowThree.className = 'bor-t-1 bor-r-1';
                    const twoDome = document.createElement('td');
                    twoDome.className = "flex flex-j-start flex-wrap pad-t-10 pad-b-10";
                    em2.children && em2.children.forEach((em3, idx3) => {
                        /** 创建-三级级菜单下属的单元格 ***/
                        // const divLevel3 = `<div class="threeLevelCell">${em3.authName}</div>`;
                        const threeLevelCell = this.createCellHtml(em3, 'threeLevelCell', false, true)
                        twoDome.appendChild(threeLevelCell);
                    })
                    rowThree.appendChild(twoDome);
                })
            })
            table.appendChild(tbody); 
            // console.log('table', table)
            div.appendChild(table); 
        },
        /**
         * 创建单元格 -及内容 checkbox + label
         * em 
         * 单元格div带的class样式名
         * isDisabled---checkbox是否设置 disabled
         * isHaveCheckBox ---- 是否创建 checkbox 
         * */ 
        createCellHtml(em, str = 'oneLevelCell', isHaveCheckBox = true, isDisabled = false) { 
            const cell = document.createElement("div");
            cell.className = str // 'oneLevelCell'
            if (isHaveCheckBox) {
                const inputOne = document.createElement('input')
                inputOne.type = 'checkbox'
                inputOne.name = `${em.cid}-${em.pid}`
                inputOne.checked = em.active // boolean ;  em.active && [1].includes(em.active) ? true : false
                inputOne.className = 'checkbox'
                inputOne.value = `${em.cid}`
                inputOne.disabled = isDisabled
                inputOne.addEventListener('change', this.checkboxChange) // 添加 checkbox监听事件
                cell.appendChild(inputOne);
            }
            const spanOne = document.createElement('span')
            spanOne.className = 'textOne'
            spanOne.innerHTML = `${em.authName}`
            cell.appendChild(spanOne);
            return cell
        },
    }
}
</script>

<style lang='scss' scoped>
.textareaText{
    width: 200rem;
}
.title{
    margin-bottom: 12rem;
    .text{
        font-size: 15rem;
        font-family: 'PingFangSC';
        color: #000;
    }
}
.body-top{
    min-height: 32rem;
    padding: 7rem 18rem;
    background: var(--fill-color-8);
    border-radius: 5px;
    font-size: 13rem;
    font-family: 'PingFangSC';
    color: #000;
    margin-bottom: 20rem;
}
.border-1-999{
    border: 1px solid #999;
}
.textOne{
    font-size: 14rem;
    color: #000;
}
.tbodyNoValue{
    width: 100%;
    height: 200rem;
    padding-top: 100rem;
    text-align: center;
    font-size: 16rem;
    font-family: 'PingFangSC';
    flex-shrink: 0;
    color: #5B6D83;
    display: block;
    .td{
        width: 100%;
    }
}

/**创建 table 及 checkbox */ 
.visitInfoTable{
    width: 100%;
    .bor-t-1{
        border-top: 1rem solid #DCE5EB;
    }
    .bor-l-1{
        border-left: 1rem solid #DCE5EB;
    }
    .bor-r-1{
        border-right: 1rem solid #DCE5EB;
    }
    .bor-b-1{
        border-bottom: 1rem solid #DCE5EB;
    }
    thead{
        th{
            font-size: 13rem;
            color: #5B6D83 ;
            font-weight: 500;
            font-family: 'PingFangSC';
            background: var(--fill-linear-color-1) ;
            .thCell{
                height: 44rem;
                line-height: 44rem;
                padding-left: 8rem;
                padding-right: 8rem;
            }
        }
    }
   
    tr{
        font-size: 15rem;
        color: #263237 ;
        font-weight: 400;
        font-family: 'PingFangSC';
        td{
            padding-left: 20rem;
            padding-right: 10rem;
        }
    }
    input[type=checkbox] {
        font-size: 12rem;
        width: 16rem;
        height: 16rem;
        vertical-align: middle;
        // visibility: hidden;
        position: relative;
    }
    input[type=checkbox]::before{
        display: block;
        cursor: pointer;
        position: absolute;
        top: 0;
        left: 0;
        content: "";
        border: 1px solid #999;
        background-color: #fff;
        width: 100%;
        height: 100%;
        border-radius: 6rem;
    }
    input[type=checkbox]:checked::before{
        display: block;
        content: "\2713";
        text-align: center;
        font-size: 13rem;
        color: #fff;
        background-color: #00a651;
        border-color: #00a651;
        width: 100%;
        height: 100%;
        border-radius: 6rem;
    }
    .checkbox{
        margin-left: 10rem;
        margin-right: 15rem;
    }
    .oneLevelCell{
        min-width: 180rem;
    }
    .twoLevelCell{
        min-width: 180rem;
    }
    .threeLevelCell{
        min-width: 180rem;
    }
}
// flex
.flex-box {
    display: flex;
    display: -webkit-box;
    display: -webkit-flex;
}

.flex-column {
    display: flex;
    flex-direction: column;
}

.flex-1 {
    flex: 1;
}

.flex-wrap {
    flex-wrap: wrap;
}

.flex-nowrap {
    flex-wrap: nowrap;
}

.flex-j-start {
    display: flex;
    align-items: center;
    justify-content: flex-start;
}

.flex-j-end {
    display: flex;
    align-items: center;
    justify-content: flex-end;
}

.flex-j-between {
    display: flex;
    align-items: center;
    justify-content: space-between;
}

.flex-j-around {
    display: flex;
    align-items: center;
    justify-content: space-around;
}

.flex-j-center {
    display: flex;
    align-items: center;
    justify-content: center;
}
</style>
6. mockRes.json
{
    "code": "200",
    "message": "操作成功",
    "result": {
        "roleId": "1",
        "roleName": "admin",
        "desc": "admin添加到这里1",
        "inAdd": 0,
        "active": false,
        "firstFloor": [
            {
                "cid": 1,
                "authName": "小程序",
                "key": "000",
                "path": "/",
                "authType": "1",
                "orderNum": 1,
                "level": 0,
                "pid": null,
                "active": true,
                "children": [
                    {
                        "cid": 2,
                        "authName": "XXXXXX记录",
                        "key": "menu_cityload",
                        "path": "pages/cityload/index",
                        "authType": "1",
                        "orderNum": 2,
                        "level": 1,
                        "pid": "1",
                        "active": true,
                        "children": [
                            {
                                "cid": 7,
                                "authName": "XXXXXX记录列表",
                                "key": "record_cityload",
                                "path": "record/cityload/list",
                                "authType": "2",
                                "orderNum": 1,
                                "level": 2,
                                "pid": "2",
                                "active": true,
                                "children": [
                                    {
                                        "cid": 90002213,
                                        "authName": "查询XXXXXX记录列表",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "7",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90003319,
                                        "authName": "查询关联设施树",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "7",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 16173319,
                                        "authName": "查询XXXXXX详情",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "7",
                                        "active": false,
                                        "children": null
                                    }
                                ]
                            },
                            {
                                "cid": 8,
                                "authName": "XXXXXX记录新增",
                                "key": "record_cityload_add",
                                "path": "record/cityload/add",
                                "authType": "2",
                                "orderNum": 2,
                                "level": 2,
                                "pid": "2",
                                "active": true,
                                "children": [
                                    {
                                        "cid": 90002210,
                                        "authName": "新增XXXXXX记录",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "8",
                                        "active": false,
                                        "children": null
                                    }
                                ]
                            },
                            {
                                "cid": 9,
                                "authName": "XXXXXX记录编辑",
                                "key": "record_cityload_edit",
                                "path": "record/cityload/edit",
                                "authType": "2",
                                "orderNum": 3,
                                "level": 2,
                                "pid": "2",
                                "active": true,
                                "children": [
                                    {
                                        "cid": 90002232,
                                        "authName": "列表",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "9",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002243,
                                        "authName": "详情",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "9",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002212,
                                        "authName": "修改XXXXXX记录",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "9",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002214,
                                        "authName": "查询XXXXXX详细信息",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "9",
                                        "active": false,
                                        "children": null
                                    }
                                ]
                            },
                            {
                                "cid": 15,
                                "authName": "XXXXXX打卡记录",
                                "key": "record_card_city",
                                "path": "record/card/city/list",
                                "authType": "2",
                                "orderNum": 1,
                                "level": 2,
                                "pid": "2",
                                "active": true,
                                "children": null
                            },
                            {
                                "cid": 16,
                                "authName": "XXXXXX巡检打卡",
                                "key": "card_city_add",
                                "path": "card/city/add",
                                "authType": "2",
                                "orderNum": 3,
                                "level": 2,
                                "pid": "2",
                                "active": true,
                                "children": [
                                    {
                                        "cid": 90002211,
                                        "authName": "巡检打卡",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "16",
                                        "active": false,
                                        "children": null
                                    }
                                ]
                            }
                        ]
                    },
                    {
                        "cid": 3,
                        "authName": "巡查记录",
                        "key": "menu_patrol",
                        "path": "pages/patrol/index",
                        "authType": "1",
                        "orderNum": 1,
                        "level": 1,
                        "pid": "1",
                        "active": true,
                        "children": [
                            {
                                "cid": 4,
                                "authName": "地图服务",
                                "key": "map_patrol",
                                "path": "map/patrol/info",
                                "authType": "2",
                                "orderNum": 1,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": [
                                    {
                                        "cid": 39000225,
                                        "authName": "任务详情地图",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "4",
                                        "active": false,
                                        "children": null
                                    }
                                ]
                            },
                            {
                                "cid": 5,
                                "authName": "巡查记录列表",
                                "key": "record_patrol",
                                "path": "record/patrol/list",
                                "authType": "2",
                                "orderNum": 2,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": [
                                    {
                                        "cid": 90002204,
                                        "authName": "查询一条未完成计划",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "5",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002206,
                                        "authName": "根据日期查询关联的巡查计划",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "5",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002207,
                                        "authName": "巡查计划统计当月信息",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "5",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002208,
                                        "authName": "查询所有的巡查任务",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "5",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002209,
                                        "authName": "新增巡查记录",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "5",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002217,
                                        "authName": "巡查记录列表",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "5",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002219,
                                        "authName": "巡查记录修改",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "5",
                                        "active": false,
                                        "children": null
                                    }
                                ]
                            },
                            {
                                "cid": 6,
                                "authName": "巡查记录新增",
                                "key": "record_patrol_add",
                                "path": "record/patrol/add",
                                "authType": "2",
                                "orderNum": 3,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": null
                            },
                            {
                                "cid": 10,
                                "authName": "巡检打卡",
                                "key": "record_cityload_card",
                                "path": "record/cityload/card",
                                "authType": "2",
                                "orderNum": 4,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": null
                            },
                            {
                                "cid": 11,
                                "authName": "巡查计划自动排班",
                                "key": "record_patrol_auto",
                                "path": "record/patrol/auto",
                                "authType": "2",
                                "orderNum": 5,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": null
                            },
                            {
                                "cid": 12,
                                "authName": "巡查计划复制排班",
                                "key": "record_patrol_copy",
                                "path": "record/patrol/copy",
                                "authType": "2",
                                "orderNum": 6,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": null
                            },
                            {
                                "cid": 13,
                                "authName": "新建计划",
                                "key": "plan_patrol_add",
                                "path": "plan/patrol/add",
                                "authType": "2",
                                "orderNum": 7,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": null
                            },
                            {
                                "cid": 14,
                                "authName": "计划列表",
                                "key": "plan_patrol_list",
                                "path": "plan/patrol/list",
                                "authType": "2",
                                "orderNum": 8,
                                "level": 2,
                                "pid": "3",
                                "active": true,
                                "children": null
                            }
                        ]
                    },
                    {
                        "cid": 17,
                        "authName": "登录权限",
                        "key": "app_login",
                        "path": "app/login",
                        "authType": "1",
                        "orderNum": 3,
                        "level": 1,
                        "pid": "1",
                        "active": true,
                        "children": [
                            {
                                "cid": 18,
                                "authName": "登录授权",
                                "key": "app_login_info",
                                "path": "app/login/info",
                                "authType": "2",
                                "orderNum": 3,
                                "level": 1,
                                "pid": "17",
                                "active": true,
                                "children": [
                                    {
                                        "cid": 90002200,
                                        "authName": "修改密码",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "18",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002201,
                                        "authName": "token置换",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "18",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002202,
                                        "authName": "登出",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "18",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002203,
                                        "authName": "获取菜单",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "18",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002215,
                                        "authName": "文件上传",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "18",
                                        "active": false,
                                        "children": null
                                    },
                                    {
                                        "cid": 90002216,
                                        "authName": "文件查看",
                                        "key": null,
                                        "path": null,
                                        "authType": "3",
                                        "orderNum": null,
                                        "level": 3,
                                        "pid": "18",
                                        "active": false,
                                        "children": null
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/350728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MS7256C:L1 频段卫星导航射频前端低噪声放大器芯片

1、描述 MS7256C 是一款具有高增益、低噪声系数的低噪声放 大器&#xff08;LNA&#xff09;芯片&#xff0c;支持 L1 频段多模式全球卫星定位&#xff0c;可 以应用于 GPS、北斗二代、伽利略、Glonass 等 GNSS 导航 接收机中。芯片采用先进工艺制造&#xff0c;封装采用 1…

Hive3.1.3基础

参考B站尚硅谷 目录 什么是HiveHive架构原理 Hive安装Hive安装地址Hive安装部署安装Hive启动并使用Hive MySQL安装安装MySQL配置MySQL 配置Hive元数据存储到MySQL配置元数据到MySQL Hive服务部署hiveserver2服务metastore服务编写Hive服务启动脚本&#xff08;了解&#xff09…

【C++中STL】list链表

List链表 基本概念构造函数赋值和交换大小操作插入和删除数据存取反转和排序 基本概念 将数据进行链式存储 链表list是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff0c;链表是由一系列结点组成&#xff0c;结点的组…

linux基础学习(7):find命令

1.按照文件名搜索 find 搜索路径 选项 文件名 选项&#xff1a; -name&#xff1a;按文件名搜索 -ineme&#xff1a;不区分文件名大小写搜索 -inum&#xff1a;按inode号搜索 按文件名搜索跟按关键词搜索不一样&#xff0c;只能搜到文件名完整对应的文件 *根据文件名…

Vulnhub靶机:FunBox11

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;FunBox11&#xff08;10.0.2.36&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/funb…

Java编程的利器:Pair和Triple无缝解决多值返回问题,助力编写高效代码

在实际编码中&#xff0c;经常会遇到一个方法需要返回多个值的情况&#xff0c;你编写一个方法&#xff0c;需要同时返回某个操作的结果和一些相关的附加信息。使用传统的方式&#xff0c;你可能需要创建一个包含这些信息的自定义类或者使用集合&#xff08;如 Map&#xff09;…

下拉回显问题案例大全

下拉回显问题案例大全 一、原生js案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>下拉框数据回…

Ubuntu18编译jdk8源码

环境 系统 ubuntu18 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux jdk源码openjdk-8u41-src-b04-14_jan_2020.zip bootJdk jdk-8u391-linux-x64.tar.gz ps -e|grep ssh sudo apt-get install ssh…

GitBook可以搭建知识库吗?有无其他更好更方便的?

在一个现代化的企业中&#xff0c;知识是一项宝贵的资产。拥有一个完善的企业知识库&#xff0c;不仅可以加速员工的学习和成长&#xff0c;还能提高工作效率和团队协作能力。然而&#xff0c;随着企业不断发展和扩大规模&#xff0c;知识库的构建和管理变得更加复杂和耗时。 |…

steam搬砖项目真的假的?怎么赚钱?到底能不能做

steam搬砖是真的还是假的&#xff1f;不管能不能做到&#xff0c;你一定因为这个问题找到了我&#xff0c;看了这篇文章。我已经练习蒸砖项目3年多了。我可以负责任地说&#xff0c;相比其他互联网项目&#xff0c;蒸汽砖项目绝对是门槛最低、最稳定、期限最长、变现最快的一个…

2982. 找出出现至少三次的最长特殊子字符串 II

字典树思路 用字典树搞一下就好了&#xff0c;比如aaaaa &#xff1a; a存5次 aa 4次以此类推&#xff5e; 字典树板子复习&#xff1a;P8306 【模板】字典树 这里这个清空方式 很好 因为很多时候memset T #include<iostream> #include<cstring> using namesp…

如何训练和导出模型

介绍如何通过DI-engine使用DQN算法训练强化学习模型 一、什么是DQN算法 DQN算法&#xff0c;全称为Deep Q-Network算法&#xff0c;是一种结合了Q学习&#xff08;一种价值基础的强化学习算法&#xff09;和深度学习的算法。该算法是由DeepMind团队在2013年提出的&#xff0c;…

STM32标准库——(4)OLED显示屏

1.STM32调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上Keil调试模式&#xff1a;借助Keil软件的调试模式&…

语义分割(2) :自定义Dataset和Dataloader

文章目录 1. 数据处理1.1 标签转换(json2mask和json2yolo)1.1.1 json2mask1.1.2 json2yolo 1.2 划分数据集1.2 不规范的标签图片处理1.3 批量修改图片后缀 2 自定义Dataset 和 Dataloader2.1 自定义Dataset2.1.1 数据增强(1) 对图像进行缩放并且进行长和宽的扭曲(2) 随机翻转图…

预处理详解1❤

一&#xff1a;预定义符号 C语言中设置了一些预定义符号&#xff0c;它们可以直接使用&#xff0c;同时预定义符号是在预处理期间处理的。 以下就是相关的预处理符号的作用。 二&#xff1a;#define定义常量 首先基本的语法是 #define name stuff 相对比较简单&#xff…

Dijkstra求最短路 I——朴素版Dijkstra算法

问题描述 稠密图使用朴素版Dijkstra算法 使用邻接矩阵存储图定义dist[]数组用来表示图中所有点到1号点的距离&#xff0c;初始化所有点到1号点的距离为0x3f3f3f3f&#xff0c;dist[1] 0循环n次 在图中找出距离1号点最小的点&#xff0c;并且当前点没有被确定过&#xff0c;另…

服务器无法访问外网怎么办

目前是互联网时代&#xff0c;网络已经成为人们日常生活中不可或缺的一部分。我们通过网络获取信息、进行沟通、甚至进行工作&#xff0c;因此&#xff0c;保持网络的稳定和通畅是非常重要的。然而&#xff0c;有时候我们可能会遇到一些网络无法访问外网的问题&#xff0c;这给…

Odoo14 中的小部件列表

们有不同类型的小部件用于不同的目的&#xff0c;帮助我们简化操作。小部件用于使代码变得简单且用户友好&#xff0c;这将有助于软件的编码和编程方面。在 Odoo 14 开发中&#xff0c;我们可以利用不同的小部件&#xff0c;这些小部件可用于编程操作的某些特定方面。这些简化工…

黑豹程序员-vue实现两级联动下拉列表

需求 在开发中这类需求很多&#xff0c;前后两个下拉框有紧密关系&#xff0c;第一个下拉框相当于一个分类&#xff0c;选中第一个下拉框中的某个分类后&#xff0c;第二个下拉框的内容随之改变&#xff0c;列出其分类下的选项。 图例 选中某个一级风险领域后&#xff0c;二级…

38、Flink 的CDC 格式:canal部署以及示例

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…