|
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
|
using SkiaSharp;
|
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_Core.Const;
|
using WIDESEAWCS_Core.Helper;
|
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 = "用户未登录"
|
};
|
}
|
|
//if (App.User.IsSuperAdmin)
|
//{
|
// 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 path = "Record\\" + fileName;
|
string filePath = basePath + fileName;
|
//// 使用字节数组创建MemoryStream
|
using (MemoryStream ms = new MemoryStream(data))
|
{
|
// 从MemoryStream创建Image对象
|
Image image = Image.FromStream(ms);
|
|
image.Save(curPath + fileName, ImageFormat.Png);
|
|
image.Save(filePath, ImageFormat.Png);
|
}
|
|
|
// 获取当前用户信息
|
Sys_UserFace userFace = BaseDal.QueryFirst(x => x.User_Id == model.UserId);
|
if (userFace != null)
|
{
|
|
userFace.UserFaceImagePath = filePath;
|
userFace.UserFaceImageName = path;
|
|
base.UpdateData(userFace);
|
|
return WebResponseContent.Instance.OK("人脸录入成功", filePath);
|
|
}
|
|
Sys_User user = _userRepository.QueryFirst(x => x.User_Id == model.UserId);
|
if (user == null)
|
{
|
return WebResponseContent.Instance.Error("未找到用户信息");
|
}
|
|
userFace = new Sys_UserFace
|
{
|
User_Id = user.User_Id,
|
UserName = user.UserName,
|
UserFaceImageName = path,
|
UserFaceImagePath = filePath
|
};
|
base.AddData(userFace);
|
|
|
return WebResponseContent.Instance.OK(data: filePath);
|
}
|
catch (Exception ex)
|
{
|
return new WebResponseContent
|
{
|
Status = false,
|
Message = "人脸录入失败:" + ex.Message
|
};
|
}
|
}
|
|
|
/// <summary>
|
/// 人脸登入给前端返回账号和密码
|
/// </summary>
|
/// <param name="ID">用户id</param>
|
/// <returns></returns>
|
public WebResponseContent ReturnAccount(int ID)
|
{
|
var user = _userRepository.QueryData(x => x.User_Id == ID).FirstOrDefault();
|
if (user == null)
|
{
|
return WebResponseContent.Instance.Error("没有找到该用户");
|
}
|
|
// 解密密码
|
string plainPassword = user.UserPwd.DecryptDES(AppSecret.User);
|
|
return new WebResponseContent
|
{
|
Status = true,
|
Data = new { Account = user.UserName, Password = plainPassword }
|
};
|
}
|
|
|
}
|
}
|