element实现角色管理页面

news2024/10/1 1:24:17

用的element,Tree 树形控件来实现的

<template>
  <div class="p-t-20">
    <div class="table-bg">
      <Title title="角色名称">
        <span>{{role.roleName}}</span>
      </Title>

      <div class="menu-list">
        <el-tree ref="tree" :data="data" :props="props" node-key="menuId" show-checkbox check-on-click-node :expand-on-click-node="false"></el-tree>
      </div>
    </div>

    <GlobalFootButtons>
      <el-button @click="$router.go(-1)">取 消</el-button>
      <el-button class="m-l-20" type="primary" @click="saveClick()">保存</el-button>
    </GlobalFootButtons>
  </div>
</template>

<script>
import { getMenusByRoleId, postUpdateRoleDetail, postQueryRoleById } from '@/axios/systemManage'
export default {
  data () {
    return {
      user: null,
      role: null,
      data: [],
      props: {
        label: 'menuName',
        children: 'children'
      },
      postCreateRoleData: {} // 新增、编辑角色表单
    }
  },
  created () {
    this.user = JSON.parse(window.localStorage.getItem('userInfo'))
    this.role = JSON.parse(window.localStorage.getItem('roleItem'))
    this.getMenuTreeList()
  },
  methods: {
    // 获取列表数据
    async getMenuTreeList () {
      const res = await getMenusByRoleId(this.user.roleId)
      if (res.code === 200) {
        // 处理名称中带括号的内容
        res.data.map(item => {
          item.menuName = item.menuName.split('(')[0]
          item.children.map(i => {
            i.menuName = i.menuName.split('(')[0]
          })
        })
        this.data = res.data
        this.getQueryRoleById()
      }
    },
    // 回显勾选的数据
    async getQueryRoleById () {
      const roleItem = JSON.parse(localStorage.getItem('roleItem'))
      const res = await postQueryRoleById({ roleId: roleItem.roleId })
      if (res.code === 200) {
        this.postCreateRoleData = res.data
        this.$nextTick(() => {
          const tree = this.$refs.tree

          // 选中树
          if (res.data.menuIds && res.data.menuIds.length > 0) {
            tree.setCheckedKeys(res.data.menuIds)
          }

          // 设置展开所有行
          const nodesMap = tree.store.nodesMap
          const keys = Object.keys(nodesMap)
          keys.forEach(key => {
            nodesMap[key].expanded = true
          })
        })
      }
    },
    // 保存
    async saveClick () {
      this.postCreateRoleData.role = JSON.parse(localStorage.getItem('roleItem'))
      this.postCreateRoleData.operationStatus = 1 // 编辑权限时固定传1 角色基本信息传0
      const halfCheckKeys = this.$refs.tree.getHalfCheckedKeys()
      const checkKeys = this.$refs.tree.getCheckedKeys()
      this.postCreateRoleData.menuIds = halfCheckKeys.concat(checkKeys)
      const res = await postUpdateRoleDetail(this.postCreateRoleData)
      if (res.code === 200) {
        this.$message.success('保存成功!')
        this.$router.go(-1)
      }
    }
  }
}
</script>

<style lang="less" scoped>
.table-bg {
  min-height: 88vh;
  padding: 20px;
  margin-bottom: 100px;
  ::v-deep .title {
    font-size: 16px;
    font-weight: bold;
    color: #333;
    span {
      font-size: 14px;
      font-weight: normal;
    }
  }

  .menu-list {
    ::v-deep .el-tree {
      border-top: 1px solid #ebeef5;
      border-left: 1px solid #ebeef5;
      border-right: 1px solid #ebeef5;
      .el-tree-node__expand-icon {
        display: none !important;
      }
      .el-tree-node {
        &.is-expanded,
        &.is-current,
        &.is-focusable {
          background-color: transparent !important;
        }
        .el-tree-node__content {
          background-color: transparent !important;
          &:hover {
            background-color: transparent !important;
          }
        }
      }
      > .el-tree-node {
        display: flex;
        align-items: center;
        border-bottom: 1px solid #ebeef5;
        position: relative;
        > .el-tree-node__content {
          width: 300px;
          height: 100%;
          padding-left: 20px !important;
        }
        .el-tree-node__children {
          position: relative;
          &::after {
            content: ' ';
            display: block;
            width: 1px;
            height: 100%;
            border-left: 1px solid #ebeef5;
            position: absolute;
            left: 0px;
            top: 0px;
          }
          .el-tree-node {
            width: 350px;
            padding: 10px 0px;
          }
        }
      }
    }
  }
}
</style>

 

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

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

相关文章

数学建模-主成分分析

有很多变量并且变量之间有很强的关联关系时使用&#xff0c;解决多重共线性问题没必要进行降维信息损失后然后进行评分&#xff0c;TOPSIS可以直接利用所有数据。指标有各种类型&#xff0c;没有进行正向化

【GoLang】MAC安装Go语言环境

小试牛刀 首先安装VScode软件 或者pycharmmac安装brew软件 brew install go 报了一个错误 不提供这个支持 重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env 可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc, # bre…

简单的SQL注入

SQL注入攻击是通过操作输入来修改SQL语句&#xff0c;用以达到执行代码对WEB服务器进行攻击的方法。简单的说就是在post/getweb表单、输入域名或页面请求的查询字符串中插入SQL命令&#xff0c;最终使web服务器执行恶意命令的过程。可以通过一个例子简单说明SQL注入攻击。假设某…

mysql学习系列(2)--忘记mysql登录密码怎么办?

系列文章目录 文章目录 系列文章目录前言一、登录mysql二、操作步骤1.找到mysql.exe所在的文件夹2.WinR打开cmd&#xff0c;进入bin文件夹3.跳过mysql用户验证3.net start mysql启动服务 总结 前言 一、登录mysql mysql -uroot -p忘记密码无法进入&#xff1a; 二、操作步骤…

【面试系列】JDK动态代理和CGLIB静态代理

文章目录 前言JDK动态代理代码实例Cglib 代理代码实例两者优缺点 前言 是否在面试过程中经常被问到Spring的代理的问题&#xff1a;比如说几种代理方式&#xff1f;两种代理方式的区别&#xff1f;或者问为什么JDK动态代理只能代理接口&#xff1f; 如果你能回答出来JDK动态代…

Vortex Indicator 构建交易策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

Day 40算法记录|dp完全背包问题 06

完全背包问题 基本知识01背包完全背包 518. 零钱兑换 II377. 组合总和 Ⅳ 基本知识 01背包 二维&#xff0c;两层for循环的循序&#xff0c;物品和背包不重要。 d p [ i ] [ j ] m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w e i g h t [ i ] ] v a l u e [ i…

docker基础6——制作镜像(dockerfile)

文章目录 一、基本了解1.1. 基于centos构建镜像1.2 基于alpine制作镜像 二、常用指令三、制作httpd镜像 一、基本了解 Dockerfile 是一个文本格式的配置文件&#xff0c;可以使用Dockerfile 快速创建自定义镜像。Dockerfile 由一行行命令语句组成&#xff0c;并且支持以 # 开头…

Python实现HBA混合蝙蝠智能算法优化XGBoost分类模型(XGBClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蝙蝠算法是2010年杨教授基于群体智能提出的启发式搜索算法&#xff0c;是一种搜索全局最优解的有效方法…

PROFINET转TCP/IP网关profinet网线接头接法

大家好&#xff0c;今天要和大家分享一款自主研发的通讯网关&#xff0c;捷米JM-PN-TCPIP。这款网关可是集多种功能于一身&#xff0c;PROFINET从站功能&#xff0c;让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗&#xff1f;一起来看看吧&…

MySQL:JDBC编程

在实际开发中&#xff0c;SQL很少是手动输入的&#xff0c;绝大多数的SQL都是通过代码&#xff0c;自动执行的。这个时候就需要其他编程语言来操作数据库服务器。 自己写一个数据库客户端是非常容易的&#xff0c;各种数据库本身就提供了一系列的API&#xff0c;但是自己写一个…

ActivityWatch配置跨平台同步(放弃)

老版本探索 老版本启动aw_qt.exe报错如下&#xff1a; 解决方案: ActivityWatch\activitywatch\PyQt5\Qt\plugins\platforms 复制到 ActivityWatch\activitywatch 下面重新启动aw_qt.exe即可解决 最新版 具体内容如下&#xff1a; Traceback (most recent call last): …

【前端】解决element-ui的form组件resetFields()方法不生效的问题

问题 使用element-ui的form组件&#xff0c;在输入栏较多的时候&#xff0c;有时resetFields只能重置一部分输入框的值 解决 给每个值赋值初始值为空即可 例如&#xff0c;需要清除的:model"queryForm.bgnTime"、:model"queryForm.endTime"等一系列的值…

基于Java+SpringBoot+vue前后端分离阿博图书馆管理系统设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【Boost搜索引擎项目】

文章目录 一、项目流程二、项目展示 一、项目流程 1.编写数据去标签模块–parser.cc 将去标签之后干净文档以title\3content\3url\ntitle\3content\3url\n格式放入同一文件中。 2.建立索引模块–index.hpp 读取处理好的行文本文件进行分词、权重计算等操作&#xff0c;在内存中…

ICMP_1靶场详解

ICMP_1靶场复盘 这个靶场还是很有意思的&#xff0c;尤其在提权阶段。 靶场下载地址&#xff1a;https://download.vulnhub.com/icmp/icmp.ova.gz arp-scan --localnet首先扫描ip&#xff0c;登陆后发现是个这样的页面。 我们发现这个页面在提醒我们的就是出现了monitorr 然…

如何部署MHA高可用MySQL数据库

目录 一、MHA概念 MHA 的组成 MHA 的特点 MHA工作原理 二、部署MySQL数据库MHA高可用 第一步 关闭所有防火墙和安全机制 第二步 修改主数据库配置文件 第三步 修改从数据库的配置文件 第四步 重启服务 第五步 优化所有数据库路径 第六步 授权所有数据库节点 第七步…

nodejs+vue+elementui在线课程知识点管理系统

前端技术&#xff1a;nodejsvueelementui,视图层其实质就是vue页面&#xff0c;通过编写vue页面从而展示在浏览器中&#xff0c;编写完成的vue页面要能够和控制器类进行交互&#xff0c;从而使得用户在点击网页进行操作时能够正常。 可以设置中间件来响应 HTTP 请求。 对于之前…

C++ 使用tinyxml库处理XML文件

文章目录 前言一、下载tinyxml二、创建一个XML文件三、XML文件增加数据四、修改XML文件五、解析XML文件六、XML文件删除数据总结 前言 TinyXML是一个开源的解析XML的解析库&#xff0c;能够用于C&#xff0c;能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件&…