Industrial-image-management.../src/views/enterprise-settings/admin-permissions/index.vue

363 lines
9.2 KiB
Vue
Raw Normal View History

2025-07-30 09:13:52 +08:00
<template>
<GiPageLayout>
<GiTable
row-key="id"
title="管理员权限管理"
:data="dataList"
:columns="tableColumns"
:loading="loading"
:scroll="{ x: '100%', y: '100%', minWidth: 1400 }"
:pagination="pagination"
@page-change="onPageChange"
@page-size-change="onPageSizeChange"
@refresh="search"
>
<template #top>
<GiForm
v-model="searchForm"
search
:columns="queryFormColumns"
size="medium"
@search="search"
2025-07-30 09:13:52 +08:00
@reset="reset"
/>
</template>
2025-07-30 09:13:52 +08:00
<template #toolbar-left>
<a-space>
<a-button type="primary" @click="openAddModal">
<template #icon><icon-plus /></template>
<template #default>新增管理员</template>
</a-button>
<a-button @click="batchOperation">
<template #icon><icon-settings /></template>
<template #default>批量操作</template>
</a-button>
</a-space>
</template>
2025-07-30 09:13:52 +08:00
<!-- 管理员类型 -->
<template #adminType="{ record }">
<a-tag :color="getAdminTypeColor(record.adminType)">
{{ record.adminType }}
</a-tag>
</template>
2025-07-30 09:13:52 +08:00
<!-- 状态显示 -->
<template #status="{ record }">
<a-tag :color="getStatusColor(record.status)">
{{ getStatusText(record.status) }}
</a-tag>
</template>
2025-07-30 09:13:52 +08:00
<!-- 权限范围 -->
<template #permissions="{ record }">
<a-space>
<a-tag
v-for="permission in record.permissions.slice(0, 3)"
:key="permission"
2025-07-30 09:13:52 +08:00
size="small"
>
{{ permission }}
</a-tag>
<a-tag v-if="record.permissions.length > 3" size="small">
+{{ record.permissions.length - 3 }}
</a-tag>
</a-space>
</template>
2025-07-30 09:13:52 +08:00
<!-- 在线状态 -->
<template #onlineStatus="{ record }">
<a-space>
<div
2025-07-30 09:13:52 +08:00
:class="record.isOnline ? 'online-dot' : 'offline-dot'"
class="status-dot"
></div>
{{ record.isOnline ? '在线' : '离线' }}
</a-space>
</template>
2025-07-30 09:13:52 +08:00
<!-- 操作列 -->
<template #action="{ record }">
<a-space>
<a-link @click="viewDetail(record)">详情</a-link>
<a-link @click="editRecord(record)">编辑</a-link>
<a-link @click="resetPassword(record)">重置密码</a-link>
<a-link
@click="toggleStatus(record)"
:class="record.status === 'active' ? 'text-red-500' : 'text-green-500'"
2025-07-30 09:13:52 +08:00
>
{{ record.status === 'active' ? '禁用' : '启用' }}
</a-link>
</a-space>
</template>
</GiTable>
</GiPageLayout>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
2025-07-30 09:13:52 +08:00
import { Message } from '@arco-design/web-vue'
import type { TableColumnData } from '@arco-design/web-vue'
// 搜索表单
let searchForm = reactive({
2025-07-30 09:13:52 +08:00
username: '',
adminType: '',
status: '',
createTime: '',
page: 1,
size: 10
2025-07-30 09:13:52 +08:00
})
// 查询条件配置
const queryFormColumns = [
{
field: 'username',
label: '用户名',
type: 'input' as const,
props: {
placeholder: '请输入用户名'
}
2025-07-30 09:13:52 +08:00
},
{
field: 'adminType',
label: '管理员类型',
type: 'select' as const,
props: {
placeholder: '请选择管理员类型',
options: [
{ label: '超级管理员', value: '超级管理员' },
{ label: '系统管理员', value: '系统管理员' },
{ label: '业务管理员', value: '业务管理员' },
{ label: '财务管理员', value: '财务管理员' }
]
}
2025-07-30 09:13:52 +08:00
},
{
field: 'status',
label: '状态',
type: 'select' as const,
props: {
placeholder: '请选择状态',
options: [
{ label: '正常', value: 'active' },
{ label: '禁用', value: 'disabled' },
{ label: '锁定', value: 'locked' }
]
}
}
2025-07-30 09:13:52 +08:00
]
// 表格列配置
const tableColumns: TableColumnData[] = [
{ title: '用户名', dataIndex: 'username', width: 120 },
{ title: '真实姓名', dataIndex: 'realName', width: 100 },
{ title: '管理员类型', dataIndex: 'adminType', slotName: 'adminType', width: 120 },
{ title: '联系电话', dataIndex: 'phone', width: 120 },
{ title: '邮箱', dataIndex: 'email', width: 200 },
{ title: '权限范围', dataIndex: 'permissions', slotName: 'permissions', width: 250 },
{ title: '创建时间', dataIndex: 'createTime', width: 160 },
{ title: '最后登录', dataIndex: 'lastLoginTime', width: 160 },
{ title: '登录次数', dataIndex: 'loginCount', width: 100 },
{ title: '在线状态', dataIndex: 'onlineStatus', slotName: 'onlineStatus', width: 100 },
{ title: '状态', dataIndex: 'status', slotName: 'status', width: 80 },
{ title: '备注', dataIndex: 'remark', width: 200, ellipsis: true, tooltip: true },
{ title: '操作', slotName: 'action', width: 250, fixed: 'right' }
2025-07-30 09:13:52 +08:00
]
// 数据状态
const loading = ref(false)
const dataList = ref([
{
id: 1,
username: 'superadmin',
realName: '系统管理员',
adminType: '超级管理员',
phone: '13800138001',
email: 'admin@windtech.com',
permissions: ['用户管理', '系统设置', '数据管理', '权限管理', '日志查看'],
createTime: '2023-01-01 10:00:00',
lastLoginTime: '2024-03-15 09:30:00',
loginCount: 1256,
isOnline: true,
status: 'active',
remark: '系统超级管理员,拥有所有权限'
2025-07-30 09:13:52 +08:00
},
{
id: 2,
username: 'projectadmin',
realName: '张项目经理',
adminType: '业务管理员',
phone: '13800138002',
email: 'zhang@windtech.com',
permissions: ['项目管理', '合同管理', '团队管理'],
createTime: '2023-02-15 14:20:00',
lastLoginTime: '2024-03-14 16:45:00',
loginCount: 892,
isOnline: false,
status: 'active',
remark: '负责项目相关业务管理'
2025-07-30 09:13:52 +08:00
},
{
id: 3,
username: 'financeadmin',
realName: '李财务经理',
adminType: '财务管理员',
phone: '13800138003',
email: 'li@windtech.com',
permissions: ['财务管理', '预算管理', '成本控制'],
createTime: '2023-03-01 11:10:00',
lastLoginTime: '2024-03-13 10:20:00',
loginCount: 654,
isOnline: true,
status: 'active',
remark: '负责财务相关业务管理'
2025-07-30 09:13:52 +08:00
},
{
id: 4,
username: 'techsupport',
realName: '王技术支持',
adminType: '系统管理员',
phone: '13800138004',
email: 'wang@windtech.com',
permissions: ['系统维护', '数据备份', '技术支持'],
createTime: '2023-04-10 15:30:00',
lastLoginTime: '2024-03-10 14:15:00',
loginCount: 432,
isOnline: false,
status: 'disabled',
remark: '技术支持人员,目前停用中'
}
2025-07-30 09:13:52 +08:00
])
const pagination = reactive({
current: 1,
pageSize: 10,
total: 4,
showTotal: true,
showPageSize: true
2025-07-30 09:13:52 +08:00
})
// 获取管理员类型颜色
const getAdminTypeColor = (type: string) => {
const colorMap: Record<string, string> = {
'超级管理员': 'red',
'系统管理员': 'blue',
'业务管理员': 'green',
'财务管理员': 'orange'
2025-07-30 09:13:52 +08:00
}
return colorMap[type] || 'gray'
}
// 获取状态颜色
const getStatusColor = (status: string) => {
const colorMap: Record<string, string> = {
'active': 'green',
'disabled': 'red',
'locked': 'orange'
2025-07-30 09:13:52 +08:00
}
return colorMap[status] || 'gray'
}
// 获取状态文本
const getStatusText = (status: string) => {
const textMap: Record<string, string> = {
'active': '正常',
'disabled': '禁用',
'locked': '锁定'
2025-07-30 09:13:52 +08:00
}
return textMap[status] || status
}
// 搜索和重置
const search = async () => {
loading.value = true
setTimeout(() => {
loading.value = false
}, 1000)
}
const reset = () => {
Object.assign(searchForm, {
username: '',
adminType: '',
status: '',
createTime: '',
page: 1,
size: 10
2025-07-30 09:13:52 +08:00
})
pagination.current = 1
search()
}
// 分页处理
const onPageChange = (page: number) => {
searchForm.page = page
pagination.current = page
search()
}
const onPageSizeChange = (size: number) => {
searchForm.size = size
searchForm.page = 1
pagination.pageSize = size
pagination.current = 1
search()
}
// 操作方法
const openAddModal = () => {
Message.info('新增管理员功能开发中...')
}
const batchOperation = () => {
Message.info('批量操作功能开发中...')
}
const viewDetail = (record: any) => {
Message.info(`查看管理员详情: ${record.realName}`)
}
const editRecord = (record: any) => {
Message.info(`编辑管理员: ${record.realName}`)
}
const resetPassword = (record: any) => {
Message.info(`重置密码: ${record.realName}`)
}
const toggleStatus = (record: any) => {
const action = record.status === 'active' ? '禁用' : '启用'
Message.info(`${action}管理员: ${record.realName}`)
}
onMounted(() => {
search()
})
</script>
<style scoped>
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
}
.online-dot {
background-color: #52c41a;
}
.offline-dot {
background-color: #d9d9d9;
}
.text-red-500 {
color: #ef4444;
}
.text-green-500 {
color: #22c55e;
}
</style>