Asp.Net Core 7.0 基于JWT组织用户角色权限认证(二)

前言:

上一篇我们已经完成了权限校验以及授权的部分,本篇接下来我们分析一下如何基于组织用户角色进行权限管理。

在本项目中,支持建立多组织,同一用户支持在不同组织下授予不同的角色。由于本人是新人,如果有好的见解或者看法欢迎和我沟通,互相学习进步。

数据库表:

数据库:MYSQL,使用EF-CORE基于仓储模式来进行数据库管理。
该项目管理表之间的关联关系主要是用第三张表来管理,相对来说比较好理解。
结构:

Entity 实体结构:

Manager模块(核心逻辑):

1. PermissionManager
using AutoMapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using org.huage.AuthManagement.BizManager.Redis;
using org.huage.AuthManagement.BizManager.wrapper;
using org.huage.AuthManagement.DataBase.Table;
using org.huage.AuthManagement.Entity.Managers;
using org.huage.AuthManagement.Entity.Model;
using org.huage.AuthManagement.Entity.Request;
using org.huage.AuthManagement.Entity.Response;

namespace org.huage.AuthManagement.BizManager.Manager;

//权限管理
public class PermissionManager : IPermissionManager
{
    private readonly IRepositoryWrapper _wrapper;
    private readonly IRedisManager _redisManager;
    private readonly ILogger<PermissionManager> _logger;
    private readonly IMapper _mapper;

    public PermissionManager(IRepositoryWrapper wrapper, IRedisManager redisManager, ILogger<PermissionManager> logger, IMapper mapper)
    {
        _wrapper = wrapper;
        _redisManager = redisManager;
        _logger = logger;
        _mapper = mapper;
    }

    /// <summary>
    /// 查询所有的权限信息。
    /// </summary>
    /// <returns></returns>
    public async Task<QueryAllPermissionResponse> QueryAllPermissionAsync()
    {
        var response = new QueryAllPermissionResponse();

        try
        {
            //查询缓存
            var permissionModels = await _redisManager.HGetAllValue<PermissionModel>(RedisKeyGenerator.AllRolesRedisKey());
            if (permissionModels.Any())
            {
                response.PermissionModels = permissionModels;
                return response;
            }
            
            //查询数据库
            var permissions = _wrapper.Permission.FindAll().Where(_ => _.IsDeleted == false).ToList();
            var data = _mapper.Map<List<PermissionModel>>(permissions);
            response.PermissionModels = data;

            var permissionsDic = data.ToDictionary(_ => _.Id);
            //添加缓存
            await permissionsDic.ParallelForEachAsync(async permission =>
            {
                var redisKey = RedisKeyGenerator.AllPermissions();
                try
                {
                    foreach (var s in data)
                    {
                        await _redisManager.HashSet(redisKey, permission.Key.ToString(),
                            JsonConvert.SerializeObject(permission.Value));
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                }
            });
        }
        catch (Exception e)
        {
            _logger.LogError($"QueryAllPermissionAsync error: {e.Message}");
            throw;
        }

        return response;
    }

    /// <summary>
    /// 添加权限
    /// </summary>
    /// <param name="request"></param>
    public async Task AddPermissionAsync(AddPermissionRequest request)
    {
        var permission = _mapper.Map<Permission>(request);
        _wrapper.Permission.Create(permission);
        await _wrapper.SaveChangeAsync();
    }
}
2. RoleManager
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using org.huage.AuthManagement.BizManager.Redis;
using org.huage.AuthManagement.BizManager.wrapper;
using org.huage.AuthManagement.DataBase.Table;
using org.huage.AuthManagement.Entity.Managers;
using org.huage.AuthManagement.Entity.Model;
using org.huage.AuthManagement.Entity.Request;
using org.huage.AuthManagement.Entity.Response;

namespace org.huage.AuthManagement.BizManager.Manager;

//角色管理
public class RoleManager : IRoleManager
{
    private readonly IRepositoryWrapper _wrapper;
    private readonly IRedisManager _redisManager;
    private readonly ILogger<RoleManager> _logger;
    private readonly IMapper _mapper;

    public RoleManager(IRedisManager redisManager, ILogger<RoleManager> logger, IMapper mapper,
        IRepositoryWrapper wrapper)
    {
        _redisManager = redisManager;
        _logger = logger;
        _mapper = mapper;
        _wrapper = wrapper;
    }

    /// <summary>
    /// 查询指定页的数据
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    public async Task<List<RoleModel>> QueryRoleByPageAsync(QueryRoleRequest request)
    {
        //考虑分页
        //参数校验,设置错误,返回第一页
        if (request.PageSize <=0 || request.PageNumber<0)
        {
            request.PageNumber = 1;
            request.PageSize = 10;
        }
        //查询数据库,TODO:后面需要考虑查询的页数是否超过最大页数
        var skip = (request.PageNumber - 1) * request.PageSize;
        var schedulers =await _wrapper.Role.FindAll().Where(_ => _.IsDeleted == false).OrderByDescending(_ => _.CreateTime)
            .Skip(skip).Take(request.PageSize).ToListAsync();
        
        return _mapper.Map<List<RoleModel>>(schedulers);
    }
    
    /// <summary>
    /// 查询所有的角色
    /// </summary>
    /// <returns></returns>
    public async Task<QueryAllRolesResponse> QueryAllRolesAsync(QueryAllRolesRequest request)
    {
        var response = new QueryAllRolesResponse();

        try
        {
            //查询缓存
            var allSchedulers = await _redisManager.HGetAllValue<RoleModel>(RedisKeyGenerator.AllRolesRedisKey());
            if (allSchedulers.Any())
            {
                response.RoleModels = allSchedulers;
                return response;
            }
            
            //查询数据库
            var roles = _wrapper.Role.FindAll().Where(_ => _.IsDeleted == false).ToList();
            var data = _mapper.Map<List<RoleModel>>(roles);
            response.RoleModels = data;

            var rolesDic = data.ToDictionary(_ => _.Id);
            //添加缓存
            await rolesDic.ParallelForEachAsync(async role =>
            {
                var redisKey = RedisKeyGenerator.AllRolesRedisKey();
                try
                {
                    foreach (var s in data)
                    {
                        await _redisManager.HashSet(redisKey, role.Key.ToString(),
                            JsonConvert.SerializeObject(role.Value));
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                }
            });
        }
        catch (Exception e)
        {
            _logger.LogError($"QueryAllRolesAsync error: {e.Message}");
            throw;
        }

        return response;
    }


    /// <summary>
    /// 查询角色的权限
    /// </summary>
    /// <param name="roleId"></param>
    /// <returns></returns>
    public async Task<QueryPermissionByRoleIdResponse> QueryPermissionByRoleIdAsync(int roleId)
    {
        var response = new QueryPermissionByRoleIdResponse();
        //查询权限ids
        var permissionIds = await _wrapper.RolePermission
            .FindByCondition(_ => _.RoleId == roleId && _.IsDeleted == false)
            .Select(_ => _.PermissionId).ToListAsync();
        if (permissionIds.Any())
        {
            foreach (var id in permissionIds)
            {
                var permission = _wrapper.Permission.FindByCondition(_ => _.Id == id && _.IsDeleted == false)
                    .FirstOrDefault();
                var permissionModel = _mapper.Map<PermissionModel>(permission);
                response.PermissionModels.Add(permissionModel);
            }
        }

        return response;
    }

    
    /// <summary>
    /// 新增角色
    /// </summary>
    /// <param name="request"></param>
    public async Task AddRoleAsync(AddRoleRequest request)
    {
        //开启事务
        await using var transaction = await _wrapper.StartTransactionAsync();
        try
        {
            if (request.RoleIds.Any())
            {
                //插入角色
                var role = new Role()
                {
                    Name = request.Name,
                    CreateBy= request.CreateBy
                };
                _wrapper.Role.Create(role);
                //这里提前保存是为了拿到数据库中该对象的id.
                await _wrapper.SaveChangeAsync();
                //先插rolePermission表
                foreach (var p in request.RoleIds)
                {
                    var rolePermission = new RolePermission()
                    {
                        RoleId = role.Id,
                        PermissionId = p
                    };
                    _wrapper.RolePermission.Create(rolePermission);
                }
            }
            else
            {
                var role = _mapper.Map<Role>(request);
                _wrapper.Role.Create(role);
            }

            await _wrapper.SaveChangeAsync();
            await transaction.CommitAsync();
        }
        catch (Exception e)
        {
            await transaction.RollbackAsync();
            _logger.LogError("AddRoleAsync error.");
            throw;
        }
    }
}
3. UserManager
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using org.huage.AuthManagement.BizManager.Helper;
using org.huage.AuthManagement.BizManager.Redis;
using org.huage.AuthManagement.BizManager.wrapper;
using org.huage.AuthManagement.DataBase.Table;
using org.huage.AuthManagement.Entity.Common;
using org.huage.AuthManagement.Entity.Managers;
using org.huage.AuthManagement.Entity.Model;
using org.huage.AuthManagement.Entity.Request;
using org.huage.AuthManagement.Entity.Response;

namespace org.huage.AuthManagement.BizManager.Manager;

//用户管理
public class UserManager : IUserManager
{
    private readonly IRepositoryWrapper _wrapper;
    private readonly IRedisManager _redisManager;
    private readonly ILogger<UserManager> _logger;
    private readonly IMapper _mapper;

    public UserManager(IMapper mapper, ILogger<UserManager> logger, IRedisManager redisManager, IRepositoryWrapper wrapper)
    {
        _mapper = mapper;
        _logger = logger;
        _redisManager = redisManager;
        _wrapper = wrapper;
    }


    /// <summary>
    /// 根据id查询用户
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    public async Task<UserModel> QueryUserById(int id)
    {
        var user = _wrapper.User.FindByCondition(_=>_.Id==id).FirstOrDefault();
        if (user is null)
            return null;
        
        var userModel = _mapper.Map<UserModel>(user);
        return userModel;
    }

    /// <summary>
    /// 根据手机号查询用户
    /// </summary>
    /// <param name="phone"></param>
    /// <returns></returns>
    public async Task<UserModel> QueryUserByPhone(string phone)
    {
        var user = _wrapper.User.FindByCondition(_=>_.Phone == phone).FirstOrDefault();
        if (user is null)
            return null;
        
        var userModel = _mapper.Map<UserModel>(user);
        return userModel;
    }
    
    /// <summary>
    /// 新增用户,用户至少归属于一个组织
    /// </summary>
    /// <param name="request"></param>
    /// <exception cref="Exception"></exception>
    public async Task<UserModel> AddUserAsync(int organizationId, AddUserRequest request)
    {
        try
        {
            if (string.IsNullOrEmpty(request.UserName) || string.IsNullOrEmpty(request.PassWord))
                throw new UserException("Account and pwd is must.");
            if (string.IsNullOrEmpty(request.Phone))
                throw new UserException("Phone & OrgCode is required");

            //密码加密
            request.PassWord = PwdBCrypt.Encryption(request.PassWord);
            
            //判断用户表是否存在该用户
            var existOrNot = _wrapper.User.FindByCondition(_ => _.Phone.Equals(request.Phone )&& _.UserName.Equals(request.UserName))
                .FirstOrDefault();
            if (existOrNot is not null)
            {
                //判断关联表是否存在该用户
                var organizationUser = _wrapper.OrganizationUser
                    .FindByCondition(_ => _.UserId == existOrNot.Id && _.OrganizationId == organizationId)
                    .FirstOrDefault();
                if (organizationUser is not null)
                {
                    //说明该用户已经存在
                    throw new UserException("该用户已存在");
                }
            }

            //删除缓存
            await _redisManager.DelKey(RedisKeyGenerator.AllUsersRedisKey());
            var user = _mapper.Map<User>(request);
            _wrapper.User.Create(user);
            await _wrapper.SaveChangeAsync();

            //
            await _redisManager.DelKey(RedisKeyGenerator.AllUsersRedisKey());
            
            var userModel = _mapper.Map<UserModel>(user);
            return userModel;
            
        }
        catch (Exception _)
        {
            _logger.LogError($"Excuse AddUserAsync error: {_.Message}");
            throw;
        }
    }

  
    
    /// <summary>
    /// 更新用户信息
    /// </summary>
    /// <param name="request"></param>
    public async Task UpdateUserAsync(UpdateUserRequest request)
    {
        var user = _wrapper.User.FindByCondition(_ => _.Phone == request.Phone && _.IsDeleted == false).FirstOrDefault();
        if (user is null)
        {
            //user not exist
            return;
        }
        if (! string.IsNullOrEmpty(request.PassWord))
        {
            request.PassWord = PwdBCrypt.Encryption(request.PassWord);
        }
        
        if (string.Equals(user.UserName,request.UserName) && string.Equals(user.PassWord,request.PassWord) && string.Equals(user.Phone,request.Phone) && string.Equals(user.Remark,request.Remark))
        {
            //data not change
            return;
        }
        //set value
        if (!string.IsNullOrEmpty(request.UserName))
        {
            user.UserName = request.UserName;
        }
        if (!string.IsNullOrEmpty(request.PassWord))
        {
            user.PassWord = request.PassWord;
        }
        if (!string.IsNullOrEmpty(request.Phone))
        {
            user.Phone = request.Phone;
        }
        if (!string.IsNullOrEmpty(request.Remark))
        {
            user.Remark = request.Remark;
        }
        user.UpdateTime=DateTime.Now;
        _wrapper.User.Update(user);
        await _wrapper.SaveChangeAsync();
    }

    /// <summary>
    /// 批量删除用户
    /// </summary>
    /// <param name="ids"></param>
    /// <exception cref="Exception"></exception>
    public async Task DeleteBatchUserAsync(List<int> ids)
    {
        var list =await _wrapper.User.FindByCondition(x=>ids.Contains(x.Id)).ToListAsync();
        foreach (var item in list)
        {
            item.IsDeleted = true;
            _wrapper.User.Update(item);
        }
        await _wrapper.SaveChangeAsync();
    }

    /// <summary>
    /// 查询用户拥有的角色
    /// </summary>
    /// <param name="organizationId"></param>
    /// <param name="userId">用户id</param>
    /// <returns></returns>
    public async Task<QueryRoleByUserIdResponse> QueryRoleByUserIdAsync(int organizationId,int userId)
    {
        var response = new QueryRoleByUserIdResponse();
        //拿到角色列表
        var roleIds =await _wrapper.UserRole.FindByCondition(_=>_.UserId==userId && _.OrganizationId==organizationId && _.IsDeleted==false)
            .Select(_=>_.RoleId).ToListAsync();
        if (roleIds.Any())
        {
            foreach (var roleId in roleIds)
            {
                //拿到具体的角色
                var role = _wrapper.Role.FindByCondition(_=>_.Id==roleId && _.IsDeleted==false).FirstOrDefault();
                var roleModel = _mapper.Map<RoleModel>(role);
                response.RoleModels.Add(roleModel);
            }
        }

        return response;
    }
    
    
    /// <summary>
    /// 查询所有的用户
    /// </summary>
    /// <returns></returns>
    public async Task<List<UserModel>> QueryAllUsersAsync()
    {
        var response = new List<UserModel>();
        try
        {
            var allUsers = await _redisManager.HGetAllValue<User>(RedisKeyGenerator.AllUsersRedisKey());
            if (allUsers.Any())
            {
                response = _mapper.Map<List<UserModel>>(allUsers);
                return response;
            }

            //查数据库,并设置redis;
            var users = _wrapper.User.FindAll().Where(_ => _.IsDeleted == false).ToList();
            response = _mapper.Map<List<UserModel>>(users);

            var usersDic = users.ToDictionary(_ => _.Id);

            await usersDic.ParallelForEachAsync(async user =>
            {
                var redisKey = RedisKeyGenerator.AllUsersRedisKey();
                try
                {
                    foreach (var s in users)
                    {
                        await _redisManager.HashSet(redisKey, user.Key.ToString(),
                            JsonConvert.SerializeObject(user.Value));
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                }
            });
        }
        catch (Exception e)
        {
            _logger.LogError("QueryAllUsersAsync error: {e.Message}");
            throw;
        }

        return response;
    }

    public void QueryUserByCondition(QueryUserByConditionRequest request)
    {
        
    }
}
4. OrganizationManager
using System.Text.RegularExpressions;
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using org.huage.AuthManagement.BizManager.Redis;
using org.huage.AuthManagement.BizManager.wrapper;
using org.huage.AuthManagement.DataBase.Table;
using org.huage.AuthManagement.Entity.Common;
using org.huage.AuthManagement.Entity.Managers;
using org.huage.AuthManagement.Entity.Model;
using org.huage.AuthManagement.Entity.Request;
using org.huage.AuthManagement.Entity.Response;

namespace org.huage.AuthManagement.BizManager.Manager;

//组织管理
public class OrganizationManager : IOrganizationManager
{
    private readonly IRepositoryWrapper _wrapper;
    private readonly IRedisManager _redisManager;
    private readonly ILogger<OrganizationManager> _logger;
    private readonly IMapper _mapper;
    private readonly IUserManager _userManager;

    public OrganizationManager(IRepositoryWrapper wrapper, IRedisManager redisManager,
        ILogger<OrganizationManager> logger, IMapper mapper,IUserManager userManager)
    {
        _wrapper = wrapper;
        _redisManager = redisManager;
        _logger = logger;
        _mapper = mapper;
        _userManager = userManager;
    }


    /// <summary>
    /// 查询该组织的用户,以及用户对应的角色:
    /// 1.查询该组织下的用户
    /// 2.查询用户角色
    /// </summary>
    /// <param name="organizationId"></param>
    public async Task<QueryOrganizationUserAndRoleResponse> QueryOrganizationAllUserAndRoleAsync(int organizationId)
    {
        var response = new QueryOrganizationUserAndRoleResponse();
        try
        {
            //查询缓存
            var organizationUsers =
                await _redisManager.HGetAllValue<OrganizationUserAndRole>(RedisKeyGenerator.OrganizationAllUserAndRole(organizationId));
            
            if (organizationUsers.Any())
            {
                response.Users = organizationUsers;
                return response;
            }

            //1.从中间表中查询出该组织对应的用户有那些,然后拿到用户信息
            var userIdList = await _wrapper.OrganizationUser
                .FindByCondition(_ => _.OrganizationId == organizationId && _.IsDeleted == false).Select(_ => _.UserId)
                .ToListAsync();
            //2.拿到所有的用户
            if (userIdList.Any())
            {
                foreach (var userId in userIdList)
                {
                    //拿到用户
                    var user = _wrapper.User.FindByCondition(_ => _.Id == userId && _.IsDeleted==false).FirstOrDefault();
                    if (user is null)
                    {
                        continue;
                    }
                    var realUser = _mapper.Map<OrganizationUserAndRole>(user);

                    //拿到该用户的角色id列表
                    var ids = await _wrapper.UserRole
                        .FindByCondition(_ => organizationId == _.OrganizationId && userId == _.UserId)
                        .Select(_ => _.RoleId).ToListAsync();

                    foreach (var id in ids)
                    {
                        //拿到角色
                        var role = _wrapper.Role.FindByCondition(_ => _.Id == id).FirstOrDefault();
                        //添加进入集合
                        var roleModel = _mapper.Map<RoleModel>(role);
                        realUser.RoleModels?.Add(roleModel);
                    }

                    //加入返回结果集
                    response.Users.Add(realUser);
                }
            }

            var userAndRoles = response.Users.ToDictionary(_ => _.Id);

            //添加缓存
            await userAndRoles.ParallelForEachAsync(async ur =>
            {
                var redisKey = RedisKeyGenerator.OrganizationAllUserAndRole(organizationId);
                try
                {
                    foreach (var s in response.Users)
                    {
                        await _redisManager.HashSet(redisKey, RedisKeyGenerator.OrganizationUser(ur.Key),
                            JsonConvert.SerializeObject(ur.Value));
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                }
            });
        }
        catch (Exception e)
        {
            _logger.LogError($"Excuse QueryOrganizationUserAndRole error: {e.Message}");
            throw;
        }

        return response;
    }


    //查询所有的组织
    public async Task<QueryAllOrganizationResponse> QueryAllOrganizationAsync()
    {
        var response = new QueryAllOrganizationResponse();
        try
        {
            //查缓存
            var value = await _redisManager.HGetAllValue<Organization>(RedisKeyGenerator.AllOrganizationsRedisKey());
            if (value.Any())
            {
                response.OrganizationModels = _mapper.Map<List<OrganizationModel>>(value);
                return response;
            }

            //查询数据库
            var organizationList = await _wrapper.Organization.FindByCondition(_ => _.IsDeleted == false).ToListAsync();
            response.OrganizationModels = _mapper.Map<List<OrganizationModel>>(organizationList);

            //设置缓存
            var organizationDic = organizationList.ToDictionary(_ => _.Id);
            await organizationDic.ParallelForEachAsync(async organization =>
            {
                var redisKey = RedisKeyGenerator.AllOrganizationsRedisKey();
                try
                {
                    foreach (var s in organizationDic)
                    {
                        await _redisManager.HashSet(redisKey, organization.Key.ToString(),
                            JsonConvert.SerializeObject(organization.Value));
                    }
                }
                catch (Exception e)
                {
                    _logger.LogError(e.Message);
                }
            });
        }
        catch (Exception e)
        {
            _logger.LogError($"QueryAllOrganizationAsync error: {e.Message}");
            throw;
        }

        return response;
    }

    /// <summary>
    /// 查询该组织明细
    /// </summary>
    /// <param name="organizationId"></param>
    /// <returns></returns>
    public async Task<OrganizationModel> QueryOrganizationDetailAsync(int organizationId)
    {
        var organization = _wrapper.Organization.FindByCondition(_ => _.Id == organizationId).FirstOrDefault();
        return _mapper.Map<OrganizationModel>(organization);
    }


    /// <summary>
    /// 批量删除
    /// </summary>
    /// <param name="ids"></param>
    public async Task<bool> BatchDeleteOrganizationByIdAsync(List<int> ids)
    {
        if (!ids.Any())
            return false;
        
        foreach (var id in ids)
        {
            var first = _wrapper.Organization.FindByCondition(_ => _.Id == id && _.IsDeleted==false).FirstOrDefault();
            if (first is not null)
            {
                //逻辑删除
                first.IsDeleted = true;
                _wrapper.Organization.Update(first);
                
                //删除关联表organizationUser
                var organizationUserList = await _wrapper.OrganizationUser.FindByCondition(_=>_.OrganizationId==id && _.IsDeleted==false).ToListAsync();
                if (organizationUserList.Any())
                {
                    foreach (var organizationUser in organizationUserList)
                    {
                        //逻辑删除
                        organizationUser.IsDeleted = true;
                        _wrapper.OrganizationUser.Update(organizationUser);
                    }
                }
            }
        }

        return true;

    }

    /// <summary>
    /// 组织添加用户:添加用户的时候,可以选择是否给该用户配角色
    /// </summary>
    /// <summary>
    /// 比如说A组织创建了一个用户a,然后用户表插入了一个用户(手机号唯一),接着在organizationUser表加入一条id, A.ID , a.id的的数据;
    /// 然后我们给该A组织的a用户设置角色的时候,我们去UserRole表加入一条数据:userid,roleId,organizationId.
    ///
    /// 这时候B组织把a也加入自己的组织了,给该用户设置B组织a用户的权限:在UserRole角色表里面加入一条,userid,roleId,organizationId.
    /// 希望解决同一个用户在不同系统拥有不同的权限:逻辑就是组织添加用户的时候,加入organizationUser表,并且需要给其授予角色(默认是游客),也可以从用户表中挑选用户;
    /// </summary>
    public async Task<bool> OrganizationAddUserAsync(AddOrganizationUserRequest request)
    {
        if (!IsValidOrgCode(request.OrganizationId.ToString()))
            throw new OrganizationException("OrganizationId invalid,please fill in valid orgCode");
        if (string.IsNullOrEmpty(request.UserModel.Phone))
            throw new OrganizationException("Phone is required.");

        //开启事务
        await using var transaction = await _wrapper.StartTransactionAsync();

        try
        {
            //添加用户
            var addUser = await _userManager.AddUserAsync(request.OrganizationId, request.UserModel);

            //添加OrganizationUser
            var organizationUserModel = new OrganizationUserModel()
            {
                OrganizationId = request.OrganizationId,
                UserId = addUser.Id
            };
            var organizationUser = _mapper.Map<OrganizationUser>(organizationUserModel);
            _wrapper.OrganizationUser.Create(organizationUser);

            //添加UserRole
            if (request.RoleModels != null && request.RoleModels.Any())
            {
                foreach (var role in request.RoleModels)
                {
                    var userRoleModel = new UserRoleModel()
                    {
                        UserId = addUser.Id,
                        OrganizationId = request.OrganizationId,
                        RoleId = role.Id
                    };
                    var userRole = _mapper.Map<UserRole>(userRoleModel);
                    _wrapper.UserRole.Create(userRole);
                }
            }
            else
            {
                //设置该用户默认角色为游客
                var ur = new UserRoleModel()
                {
                    UserId = addUser.Id,
                    OrganizationId = request.OrganizationId,
                    RoleId = 2
                };
                var userRole = _mapper.Map<UserRole>(ur);
                _wrapper.UserRole.Create(userRole);
            }

            await _wrapper.SaveChangeAsync();

            await transaction.CommitAsync();
        }
        catch (UserException ex)
        {
            await transaction.RollbackAsync();
            _logger.LogError(ex.Message);
            throw;
        }
        catch (Exception e)
        {
            //发生异常回滚
            await transaction.RollbackAsync();
            _logger.LogError($"Excuse OrganizationAddUser error: {e.Message}");
            throw;
        }

        return true;
    }


    /// <summary>
    /// 新增组织
    /// </summary>
    /// <param name="request"></param>
    /// <exception cref="Exception"></exception>
    public async Task AddOrganizationAsync(AddOrganizationRequest request)
    {
        try
        {
            //params check
            if (string.IsNullOrEmpty(request.OrgCode) ||
                string.IsNullOrEmpty(request.Name))
            {
                throw new OrganizationException("组织名称和组织注册编码不能为空");
            }

            if (string.IsNullOrEmpty(request.Version))
            {
                request.Version = "v1";
            }

            //mapping
            var organization = _mapper.Map<Organization>(request);
            _wrapper.Organization.Create(organization);
            await _wrapper.SaveChangeAsync();
        }
        catch (Exception e)
        {
            _logger.LogError($"Excuse AddOrganization error: {e.Message}");
            throw;
        }
    }

    /// <summary>
    /// 判断传进来的营业执照是否有效,这里可以根据自己的业务具体实现,当前假设为邮箱
    /// </summary>
    /// <param name="orgCode"></param>
    /// <returns></returns>
    private bool IsValidOrgCode(string orgCode)
    {
        var regex = new Regex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
        return regex.IsMatch(orgCode);
    }
}

Api模块:暴露接口,程序启动

目录接口:

Example :OrganizationController
namespace org.huage.AuthManagement.Api.Controllers;
[ApiController]
[Route("/[controller]/[action]")]
public class OrganizationController : Controller
{
    private readonly IOrganizationManager _organizationManager;
    private readonly ILogger<OrganizationController> _logger;

    public OrganizationController(IOrganizationManager organizationManager, ILogger<OrganizationController> logger)
    {
        _organizationManager = organizationManager;
        _logger = logger;
    }
    
    
    [HttpPost]
    public async Task<bool> OrganizationAddUser(AddOrganizationUserRequest request)
    {
        try
        {
            return await _organizationManager.OrganizationAddUserAsync(request);
        }
        catch (OrganizationException ex)
        {
            _logger.LogError(
                $"Error in org.huage.Service.OrganizationManager.OrganizationController.OrganizationAddUser. {ex.Message}");
            throw;
        }
        catch (Exception e)
        {
            var organizationExceptionException = new OrganizationException(e.Message);
            _logger.LogError(
                $"Error in org.huage.Service.OrganizationManager.OrganizationController.OrganizationAddUser.");
            throw organizationExceptionException;
        }
    }
}

 

测试:基于Swagger测试

Example: 

备注:查全量数据的时候都集成了Redis,经过postman本地测试,基本所有接口响应时间都可以控制在50ms内,基于Redis查全量数据的时候能控制在10ms以内。

完整项目地址:(整理中,后续贴上)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值