236 lines
9.2 KiB
C#
236 lines
9.2 KiB
C#
using Cowain.Base.DBContext;
|
|
using Cowain.Base.Helpers;
|
|
using Cowain.Base.IServices;
|
|
using Cowain.Base.Models;
|
|
using Cowain.Base.Models.Admins;
|
|
using Cowain.Base.ViewModels;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System;
|
|
using System.Collections.ObjectModel;
|
|
using System.Text.Json;
|
|
|
|
namespace Cowain.Base.Services;
|
|
|
|
public class AccountService : BaseService, IAccountService
|
|
{
|
|
private readonly PageViewMenuHelper _pageMenuHelper;
|
|
public AccountService(IDbContextFactory<SqlDbContext> dbContextFactory, PageViewMenuHelper pageMenuHelper) : base(dbContextFactory)
|
|
{
|
|
_pageMenuHelper = pageMenuHelper;
|
|
}
|
|
|
|
public async Task<ResultModel<LoginUserViewModel>> LoginAsync(string userName, string password)
|
|
{
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|
var userDbSet = dbContext.GetDbSet<UserDto>();
|
|
var userRoleDbSet = dbContext.GetDbSet<UserRoleDto>();
|
|
|
|
var data = await (from us in userDbSet
|
|
join ur in userRoleDbSet on us.RoleId equals ur.Id
|
|
where us.Name == userName && us.Password == DESHelper.Encrypt(password, "ZSL12345")
|
|
select new UserViewModel
|
|
{
|
|
Id = us.Id,
|
|
RoleId = us.RoleId,
|
|
IsValid = us.IsValid,
|
|
Name = us.Name,
|
|
Phone = us.Phone,
|
|
Sex = us.Sex,
|
|
UserNumber = us.UserNumber,
|
|
RoleName = ur.RoleName
|
|
}).FirstOrDefaultAsync();
|
|
//登录成功,需要获取用户菜单
|
|
if (data != null)
|
|
{
|
|
var jsonSerializerOptions = new JsonSerializerOptions
|
|
{
|
|
PropertyNameCaseInsensitive = true
|
|
};
|
|
LoginUserViewModel loginUser = new LoginUserViewModel();
|
|
loginUser.User = data;
|
|
var userRoleMenus = dbContext.GetDbSet<UserRoleMenuDto>();
|
|
var menus = userRoleMenus.Where(x => x.RoleId == data.RoleId);
|
|
loginUser.Menus = new ObservableCollection<UserRoleMenuViewModel>(menus.Select(x => new UserRoleMenuViewModel
|
|
{
|
|
Id = x.Id,
|
|
RoleId = x.RoleId,
|
|
MenuKey = x.MenuKey,
|
|
MenuName = _pageMenuHelper.GetMenuName(x.MenuKey),
|
|
MenuActions = new ObservableCollection<string>(JsonSerializer.Deserialize<List<string>>(x.MenuActions ?? "[]", jsonSerializerOptions) ?? new List<string>())
|
|
}));
|
|
return ResultModel<LoginUserViewModel>.Success(loginUser);
|
|
}
|
|
return ResultModel<LoginUserViewModel>.Error("login err");
|
|
}
|
|
|
|
public async Task<ResultModel> CheckHealthAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|
try
|
|
{
|
|
await dbContext.EnsureCreatedAsync();
|
|
var DbSet = dbContext.GetDbSet<UserDto>();
|
|
var isHealthy = await DbSet.ToListAsync(cancellationToken);
|
|
return ResultModel.Success("An healthy result.");
|
|
}
|
|
catch
|
|
{
|
|
return ResultModel.Error("An unhealthy result.");
|
|
}
|
|
}
|
|
|
|
public async Task<List<UserViewModel>> GetAllAsync()
|
|
{
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|
var userDbSet = dbContext.GetDbSet<UserDto>();
|
|
var userRoleDbSet = dbContext.GetDbSet<UserRoleDto>();
|
|
var data = await (from us in userDbSet
|
|
join ur in userRoleDbSet on us.RoleId equals ur.Id
|
|
select new UserViewModel
|
|
{
|
|
Id = us.Id,
|
|
RoleId = us.RoleId,
|
|
IsValid = us.IsValid,
|
|
Name = us.Name,
|
|
Password = DESHelper.Decrypt(us.Password, "ZSL12345"),
|
|
Phone = us.Phone,
|
|
Sex = us.Sex,
|
|
UserNumber = us.UserNumber,
|
|
RoleName = ur.RoleName
|
|
}).ToListAsync();
|
|
return data;
|
|
}
|
|
|
|
public async Task<(List<UserViewModel>, int totals)> GetAllAsync(int pageIndex, int pageSize)
|
|
{
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|
var userDbSet = dbContext.GetDbSet<UserDto>();
|
|
var userRoleDbSet = dbContext.GetDbSet<UserRoleDto>();
|
|
var data = (from us in userDbSet
|
|
join ur in userRoleDbSet on us.RoleId equals ur.Id
|
|
select new UserViewModel
|
|
{
|
|
Id = us.Id,
|
|
RoleId = us.RoleId,
|
|
IsValid = us.IsValid,
|
|
Name = us.Name,
|
|
Password = DESHelper.Decrypt(us.Password, "ZSL12345"),
|
|
Phone = us.Phone,
|
|
Sex = us.Sex,
|
|
UserNumber = us.UserNumber,
|
|
RoleName = ur.RoleName
|
|
});
|
|
var list = await data.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
|
|
return (list, data.Count());
|
|
}
|
|
|
|
public async Task<ResultModel> AddUserAsync(UserViewModel? user)
|
|
{
|
|
if (user == null)
|
|
{
|
|
return ResultModel.Error("User cannot be null");
|
|
}
|
|
if (string.IsNullOrEmpty(user.Name))
|
|
{
|
|
return ResultModel.Error("UserName cannot be null");
|
|
}
|
|
if (user.RoleId == 0)
|
|
{
|
|
return ResultModel.Error("UserRole cannot be null");
|
|
}
|
|
if (string.IsNullOrEmpty(user.UserNumber))
|
|
{
|
|
return ResultModel.Error("UserNumber cannot be null");
|
|
}
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|
var users = dbContext.GetDbSet<UserDto>();
|
|
var existingUser = await users.FirstOrDefaultAsync(x => x.UserNumber == user.UserNumber);
|
|
if (existingUser != null)
|
|
{
|
|
return ResultModel.Error("UserNumber already exists");
|
|
}
|
|
var entity = new UserDto
|
|
{
|
|
RoleId = user.RoleId,
|
|
Name = user.Name,
|
|
Phone = user.Phone ?? string.Empty,
|
|
UserNumber = user.UserNumber,
|
|
Sex = user.Sex ?? SexMode.Other.ToString(),
|
|
Password = DESHelper.Encrypt(user.Password ?? "12345", "ZSL12345"),
|
|
IsValid = user.IsValid
|
|
};
|
|
await users.AddAsync(entity);
|
|
|
|
await dbContext.SaveChangesAsync();
|
|
return ResultModel.Success("User added successfully");
|
|
}
|
|
|
|
public async Task<ResultModel> EditUserAsync(UserViewModel? user)
|
|
{
|
|
if (user == null)
|
|
{
|
|
return ResultModel.Error("User cannot be null");
|
|
}
|
|
if (string.IsNullOrEmpty(user.Name))
|
|
{
|
|
return ResultModel.Error("UserName cannot be null");
|
|
}
|
|
if (user.RoleId == 0)
|
|
{
|
|
return ResultModel.Error("UserRole cannot be null");
|
|
}
|
|
if (string.IsNullOrEmpty(user.UserNumber))
|
|
{
|
|
return ResultModel.Error("UserNumber cannot be null");
|
|
}
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|
var users = dbContext.GetDbSet<UserDto>();
|
|
var existingUser = await users.FirstOrDefaultAsync(x => x.Id == user.Id);
|
|
if (existingUser == null)
|
|
{
|
|
return ResultModel.Error("User-id not find");
|
|
}
|
|
var duplicateUser = await users.FirstOrDefaultAsync(x => x.UserNumber == user.UserNumber && x.Id != user.Id);
|
|
if (duplicateUser != null)
|
|
{
|
|
return ResultModel.Error("UserNumber already exists");
|
|
}
|
|
existingUser.RoleId = user.RoleId;
|
|
existingUser.Name = user.Name;
|
|
existingUser.Phone = user.Phone ?? string.Empty;
|
|
existingUser.UserNumber = user.UserNumber;
|
|
existingUser.Sex = user.Sex ?? SexMode.Other.ToString();
|
|
existingUser.Password = DESHelper.Encrypt(user.Password ?? "12345", "ZSL12345");
|
|
existingUser.IsValid = user.IsValid;
|
|
existingUser.UpdateTime = DateTime.Now;
|
|
await dbContext.SaveChangesAsync();
|
|
return ResultModel.Success("User edit successfully");
|
|
}
|
|
|
|
public async Task<ResultModel> DelUserAsync(UserViewModel? user)
|
|
{
|
|
if (user == null)
|
|
{
|
|
return ResultModel.Error("User cannot be null");
|
|
}
|
|
if (string.IsNullOrEmpty(user.Name))
|
|
{
|
|
return ResultModel.Error("UserName cannot be null");
|
|
}
|
|
if (user.Id == 0)
|
|
{
|
|
return ResultModel.Error("User-id cannot be null");
|
|
}
|
|
using var dbContext = _dbContextFactory.CreateDbContext();
|
|
var users = dbContext.GetDbSet<UserDto>();
|
|
var existingUser = await users.FirstOrDefaultAsync(x => x.Id == user.Id);
|
|
if (existingUser == null)
|
|
{
|
|
return ResultModel.Error("User-id not find");
|
|
}
|
|
users.Remove(existingUser);
|
|
await dbContext.SaveChangesAsync();
|
|
return ResultModel.Success("User deleted successfully");
|
|
}
|
|
}
|