map/ui/dasadmin/src/views/backend/auth/role/index.vue
高云鹏 3728641a29 机构:修改无上级机构时显示名称,修改查询逻辑
角色:修改用户角色列表显示逻辑
2024-10-15 12:49:39 +08:00

320 lines
11 KiB
Vue

<template>
<div class="roleManagement">
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="600">
<el-form :model="formModel" ref="formRef">
<template v-for="item in formColumnList" :key="item.prop">
<el-form-item :label="item.label" :rules="item.rule" :label-width="80" :prop="item.prop">
<template v-if="item.type === 'input'">
<el-input v-model="formModel[item.prop] as string" :placeholder="'请输入' + item.label"></el-input>
</template>
<template v-if="item.type === 'custom'">
<template v-if="item.prop === 'authList'">
<el-select v-model="formModel[item.prop]" multiple :placeholder="'请选择' + item.label">
<el-option
v-for="item in authorityListOptions"
:key="item.id"
:label="item.authorityName"
:value="item.id"
></el-option>
</el-select>
</template>
</template>
</el-form-item>
</template>
</el-form>
<template #footer>
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button @click="cancelSubmitForm">取消</el-button>
</template>
</el-dialog>
<el-container class="container">
<el-header class="containerHeader">
<div class="searchPart">
<el-input class="searchInput" v-model="searchInputValue" :placeholder="searchInputPlacehoder"></el-input>
<el-button type="primary" :icon="Search" class="defaultBtn" @click="searchClick">{{ t('management.search') }}</el-button>
</div>
<el-button type="primary" :icon="Plus" class="defaultBtn" @click="addClick">{{ t('management.add') }}</el-button>
</el-header>
<el-main class="containerMain">
<el-table :data="tableData" class="tablePart">
<el-table-column
v-for="item in tableColumn"
:key="item.key"
:prop="item.prop"
:label="item.label"
:fixed="item.fixed"
:align="item.align ?? 'center'"
></el-table-column>
<el-table-column fixed="right" label="操作" align="center">
<template #default="scope">
<div class="tableOperate">
<a @click="editForm(scope.row)">编辑</a>
<a>|</a>
<el-popconfirm title="确定删除么?" @confirm="delForm(scope.row)">
<template #reference>
<a>删除</a>
</template>
</el-popconfirm>
</div>
</template>
</el-table-column>
</el-table>
<div class="mainFooter">
<el-pagination
v-model:current-page="currentPage"
v-model:page-size="currentPageSize"
:total="pageTotal"
:page-sizes="pagePagination"
background
:pager-count="7"
layout="prev, pager, next, jumper,sizes,total"
></el-pagination>
</div>
</el-main>
</el-container>
</div>
</template>
<script setup lang="ts">
import { ref, computed, onMounted } from 'vue'
import {
ElContainer,
ElHeader,
ElMain,
ElInput,
ElButton,
ElTable,
ElTableColumn,
ElDialog,
ElForm,
ElFormItem,
ElMessage,
ElPopconfirm,
ElPagination,
} from 'element-plus'
import type { FormInstance } from 'element-plus'
import { Plus, Search } from '@element-plus/icons-vue'
import {
tableDataType,
tableColumnType,
formDataEnum,
formDataEnumKeyJointType,
formColumnListType,
formDataType,
authorityDataListType,
tableDataColumnTypeJointType,
tableDataEnum,
} from './type'
import { useI18n } from 'vue-i18n'
import { getRoleListReq, changeRoleListReq, addRoleListReq, delRoleListReq, getAllRoleListReq } from '/@/api/backend/role/request'
const { t } = useI18n()
const dialogTitle = ref('新增角色')
const dialogVisible = ref(false)
const defaultFormModel = {
id: '',
authList: [],
roleName: '',
roleCode: '',
}
const formModel = ref<formDataType>(JSON.parse(JSON.stringify(defaultFormModel)))
const formColumnList: formColumnListType<formDataEnumKeyJointType>[] = [
{ type: 'input', label: formDataEnum['roleName'], prop: 'roleName', rule: [{ required: true, message: '请输入角色名称', trigger: 'blur' }] },
{ type: 'input', label: formDataEnum['roleCode'], prop: 'roleCode', rule: [{ required: true, message: '请输入角色编码', trigger: 'blur' }] },
{
type: 'custom',
label: formDataEnum['authList'],
prop: 'authList',
rule: [{ required: true, message: '请选择权限列表', trigger: 'change' }],
},
]
const authorityListOptions = ref<authorityDataListType[]>([])
const formRef = ref<FormInstance>()
const submitForm = () => {
if (!formRef.value) return
formRef.value.validate((valid) => {
if (valid) {
if (dialogTitle.value === '新增角色') {
console.log(formModel.value)
addRoleListReq(formModel.value)
.then((res) => {
if (res.success) {
getRoleList()
ElMessage.success('新增成功')
dialogVisible.value = false
} else {
ElMessage.error(res?.msg ?? '新增失败')
}
})
.catch((err) => {
ElMessage.error(err?.response?.data?.msg ?? '新增失败')
})
} else if (dialogTitle.value === '编辑角色') {
changeRoleListReq(formModel.value)
.then((res) => {
if (res.success) {
getRoleList()
ElMessage.success('编辑成功')
dialogVisible.value = false
} else {
ElMessage.error(res?.msg ?? '编辑失败')
}
})
.catch((err) => {
ElMessage.error(err?.response?.data?.msg ?? '编辑失败')
})
}
}
})
}
const cancelSubmitForm = () => {
dialogVisible.value = false
}
const searchInputPlacehoder = t('management.Query roles by name')
const searchInputValue = ref<string>('')
const searchClick = () => {
currentPage.value = 1
getRoleList(searchInputValue.value)
}
const tableColumn = ref<tableColumnType<tableDataColumnTypeJointType>[]>([
{
key: 'roleName-table',
prop: 'roleName',
label: tableDataEnum['roleName'],
},
{
key: 'roleCode_table',
prop: 'roleCode',
label: tableDataEnum['roleCode'],
},
{
label: tableDataEnum['listName'],
prop: 'listName',
key: 'authList-table',
},
])
const tableData = computed(() => {
const start = (currentPage.value - 1) * currentPageSize.value
const end = start + currentPageSize.value
return originData.value?.slice(start, end)
})
const pagePagination = [5, 10, 20, 30]
const currentPage = ref(1)
const currentPageSize = ref(pagePagination[0])
const pageTotal = ref(0)
const originData = ref<tableDataType<authorityDataListType>[]>()
const addClick = () => {
// 新增角色
dialogTitle.value = '新增角色'
formModel.value = JSON.parse(JSON.stringify(defaultFormModel))
formRef.value && formRef.value.resetFields()
dialogVisible.value = true
}
const editForm = (formData: formDataType) => {
formRef.value?.resetFields()
const data = JSON.parse(JSON.stringify(formData))
dialogTitle.value = '编辑角色'
formModel.value = data
dialogVisible.value = true
}
const delForm = (formData: formDataType) => {
delRoleListReq({ id: formData.id })
.then((res) => {
if (res.success) {
ElMessage.success('删除成功')
getRoleList()
} else {
ElMessage.error(res?.msg ?? '删除失败')
}
})
.catch((err) => {
ElMessage.error(err?.response?.data?.msg ?? '删除失败')
})
}
const getRoleList = (roleName = '') => {
getRoleListReq({
roleName,
}).then((res) => {
console.log(res)
pageTotal.value = res.total
originData.value = res.rows.map((item) => {
return {
roleCode: item.roleCode,
roleName: item.roleName,
listName: item.list.map((item) => item.authorityName).join(','),
authList: item.list.map((item) => parseInt(item.id)),
id: item.id,
revision: item.revision,
}
})
})
}
onMounted(() => {
getRoleList()
getAllRoleListReq().then((res) => {
authorityListOptions.value = [...res.data]
})
})
</script>
<style scoped lang="scss">
$defaultHeaderHeight: 60px;
$defaultMainHeight: calc(100% - 60px);
$paginationHeight: 32px;
.roleManagement {
width: 100%;
height: 100%;
.container {
width: 100%;
height: 100%;
.containerHeader {
display: flex;
align-items: center;
justify-content: space-between;
height: $defaultHeaderHeight;
.searchInput {
margin-right: 10px;
width: 220px;
height: 40px;
}
.defaultBtn {
width: 88px;
height: 40px;
}
}
.containerMain {
width: 100%;
height: $defaultMainHeight;
.tablePart {
height: calc(100% - $paginationHeight);
.tableOperate {
display: flex;
justify-content: center;
align-items: center;
a {
margin: 5px;
color: #0064aa;
font-weight: 600;
&:hover {
cursor: pointer;
}
}
}
}
.mainFooter {
display: flex;
justify-content: right;
background-color: #fff;
}
}
}
}
</style>