项目地址
dbt
airflow
一、代码示例
1.1 后端
1. 权限实体和权限DTO
- 权限实体

- DTO

2. 实现授权接口

public class PermissionService : IPermissionService
{
private readonly AppDbContext _dbContext;
public PermissionService(AppDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task<List<PermissionDto>> GetUserPermissionsAsync(int userId)
{
var rolePermissions = await _dbContext.UserRoles
.Where(ur => ur.UserId == userId)
.Join(_dbContext.RolePermissions,
ur => ur.RoleId,
rp => rp.RoleId,
(ur, rp) => rp.PermissionId)
.Distinct()
.ToListAsync();
var userPermissions = await _dbContext.UserPermissions
.Where(up => up.UserId == userId)
.Select(up => up.PermissionId)
.Distinct()
.ToListAsync();
var allPermissionIds = rolePermissions.Union(userPermissions).ToList();
return await _dbContext.Permissions
.Where(p => allPermissionIds.Contains(p.PermissionId))
.Select(p => new PermissionDto
{
PermissionId = p.PermissionId,
PermissionCode = p.PermissionCode,
PermissionName = p.PermissionName,
MenuId = p.MenuId
})
.ToListAsync();
}
public async Task<List<MenuPermissionDto>> GetUserMenusAsync(int userId)
{
var userPermissions = await GetUserPermissionsAsync(userId);
var permissionCodes = userPermissions.Select(p => p.PermissionCode).ToList();
var accessibleMenuIds = userPermissions
.Where(p => p.MenuId.HasValue && p.PermissionCode.StartsWith("menu:"))
.Select(p => p.MenuId.Value)
.Distinct()
.ToList();
var allMenus = await _dbContext.Menus.ToListAsync();
var accessibleMenus = allMenus
.Where(m => accessibleMenuIds.Contains(m.MenuId))
.ToList();
var menuDtos = BuildMenuTree(accessibleMenus, null, userPermissions);
return menuDtos