This commit is contained in:
2026-07-30 21:23:39 +08:00
parent c1f6423c20
commit 0b0f86218a
12 changed files with 87 additions and 47 deletions
+4 -17
View File
@@ -4,7 +4,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
import { Braces, FolderTree, Pencil, Plus, Search, ShieldCheck } from '@lucide/vue'
import MetricStrip from '@/components/MetricStrip.vue'
import StatusBadge from '@/components/StatusBadge.vue'
import { createPlatformPermission, listPlatformPermissions, type PlatformPermissionResource } from '@/api/platformIam'
import { createPlatformPermission, listPlatformPermissions } from '@/api/platformIam'
import { getApiErrorDetails, getApiErrorMessage, type ApiErrorDetails } from '@/api/http'
import ApiErrorMeta from '@/components/ApiErrorMeta.vue'
import { useUnsavedWorkRegistration } from '@/composables/useUnsavedWorkRegistration'
@@ -12,6 +12,7 @@ import { useAccessPreviewStore } from '@/stores/accessPreview'
import { useAdminDataStore } from '@/stores/adminData'
import type { Permission, PermissionType } from '@/types/admin'
import { buildPermissionTree, getDescendantIds } from '@/utils/permissionTree'
import { mapPlatformPermission } from '@/utils/platformPermission'
const store = useAdminDataStore()
const access = useAccessPreviewStore()
@@ -55,20 +56,6 @@ const metrics = computed(() => [
{ label: '停用资源', value: permissions.value.filter((item) => item.status === '停用').length, note: '当前不可分配' },
])
function mapPlatformPermission(item: PlatformPermissionResource): Permission {
return {
id: String(item.id),
parentId: item.parentId === 0 ? null : String(item.parentId),
name: item.permissionName,
code: item.permissionCode,
type: item.permissionType === 'BUTTON' ? '按钮' : '菜单',
path: item.routePath ?? '',
method: item.httpMethod ?? '-',
status: item.status === 'ACTIVE' ? '启用' : '停用',
sort: item.sortNo,
}
}
async function loadPermissions() {
if (!access.usesServerPermissions) return
loading.value = true
@@ -97,7 +84,7 @@ async function savePermission() {
type: form.type === '按钮' ? 'BUTTON' : 'MENU',
code: form.code.trim(),
name: form.name.trim(),
parentId: form.parentId ? Number(form.parentId) : 0,
parentId: form.parentId || '0',
routePath: form.type === '菜单' ? form.path.trim() : null,
httpMethod: null,
sortNo: form.sort,
@@ -147,13 +134,13 @@ onMounted(loadPermissions)
<section class="surface-panel table-panel">
<header class="panel-heading"><div><h2>权限资源树</h2><p>目录组织菜单,按钮控制页面操作;接口权限将在服务端契约确定后补充。</p></div><div class="legend-list"><span><i class="is-menu" />目录 / 菜单</span><span><i class="is-action" />操作</span><span><i class="is-api" />接口预留</span></div></header>
<el-table v-loading="loading" :data="treeRows" row-key="id" default-expand-all :tree-props="{ children: 'children' }" empty-text="没有符合条件的权限资源">
<el-table-column label="操作" width="235" fixed="left"><template #default="{ row }"><div v-if="access.usesServerPermissions && canCreate" class="table-actions"><el-button v-if="row.type === '菜单'" link type="primary" @click="openCreate(row.id)"><Plus :size="15" />添加下级</el-button><span class="secondary-text">编辑接口待补齐</span></div><div v-else-if="access.can('system:permission:write')" class="table-actions"><el-button link type="primary" @click="openEdit(row as Permission)"><Pencil :size="15" />编辑</el-button><el-button v-if="row.type === '目录' || row.type === '菜单'" link type="primary" @click="openCreate(row.id)"><Plus :size="15" />添加下级</el-button><el-button link :type="row.status === '启用' ? 'danger' : 'success'" @click="toggleStatus(row as Permission)">{{ row.status === '启用' ? '停用' : '启用' }}</el-button></div></template></el-table-column>
<el-table-column label="权限名称" min-width="260"><template #default="{ row }"><div class="permission-name"><span :class="`is-${typeClass(row.type)}`"><FolderTree v-if="row.type === '目录' || row.type === '菜单'" :size="16" /><ShieldCheck v-else-if="row.type === '按钮'" :size="16" /><Braces v-else :size="16" /></span><strong>{{ row.name }}</strong></div></template></el-table-column>
<el-table-column label="权限编码" min-width="220"><template #default="{ row }"><code class="code-value">{{ row.code }}</code></template></el-table-column>
<el-table-column prop="type" label="类型" width="80" />
<el-table-column label="路由 / 接口" min-width="260"><template #default="{ row }"><div class="endpoint-cell"><span v-if="row.method !== '-'">{{ row.method }}</span><code>{{ row.path || '-' }}</code></div></template></el-table-column>
<el-table-column prop="sort" label="排序" width="72" align="right" />
<el-table-column label="状态" width="88"><template #default="{ row }"><StatusBadge :status="row.status" /></template></el-table-column>
<el-table-column label="操作" width="235" fixed="right"><template #default="{ row }"><div v-if="access.usesServerPermissions && canCreate" class="table-actions"><el-button v-if="row.type === '菜单'" link type="primary" @click="openCreate(row.id)"><Plus :size="15" />添加下级</el-button><span class="secondary-text">编辑接口待补齐</span></div><div v-else-if="access.can('system:permission:write')" class="table-actions"><el-button link type="primary" @click="openEdit(row as Permission)"><Pencil :size="15" />编辑</el-button><el-button v-if="row.type === '目录' || row.type === '菜单'" link type="primary" @click="openCreate(row.id)"><Plus :size="15" />添加下级</el-button><el-button link :type="row.status === '启用' ? 'danger' : 'success'" @click="toggleStatus(row as Permission)">{{ row.status === '启用' ? '停用' : '启用' }}</el-button></div></template></el-table-column>
</el-table>
</section>