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