Files
WCS/Cowain.Base/Services/AccountService.cs
2026-03-02 09:08:20 +08:00

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");
}
}