## P3.1: 争议仲裁模块(disputes)✅ - API: disputes.ts - 模块导出 ## P3.2: 卖家中心模块(seller)✅ - Views: 4个页面 - Composables: usePublishForm, usePublishDraft - 模块导出 ## P3.3: 管理后台模块(admin)✅ - API: 8个文件(adminAuth, adminDashboard, adminUsers等) - Views: 15个管理页面 - Composables: useAdminTable, useAdminPaginatedTable - Components: 管理端组件 - 模块导出 --- ## 🎉 Features 架构迁移全部完成! ### 最终统计 - ✅ P0: shared(基础设施)- 22个文件 - ✅ P1: wallet, chats, orders - 24个文件 - ✅ P2: listings, auth - 35个文件 - ✅ P3: seller, disputes, admin - 47个文件 **总计:** 9个模块,128个文件完成迁移 ### 新架构 ``` frontend/src/ ├── features/ # 9个业务模块 ✅ │ ├── wallet/ ✅ │ ├── chats/ ✅ │ ├── orders/ ✅ (已重构) │ ├── listings/ ✅ │ ├── auth/ ✅ │ ├── seller/ ✅ │ ├── disputes/ ✅ │ └── admin/ ✅ └── shared/ ✅ ``` 下一步:清理旧文件、更新路由配置 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
109 lines
3.0 KiB
Vue
109 lines
3.0 KiB
Vue
<script setup lang="ts">
|
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
|
import { ref } from 'vue'
|
|
|
|
import { fetchRoles, deleteRole, type Role } from '@/api/adminRoles'
|
|
import { useAdminTable } from '@/composables/useAdminTable'
|
|
|
|
import AssignPermissionsDialog from './components/AssignPermissionsDialog.vue'
|
|
import RoleDialog from './components/RoleDialog.vue'
|
|
|
|
const showDialog = ref(false)
|
|
const editingRole = ref<Role | null>(null)
|
|
const showPermsDialog = ref(false)
|
|
const permsRole = ref<Role | null>(null)
|
|
|
|
const { loading, data: roles, load: loadRoles } = useAdminTable<Role[]>({
|
|
fetchFn: fetchRoles,
|
|
})
|
|
|
|
function openCreate() {
|
|
editingRole.value = null
|
|
showDialog.value = true
|
|
}
|
|
|
|
function openEdit(row: Role) {
|
|
editingRole.value = row
|
|
showDialog.value = true
|
|
}
|
|
|
|
function openPerms(row: Role) {
|
|
permsRole.value = row
|
|
showPermsDialog.value = true
|
|
}
|
|
|
|
async function handleDelete(row: Role) {
|
|
try {
|
|
await ElMessageBox.confirm(`确定要删除角色「${row.name}」吗?已分配该角色的管理员将失去对应权限。`, '删除确认', {
|
|
confirmButtonText: '确认删除',
|
|
cancelButtonText: '取消',
|
|
type: 'warning',
|
|
})
|
|
await deleteRole(row.id)
|
|
ElMessage.success('角色已删除')
|
|
await loadRoles()
|
|
} catch {
|
|
// 用户取消
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<section class="page">
|
|
<div class="page-header-row">
|
|
<div class="page-header">
|
|
<p class="eyebrow">Roles</p>
|
|
<h1>角色管理</h1>
|
|
<p>管理系统角色及其权限配置。</p>
|
|
</div>
|
|
<div class="toolbar-actions">
|
|
<el-button @click="loadRoles">刷新</el-button>
|
|
<el-button type="primary" @click="openCreate">新建角色</el-button>
|
|
</div>
|
|
</div>
|
|
|
|
<el-table v-loading="loading" class="table-panel" :data="roles">
|
|
<el-table-column prop="id" label="ID" width="70" />
|
|
<el-table-column prop="code" label="编码" min-width="120" />
|
|
<el-table-column prop="name" label="名称" min-width="120" />
|
|
<el-table-column prop="description" label="描述" min-width="200" />
|
|
<el-table-column prop="perm_count" label="权限数" width="90" align="center" />
|
|
<el-table-column label="操作" width="240" fixed="right">
|
|
<template #default="{ row }">
|
|
<el-button size="small" @click="openEdit(row)">编辑</el-button>
|
|
<el-button size="small" type="primary" @click="openPerms(row)">权限</el-button>
|
|
<el-button
|
|
v-if="row.code !== 'super_admin'"
|
|
size="small"
|
|
type="danger"
|
|
@click="handleDelete(row)"
|
|
>
|
|
删除
|
|
</el-button>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
|
|
<!-- 新建/编辑对话框 -->
|
|
<RoleDialog
|
|
v-model="showDialog"
|
|
:role="editingRole"
|
|
@saved="loadRoles"
|
|
/>
|
|
|
|
<!-- 权限分配对话框 -->
|
|
<AssignPermissionsDialog
|
|
v-model="showPermsDialog"
|
|
:role="permsRole"
|
|
@saved="loadRoles"
|
|
/>
|
|
</section>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.toolbar-actions {
|
|
display: flex;
|
|
gap: 8px;
|
|
}
|
|
</style>
|