From c621af044c4011b26ac0bcf87869fd159e5c3db8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 5 Mar 2026 09:32:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E5=AE=8C=E5=96=84=E8=A7=92?= =?UTF-8?q?=E8=89=B2=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 PermissionButton.vue 权限按钮组件 - 添加 PermissionDialog.vue 权限对话框组件 - 添加 role.ts 角色管理服务 - 添加 RoleManagementView.vue 角色管理页面 - 更新路由配置添加角色管理页面 - 更新 App.vue 添加角色管理菜单入口 - 修复 TypeScript 类型定义问题 - 前端编译验证通过 --- .claude/settings.local.json | 4 +- frontend/admin/src/App.vue | 8 + frontend/admin/src/auth/roles.ts | 3 + .../admin/src/components/PermissionButton.vue | 89 +++++ .../admin/src/components/PermissionDialog.vue | 68 ++++ frontend/admin/src/router/index.ts | 8 + frontend/admin/src/services/role.ts | 172 ++++++++++ .../admin/src/views/RoleManagementView.vue | 314 ++++++++++++++++++ 8 files changed, 665 insertions(+), 1 deletion(-) create mode 100644 frontend/admin/src/components/PermissionButton.vue create mode 100644 frontend/admin/src/components/PermissionDialog.vue create mode 100644 frontend/admin/src/services/role.ts create mode 100644 frontend/admin/src/views/RoleManagementView.vue diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 3fd1037..4eb7bdb 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -20,7 +20,9 @@ "Grep", "Bash(cd /home/long/project/蚊子/frontend/admin && npm run build 2>&1 | head -30)", "Bash(npm run build 2>&1 | head -40)", - "Bash(npm run build 2>&1 | head -50)" + "Bash(npm run build 2>&1 | head -50)", + "Bash(cd /home/long/project/蚊子/frontend/admin && npm run build 2>&1 | tail -20)", + "Bash(npm run build 2>&1 | tail -15)" ], "deny": [] }, diff --git a/frontend/admin/src/App.vue b/frontend/admin/src/App.vue index d8c84ad..a5fbf06 100644 --- a/frontend/admin/src/App.vue +++ b/frontend/admin/src/App.vue @@ -74,6 +74,14 @@ > 权限 + + 角色 + + + + + + + diff --git a/frontend/admin/src/components/PermissionDialog.vue b/frontend/admin/src/components/PermissionDialog.vue new file mode 100644 index 0000000..2297fef --- /dev/null +++ b/frontend/admin/src/components/PermissionDialog.vue @@ -0,0 +1,68 @@ + + + diff --git a/frontend/admin/src/router/index.ts b/frontend/admin/src/router/index.ts index ed3c422..ea0b78f 100644 --- a/frontend/admin/src/router/index.ts +++ b/frontend/admin/src/router/index.ts @@ -16,6 +16,7 @@ import ActivityConfigWizardView from '../views/ActivityConfigWizardView.vue' import ApprovalCenterView from '../views/ApprovalCenterView.vue' import UserDetailView from '../views/UserDetailView.vue' import PermissionsView from '../views/PermissionsView.vue' +import RoleManagementView from '../views/RoleManagementView.vue' import type { AdminRole } from '../auth/roles' // 路由权限配置 - 使用新的角色系统 @@ -33,6 +34,7 @@ const routeRoles: Record = { 'audit': ['super_admin', 'system_admin', 'finance_manager', 'auditor'], 'approvals': ['super_admin', 'system_admin', 'operation_manager', 'marketing_manager', 'finance_manager', 'risk_manager'], 'permissions': ['super_admin', 'system_admin'], + 'role-management': ['super_admin', 'system_admin'], 'notifications': ['super_admin', 'system_admin', 'operation_manager', 'operation_member', 'marketing_manager', 'marketing_member', 'finance_manager', 'finance_member', 'risk_manager', 'risk_member', 'customer_service', 'auditor', 'viewer'], 'system': ['super_admin', 'system_admin', 'auditor'] } @@ -129,6 +131,12 @@ const router = createRouter({ component: PermissionsView, meta: { roles: routeRoles.permissions } }, + { + path: '/roles', + name: 'role-management', + component: RoleManagementView, + meta: { roles: routeRoles['role-management'] } + }, { path: '/notifications', name: 'notifications', diff --git a/frontend/admin/src/services/role.ts b/frontend/admin/src/services/role.ts new file mode 100644 index 0000000..03673cd --- /dev/null +++ b/frontend/admin/src/services/role.ts @@ -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 { + id: number + status?: number +} + +export interface AssignPermissionsRequest { + roleId: number + permissionIds: number[] +} + +export interface ApiResponse { + code: number + data: T + message?: string +} + +/** + * 角色管理服务类 + */ +class RoleService { + private baseUrl = '/api' + + /** + * 获取所有角色列表 + */ + async getRoles(): Promise { + const response = await fetch(`${this.baseUrl}/roles`, { + credentials: 'include' + }) + const result = await response.json() as ApiResponse + if (result.code !== 200) { + throw new Error(result.message || '获取角色列表失败') + } + return result.data + } + + /** + * 获取角色详情 + */ + async getRoleById(id: number): Promise { + const response = await fetch(`${this.baseUrl}/roles/${id}`, { + credentials: 'include' + }) + const result = await response.json() as ApiResponse + if (result.code !== 200) { + return null + } + return result.data + } + + /** + * 创建角色 + */ + async createRole(data: CreateRoleRequest): Promise { + 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 + if (result.code !== 200) { + throw new Error(result.message || '创建角色失败') + } + return result.data + } + + /** + * 更新角色 + */ + async updateRole(data: UpdateRoleRequest): Promise { + 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 + if (result.code !== 200) { + throw new Error(result.message || '更新角色失败') + } + } + + /** + * 删除角色 + */ + async deleteRole(id: number): Promise { + const response = await fetch(`${this.baseUrl}/roles/${id}`, { + method: 'DELETE', + credentials: 'include' + }) + const result = await response.json() as ApiResponse + if (result.code !== 200) { + throw new Error(result.message || '删除角色失败') + } + } + + /** + * 获取角色权限 + */ + async getRolePermissions(roleId: number): Promise { + const response = await fetch(`${this.baseUrl}/roles/${roleId}/permissions`, { + credentials: 'include' + }) + const result = await response.json() as ApiResponse + if (result.code !== 200) { + throw new Error(result.message || '获取角色权限失败') + } + return result.data + } + + /** + * 分配权限给角色 + */ + async assignPermissions(data: AssignPermissionsRequest): Promise { + 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 + if (result.code !== 200) { + throw new Error(result.message || '分配权限失败') + } + } + + /** + * 获取所有权限列表 + */ + async getAllPermissions(): Promise { + const response = await fetch(`${this.baseUrl}/permissions`, { + credentials: 'include' + }) + const result = await response.json() as ApiResponse + 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 + if (result.code !== 200) { + throw new Error(result.message || '获取用户信息失败') + } + return result.data + } +} + +export const roleService = new RoleService() +export default roleService diff --git a/frontend/admin/src/views/RoleManagementView.vue b/frontend/admin/src/views/RoleManagementView.vue new file mode 100644 index 0000000..c8564b6 --- /dev/null +++ b/frontend/admin/src/views/RoleManagementView.vue @@ -0,0 +1,314 @@ +