From fa88dd8ec2ce3be87feb7cba6823612e20e1016e Mon Sep 17 00:00:00 2001 From: jayhgq Date: Wed, 10 Jun 2026 09:47:29 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E6=9D=83?= =?UTF-8?q?=E9=99=90=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97=E4=B8=BA=E8=8F=9C?= =?UTF-8?q?=E5=8D=95=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 前端将权限管理页面替换为菜单管理页面,更新路由配置 2. 后端角色删除逻辑优化,新增角色存在性检查 3. 后端权限删除逻辑增强,自动清理关联数据并调整子权限层级 4. 更新初始化权限数据中的菜单管理配置 --- backend/auth/apps/permissions/urls.py | 24 ++++++++++++++++--- backend/auth/apps/roles/urls.py | 20 +++++++--------- backend/auth/init_data.py | 16 ++++++------- .../{PermissionManage.vue => MenuManage.vue} | 0 frontend/src/router/index.ts | 6 ++--- 5 files changed, 40 insertions(+), 26 deletions(-) rename frontend/src/modules/admin/views/permissions/{PermissionManage.vue => MenuManage.vue} (100%) diff --git a/backend/auth/apps/permissions/urls.py b/backend/auth/apps/permissions/urls.py index ec8bfa8..c00ec72 100644 --- a/backend/auth/apps/permissions/urls.py +++ b/backend/auth/apps/permissions/urls.py @@ -218,15 +218,33 @@ async def delete_permission( db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): - """删除权限""" + """删除权限(自动清理角色关联和子权限关联)""" # 检查权限是否存在 result = await db.execute(select(Permission).filter(Permission.id == permission_id)) existing_permission = result.scalar_one_or_none() if not existing_permission: raise HTTPException(status_code=404, detail="权限不存在") - # 使用FastCRUD删除权限 - deleted = await permission_crud.delete(db, id=permission_id) + # 1. 删除角色-权限关联表中的记录 + from sqlalchemy import delete as sql_delete + from models import role_permission + + stmt = sql_delete(role_permission).where(role_permission.c.permission_id == permission_id) + await db.execute(stmt) + + # 2. 处理子权限:如果有子权限,将子权限的父ID置为0(提升为顶级节点) + from sqlalchemy import update as sql_update + + stmt = ( + sql_update(Permission) + .where(Permission.parentid == permission_id) + .values(parentid=0) + ) + await db.execute(stmt) + + # 3. 使用FastCRUD删除权限本身(不提交,与前述操作在同一事务中) + await permission_crud.delete(db, id=permission_id, commit=False) + await db.commit() return {"message": "权限删除成功"} diff --git a/backend/auth/apps/roles/urls.py b/backend/auth/apps/roles/urls.py index 3532cb0..77a5b95 100644 --- a/backend/auth/apps/roles/urls.py +++ b/backend/auth/apps/roles/urls.py @@ -125,9 +125,13 @@ async def delete_role( current_user: User = Depends(get_current_user), ): """删除角色""" - # 检查是否有用户使用此角色 - from sqlalchemy import select + # 检查角色是否存在 + result = await db.execute(select(Role).filter(Role.id == role_id)) + existing_role = result.scalar_one_or_none() + if not existing_role: + raise HTTPException(status_code=404, detail="角色不存在") + # 检查是否有用户使用此角色 result = await db.execute(select(User).filter(User.role_id == role_id)) users = result.scalars().all() if users: @@ -135,14 +139,6 @@ async def delete_role( status_code=400, detail=f"该角色正在被 {len(users)} 个用户使用,无法删除" ) - # 使用原生 SQLAlchemy 删除角色(FastCRUD 有问题) - from sqlalchemy import delete as sql_delete - - stmt = sql_delete(Role).where(Role.id == role_id) - result = await db.execute(stmt) - - if result.rowcount == 0: - raise HTTPException(status_code=404, detail="角色不存在") - - await db.commit() + # 使用FastCRUD删除角色 + await role_crud.delete(db, id=role_id) return {"message": "角色删除成功"} diff --git a/backend/auth/init_data.py b/backend/auth/init_data.py index 1775375..30d3250 100644 --- a/backend/auth/init_data.py +++ b/backend/auth/init_data.py @@ -69,7 +69,7 @@ async def init_permissions(db: AsyncSession): # ======================================== {"name": "用户管理", "code": "perm:user", "parentid": 1, "route": "/admin/users", "description": "用户管理子模块"}, {"name": "角色管理", "code": "perm:role", "parentid": 1, "route": "/admin/roles", "description": "角色管理子模块"}, - {"name": "权限配置", "code": "perm:config", "parentid": 1, "route": "/admin/permissions", "description": "权限配置子模块"}, + {"name": "菜单管理", "code": "perm:menu", "parentid": 1, "route": "/admin/menu", "description": "菜单管理子模块"}, # ======================================== # 系统设置 -> 二级子模块 @@ -104,13 +104,13 @@ async def init_permissions(db: AsyncSession): # ======================================== # 权限配置操作(parentid=5) # ======================================== - {"name": "查看列表", "code": "perm:config:list", "parentid": 5, "description": "查看权限列表"}, - {"name": "查看详情", "code": "perm:config:detail", "parentid": 5, "description": "查看权限详情"}, - {"name": "搜索", "code": "perm:config:search", "parentid": 5, "description": "搜索权限"}, - {"name": "创建", "code": "perm:config:create", "parentid": 5, "description": "创建新权限"}, - {"name": "编辑", "code": "perm:config:edit", "parentid": 5, "description": "编辑权限信息"}, - {"name": "删除", "code": "perm:config:delete", "parentid": 5, "description": "删除权限"}, - {"name": "导出", "code": "perm:config:export", "parentid": 5, "description": "导岀权限数据"}, + {"name": "查看列表", "code": "perm:menu:list", "parentid": 5, "description": "查看权限列表"}, + {"name": "查看详情", "code": "perm:menu:detail", "parentid": 5, "description": "查看权限详情"}, + {"name": "搜索", "code": "perm:menu:search", "parentid": 5, "description": "搜索权限"}, + {"name": "创建", "code": "perm:menu:create", "parentid": 5, "description": "创建新权限"}, + {"name": "编辑", "code": "perm:menu:edit", "parentid": 5, "description": "编辑权限信息"}, + {"name": "删除", "code": "perm:menu:delete", "parentid": 5, "description": "删除权限"}, + {"name": "导出", "code": "perm:menu:export", "parentid": 5, "description": "导岀权限数据"}, # ======================================== # 系统设置 -> 基础配置操作(parentid=6) diff --git a/frontend/src/modules/admin/views/permissions/PermissionManage.vue b/frontend/src/modules/admin/views/permissions/MenuManage.vue similarity index 100% rename from frontend/src/modules/admin/views/permissions/PermissionManage.vue rename to frontend/src/modules/admin/views/permissions/MenuManage.vue diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 9e5142e..9429df4 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -39,11 +39,11 @@ const router = createRouter({ }, { - path: "permissions", - name: "admin-permissions", + path: "menu", + name: "admin-menu", meta: { title: "菜单管理", permission: "perm:menu" }, component: () => - import("@/modules/admin/views/permissions/PermissionManage.vue"), + import("@/modules/admin/views/permissions/MenuManage.vue"), }, { path: "settings",