table 权限 展示页面

上篇文件介绍了基本的colspanrowspan,这篇贴上一个学习代码,供以后修改。
效果如下:(这个demo v-if 和 v-for 混用了,这个不好)
在这里插入图片描述

<template><div class="rbac-table"><div class="table-wrapper"><div class="tabel-container"><table><tbody><tr v-for="(item, index) in classTableData" :key="index"><td v-for="(node, nodeIndex) in item" :key="nodeIndex" :colspan="node.colspan" :rowspan="node.rowspan" v-if="node.colspan !== 0 && node.rowspan !== 0"><div v-if="node.data.type !== 'function'">{{ node.data.name }}<div>{{ node.colspan }}-{{ node.rowspan }}</div></div><div v-else><function-check :value="node" /></div></td></tr></tbody></table></div></div></div>
</template>
<script>
import FunctionCheck from './components/FunctionCheck.vue'
const shortid = require('shortid')
// 深度遍历, 使用递归
const getNodeTable = data => {let deep = 0const resultArr = []data.forEach(item => {const itemArr = []const map = (node, level, parent) => {if (level > deep) {deep = level}if (!node.id) {node.id = shortid.generate()}if (parent == null) {resultArr.push({key: node.id,arr: [{key: node.id,_id: node._id,// 第几层级level: level,// 名称name: node.name,function: node.function,},],})}if (node.children) {const parentIndex = resultArr.findIndex(x => {return x.key == node.id})// 截取前面公用部分const commonArr = resultArr[parentIndex].arr.slice(0, level)const replaceArr = []node.children.forEach((child, index) => {child.id = shortid.generate()replaceArr.push({key: child.id,arr: commonArr.concat({ level: level + 1, name: child.name, function: child.function, _id: child._id, key: child.id }),})})resultArr.splice(parentIndex, 1, ...replaceArr)node.children.forEach(child => {map(child, level + 1, node)})}}map(item, 1, null)})return {data: resultArr,deep: deep,}
}const tableData = [{name: '订单管理',type: 'menu',_id: '1',children: [{name: '销售订单',_id: '2',type: 'menu_function',function: [{name: '全选',},{name: '订单查看',_id: '21',},{name: '订单添加',_id: '22',},{name: '订单修改',_id: '23',},{name: '订单删除',_id: '24',},{name: '订单打印',_id: '25',},{name: '订单下载',_id: '26',},{name: '一键完成',_id: '27',},{name: '打印送货单',_id: '28',},],},{name: '采购订单',type: 'menu_function',_id: '3',function: [{name: '全选',},{name: '订单查看',_id: '31',},{name: '订单添加',_id: '32',},{name: '订单修改',_id: '33',},{name: '订单删除',_id: '34',},{name: '订单打印',_id: '35',},{name: '订单下载',_id: '36',},{name: '一键完成',_id: '37',},{name: '打印送货单',_id: '38',},],},],},{name: '销售订单',_id: '5',type: 'menu_function',function: [{name: '全选',},{name: '订单查看',_id: '51',},{name: '订单添加',_id: '52',},{name: '订单修改',_id: '53',},{name: '订单删除',_id: '54',},{name: '订单打印',_id: '55',},{name: '订单下载',_id: '56',},{name: '一键完成',_id: '57',},{name: '打印送货单',_id: '58',},],},
]export default {components: {FunctionCheck,},data() {return {data: [],columns: [],classTableData: [],}},mounted() {const { data, deep } = getNodeTable(tableData)const rowLength = data.lengthconst colLength = deep + 1const bdata = new Array(rowLength)for (let i = 0; i < colLength; i++) {bdata[i] = new Array(colLength)}for (let i = 0; i < rowLength; i++) {const row = data[i].arrfor (let j = colLength - 1; j > -1; j--) {if (!row[j] && row[j - 1]) {row[j] = JSON.parse(JSON.stringify(row[j - 1]))row[j].type = 'function'console.log('row[j]', row[j])}bdata[i][j] = {data: row[j],rowspan: 1,colspan: 1,}}}let matchArr = []let matchArrPos = []// 最左侧为基准let matchLeftArr = []let matchLeftPos = []for (let i = 0; i < rowLength; i++) {matchLeftArr.push(bdata[i][0])matchLeftPos.push({ x: i, y: 0 })}for (let i = 0; i < rowLength; i++) {if (i == 0) {matchArr = JSON.parse(JSON.stringify(bdata[i]))}for (let j = 0; j < colLength; j++) {// row 处理 beginif (i == 0) {matchArrPos.push({ x: i, y: j })} else {if (bdata[i][j].data && bdata[i][j].data.key == matchArr[j].data.key) {const { x, y } = matchArrPos[j]bdata[x][y].rowspan = bdata[x][y].rowspan + 1bdata[i][j].rowspan = 0} else {matchArr[j] = bdata[i][j]matchArrPos[j] = { x: i, y: j }}}// row 处理 end// col 处理 beginif (j > 0) {if (bdata[i][j].data == undefined) {const { x, y } = matchLeftPos[i]bdata[x][y].colspan = bdata[x][y].colspan + 1bdata[i][j].colspan = 0} else {matchLeftArr[i] = bdata[i][j]matchLeftPos[i] = { x: i, y: j }}}}// col 处理 end}this.classTableData = bdata},
}
</script>
<style lang="less" scoped>
.rbac-table {background: white;.table-wrapper {width: 100%;height: 100%;overflow: auto;}.tabel-container {margin: 7px;table {table-layout: fixed;width: 100%;tbody {background-color: white;td {color: #677998;}}th,td {width: 60px;padding: 12px 2px;font-size: 12px;text-align: center;border: 1px solid #d9d9d9;position: relative;}tr td:first-child {color: #333;.period {font-size: 8px;}}}}
}
</style>

组件FunctionCheck

<template><div class="function-check"><div class="check-item" v-for="(item, index) in value.data.function" :key="index"><a-checkbox @change="onChange">{{ item.name }}</a-checkbox></div></div>
</template>
<script>
export default {props: {value: {type: Object,default: () => {return {}},},},
}
</script>
<style lang="less" scoped>
.function-check {width: 100%;height: 100%;padding-left: 10px;display: flex;flex-wrap: wrap;.check-item {width: 120px;margin-top: 2px;margin-bottom: 2px;text-align: left;}
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 公用组件开发 确认框confirm

文件目录&#xff1a; github地址&#xff1a;https://github.com/xingkongwuyu/vue-spa-experience/tree/master/src/components 最终的效果&#xff1a; 组件的源码解析&#xff1a; confirm &#xff1a; confirm的框架 ./index.js import confirmBox from ./src/index; ex…

前端学习(2688):重读vue电商网站9之el-menu 默认会有一个 border-right

这样会导致我们的菜单栏右边会有一个若隐若现的线条凸起 解决办法如下&#xff0c;直接将 el-menu 的border-right 设置为 none 即可。

Android studio 导入module方法

添加module方法步骤&#xff1a; &#xff08;1&#xff09;File----->New------>Import Module找到下载的citypicker文件&#xff0c;点击OK&#xff0c;点击Finish &#xff08;2&#xff09;app的build.gradle下的dependencies下添加 compile project(:citypicker)如…

vue构建项目

想把项目公司一些基础公用组件进行封装&#xff0c;所以需要对单组件进行开发优化。使用到Vue Cli 官方文档&#xff1a;https://cli.vuejs.org/zh/guide/build-targets.html 1、一个新环境&#xff0c;需要安装Vue Cli npm install -g vue/cli npm install -g vue/cli-serv…

前端学习(2689):重读vue电商网站10之表格展开页

只需要将 el-table-column 中 type 属性设为 expand 即能将表格进行展开。 实现效果如下&#xff1a;

AppTheme 属性详解

<style name"AppTheme" parent"Theme.AppCompat.Light.NoActionBar"><!--Appbar背景色&#xff0c;应用的主要色调&#xff0c;actionBar默认使用该颜色--><item name"android:colorPrimary">color/material_animations_prima…

前端学习(2690):重读vue电商网站11之使用树形控件 el-tree

对于分配权限一栏&#xff0c;我们需要如下效果&#xff1a; 相关配置属性&#xff1a; 其中 data 为我们的数据源&#xff0c;props 为我们在 tree组件显示的文本内容。通过设置 node-key可以让每个树节点作为唯一标识的属性&#xff0c;整棵树是唯一的&#xff1b;通过设置 …

Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长

1、复制音频文件到raw文件夹下 2、实例化音频文件 private final MediaPlayer.OnCompletionListener beepListener new MediaPlayer.OnCompletionListener() { // 声音public void onCompletion(MediaPlayer mediaPlayer) {mediaPlayer.seekTo(0);} }; private static final …

前端学习(2691):重读vue电商网站12之获取选中节点的keys:

首先&#xff0c;给我们对话框的确定按钮绑定一个事件。 主要使用 tree 组件提供的两个方法 getCheckedKeys 和 getHalfCheckedKeys来分别返回目前被选中的节点的 key 所组成的数组和目前半选中的节点的 key 所组成的数组

cmd 【已解决】windows连接手机,运行adb devices提示“unauthorized”

报错截图如下&#xff1a; 问题原因&#xff1a;电脑连接手机。手机未授权 解决方式&#xff1a; 设置----开发者选项-----打开USB调试&#xff0c;出现如下弹框&#xff0c;点击“确定”即可解决问题。 转载于:https://www.cnblogs.com/syw20170419/p/8280291.html

Android 可开关式顶部下拉view

效果&#xff1a; 实现方法 1、layout文件结构 最外部使用相对布局 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.c…

前端学习(2692):重读vue电商网站13之使用动态编辑标签

实现效果如下&#xff1a; 通过 v-if 的 boolean值来动态变化是否显示文本框还是 button 按钮。通过 v-model 双向绑定来实现文本框内容的监听。 由于每一行需要设置文本框的显示与隐藏&#xff0c;而且数据是共享的。我们需要通过 scope来获取每一行的值来进行绑定&#xff0…

宝塔面板解决跨域

1、找到宝塔面板配置nginx文件的地方 2、增加如下代码 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods POST,PUT,GET,DELETE; add_header Access-Control-Allow-Headers version, access-token, user-token, Accept, apiAuth, User-Agent…

Android 底部上拉抽屉view

module链接&#xff1a;https://download.csdn.net/download/meixi_android/10839835 接入module方法&#xff1a;https://blog.csdn.net/meixi_android/article/details/84655666 1、activity实现步骤 layout文件布局——DrawerLayoutContent_ID是抽屉内容id&#xff0c;dra…

前端学习(2693):重读vue电商网站14之步骤条的使用与美化

以下就是步骤条使用的核心代码&#xff0c;其中 active 绑定的是每一个 step 的下标&#xff0c;默认从 0 开始。其次&#xff0c;我们可以设置 aligin-center 属性来让我们的步骤条进行居中。el-step就是每一个步骤进度。 Javascript <!-- 步骤条区域 --> <el-steps…

BOM--window对象

BOM 的核心对象是window&#xff0c;它表示浏览器的一个实例。在浏览器中&#xff0c;window 对象有双重角色&#xff0c;它既是通过JavaScript 访问浏览器窗口的一个接口&#xff0c;又是ECMAScript 规定的Global 对象。这意味着在网页中定义的任何一个对象、变量和函数&#…

前端学习(2694):重读vue电商网站15之阻止页签tabs切换

主要函数如下&#xff1a; 在我们的 tabs 标签页添加一个 before-leave 函数 然后在 methods 中定义&#xff0c;根据第一个标签页的逻辑来阻止标签页的切换。

Android 侧滑多层view显示

侧滑module链接&#xff1a;https://download.csdn.net/download/meixi_android/10840271 引用方法 只需layout布局文件引用即可——第一个LinearLayout是底层view&#xff0c;第二个LinearLayout是上层view&#xff0c;侧滑即可显示底层view <com.daimajia.swipe.SwipeL…

Android QQ登录集成

1、首先到腾讯开放平台创建应用&#xff0c;并上线——使用有效APP ID才可以进行qq登录 腾讯开放平台&#xff1a;https://open.tencent.com/ 上线后APP ID 2、下载腾讯sdk&#xff1a;https://download.csdn.net/download/meixi_android/10842092 3、activity代码详情&#…

前端学习(2695):重读vue电商网站16之Upload 上传组件

通过点击或者拖拽上传文件 Js <!-- action表示图片上传后台api地址 --> <el-upload:action"uploadURL":on-preview"handlePreview":on-remove"handleRemove"list-type"picture" ><el-button size"small" typ…