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>, ISys_UserFaceService { public IRepository Repository => BaseDal; private readonly IRepository _userRepository; private readonly ICacheService _cacheService; public Sys_UserFaceService(IRepository BaseDal, IRepository 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 }; } } /// /// 人脸登入给前端返回账号和密码 /// /// 用户id /// 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 } }; } } }