Uroboros

博客开发 · BLOG-DEVELOPMENT2026.07.23
54 次阅读

博客开发日志 - day13

今天完善了RBAC权限清理脏数据的逻辑

   今天把用户、角色禁用这块的逻辑完善了,老实说,工作量比我想的大多了,因为还要完善之前RBAC的逻辑,因为没有使用外键和级联删除,所以在删除角色、菜单、api时,得一步步清理很多表,这块逻辑相当烧脑,弄了一整个下午,勉强算是弄完了,其实就是一步步来,在这之间出了个bug,因为之前偷懒,直接写了一个sql是根据api_id清理permission表,导致我如果没有严格按照顺序清理,先将api_permission这张表清理的话,这个sql会因为没有关联的数据而无法清理脏数据,后面还是改成了先查,这样顺不顺序的就无所谓了。

go
复制代码
s.store.WithTx(ctx, func(q *sqlc.Queries) error {
    // 1. 找出权限id
    permissionID, err := q.GetSysPermissionIDBySysApiID(ctx, id)
    if err != nil {
        return dberr.MapNoRows(err, errs.ErrSysApiNotFound)
    }
    // 2. 根据权限id,删除角色权限关联数据
    if err = q.DeleteSysRolePermissionByPermissionID(ctx, permissionID); err != nil {
        return err
    }
    // 3. 根据api id 删除sys_api_permission关联表数据
    if err = q.DeleteSysApiPermission(ctx, id); err != nil {
        return err
    }

    // 4. 根据权限id,删除权限表权限数据
    if err = q.DeleteSysPermission(ctx, permissionID); err != nil {
        return err
    }

    // 5. 删除api
    rows, err := q.DeleteSysApi(ctx, id)
    if err = dberr.MapRowsAffected(rows, err, errs.ErrSysApiNotFound); err != nil {
        return err
    }

    return nil
})

开发数据库