| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463 |
- <template>
- <div class="authority">
- <warning-bar title="注:右上角头像下拉可切换角色" />
- <div class="gva-table-box">
- <div class="gva-btn-list">
- <el-button
- type="primary"
- icon="plus"
- @click="addAuthority(0)"
- >新增角色</el-button>
- </div>
- <el-table
- :data="tableData"
- :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
- row-key="authorityId"
- style="width: 100%"
- >
- <el-table-column
- label="角色ID"
- min-width="180"
- prop="authorityId"
- />
- <el-table-column
- align="left"
- label="角色名称"
- min-width="180"
- prop="authorityName"
- />
- <el-table-column
- align="left"
- label="操作"
- width="460"
- >
- <template #default="scope">
- <el-button
- icon="setting"
- type="primary"
- link
- @click="openDrawer(scope.row)"
- >设置权限</el-button>
- <el-button
- icon="plus"
- type="primary"
- link
- @click="addAuthority(scope.row.authorityId)"
- >新增子角色</el-button>
- <el-button
- icon="copy-document"
- type="primary"
- link
- @click="copyAuthorityFunc(scope.row)"
- >拷贝</el-button>
- <el-button
- icon="edit"
- type="primary"
- link
- @click="editAuthority(scope.row)"
- >编辑</el-button>
- <el-button
- icon="delete"
- type="primary"
- link
- @click="deleteAuth(scope.row)"
- >删除</el-button>
- </template>
- </el-table-column>
- </el-table>
- </div>
- <!-- 新增角色弹窗 -->
- <el-dialog
- v-model="dialogFormVisible"
- :title="dialogTitle"
- >
- <el-form
- ref="authorityForm"
- :model="form"
- :rules="rules"
- label-width="80px"
- >
- <el-form-item
- label="父级角色"
- prop="parentId"
- >
- <el-cascader
- v-model="form.parentId"
- style="width:100%"
- :disabled="dialogType==='add'"
- :options="AuthorityOption"
- :props="{ checkStrictly: true,label:'authorityName',value:'authorityId',disabled:'disabled',emitPath:false}"
- :show-all-levels="false"
- filterable
- />
- </el-form-item>
- <el-form-item
- label="角色ID"
- prop="authorityId"
- >
- <el-input
- v-model="form.authorityId"
- :disabled="dialogType==='edit'"
- autocomplete="off"
- maxlength="15"
- />
- </el-form-item>
- <el-form-item
- label="角色姓名"
- prop="authorityName"
- >
- <el-input
- v-model="form.authorityName"
- autocomplete="off"
- />
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="closeDialog">取 消</el-button>
- <el-button
- type="primary"
- @click="enterDialog"
- >确 定</el-button>
- </div>
- </template>
- </el-dialog>
- <el-drawer
- v-if="drawer"
- v-model="drawer"
- :with-header="false"
- size="40%"
- title="角色配置"
- >
- <el-tabs
- :before-leave="autoEnter"
- type="border-card"
- >
- <el-tab-pane label="角色菜单">
- <Menus
- ref="menus"
- :row="activeRow"
- @changeRow="changeRow"
- />
- </el-tab-pane>
- <el-tab-pane label="角色api">
- <Apis
- ref="apis"
- :row="activeRow"
- @changeRow="changeRow"
- />
- </el-tab-pane>
- <el-tab-pane label="资源权限">
- <Datas
- ref="datas"
- :authority="tableData"
- :row="activeRow"
- @changeRow="changeRow"
- />
- </el-tab-pane>
- </el-tabs>
- </el-drawer>
- </div>
- </template>
- <script setup>
- import {
- getAuthorityList,
- deleteAuthority,
- createAuthority,
- updateAuthority,
- copyAuthority
- } from '@/api/authority'
- import Menus from '@/view/superAdmin/authority/components/menus.vue'
- import Apis from '@/view/superAdmin/authority/components/apis.vue'
- import Datas from '@/view/superAdmin/authority/components/datas.vue'
- import WarningBar from '@/components/warningBar/warningBar.vue'
- import { ref } from 'vue'
- import { ElMessage, ElMessageBox } from 'element-plus'
- import { toDoc } from '@/utils/doc'
- import { VideoCameraFilled } from '@element-plus/icons-vue'
- defineOptions({
- name: 'Authority'
- })
- const mustUint = (rule, value, callback) => {
- if (!/^[0-9]*[1-9][0-9]*$/.test(value)) {
- return callback(new Error('请输入正整数'))
- }
- return callback()
- }
- const AuthorityOption = ref([
- {
- authorityId: 0,
- authorityName: '根角色'
- }
- ])
- const drawer = ref(false)
- const dialogType = ref('add')
- const activeRow = ref({})
- const dialogTitle = ref('新增角色')
- const dialogFormVisible = ref(false)
- const apiDialogFlag = ref(false)
- const copyForm = ref({})
- const form = ref({
- authorityId: 0,
- authorityName: '',
- parentId: 0
- })
- const rules = ref({
- authorityId: [
- { required: true, message: '请输入角色ID', trigger: 'blur' },
- { validator: mustUint, trigger: 'blur', message: '必须为正整数' }
- ],
- authorityName: [
- { required: true, message: '请输入角色名', trigger: 'blur' }
- ],
- parentId: [
- { required: true, message: '请选择父角色', trigger: 'blur' },
- ]
- })
- const page = ref(1)
- const total = ref(0)
- const pageSize = ref(999)
- const tableData = ref([])
- const searchInfo = ref({})
- // 查询
- const getTableData = async() => {
- const table = await getAuthorityList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
- if (table.code === 0) {
- tableData.value = table.data.list
- total.value = table.data.total
- page.value = table.data.page
- pageSize.value = table.data.pageSize
- }
- }
- getTableData()
- const changeRow = (key, value) => {
- activeRow.value[key] = value
- }
- const menus = ref(null)
- const apis = ref(null)
- const datas = ref(null)
- const autoEnter = (activeName, oldActiveName) => {
- const paneArr = [menus, apis, datas]
- if (oldActiveName) {
- if (paneArr[oldActiveName].value.needConfirm) {
- paneArr[oldActiveName].value.enterAndNext()
- paneArr[oldActiveName].value.needConfirm = false
- }
- }
- }
- // 拷贝角色
- const copyAuthorityFunc = (row) => {
- setOptions()
- dialogTitle.value = '拷贝角色'
- dialogType.value = 'copy'
- for (const k in form.value) {
- form.value[k] = row[k]
- }
- copyForm.value = row
- dialogFormVisible.value = true
- }
- const openDrawer = (row) => {
- drawer.value = true
- activeRow.value = row
- }
- // 删除角色
- const deleteAuth = (row) => {
- ElMessageBox.confirm('此操作将永久删除该角色, 是否继续?', '提示', {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning'
- })
- .then(async() => {
- const res = await deleteAuthority({ authorityId: row.authorityId })
- if (res.code === 0) {
- ElMessage({
- type: 'success',
- message: '删除成功!'
- })
- if (tableData.value.length === 1 && page.value > 1) {
- page.value--
- }
- getTableData()
- }
- })
- .catch(() => {
- ElMessage({
- type: 'info',
- message: '已取消删除'
- })
- })
- }
- // 初始化表单
- const authorityForm = ref(null)
- const initForm = () => {
- if (authorityForm.value) {
- authorityForm.value.resetFields()
- }
- form.value = {
- authorityId: 0,
- authorityName: '',
- parentId: 0
- }
- }
- // 关闭窗口
- const closeDialog = () => {
- initForm()
- dialogFormVisible.value = false
- apiDialogFlag.value = false
- }
- // 确定弹窗
- const enterDialog = () => {
- authorityForm.value.validate(async valid => {
- if (valid) {
- form.value.authorityId = Number(form.value.authorityId)
- switch (dialogType.value) {
- case 'add':
- {
- const res = await createAuthority(form.value)
- if (res.code === 0) {
- ElMessage({
- type: 'success',
- message: '添加成功!'
- })
- getTableData()
- closeDialog()
- }
- }
- break
- case 'edit':
- {
- const res = await updateAuthority(form.value)
- if (res.code === 0) {
- ElMessage({
- type: 'success',
- message: '添加成功!'
- })
- getTableData()
- closeDialog()
- }
- }
- break
- case 'copy': {
- const data = {
- authority: {
- authorityId: 0,
- authorityName: '',
- datauthorityId: [],
- parentId: 0
- },
- oldAuthorityId: 0
- }
- data.authority.authorityId = form.value.authorityId
- data.authority.authorityName = form.value.authorityName
- data.authority.parentId = form.value.parentId
- data.authority.dataAuthorityId = copyForm.value.dataAuthorityId
- data.oldAuthorityId = copyForm.value.authorityId
- const res = await copyAuthority(data)
- if (res.code === 0) {
- ElMessage({
- type: 'success',
- message: '复制成功!'
- })
- getTableData()
- }
- }
- }
- initForm()
- dialogFormVisible.value = false
- }
- })
- }
- const setOptions = () => {
- AuthorityOption.value = [
- {
- authorityId: 0,
- authorityName: '根角色'
- }
- ]
- setAuthorityOptions(tableData.value, AuthorityOption.value, false)
- }
- const setAuthorityOptions = (AuthorityData, optionsData, disabled) => {
- AuthorityData &&
- AuthorityData.forEach(item => {
- if (item.children && item.children.length) {
- const option = {
- authorityId: item.authorityId,
- authorityName: item.authorityName,
- disabled: disabled || item.authorityId === form.value.authorityId,
- children: []
- }
- setAuthorityOptions(
- item.children,
- option.children,
- disabled || item.authorityId === form.value.authorityId
- )
- optionsData.push(option)
- } else {
- const option = {
- authorityId: item.authorityId,
- authorityName: item.authorityName,
- disabled: disabled || item.authorityId === form.value.authorityId
- }
- optionsData.push(option)
- }
- })
- }
- // 增加角色
- const addAuthority = (parentId) => {
- initForm()
- dialogTitle.value = '新增角色'
- dialogType.value = 'add'
- form.value.parentId = parentId
- setOptions()
- dialogFormVisible.value = true
- }
- // 编辑角色
- const editAuthority = (row) => {
- setOptions()
- dialogTitle.value = '编辑角色'
- dialogType.value = 'edit'
- for (const key in form.value) {
- form.value[key] = row[key]
- }
- setOptions()
- dialogFormVisible.value = true
- }
- </script>
- <style lang="scss">
- .authority {
- .el-input-number {
- margin-left: 15px;
- span {
- display: none;
- }
- }
- }
- .tree-content{
- margin-top: 10px;
- height: calc(100vh - 158px);
- overflow: auto;
- }
- </style>
|