|
using System.Drawing;
|
using System.Drawing.Imaging;
|
using WIDESEAWCS_Common.Face;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_Core.Authorization;
|
using WIDESEAWCS_Core.BaseRepository;
|
using WIDESEAWCS_Core.BaseServices;
|
using WIDESEAWCS_Core.Caches;
|
using WIDESEAWCS_ISystemServices;
|
using WIDESEAWCS_Model.Models;
|
using File = System.IO.File;
|
|
namespace WIDESEAWCS_SystemServices
|
{
|
public class Sys_UserFaceService : ServiceBase<Sys_UserFace, IRepository<Sys_UserFace>>, ISys_UserFaceService
|
{
|
public IRepository<Sys_UserFace> Repository => BaseDal;
|
|
private readonly IRepository<Sys_User> _userRepository;
|
private readonly ICacheService _cacheService;
|
|
public Sys_UserFaceService(IRepository<Sys_UserFace> BaseDal, IRepository<Sys_User> userRepository, ICacheService cacheService) : base(BaseDal)
|
{
|
_userRepository = userRepository;
|
_cacheService = cacheService;
|
}
|
|
public WebResponseContent FaceRecognition(ImageModel model)
|
{
|
string filePath = string.Empty;
|
try
|
{
|
byte[] data = Convert.FromBase64String(model.Base64Image);
|
string sourcePath = AppDomain.CurrentDomain.BaseDirectory + "Record\\";
|
string basePath = AppDomain.CurrentDomain.BaseDirectory + "Current\\";
|
if (!Directory.Exists(basePath))
|
{
|
Directory.CreateDirectory(basePath);
|
}
|
|
filePath = basePath + $"face_{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.jpg";
|
|
// 使用字节数组创建MemoryStream
|
using (MemoryStream ms = new MemoryStream(data))
|
{
|
// 从MemoryStream创建Image对象
|
Image image = Image.FromStream(ms);
|
image.Save(filePath, ImageFormat.Png);
|
}
|
|
try
|
{
|
var (flag, result) = FaceHelper.FaceRecognition(sourcePath, filePath);
|
|
if (flag)
|
{
|
Sys_UserFace userFace = BaseDal.QueryFirst(x => x.UserFaceImagePath.Contains(result));
|
if (userFace != null)
|
{
|
Sys_User user = _userRepository.QueryFirst(x => x.User_Id == userFace.User_Id && x.UserName == userFace.UserName);
|
if (user != null)
|
{
|
string token = JwtHelper.IssueJwt(new TokenModelJwt()
|
{
|
UserId = user.User_Id,
|
RoleId = user.Role_Id,
|
UserName = user.UserName,
|
TenantId = user.TenantId,
|
});
|
|
_cacheService.AddOrUpdate(user.User_Id.ToString(), token);
|
|
return WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl });
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error($"未找到匹配的用户信息,{result}");
|
}
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error($"未找到匹配的人脸信息,{result}");
|
}
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error(result);
|
}
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent
|
{
|
Status = false,
|
Message = "登录失败:" + ex.Message
|
};
|
}
|
|
}
|
finally
|
{
|
// 确保释放资源
|
GC.Collect();
|
GC.WaitForPendingFinalizers();
|
if (File.Exists(filePath))
|
{
|
File.Delete(filePath); // 删除当前人脸图片
|
}
|
}
|
}
|
|
public WebResponseContent FaceEnter(ImageModel model)
|
{
|
try
|
{
|
if (App.User == null || string.IsNullOrEmpty(App.User.UserName) || App.User.UserId == 0)
|
{
|
return new WebResponseContent
|
{
|
Status = false,
|
Message = "用户未登录"
|
};
|
}
|
|
string str = Environment.CurrentDirectory;
|
|
byte[] data = Convert.FromBase64String(model.Base64Image);
|
string basePath = AppDomain.CurrentDomain.BaseDirectory + "Record\\";
|
if (!Directory.Exists(basePath))
|
{
|
Directory.CreateDirectory(basePath);
|
}
|
|
string curPath = AppDomain.CurrentDomain.BaseDirectory + "Current\\";
|
if (!Directory.Exists(curPath))
|
{
|
Directory.CreateDirectory(curPath);
|
}
|
|
string fileName = $"face_{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.jpg";
|
string filePath = basePath + fileName;
|
// 使用字节数组创建MemoryStream
|
using (MemoryStream ms = new MemoryStream(data))
|
{
|
// 从MemoryStream创建Image对象
|
Image image = Image.FromStream(ms);
|
|
image.Save(curPath + fileName, ImageFormat.Png);
|
|
{
|
var (flag, result) = FaceHelper.FaceRecognition(basePath, curPath + fileName);
|
if (flag)
|
{
|
Sys_UserFace userFaceTemp = BaseDal.QueryFirst(x => x.UserFaceImagePath.Contains(result));
|
if (userFaceTemp != null && userFaceTemp.User_Id != App.User.UserId && userFaceTemp.UserName != App.User.UserName)
|
{
|
return new WebResponseContent
|
{
|
Status = false,
|
Message = "不可注册多个账号"
|
};
|
}
|
}
|
}
|
|
image.Save(filePath, ImageFormat.Png);
|
}
|
|
|
// 获取当前用户信息
|
Sys_UserFace userFace = BaseDal.QueryFirst(x => x.UserName == App.User.UserName && x.User_Id == App.User.UserId);
|
if (userFace != null)
|
{
|
if (!string.IsNullOrEmpty(userFace.UserFaceImagePath))
|
{
|
string? firstImagePath = userFace.UserFaceImagePath.Split(',').FirstOrDefault();
|
if (!string.IsNullOrEmpty(firstImagePath))
|
{
|
var (flag, result) = FaceHelper.FaceRecognitionOne(firstImagePath, filePath);
|
|
if (flag)
|
{
|
userFace.UserFaceImagePath += "," + filePath;
|
|
base.UpdateData(userFace);
|
|
return WebResponseContent.Instance.OK("人脸录入成功", filePath);
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error(result);
|
}
|
}
|
}
|
else
|
{
|
userFace.UserFaceImagePath = filePath;
|
|
base.UpdateData(userFace);
|
|
return WebResponseContent.Instance.OK("人脸录入成功", filePath);
|
}
|
}
|
userFace = new Sys_UserFace
|
{
|
User_Id = App.User.UserId,
|
UserName = App.User.UserName,
|
UserFaceImageName = fileName,
|
UserFaceImagePath = filePath
|
};
|
base.AddData(userFace);
|
|
|
|
return WebResponseContent.Instance.OK(data: filePath);
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent
|
{
|
Status = false,
|
Message = "人脸录入失败:" + ex.Message
|
};
|
}
|
}
|
|
|
}
|
}
|