feat 角色管理
This commit is contained in:
@@ -17,5 +17,5 @@ public class RoleEntity
|
||||
|
||||
public string NormalizedName { get; set; }
|
||||
|
||||
public string ConcurrencyStamp { get; set; }
|
||||
public Guid ConcurrencyStamp { get; set; }
|
||||
}
|
||||
|
||||
13
Src/Dlhis.Entity/Sys/Entities/UserRoleEntity.cs
Normal file
13
Src/Dlhis.Entity/Sys/Entities/UserRoleEntity.cs
Normal file
@@ -0,0 +1,13 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using SqlSugar;
|
||||
|
||||
namespace Dlhis.Entity.Sys.Entities;
|
||||
|
||||
[SkipScan]
|
||||
[SugarTable(TableName = "UserRoles")]
|
||||
public class UserRoleEntity
|
||||
{
|
||||
public int UserId { get; set; }
|
||||
|
||||
public int RoleId { get; set; }
|
||||
}
|
||||
@@ -10,7 +10,7 @@ namespace Dlhis.Sys.Identity.Controllers;
|
||||
/// <summary>
|
||||
/// 角色
|
||||
/// </summary>
|
||||
[Authorize(Roles = "admin")]
|
||||
[Authorize]
|
||||
[Route("api/[controller]")]
|
||||
[ApiController]
|
||||
public class RolesController : ControllerBase
|
||||
@@ -27,9 +27,55 @@ public class RolesController : ControllerBase
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[HttpGet]
|
||||
public async Task<Pagination<RoleRespone>> GetPageAsync(RolePageRequest request)
|
||||
[Authorize(Roles = "admin")]
|
||||
[HttpGet("page")]
|
||||
public async Task<Pagination<RoleRespone>> GetPageAsync([FromQuery] RolePageRequest request)
|
||||
{
|
||||
return await _roleService.GetPageAsync(request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 分配角色
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[Authorize(Roles = "admin")]
|
||||
[HttpPost("assign")]
|
||||
public async Task AssignRole(AssignRoleRequest request)
|
||||
{
|
||||
await _roleService.AssignRoleAsync(request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存角色
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[Authorize(Roles = "admin")]
|
||||
[HttpPost("save")]
|
||||
public async Task SaveRole(RoleSaveRequest request)
|
||||
{
|
||||
await _roleService.SaveRoleAsync(request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移除角色
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <returns></returns>
|
||||
[Authorize(Roles = "admin")]
|
||||
[HttpPost("delete")]
|
||||
public async Task RemoveRole(RoleRemoveRequest request)
|
||||
{
|
||||
await _roleService.RemoveRoleAsync(request);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 我的角色
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpGet("my")]
|
||||
public async Task<RoleRespone> GetMyRoleAsync()
|
||||
{
|
||||
return await _roleService.GetMyRoleAsync();
|
||||
}
|
||||
}
|
||||
|
||||
8
Src/Dlhis.Sys/Identity/Request/AssignRoleRequest.cs
Normal file
8
Src/Dlhis.Sys/Identity/Request/AssignRoleRequest.cs
Normal file
@@ -0,0 +1,8 @@
|
||||
namespace Dlhis.Sys.Identity.Request;
|
||||
|
||||
public class AssignRoleRequest
|
||||
{
|
||||
public int UserId { get; set; }
|
||||
|
||||
public int? RoleId { get; set; }
|
||||
}
|
||||
6
Src/Dlhis.Sys/Identity/Request/RoleRemoveRequest.cs
Normal file
6
Src/Dlhis.Sys/Identity/Request/RoleRemoveRequest.cs
Normal file
@@ -0,0 +1,6 @@
|
||||
namespace Dlhis.Sys.Identity.Request;
|
||||
|
||||
public class RoleRemoveRequest
|
||||
{
|
||||
public int Id { get; set; }
|
||||
}
|
||||
11
Src/Dlhis.Sys/Identity/Request/RoleSaveRequest.cs
Normal file
11
Src/Dlhis.Sys/Identity/Request/RoleSaveRequest.cs
Normal file
@@ -0,0 +1,11 @@
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Dlhis.Sys.Identity.Request;
|
||||
|
||||
public class RoleSaveRequest
|
||||
{
|
||||
public int? Id { get; set; }
|
||||
|
||||
[Required(ErrorMessage = "角色名不能为空")]
|
||||
public string Name { get; set; }
|
||||
}
|
||||
@@ -7,4 +7,12 @@ namespace Dlhis.User.Identity.Services;
|
||||
public interface IRoleService : IScopeDependency
|
||||
{
|
||||
Task<Pagination<RoleRespone>> GetPageAsync(RolePageRequest request);
|
||||
|
||||
Task SaveRoleAsync(RoleSaveRequest request);
|
||||
|
||||
Task<RoleRespone> GetMyRoleAsync();
|
||||
|
||||
Task RemoveRoleAsync(RoleRemoveRequest request);
|
||||
|
||||
Task AssignRoleAsync(AssignRoleRequest request);
|
||||
}
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
using Dlhis.Sys.Identity.Request;
|
||||
using Dlhis.Sys.Identity.Response;
|
||||
using Dlhis.User.Identity.Services;
|
||||
using Kurisu.AspNetCore.Scope;
|
||||
using Kurisu.AspNetCore.UnifyResultAndValidation;
|
||||
using Kurisu.AspNetCore.Utils.Extensions;
|
||||
using Kurisu.Core.DataAccess.Dto;
|
||||
using Kurisu.Core.User.Abstractions;
|
||||
using Kurisu.SqlSugar.Extensions;
|
||||
using Kurisu.SqlSugar.Services;
|
||||
|
||||
@@ -11,20 +14,162 @@ namespace Dlhis.Sys.Identity.Services.Implements;
|
||||
|
||||
public class RoleService : IRoleService
|
||||
{
|
||||
private readonly IDbContext _dbContext;
|
||||
private readonly IConfiguration _configuration;
|
||||
private readonly ICurrentUser _currentUser;
|
||||
|
||||
public RoleService(IDbContext dbContext, IConfiguration configuration)
|
||||
public RoleService(IConfiguration configuration, ICurrentUser currentUser)
|
||||
{
|
||||
var identityConnection = configuration.GetSection("SqlSugarOptions:IdentityConnectionString").Value;
|
||||
dbContext.Client.CurrentConnectionConfig.ConnectionString = identityConnection;
|
||||
_dbContext = dbContext;
|
||||
_configuration = configuration;
|
||||
_currentUser = currentUser;
|
||||
}
|
||||
|
||||
public async Task<Pagination<RoleRespone>> GetPageAsync(RolePageRequest request)
|
||||
{
|
||||
return await _dbContext.Queryable<RoleEntity>()
|
||||
return await Scoped.Request.Value.CreateAsync(async sp =>
|
||||
{
|
||||
var dbContext = sp.GetService<IDbContext>();
|
||||
var identityConnection = _configuration.GetSection("SqlSugarOptions:IdentityConnectionString").Value;
|
||||
dbContext.Client.CurrentConnectionConfig.ConnectionString = identityConnection;
|
||||
|
||||
|
||||
return await dbContext.Queryable<RoleEntity>()
|
||||
.WhereIF(request.Search.IsPresent(), x => x.Name.Contains(request.Search) || x.NormalizedName.Contains(request.Search))
|
||||
.Select<RoleRespone>()
|
||||
.ToPageListAsync(request);
|
||||
});
|
||||
}
|
||||
|
||||
public async Task<RoleRespone> GetMyRoleAsync()
|
||||
{
|
||||
var userId = _currentUser.GetIntSubjectId();
|
||||
|
||||
return await Scoped.Request.Value.CreateAsync(async sp =>
|
||||
{
|
||||
var dbContext = sp.GetService<IDbContext>();
|
||||
var identityConnection = _configuration.GetSection("SqlSugarOptions:IdentityConnectionString").Value;
|
||||
dbContext.Client.CurrentConnectionConfig.ConnectionString = identityConnection;
|
||||
|
||||
|
||||
return await dbContext.Queryable<UserRoleEntity>()
|
||||
.LeftJoin<RoleEntity>((x, r) => x.RoleId == r.Id)
|
||||
.Where(x => x.UserId == userId)
|
||||
.Select((x, r) => new RoleRespone
|
||||
{
|
||||
Id = r.Id,
|
||||
Name = r.Name,
|
||||
NormalizedName = r.NormalizedName,
|
||||
})
|
||||
.FirstAsync();
|
||||
});
|
||||
}
|
||||
|
||||
public async Task SaveRoleAsync(RoleSaveRequest request)
|
||||
{
|
||||
await Scoped.Request.Value.CreateAsync(async sp =>
|
||||
{
|
||||
var dbContext = sp.GetService<IDbContext>();
|
||||
var identityConnection = _configuration.GetSection("SqlSugarOptions:IdentityConnectionString").Value;
|
||||
dbContext.Client.CurrentConnectionConfig.ConnectionString = identityConnection;
|
||||
|
||||
|
||||
await CheckDuplicateNameAsync(dbContext, request);
|
||||
|
||||
if (!request.Id.HasValue)
|
||||
{
|
||||
await dbContext.InsertAsync(new RoleEntity
|
||||
{
|
||||
Name = request.Name,
|
||||
NormalizedName = request.Name.ToUpperInvariant(),
|
||||
ConcurrencyStamp = Guid.NewGuid(),
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
var entity = await dbContext.Queryable<RoleEntity>().Where(x => x.Id == request.Id).FirstAsync();
|
||||
entity.ThrowIfNull("角色不存在");
|
||||
|
||||
entity.Name = request.Name;
|
||||
entity.NormalizedName = request.Name.ToUpperInvariant();
|
||||
entity.ConcurrencyStamp = Guid.NewGuid();
|
||||
|
||||
await dbContext.UpdateAsync(entity);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private async Task CheckDuplicateNameAsync(IDbContext db, RoleSaveRequest request)
|
||||
{
|
||||
var exists = await db.Queryable<RoleEntity>()
|
||||
.WhereIF(request.Id.HasValue, x => x.Id != request.Id)
|
||||
.Where(x => x.Name == request.Name)
|
||||
.AnyAsync();
|
||||
|
||||
exists.ThrowIfTrue($"重复角色名称{request.Name}");
|
||||
}
|
||||
|
||||
public async Task AssignRoleAsync(AssignRoleRequest request)
|
||||
{
|
||||
var myUserId = _currentUser.GetIntSubjectId();
|
||||
|
||||
await Scoped.Request.Value.CreateAsync(async sp =>
|
||||
{
|
||||
//不能被其他人修改
|
||||
if (request.UserId == 1 && request.UserId != myUserId)
|
||||
{
|
||||
throw new UserFriendlyException("无法修改admin角色");
|
||||
}
|
||||
|
||||
var dbContext = sp.GetService<IDbContext>();
|
||||
var identityConnection = _configuration.GetSection("SqlSugarOptions:IdentityConnectionString").Value;
|
||||
dbContext.Client.CurrentConnectionConfig.ConnectionString = identityConnection;
|
||||
|
||||
var existsUser = await dbContext.Queryable<UserEntity>().Where(x => x.Id == request.UserId).AnyAsync();
|
||||
existsUser.ThrowIfFalse("分配的用户不存在");
|
||||
|
||||
var userRole = await dbContext.Queryable<UserRoleEntity>().Where(x => x.UserId == request.UserId).FirstAsync();
|
||||
|
||||
if (request.RoleId.HasValue)
|
||||
{
|
||||
var existsRole = await dbContext.Queryable<RoleEntity>().Where(x => x.Id == request.RoleId).AnyAsync();
|
||||
existsUser.ThrowIfFalse("分配的角色不存在");
|
||||
|
||||
if (userRole == null)
|
||||
{
|
||||
await dbContext.InsertAsync(new UserRoleEntity
|
||||
{
|
||||
UserId = request.UserId,
|
||||
RoleId = request.RoleId.Value,
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
await dbContext.Updateable<UserRoleEntity>()
|
||||
.SetColumns(x => x.RoleId == request.RoleId)
|
||||
.Where(x => x.UserId == request.UserId)
|
||||
.ExecuteCommandAsync();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
await dbContext.DeleteReallyAsync(userRole);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public async Task RemoveRoleAsync(RoleRemoveRequest request)
|
||||
{
|
||||
await Scoped.Request.Value.CreateAsync(async sp =>
|
||||
{
|
||||
var dbContext = sp.GetService<IDbContext>();
|
||||
var identityConnection = _configuration.GetSection("SqlSugarOptions:IdentityConnectionString").Value;
|
||||
dbContext.Client.CurrentConnectionConfig.ConnectionString = identityConnection;
|
||||
|
||||
var role = await dbContext.Queryable<RoleEntity>().FirstAsync(x => x.Id == request.Id);
|
||||
role.ThrowIfNull("角色不存在");
|
||||
|
||||
//删除角色,自动删除UserRoles对应关系
|
||||
await dbContext.DeleteReallyAsync(role);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user