编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

vue-admin-template权限管理

wxchong 2024-06-22 20:43:42 开源技术 12 ℃ 0 评论

1.页面结构.

<template>
<div class="container">
<div class="app-container">
<el-button class="btn-add" size="mini" type="primary">添加权限</el-button>
<el-table>
<el-table-column label="名称" />
<el-table-column label="标识" />
<el-table-column label="描述" />
<el-table-column label="操作">
<el-button size="mini" type="text">添加</el-button>
<el-button size="mini" type="text">编辑</el-button>
<el-button size="mini" type="text">删除</el-button>
</el-table-column>
</el-table>
</div>
</div>
</template>
<script>
export default {
        name: 'Permission'
        }
</script>
<style>
.btn-add {
        margin: 10px;
        }
</style>

2.api.js

import request from '@/utils/request'

/** *
 * 获取权限列表
 * **/

        export function getPermissionList() {
        return request({
        url: '/permission'
        })
        }

3.页面调用api

<script>
import { getPermissionList } from '@/api/permission'
        import { transListToTreeData } from '@/utils'
        export default {
        name: 'Permission',
        data() {
        return {
        list: []
        }
        },
        created() {
        this.getPermissionList()
        },
        methods: {
        async getPermissionList() {
        this.list = transListToTreeData(await getPermissionList(), 0) // 将列表数据转化成树形结构
        }
        }
        }
</script>

4.绑定数据

<el-table default-expand-all :data="list" row-key="id">
<el-table-column prop="name" label="名称" />
<el-table-column prop="code" label="标识" />
<el-table-column prop="description" label="描述" />
<el-table-column label="操作">
<template v-slot="{ row }">
<el-button v-if="row.type === 1" size="mini" type="text">添加</el-button>
<el-button size="mini" type="text">编辑</el-button>
<el-button size="mini" type="text">删除</el-button>
</template>

</el-table-column>
</el-table>


row中字段包含children是必须指定row-key

5.api.js

import request from '@/utils/request'

/** *
 * 获取权限列表
 * **/

        export function getPermissionList() {
        return request({
        url: '/permission/query',
        method: 'get'
        })
        }

/**
 * 获取权限详情
 *
 * ***/

        export function getPermissionDetail(id) {
        return request({
        url: `/permission/${id}`
        })
        }

/**
 * 新增权限
 * ***/
        export function addPermission(data) {
        return request({
        method: 'post',
        url: '/permission',
        data
        })
        }

/**
 * 编辑权限
 * ***/
        export function editPermission(data) {
        return request({
        method: 'put',
        url: '/permission',
        data
        })
        }

/**
 * 删除权限
 *
 * ***/

        export function delPermission(id) {
        return request({
        method: 'delete',
        url: `/permission/${id}`
        })
        }

6.完整页面

add-permission

<template>
<el-dialog :title="title" :visible="showDialog" @close="close">
<!-- 放置弹层内容 -->
<el-form ref="addPermission" :model="formData" :rules="rules" label-width="120px">
<el-form-item prop="name" label="权限名称">
<el-input v-model="formData.name" placeholder="2-10个字符" style="width: 80%" size="mini" />
</el-form-item>
<el-form-item prop="code" label="权限标识">
<el-input v-model="formData.code" placeholder="2-10个字符" style="width: 80%" size="mini" />
</el-form-item>
<el-form-item prop="description" label="权限描述">
<el-input v-model="formData.description" placeholder="1-100个字符" type="textarea" size="mini" :rows="4" style="width: 80%" />
</el-form-item>

<el-form-item label="开启">
<el-switch
        v-model="formData.envisible"
        active-value="1"
        inactive-value="0"
        />
</el-form-item>

<el-form-item>
<!-- 按钮 -->
<el-row type="flex" justify="center">
<el-col :span="12">
<el-button size="mini" type="primary" @click="btnOK">确定</el-button>
<el-button size="mini" @click="close">取消</el-button>
</el-col>
</el-row>

</el-form-item></el-form>
</el-dialog>
</template>
<script>
import { getPermissionList, addPermission, editPermission, getPermissionDetail } from '@/api/permission'

        export default {
        props: {
        showDialog: {
        type: Boolean,
default: false
        },
        currentNodeId: {
        type: String,
default: null
        },
        title: {
        type: String,
default: null
        }
        },
        data() {
        return {
        formData: {
        code: '', // 权限标识
        description: '', // 权限描述
        name: '', // 权限名称
        pid: 0, // 父级权限的id
        type: 1, // 权限层级
        enVisible: '1' // 是否启用
        },
        rules: {
        code: [{ required: true, message: '权限标识不能为空', trigger: 'blur' },
        {
        min: 2, max: 10, message: '权限标识的长度为2-10个字符', trigger: 'blur'
        }, {
        trigger: 'blur',
        // 自定义校验模式
        validator: async(rule, value, callback) => {
        // value就是输入的编码
        let result = await getPermissionList()
        // 判断是否编辑模式
        if (this.formData.id) {
        result = result.filter(item => item.id !== this.formData.id)
        }
        // result数组中是否存在 value值
        if (result.some(item => item.code === value)) {
        callback(new Error('权限中已经有该编码了'))
        } else {
        callback()
        }
        }
        }
        ], // 权限编码
        name: [{ required: true, message: '权限名称不能为空', trigger: 'blur' },
        {
        min: 2, max: 10, message: '权限名称的长度为2-10个字符', trigger: 'blur'
        }, {
        trigger: 'blur',
        // 自定义校验模式
        validator: async(rule, value, callback) => {
        // value就是输入的编码
        let result = await getPermissionList()
        // 判断是否编辑模式
        if (this.formData.id) {
        result = result.filter(item => item.id !== this.formData.id)
        }
        // result数组中是否存在 value值
        if (result.some(item => item.name === value)) {
        callback(new Error('权限中已经有该名称了'))
        } else {
        callback()
        }
        }
        }] // 权限名称
        // pid: '' // 父级权限的id 不需要做校验
        }
        }
        },
        methods: {
        close() {
        // 修改父组件的值 子传父
        this.$refs.addPermission.resetFields() // 重置表单
        this.$emit('update:showDialog', false)
        },

        // 点击确定时调用
        btnOK() {
        this.$refs.addPermission.validate(async isOK => {
        if (isOK) {
        let msg = ' '
        // 通过是否获取id来标识编辑状态
        if (this.formData.id) {
        await editPermission({ ...this.formData })
        msg = '编辑'
        } else {
        await addPermission({ ...this.formData, pid: this.currentNodeId })
        // 提示消息
        msg = '新增'
        }

        // 通知父组件更新
        this.$emit('updatePermission')
        this.$message.success(msg + '权限成功')
        this.close()
        }
        })
        },
        // 获取权限的详情
        async getPermissionDetail() {
        this.formData = await getPermissionDetail(this.currentNodeId)
        }
        }
        }
</script>

index.vue

<template>
<div class="container">
<div class="app-container">
<el-button class="btn-add" size="mini" type="primary" @click="showAdd(0,'add')">添加权限</el-button>
<el-table default-expand-all :data="list" row-key="id">
<el-table-column prop="name" label="名称" />
<el-table-column prop="code" label="标识" />
<el-table-column prop="description" label="描述" />
<el-table-column label="操作">
<template v-slot="{ row }">
<el-button v-if="row.type === 1" size="mini" type="text" @click="showAdd( row.id,'add' )">添加</el-button>
<el-button size="mini" type="text" @click="showAdd( row.id,'edit' )">编辑</el-button>
<el-button size="mini" type="text" @click="delPer( row.id )">删除</el-button>
</template>

</el-table-column>
</el-table>
</div>
<!-- 表示会接受子组件的事件  update:showDialog, 值 => 属性 -->
<add-permission ref="addPermission" :title="title" :current-node-id="currentNodeId" :show-dialog.sync="showDialog" :showtype.sync="showtype" @updatePermission="getPermissionList" />
</div>
</template>
<script>
import { delPermission, getPermissionList } from '@/api/permission'
        import { transListToTreeData } from '@/utils'
        import addPermission from './components/add-permission.vue'
        export default {
        name: 'Permission',
        components: { addPermission },
        data() {
        return {
        currentNodeId: null, // 存储当前点击的id
        showDialog: false, // 控制弹层的隐藏和显示
        list: []
        }
        },
        created() {
        this.getPermissionList()
        },
        methods: {
        async getPermissionList() {
        this.list = transListToTreeData(await getPermissionList(), 0) // 将列表数据转化成树形结构
        },
        showAdd(id, showtype) {
        this.showDialog = true
        this.currentNodeId = id
        console.log(id)
        if (showtype === 'add') { this.title = '新增权限点' }
        if (showtype === 'edit') {
        this.title = '编辑权限点'
        // 父组件调用子组件的方法来获取数据
        this.$nextTick(() => {
        this.$refs.addPermission.getPermissionDetail() // this.$refs.addDept等同于子组件的this
        })
        }
        },
        delPer(id) {
        // 删除权限
        this.$confirm('您确认要删除该权限吗').then(async() => {
        await delPermission(id)
        // 提示消息
        this.$message.success('删除权限成功')
        this.getPermissionList()
        })
        }
        }
        }
</script>
<style>
.btn-add {
        margin: 10px;
        }
</style>

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表