From ee5e3a086a5dc145e7f5df3de32e0e072c183949 Mon Sep 17 00:00:00 2001 From: z8018 <1282578289@qq.com> Date: 星期五, 06 六月 2025 15:19:40 +0800 Subject: [PATCH] 1 --- project/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserFaceService.cs | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 214 insertions(+), 0 deletions(-) diff --git a/project/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserFaceService.cs b/project/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserFaceService.cs new file mode 100644 index 0000000..71addb8 --- /dev/null +++ b/project/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserFaceService.cs @@ -0,0 +1,214 @@ +锘� +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)) + { + // 浠嶮emoryStream鍒涘缓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("鏈壘鍒板尮閰嶇殑鐢ㄦ埛淇℃伅"); + } + } + else + { + return WebResponseContent.Instance.Error("鏈壘鍒板尮閰嶇殑浜鸿劯淇℃伅"); + } + } + 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 = "鐢ㄦ埛鏈櫥褰�" + }; + } + + 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(basePath)) + { + Directory.CreateDirectory(basePath); + } + + string fileName = $"face_{DateTime.Now.ToString("yyyyMMddHHmmssfff")}.jpg"; + string filePath = basePath + fileName; + // 浣跨敤瀛楄妭鏁扮粍鍒涘缓MemoryStream + using (MemoryStream ms = new MemoryStream(data)) + { + // 浠嶮emoryStream鍒涘缓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 + }; + } + } + + + } +} -- Gitblit v1.9.3