Loading

造轮子之用户管理

跟角色管理一样,asp.net core identity中已经包含了UserManager,我们只需要简单包装一下逻辑即可完成我们的用户管理相关功能。
这里只打算添加分页查询,创建以及修改用户的API,不提供删除API。

实现UserManageAppService

IUserManageAppService

namespace Wheel.Services.Users
{
    public interface IUserManageAppService : ITransientDependency
    {
        Task<Page<UserDto>> GetUserPageList(UserPageRequest pageRequest);
        Task<R> CreateUser(CreateUserDto userDto);
        Task<R> UpdateUser(string userId, UpdateUserDto updateUserDto);
    }
}

UserManageAppService

namespace Wheel.Services.Users
{
    public class UserManageAppService : WheelServiceBase, IUserManageAppService
    {
        private readonly IBasicRepository<User, string> _userRepository;
        private readonly UserManager<User> _userManager;
        private readonly IUserStore<User> _userStore;

        public UserManageAppService(IBasicRepository<User, string> userRepository, UserManager<User> userManager, IUserStore<User> userStore)
        {
            _userRepository = userRepository;
            _userManager = userManager;
            _userStore = userStore;
        }

        public async Task<Page<UserDto>> GetUserPageList(UserPageRequest pageRequest)
        {
            var (items, total) = await _userRepository.SelectPageListAsync(
                _userRepository.BuildPredicate(
                    (!string.IsNullOrWhiteSpace(pageRequest.UserName), u => u.UserName.Contains(pageRequest.UserName)),
                    (!string.IsNullOrWhiteSpace(pageRequest.Email), u => u.Email.Contains(pageRequest.Email)),
                    (!string.IsNullOrWhiteSpace(pageRequest.PhoneNumber), u => u.PhoneNumber.Contains(pageRequest.PhoneNumber)),
                    (pageRequest.EmailConfirmed.HasValue, u => u.EmailConfirmed.Equals(pageRequest.EmailConfirmed)),
                    (pageRequest.PhoneNumberConfirmed.HasValue, u => u.PhoneNumberConfirmed.Equals(pageRequest.PhoneNumberConfirmed))
                    ),
                o => new UserDto
                {
                    UserName = o.UserName,
                    Email = o.Email,
                    PhoneNumber = o.PhoneNumber,
                    EmailConfirmed = o.EmailConfirmed,
                    PhoneNumberConfirmed = o.PhoneNumberConfirmed,
                    CreationTime = o.CreationTime
                },
                (pageRequest.PageIndex - 1) * pageRequest.PageSize,
                pageRequest.PageSize,
                pageRequest.OrderBy
                );

            return new Page<UserDto>(items, total);
        }
        public async Task<R> CreateUser(CreateUserDto userDto)
        {
            var user = new User();
            await _userManager.SetUserNameAsync(user, userDto.UserName);

            if (userDto.Email != null)
            {
                var emailStore = (IUserEmailStore<User>)_userStore;
                await emailStore.SetEmailAsync(user, userDto.Email, default);
            }

            var result = await _userManager.CreateAsync(user, userDto.Passowrd);
            if (result.Succeeded)
            {
                if (userDto.Roles.Count > 0)
                {
                    await _userManager.AddToRolesAsync(user, userDto.Roles);
                    await _userManager.UpdateAsync(user);
                }
                return new R();
            }
            else
                throw new BusinessException(ErrorCode.CreateUserError, string.Join("\r\n", result.Errors.Select(a => a.Description)));
        }
        public async Task<R> UpdateUser(string userId, UpdateUserDto updateUserDto)
        {
            var user = await _userManager.FindByIdAsync(userId);
            if (user == null)
            {
                throw new BusinessException(ErrorCode.UserNotExist, L["UserNotExist"]);
            }
            if (updateUserDto.Email != null)
            {
                var emailStore = (IUserEmailStore<User>)_userStore;
                await emailStore.SetEmailAsync(user, updateUserDto.Email, default);
            }
            if (updateUserDto.PhoneNumber != null)
            {
                await _userManager.SetPhoneNumberAsync(user, updateUserDto.PhoneNumber);
            }
            if (updateUserDto.Roles.Count > 0)
            {
                var existRoles = await _userManager.GetRolesAsync(user);
                await _userManager.RemoveFromRolesAsync(user, existRoles);
                await _userManager.AddToRolesAsync(user, updateUserDto.Roles);
            }
            await _userManager.UpdateAsync(user);
            return new R();
        }
    }
}

实现UserManageController

namespace Wheel.Controllers
{
    /// <summary>
    /// 用户管理
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class UserManageController : WheelControllerBase
    {
        private readonly IUserManageAppService _userManageAppService;

        public UserManageController(IUserManageAppService userManageAppService)
        {
            _userManageAppService = userManageAppService;
        }
        /// <summary>
        /// 创建用户
        /// </summary>
        /// <param name="userDto"></param>
        /// <returns></returns>
        [HttpPost]
        public Task<R> CreateUser(CreateUserDto userDto)
        {
            return _userManageAppService.CreateUser(userDto);
        }
        /// <summary>
        /// 用户分页查询
        /// </summary>
        /// <param name="pageRequest"></param>
        /// <returns></returns>
        [HttpGet]
        public Task<Page<UserDto>> GetUserPageList([FromQuery]UserPageRequest pageRequest)
        {
            return _userManageAppService.GetUserPageList(pageRequest);
        }
        /// <summary>
        /// 修改用户
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="updateUserDto"></param>
        /// <returns></returns>
        [HttpPut("{userId}")]
        public Task<R> UpdateUser(string userId, UpdateUserDto updateUserDto)
        {
            return _userManageAppService.UpdateUser(userId, updateUserDto);
        }
    }
}

非常简单就实现了一个用户管理的API。

轮子仓库地址https://github.com/Wheel-Framework/Wheel
欢迎进群催更。

image.png

posted @ 2023-10-12 11:50  饭勺oO  阅读(66)  评论(0编辑  收藏  举报