feat(frontend): 完善角色管理功能

- 添加 PermissionButton.vue 权限按钮组件
- 添加 PermissionDialog.vue 权限对话框组件
- 添加 role.ts 角色管理服务
- 添加 RoleManagementView.vue 角色管理页面
- 更新路由配置添加角色管理页面
- 更新 App.vue 添加角色管理菜单入口
- 修复 TypeScript 类型定义问题
- 前端编译验证通过
This commit is contained in:
Your Name
2026-03-05 09:32:11 +08:00
parent ddae0432f4
commit c621af044c
8 changed files with 665 additions and 1 deletions

View File

@@ -0,0 +1,172 @@
/**
* 角色管理服务
*/
import type { AdminRole, Permission, RoleInfo, PermissionInfo } from '../auth/roles'
export interface CreateRoleRequest {
roleCode: string
roleName: string
roleLevel: number
dataScope: 'ALL' | 'DEPARTMENT' | 'OWN'
description?: string
}
export interface UpdateRoleRequest extends Partial<CreateRoleRequest> {
id: number
status?: number
}
export interface AssignPermissionsRequest {
roleId: number
permissionIds: number[]
}
export interface ApiResponse<T> {
code: number
data: T
message?: string
}
/**
* 角色管理服务类
*/
class RoleService {
private baseUrl = '/api'
/**
* 获取所有角色列表
*/
async getRoles(): Promise<RoleInfo[]> {
const response = await fetch(`${this.baseUrl}/roles`, {
credentials: 'include'
})
const result = await response.json() as ApiResponse<RoleInfo[]>
if (result.code !== 200) {
throw new Error(result.message || '获取角色列表失败')
}
return result.data
}
/**
* 获取角色详情
*/
async getRoleById(id: number): Promise<RoleInfo | null> {
const response = await fetch(`${this.baseUrl}/roles/${id}`, {
credentials: 'include'
})
const result = await response.json() as ApiResponse<RoleInfo>
if (result.code !== 200) {
return null
}
return result.data
}
/**
* 创建角色
*/
async createRole(data: CreateRoleRequest): Promise<number> {
const response = await fetch(`${this.baseUrl}/roles`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
body: JSON.stringify(data)
})
const result = await response.json() as ApiResponse<number>
if (result.code !== 200) {
throw new Error(result.message || '创建角色失败')
}
return result.data
}
/**
* 更新角色
*/
async updateRole(data: UpdateRoleRequest): Promise<void> {
const response = await fetch(`${this.baseUrl}/roles/${data.id}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
body: JSON.stringify(data)
})
const result = await response.json() as ApiResponse<void>
if (result.code !== 200) {
throw new Error(result.message || '更新角色失败')
}
}
/**
* 删除角色
*/
async deleteRole(id: number): Promise<void> {
const response = await fetch(`${this.baseUrl}/roles/${id}`, {
method: 'DELETE',
credentials: 'include'
})
const result = await response.json() as ApiResponse<void>
if (result.code !== 200) {
throw new Error(result.message || '删除角色失败')
}
}
/**
* 获取角色权限
*/
async getRolePermissions(roleId: number): Promise<number[]> {
const response = await fetch(`${this.baseUrl}/roles/${roleId}/permissions`, {
credentials: 'include'
})
const result = await response.json() as ApiResponse<number[]>
if (result.code !== 200) {
throw new Error(result.message || '获取角色权限失败')
}
return result.data
}
/**
* 分配权限给角色
*/
async assignPermissions(data: AssignPermissionsRequest): Promise<void> {
const response = await fetch(`${this.baseUrl}/roles/${data.roleId}/permissions`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
credentials: 'include',
body: JSON.stringify({ permissionIds: data.permissionIds })
})
const result = await response.json() as ApiResponse<void>
if (result.code !== 200) {
throw new Error(result.message || '分配权限失败')
}
}
/**
* 获取所有权限列表
*/
async getAllPermissions(): Promise<PermissionInfo[]> {
const response = await fetch(`${this.baseUrl}/permissions`, {
credentials: 'include'
})
const result = await response.json() as ApiResponse<PermissionInfo[]>
if (result.code !== 200) {
throw new Error(result.message || '获取权限列表失败')
}
return result.data
}
/**
* 获取当前用户信息
*/
async getCurrentUser(): Promise<{ id: number; username: string; roles: string[] }> {
const response = await fetch(`${this.baseUrl}/auth/current`, {
credentials: 'include'
})
const result = await response.json() as ApiResponse<any>
if (result.code !== 200) {
throw new Error(result.message || '获取用户信息失败')
}
return result.data
}
}
export const roleService = new RoleService()
export default roleService