From 2623a84ddaeb38f5c8c6234a24980302b1ec550b Mon Sep 17 00:00:00 2001
From: yanjinhui <3306209981@qq.com>
Date: 星期四, 03 四月 2025 17:13:57 +0800
Subject: [PATCH] 添加人脸识别

---
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/BaiDuFaceHelper.cs                                   |  369 ++++++++++++++++++++
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/LoginInfo.cs                                          |   11 
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITelescopicService/IFaceRecognitionServer .cs               |   19 +
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/System/Sys_User.cs                             |   11 
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs             |   57 +++
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/System/AddUserDTO.cs                                    |   57 +++
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Telescopic/FaceRecognitionController .cs |   28 +
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_TelescopicService/FaceRecognitionServer.cs                  |   24 +
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/wwwroot/image/logo1.png                              |    0 
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj                             |    1 
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/Telescopic/Dt_FaceRecognition.cs               |   27 +
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserService.cs                           |  437 +++++++++++++++++++++++
 项目代码/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/HierarchyCache.v1.txt                        |    0 
 项目代码/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/ISys_UserService.cs                         |   26 +
 14 files changed, 1,055 insertions(+), 12 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/HierarchyCache.v1.txt" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/HierarchyCache.v1.txt"
index a26aa2e..ff0e5d5 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/HierarchyCache.v1.txt"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/v17/HierarchyCache.v1.txt"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/BaiDuFaceHelper.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/BaiDuFaceHelper.cs"
new file mode 100644
index 0000000..5f19dce
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/BaiDuFaceHelper.cs"
@@ -0,0 +1,369 @@
+锘縰sing Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_Common
+{
+    public class BaiDuFaceHelper
+    {
+        /// <summary>
+        /// 鑾峰彇AccessToken
+        /// </summary>
+        /// <returns></returns>
+        public static string GetAccessToken()
+        {
+            //string url = string.Format("https://aip.baidubce.com/oauth/2.0/token?client_id={0}&client_secret={1}&grant_type={2}", "TqFQHXSNt6Z7cPQ4vDBfBNjq", "0cli6I6s8JFz3qM1Czi5ciRpDqrJuVvm", "client_credentials");
+            //string returnStr = BDWebRequest(url, "", "POST");
+
+            //NLog.LogManager.GetCurrentClassLogger().Trace("鐧惧害浜鸿劯璇嗗埆杩斿洖锛�" + returnStr);
+            //BDToken token = JsonConvert.DeserializeObject<BDToken>(returnStr);
+            //token.getdate = DateTime.Now.ToString();
+
+            //return token.access_token;
+
+
+            var str = "24.83aee44079e5a27530bc72d5ec7049a3.2592000.1746152354.282335-118294290";
+            return str;
+        }
+
+        public static string BDWebRequest(string url, string data, string method)
+        {
+            try
+            {
+                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
+                request.Method = string.IsNullOrEmpty(method) ? "POST" : method.ToUpper();
+                request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22";
+                request.ServicePoint.Expect100Continue = false;
+                request.Timeout = 1000 * 60;
+                request.ContentType = "application/x-www-form-urlencoded";
+                if (!string.IsNullOrEmpty(method) && method.ToUpper() == "POST" && !string.IsNullOrEmpty(data))
+                {
+                    byte[] byteArray = Encoding.UTF8.GetBytes(data);
+                    request.ContentLength = byteArray.Length;
+                    using (Stream myRequestStream = request.GetRequestStream())
+                    {
+                        myRequestStream.Write(byteArray, 0, byteArray.Length);
+                    }
+                }
+                HttpWebResponse myHttpWebResponse = (HttpWebResponse)request.GetResponse();
+                using (Stream response = myHttpWebResponse.GetResponseStream())
+                {
+                    using (StreamReader reader = new StreamReader(response, Encoding.UTF8))
+                    {
+                        return reader.ReadToEnd();
+                    }
+                }
+            }
+            catch { return ""; }
+        }
+
+        
+        /// <summary>
+        /// 浜鸿劯妫�娴嬩笌灞炴�у垎鏋�
+        /// </summary>
+        /// <returns></returns>
+        public static string FaceDetect(string path)
+        {
+            string token = GetAccessToken();
+            string host = "https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token=" + token;
+            var imgbase64 = GetFileContentAsBase64(path);
+            Encoding encoding = Encoding.Default;
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
+            request.Method = "POST";
+            request.KeepAlive = true;
+            String str = "{\"image\":\""+ imgbase64 + "\",\"image_type\":\"BASE64\"}";
+            byte[] buffer = encoding.GetBytes(str);
+            request.ContentLength = buffer.Length;
+            request.GetRequestStream().Write(buffer, 0, buffer.Length);
+
+            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
+            string result = reader.ReadToEnd();
+
+            NLog.LogManager.GetCurrentClassLogger().Trace("浜鸿劯妫�娴嬩笌灞炴�у垎鏋愶細" + result);
+            return result;
+        }
+
+        /// <summary>
+        /// 鍒涘缓鐢ㄦ埛浜鸿劯璇嗗埆缁�
+        /// </summary>
+        /// <returns></returns>
+        public static string GroupAdd(string group)
+        {
+            string token = GetAccessToken();
+            string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add?access_token=" + token;
+            Encoding encoding = Encoding.Default;
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
+            request.Method = "post";
+            request.KeepAlive = true;
+            String str = "{\"group_id\":\""+ group + "\"}";
+            byte[] buffer = encoding.GetBytes(str);
+            request.ContentLength = buffer.Length;
+            request.GetRequestStream().Write(buffer, 0, buffer.Length);
+            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
+            string result = reader.ReadToEnd();
+            NLog.LogManager.GetCurrentClassLogger().Trace("鍒涘缓鐢ㄦ埛缁勶細" + result);
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏂囦欢base64缂栫爜
+        /// </summary>
+        /// <param name="path">鏂囦欢璺緞</param>
+        /// <returns>base64缂栫爜淇℃伅锛屼笉甯︽枃浠跺ご</returns>
+        //public static string GetFileContentAsBase64(string path)
+        //{
+        //    using (FileStream filestream = new FileStream(path, FileMode.Open))
+        //    {
+        //        byte[] arr = new byte[filestream.Length];
+        //        filestream.Read(arr, 0, (int)filestream.Length);
+        //        string base64 = Convert.ToBase64String(arr);
+        //        return base64;
+        //    }
+        //}
+        public static string GetFileContentAsBase64(string filePath)
+        {
+            // 鍙繚鐣欐枃浠跺悕锛岄伩鍏嶈矾寰勯敊璇�
+            string fileName = Path.GetFileName(filePath);
+
+            // 鑾峰彇鏂囦欢鐨勫畬鏁磋矾寰�
+            string fullPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image", fileName);
+
+            if (!File.Exists(fullPath))
+            {
+                throw new FileNotFoundException("鏂囦欢涓嶅瓨鍦細" + fullPath);
+            }
+
+            using (FileStream filestream = new FileStream(fullPath, FileMode.Open, FileAccess.Read))
+            {
+                byte[] arr = new byte[filestream.Length];
+                filestream.Read(arr, 0, arr.Length);
+                return Convert.ToBase64String(arr);
+            }
+        }
+
+
+
+        /// <summary>
+        /// 浜鸿劯娉ㄥ唽
+        /// </summary>
+        /// <returns></returns>
+        public static CreateUserResult AddUser(BDUserInfo info)
+        {
+            string token = GetAccessToken();
+            var imgbase64 = GetFileContentAsBase64(info.ImgPath);
+            string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add?access_token=" + token;
+            Encoding encoding = Encoding.Default;
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
+            request.Method = "POST";
+            request.KeepAlive = true;
+            String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
+            byte[] buffer = encoding.GetBytes(str);
+            request.ContentLength = buffer.Length;
+            request.GetRequestStream().Write(buffer, 0, buffer.Length);
+            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
+            string result = reader.ReadToEnd();
+
+            NLog.LogManager.GetCurrentClassLogger().Trace("浜鸿劯娉ㄥ唽锛�" + result);
+            CreateUserResult res= JsonConvert.DeserializeObject<CreateUserResult>(result);//闇�瑕佸皢log_id鍜宖ace_token淇濆瓨鍒扮敤鎴疯〃涓紝鍦ㄤ汉鑴稿垹闄や腑闇�瑕佺敤鍒�
+
+            return res;
+        }
+
+        /// <summary>
+        /// 浜鸿劯鍒犻櫎锛堝垹闄ょ敤鎴风殑鏌愪竴寮犱汉鑴革紝濡傛灉璇ョ敤鎴峰彧鏈変竴寮犱汉鑴稿浘鐗囷紝鍒欏悓鏃跺垹闄ょ敤鎴枫�傦級
+        /// </summary>
+        /// <returns></returns>
+        public static string DeleteUserImg(DeleteUserImg info)
+        {
+            string token = GetAccessToken();
+            string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete?access_token=" + token;
+            Encoding encoding = Encoding.Default;
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
+            request.Method = "POST";
+            request.KeepAlive = true;
+            String str = "{\"face_token\":\"" + info.face_token + "\",\"log_id\":\"" + info.log_id + "\",\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\"}";
+            byte[] buffer = encoding.GetBytes(str);
+            request.ContentLength = buffer.Length;
+            request.GetRequestStream().Write(buffer, 0, buffer.Length);
+            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
+            string result = reader.ReadToEnd();
+
+            NLog.LogManager.GetCurrentClassLogger().Trace("浜鸿劯鍒犻櫎锛�" + result);
+            return result;
+        }
+
+        /// <summary>
+        /// 鐢ㄦ埛鍒犻櫎
+        /// </summary>
+        /// <returns></returns>
+        public static string DeleteUser(DeleteUserImg info)
+        {
+            string token = GetAccessToken();
+            string host = "https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete?access_token=" + token;
+            Encoding encoding = Encoding.Default;
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
+            request.Method = "POST";
+            request.KeepAlive = true;
+            String str = "{\"group_id\":\"" + info.group_id + "\",\"user_id\":\"" + info.user_id + "\"}";
+            byte[] buffer = encoding.GetBytes(str);
+            request.ContentLength = buffer.Length;
+            request.GetRequestStream().Write(buffer, 0, buffer.Length);
+            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
+            string result = reader.ReadToEnd();
+
+            NLog.LogManager.GetCurrentClassLogger().Trace("鐢ㄦ埛鍒犻櫎锛�" + result);
+            return result;
+        }
+
+        /// <summary>
+        /// 浜鸿劯鎼滅储
+        /// </summary>
+        /// <returns></returns>
+        public static SearchResult FaceSearch(string path,string group_id_list)
+        {
+            string token = GetAccessToken();
+            var imgbase64 = GetFileContentAsBase64(path);
+
+            string host = "https://aip.baidubce.com/rest/2.0/face/v3/search?access_token=" + token;
+            Encoding encoding = Encoding.Default;
+            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(host);
+            request.Method = "POST";
+            request.KeepAlive = true;
+            String str = "{\"image\":\"" + imgbase64 + "\",\"image_type\":\"BASE64\",\"group_id_list\":\""+ group_id_list + "\",\"quality_control\":\"LOW\",\"liveness_control\":\"NORMAL\"}";
+            byte[] buffer = encoding.GetBytes(str);
+            request.ContentLength = buffer.Length;
+            request.GetRequestStream().Write(buffer, 0, buffer.Length);
+            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+            StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
+            string result = reader.ReadToEnd();
+
+            NLog.LogManager.GetCurrentClassLogger().Trace("浜鸿劯鎼滅储锛�" + result);
+            SearchResult searchResult = JsonConvert.DeserializeObject<SearchResult>(result);
+
+            return searchResult;
+        }
+
+    }
+
+    
+    /// <summary>
+    /// token鑾峰彇淇℃伅
+    /// </summary>
+    public class BDToken
+    {
+        /// <summary>
+        /// 璁よ瘉token
+        /// </summary>
+        public string access_token { get; set; }
+        /// <summary>
+        /// Access Token鐨勬湁鏁堟湡(绉掍负鍗曚綅锛屾湁鏁堟湡30澶�)
+        /// </summary>
+        public int expires_in { get; set; }
+        /// <summary>
+        /// 鑾峰彇鏃堕棿
+        /// </summary>
+        public string getdate { get; set; }
+    }
+
+    /// <summary>
+    /// 浜鸿劯娉ㄥ唽淇℃伅
+    /// </summary>
+    public class BDUserInfo
+    {
+        /// <summary>
+        /// 鍥剧墖璺緞(鎬绘暟鎹ぇ灏忓簲灏忎簬10M锛屽垎杈ㄧ巼搴斿皬浜�1920*1080)
+        /// </summary>
+        public string ImgPath { get; set; }
+        /// <summary>
+        /// 鐢ㄦ埛缁刬d锛屾爣璇嗕竴缁勭敤鎴凤紙鐢辨暟瀛椼�佸瓧姣嶃�佷笅鍒掔嚎缁勬垚锛夛紝闀垮害闄愬埗48B
+        /// </summary>
+        public string group_id { get; set; }
+        /// <summary>
+        /// 鐢ㄦ埛id锛堢敱鏁板瓧銆佸瓧姣嶃�佷笅鍒掔嚎缁勬垚锛夛紝瀵瑰簲绯荤粺璐﹀彿
+        /// </summary>
+        public string user_id { get; set; }
+    }
+    /// <summary>
+    /// 浜鸿劯娉ㄥ唽鏃惰繑鍥炲璞�
+    /// </summary>
+    public class CreateUserResult
+    {
+        /// <summary>
+        /// 妫�绱㈡垚鍔熻繑鍥�0
+        /// </summary>
+        public int error_code { get; set; }
+        public string error_msg { get; set; }
+        /// <summary>
+        /// 璇锋眰鏍囪瘑鐮侊紝闅忔満鏁帮紝鍞竴
+        /// </summary>
+        public string log_id {  get; set; }
+        public CreateUser result { get; set; }
+    }
+    public class CreateUser
+    {
+        /// <summary>
+        /// 浜鸿劯鍥剧墖鐨勫敮涓�鏍囪瘑
+        /// </summary>
+        public string face_token {  get; set; }
+    }
+
+    /// <summary>
+    /// 浜鸿劯鎼滅储鏃惰繑鍥炵殑瀵硅薄
+    /// </summary>
+    public class SearchResult
+    {
+        /// <summary>
+        /// 妫�绱㈡垚鍔熻繑鍥�0
+        /// </summary>
+        public int error_code { get; set; }
+        public string error_msg { get; set;}
+        public UserResult result { get; set;}
+        
+    }
+    public class UserResult
+    {
+        public string face_token {  get; set; }
+        public List<User_List> user_list { get; set;}
+    }
+    public class User_List
+    {
+        public string user_id { get; set; }
+        /// <summary>
+        /// 鐢ㄦ埛鐨勫尮閰嶅緱鍒�,80鍒嗕互涓婂彲浠ュ垽鏂负鍚屼竴浜�
+        /// </summary>
+        public string score { get; set;}
+    }
+    /// <summary>
+    /// 浜鸿劯鍒犻櫎鐨勫叆鍙傚璞★紙鍙垹闄ゆ煇涓�寮犲浘鐗囷紝濡傛灉璇ョ敤鎴峰彧鏈変竴寮犲浘鐗囷紝閭h鐢ㄦ埛鏁翠綋鍒犻櫎
+    /// </summary>
+    public class DeleteUserImg
+    {
+        /// <summary>
+        /// 璇锋眰鏍囪瘑鐮侊紝闅忔満鏁帮紝鍞竴
+        /// </summary>
+        public int log_id { get; set;}
+        /// <summary>
+        /// 鐢ㄦ埛id锛堢敱鏁板瓧銆佸瓧姣嶃�佷笅鍒掔嚎缁勬垚锛夛紝闀垮害闄愬埗48B
+        /// </summary>
+        //public string user_id { get; set;}
+        public string user_id { get; set;}
+        /// <summary>
+        /// 鐢ㄦ埛缁刬d锛堢敱鏁板瓧銆佸瓧姣嶃�佷笅鍒掔嚎缁勬垚锛� 闀垮害闄愬埗48B锛屽垹闄ゆ寚瀹歡roup_id涓殑user_id淇℃伅
+        /// </summary>
+        public string group_id { get; set;}
+        /// <summary>
+        /// 闇�瑕佸垹闄ょ殑浜鸿劯鍥剧墖token锛岋紙鐢辨暟瀛椼�佸瓧姣嶃�佷笅鍒掔嚎缁勬垚锛夐暱搴﹂檺鍒�64B
+        /// </summary>
+        public string face_token { get; set;}
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj"
index f958b97..dcc8804 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj"
@@ -8,6 +8,7 @@
 
   <ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
+    <PackageReference Include="NLog" Version="5.4.0" />
   </ItemGroup>
 
 </Project>
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/System/AddUserDTO.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/System/AddUserDTO.cs"
new file mode 100644
index 0000000..ec3c6c2
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_DTO/System/AddUserDTO.cs"
@@ -0,0 +1,57 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WIDESEAWCS_DTO.SerialPort
+{
+    public class AddUserDTO
+    {
+        /// <summary>
+        /// 鐢ㄦ埛id鐢ㄦ潵淇敼
+        /// </summary>
+        public int id { get; set; }
+
+        public string  username { get; set; }
+
+        public string usertruename { get; set; }
+
+        /// <summary>
+        /// 鐧惧害浜戝垎缁�
+        /// </summary>
+      //  public int log_id { get; set; }
+
+
+        public string  phoneno { get; set; }
+
+        /// <summary>
+        /// 缁勫埆
+        /// </summary>
+        public int roleid { get; set; }
+
+        /// <summary>
+        /// 鐢ㄦ埛绫诲埆
+        /// </summary>
+        public string rolename { get; set; }
+
+        /// <summary>
+        /// 鏄惁鍚敤
+        /// </summary>
+        public  byte    enable { get; set; }
+
+
+        /// <summary>
+        /// 涓婁紶鍥剧墖鍚�
+        /// </summary>
+        public string?path { get; set; }
+
+
+        /// <summary>
+        /// 鍥剧墖token
+        /// </summary>
+        //public string ?face_token { get; set; }
+
+        
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/ISys_UserService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/ISys_UserService.cs"
index 86ea1a9..288a4a8 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/ISys_UserService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_ISystemServices/ISys_UserService.cs"
@@ -45,5 +45,31 @@
         /// <param name="files"></param>
         /// <returns></returns>
         WebResponseContent SaveFiles(IFormCollection files);
+
+        /// <summary>
+        /// 娣诲姞鐢ㄦ埛
+        /// </summary>
+        /// <param name="addUserDTO"></param>
+        /// <returns></returns>
+        WebResponseContent AdduserData(AddUserDTO addUserDTO);
+
+        WebResponseContent UpuserData(AddUserDTO addUserDTO);
+
+        WebResponseContent DeleteUserData(string userAccount);
+
+        /// <summary>
+        /// 娓呯悊鏁版嵁搴撲腑娌℃湁浣跨敤鐨勫浘鐗�
+        /// </summary>
+        /// <returns></returns>
+        WebResponseContent CleanUnusedImages();
+
+
+        /// <summary>
+        /// 淇濆瓨浜鸿劯鐧诲叆鏃剁殑鍥剧墖
+        /// </summary>
+        /// <param name="files"></param>
+        /// <returns></returns>
+        WebResponseContent SaveFaceFiles(IFormCollection files);
+
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITelescopicService/IFaceRecognitionServer .cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITelescopicService/IFaceRecognitionServer .cs"
new file mode 100644
index 0000000..d12d722
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_ITelescopicService/IFaceRecognitionServer .cs"
@@ -0,0 +1,19 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.BaseRepository;
+using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_DTO.Telescopic;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_ITaskInfoService
+{
+    public interface IFaceRecognitionServer : IService<Dt_FaceRecognition>
+    {
+        IRepository<Dt_FaceRecognition> Repository { get; }
+      
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/LoginInfo.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/LoginInfo.cs"
index dc90d24..54f2045 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/LoginInfo.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/LoginInfo.cs"
@@ -11,5 +11,16 @@
         public string UserName { get; set; }
 
         public string Password { get; set; }
+
+        /// <summary>
+        /// 浜鸿劯璇嗗埆
+        /// </summary>
+        public string? path { get; set; }
+
+
+        /// <summary>
+        /// 鐧惧害浜戝垎缁刦ace琛ㄤ腑鐨凣roupid
+        /// </summary>
+        //public string? groupid { get; set; }
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/System/Sys_User.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/System/Sys_User.cs"
index 5e09974..b5e48cd 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/System/Sys_User.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/System/Sys_User.cs"
@@ -29,6 +29,17 @@
         public string UserName { get; set; }
 
         /// <summary>
+        /// 浜鸿劯璇嗗埆缁�
+        /// </summary>
+        [SugarColumn(IsNullable = true, ColumnDescription = "浜鸿劯璇嗗埆缁�")]
+        public string Log_id { get; set; }
+
+        /// <summary>
+        /// 浜鸿劯璇嗗埆token
+        /// </summary>
+        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "浜鸿劯璇嗗埆token")]
+        public string Face_token { get; set; }
+        /// <summary>
         ///鍗″彿
         /// </summary>
         [SugarColumn( IsNullable = true, ColumnDescription = "鍗″彿")]
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/Telescopic/Dt_FaceRecognition.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/Telescopic/Dt_FaceRecognition.cs"
new file mode 100644
index 0000000..f09b4a7
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Model/Models/Telescopic/Dt_FaceRecognition.cs"
@@ -0,0 +1,27 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using SqlSugar;
+using WIDESEAWCS_Core.DB.Models;
+using WIDESEAWCS_Core.Tenants;
+
+namespace WIDESEAWCS_Model.Models
+{
+    [SugarTable("Dt_FaceRecognition", "浜鸿劯璇嗗埆琛�"), MultiTenant]
+    public class Dt_FaceRecognition:BaseEntity
+    {
+        /// <summary>
+        /// id
+        /// </summary>
+        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "涓婚敭")]
+        public int ID { get; set; }
+
+        /// <summary>
+        /// 浜鸿劯璇嗗埆缁�
+        /// </summary>
+        [SugarColumn(IsNullable = true, Length = 50, ColumnDescription = "浜鸿劯璇嗗埆缁�")]
+        public string GroupID { get; set; }
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs"
index 657bdf4..66a2e06 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs"
@@ -65,6 +65,8 @@
 
             return new { result = false };
         }
+
+
         [HttpPost, Route("login"), AllowAnonymous]
         public IActionResult Login([FromBody] LoginInfo loginInfo)
         {
@@ -169,6 +171,61 @@
 
         }
 
+        /// <summary>
+        /// 娣诲姞鐢ㄦ埛
+        /// </summary>
+        /// <param name="addUserDTO"></param>
+        /// <returns></returns>
+        [HttpPost, Route("AdduserData"), AllowAnonymous]
+        public WebResponseContent AdduserData([FromBody] AddUserDTO addUserDTO)
+        {
+            return Service.AdduserData(addUserDTO);
+        }
+
+        /// <summary>
+        /// 鏇存柊鐢ㄦ埛
+        /// </summary>
+        /// <param name="addUserDTO"></param>
+        /// <returns></returns>
+        [HttpPost, Route("UpuserData"), AllowAnonymous]
+        public WebResponseContent UpuserData([FromBody] AddUserDTO addUserDTO)
+        {
+            return Service.UpuserData(addUserDTO);
+        }
+
+        /// <summary>
+        /// 鍒犻櫎鐢ㄦ埛
+        /// </summary>
+        /// <param name="deleteUserDTO"></param>
+        /// <returns></returns>
+        [HttpPost, Route("DeleteUserData"), AllowAnonymous]
+        public WebResponseContent DeleteUserData(string userAccount)
+        {
+            return Service.DeleteUserData(userAccount);
+        }
+
+
+        /// <summary>
+        /// 鐧诲叆鍚庢竻闄よ繖娆″叏閮ㄨ皟鐢⊿aveFaceFiles鏂规硶鐨勫浘鐗�
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet, Route("CleanUnusedImages"), AllowAnonymous]
+        public WebResponseContent CleanUnusedImages()
+        {
+            return Service.CleanUnusedImages();
+        }
+
+        /// <summary>
+        ///浜鸿劯鐧诲叆鏃惰皟鐢ㄨ鏂规硶涓婁紶鍥剧墖
+        /// </summary>
+        /// <param name="files"></param>
+        /// <returns></returns>
+        [HttpPost, Route("SaveFaceFiles"), AllowAnonymous]
+        public WebResponseContent SaveFaceFiles(IFormCollection files)
+        {
+            return Service.SaveFaceFiles(files);
+        }
+
     }
 
     public class SwaggerLoginRequest
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Telescopic/FaceRecognitionController .cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Telescopic/FaceRecognitionController .cs"
new file mode 100644
index 0000000..37c6c25
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/Controllers/Telescopic/FaceRecognitionController .cs"
@@ -0,0 +1,28 @@
+锘縰sing Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Hosting.Server;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.BaseController;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_DTO.Telescopic;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_TaskInfoService;
+
+
+namespace WIDESEAWCS_Server.Controllers.SerialPort
+{
+    [Route("api/[controller]")]
+    [ApiController]
+    public class FaceRecognitionController : ApiBaseController<IFaceRecognitionServer, Dt_FaceRecognition>
+    {
+        public FaceRecognitionController(IFaceRecognitionServer service) : base(service)
+        {
+           
+        }
+
+
+
+    }
+}
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/wwwroot/image/logo1.png" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/wwwroot/image/logo1.png"
new file mode 100644
index 0000000..ec0eca7
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_Server/wwwroot/image/logo1.png"
Binary files differ
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserService.cs"
index 51e3048..c20cabf 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_SystemServices/Sys_UserService.cs"
@@ -12,6 +12,8 @@
 using WIDESEAWCS_Core.Caches;
 using WIDESEAWCS_DTO.SerialPort;
 using Microsoft.AspNetCore.Http;
+using Newtonsoft.Json;
+using WIDESEAWCS_Common;
 
 namespace WIDESEAWCS_SystemServices
 {
@@ -20,21 +22,91 @@
         private readonly IUnitOfWorkManage _unitOfWorkManage;
         private readonly ICacheService _cacheService;
         private readonly ISys_MenuService _menuService;
-        public Sys_UserService(IRepository<Sys_User> repository, IUnitOfWorkManage unitOfWorkManage, ICacheService cacheService, ISys_MenuService menuService) : base(repository)
+        private readonly IRepository<Dt_FaceRecognition> _faceServer;
+        private readonly IRepository<Dt_Loginhsy> _LoginhsyServer;
+        public Sys_UserService(IRepository<Dt_Loginhsy> LoginhsyServer,IRepository<Dt_FaceRecognition> faceServer, IRepository<Sys_User> repository, IUnitOfWorkManage unitOfWorkManage, ICacheService cacheService, ISys_MenuService menuService) : base(repository)
         {
+            _faceServer = faceServer;
+            _LoginhsyServer = LoginhsyServer;
             _unitOfWorkManage = unitOfWorkManage;
             _cacheService = cacheService;
             _menuService = menuService;
+
         }
 
+
+
+        #region
+        //public WebResponseContent Login(LoginInfo loginInfo)
+        //{
+        //    WebResponseContent content = new WebResponseContent();
+        //    try
+        //    {
+        //        //BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
+
+        //        string msg = string.Empty;
+
+        //        #region 涓存椂浣跨敤
+        //        try
+        //        {
+        //            loginInfo.Password = loginInfo.Password.EncryptDES(AppSecret.User);
+        //        }
+        //        catch
+        //        {
+
+        //        }
+        //        #endregion
+
+        //        UserInfo user = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName && x.UserPwd == loginInfo.Password, x => new UserInfo { HeadImageUrl = x.HeadImageUrl, RoleId = x.Role_Id, TenantId = x.TenantId, UserId = x.User_Id, UserName = x.UserName, UserTrueName = x.UserTrueName });
+        //        if (user != null)
+        //        {
+        //            object obj = _menuService.GetMenuActionList(user.RoleId);
+        //            if (obj is not IEnumerable<object> list)
+        //            {
+        //                return WebResponseContent.Instance.Error("鏃犵櫥褰曟潈闄�");
+        //            }
+        //            if (!list.Any())
+        //            {
+        //                return WebResponseContent.Instance.Error("鏃犵櫥褰曟潈闄�");
+        //            }
+
+        //            string token = JwtHelper.IssueJwt(new TokenModelJwt()
+        //            {
+        //                UserId = user.UserId,
+        //                RoleId = user.RoleId,
+        //                UserName = user.UserName,
+        //                TenantId = user.TenantId,
+        //            });
+
+                 // _cacheService.AddOrUpdate(user.UserId.ToString(), token);
+
+        //            content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl,ID=user.UserId });
+        //        }
+        //        else
+        //        {
+        //            content = WebResponseContent.Instance.Error("璐﹀彿鎴栧瘑鐮侀敊璇�");
+        //        }
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        content = WebResponseContent.Instance.Error(ex.Message);
+        //    }
+
+        //    return content;
+        //}
+        #endregion
+
+        /// <summary>
+        /// 浜鸿劯璇嗗埆鐧诲叆鎺ュ彛
+        /// </summary>
+        /// <param name="loginInfo"></param>
+        /// <returns></returns>
         public WebResponseContent Login(LoginInfo loginInfo)
         {
             WebResponseContent content = new WebResponseContent();
             try
             {
-                //BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
-
-                string msg = string.Empty;
+                //string msg = string.Empty;
 
                 #region 涓存椂浣跨敤
                 try
@@ -43,23 +115,74 @@
                 }
                 catch
                 {
-
                 }
                 #endregion
+                // 鍏堣幏鍙栫敤鎴蜂俊鎭�
+                UserInfo user = null;
+                if (!string.IsNullOrEmpty(loginInfo.path))
+                {
+                    // 浜鸿劯璇嗗埆鐧诲綍
+                    var groupId = _faceServer.QueryData().Select(x => x.GroupID).FirstOrDefault();
+                    if (groupId == null)
+                    {
+                        return WebResponseContent.Instance.Error("娌℃壘鍒拌浜鸿劯璇嗗埆鍒嗙粍");
+                    }
 
-                UserInfo user = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName && x.UserPwd == loginInfo.Password, x => new UserInfo { HeadImageUrl = x.HeadImageUrl, RoleId = x.Role_Id, TenantId = x.TenantId, UserId = x.User_Id, UserName = x.UserName, UserTrueName = x.UserTrueName });
+                    var faceResult = BaiDuFaceHelper.FaceSearch(loginInfo.path, groupId);
+                    if (faceResult != null && faceResult.error_code == 0)
+                    {
+                        var bestMatch = faceResult.result.user_list.OrderByDescending(u => u.score).FirstOrDefault();
+                        string usercount = bestMatch.user_id;
+                        if (bestMatch != null && double.TryParse(bestMatch.score, out double score) && score > 80)
+                        {
+                            //鐢ㄨ瘑鍒埌鐨� user_id 鏉ヨ幏鍙栫敤鎴蜂俊鎭�
+                            var faceuser = BaseDal.QueryData(x => x.UserName == usercount).FirstOrDefault(); // 鑾峰彇鍖归厤鐨勭涓�涓敤鎴�
+                            if (faceuser != null)
+                            {
+                                // 鎵嬪姩灏� Sys_User 鏄犲皠鍒� UserInfo
+                                user = new UserInfo
+                                {
+                                    UserId = faceuser.User_Id,
+                                    UserName = faceuser.UserName,
+                                    UserTrueName = faceuser.UserTrueName,
+                                    HeadImageUrl = faceuser.HeadImageUrl,
+                                    RoleId = faceuser.Role_Id,
+                                    TenantId = faceuser.TenantId,
+                                };
+                            }
+                        }
+
+                        if (user == null)
+                        {
+                            return WebResponseContent.Instance.Error("浜鸿劯璇嗗埆澶辫触锛岃閲嶈瘯");
+                        }
+                        loginInfo.UserName = user.UserName;
+                    }
+                }
+                else
+                {
+                    // 瀵嗙爜鐧诲綍
+                    user = GetUserInfo(loginInfo.UserName, loginInfo.Password);
+                }
+
+                // 濡傛灉鎵惧埌鐢ㄦ埛
                 if (user != null)
                 {
-                    object obj = _menuService.GetMenuActionList(user.RoleId);
-                    if (obj is not IEnumerable<object> list)
+
+                    var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
+                    if (disbled.Enable != 1)
                     {
-                        return WebResponseContent.Instance.Error("鏃犵櫥褰曟潈闄�");
+                        return WebResponseContent.Instance.Error("浣犵殑璐﹀彿宸茶绂佺敤锛岃鑱旂郴绠$悊鍛�");
                     }
-                    if (!list.Any())
+
+                    // 鑾峰彇瑙掕壊鏉冮檺
+                    object obj = _menuService.GetMenuActionList(user.RoleId);
+                    if (obj is not IEnumerable<object> list || !list.Any())
                     {
                         return WebResponseContent.Instance.Error("鏃犵櫥褰曟潈闄�");
                     }
 
+                    // 鐢熸垚 JWT Token
                     string token = JwtHelper.IssueJwt(new TokenModelJwt()
                     {
                         UserId = user.UserId,
@@ -68,9 +191,27 @@
                         TenantId = user.TenantId,
                     });
 
-                    _cacheService.AddOrUpdate(user.UserId.ToString(), token);
+                    // 璁板綍鐧诲綍鍘嗗彶
+                    var loghis = new Dt_Loginhsy
+                    {
+                        UserName = user.UserName,
+                        LoginTiem =DateTime.Now,
+                        CreateDate = DateTime.Now
+                    };
 
-                    content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl,ID=user.UserId });
+                    // 淇濆瓨鐢ㄦ埛鐧诲綍淇℃伅
+                    _cacheService.AddOrUpdate(user.UserId.ToString(), token);
+                    _LoginhsyServer.AddData(loghis);
+
+                    // 杩斿洖鍝嶅簲
+                    content = WebResponseContent.Instance.OK(data: new
+                    {
+                        token,
+                        userName = user.UserTrueName,
+                        img = user.HeadImageUrl,
+                        ID = user.UserId,
+                        RoleId = user.RoleId
+                    });
                 }
                 else
                 {
@@ -303,5 +444,277 @@
                 return new WebResponseContent { Status = false, Message = "涓婁紶鏂囦欢澶辫触锛�" + ex.Message };
             }
         }
+
+
+        /// <summary>
+        /// 娣诲姞鐢ㄦ埛
+        /// </summary>
+        /// <param name="addUserDTO"></param>
+        /// <returns></returns>
+        public WebResponseContent AdduserData(AddUserDTO addUserDTO)
+        {
+            try
+            {
+                if (addUserDTO == null)
+                {
+                    return new WebResponseContent { Status = false, Message = "璇锋眰鏁版嵁涓虹┖锛屽彲鑳芥槸 JSON 瑙f瀽澶辫触" };
+                }
+
+                var list = BaseDal.QueryData(a => a.UserName == addUserDTO.username).FirstOrDefault();
+                if (list != null)
+                {
+                    return new WebResponseContent { Status = false, Message = "璐﹀彿閲嶅锛岃閲嶆柊褰曞叆" };
+                }
+                var face = _faceServer.QueryData().Select(x => x.GroupID).FirstOrDefault(); ;
+                var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo
+                {
+                    ImgPath = addUserDTO.path,
+                    user_id = addUserDTO.username,
+                    group_id = face // 杩欓噷搴旇濉櫨搴︿汉鑴稿簱鍒嗙粍
+                                    // group_id = baiduResult.result.log_id
+                });
+
+
+                // 鍒ゆ柇鐧惧害杩斿洖鏄惁鎴愬姛
+                if (baiduResult == null || baiduResult.error_code != 0)
+                {
+                    return new WebResponseContent { Status = false, Data = "浜鸿劯娉ㄥ唽澶辫触锛�" + baiduResult.error_msg };
+
+
+                }
+
+                // 鍒涘缓鐢ㄦ埛鏁版嵁
+                var sys = new Sys_User
+                {
+                    UserName = addUserDTO.username,
+                    UserTrueName = addUserDTO.usertruename,
+                    HeadImageUrl = addUserDTO.path,
+                    Log_id = baiduResult.log_id,
+                    Face_token = baiduResult.result.face_token,
+                    PhoneNo = addUserDTO.phoneno,
+                    Role_Id = addUserDTO.roleid,
+                    RoleName = addUserDTO.rolename,
+                    Enable = addUserDTO.enable,
+                    UserPwd = "j79rYYvCz4vdhcboB1Ausg==",
+                    CreateDate = DateTime.Now
+                };
+                BaseDal.AddData(sys);
+                return new WebResponseContent { Status = true, Data = sys };
+            }
+            catch (Exception ex)
+            {
+
+                return new WebResponseContent { Status = false, Message = "澶辫触" + ex };
+            }
+
+        }
+
+
+        /// <summary>
+        /// 鏇存柊鐢ㄦ埛
+        /// </summary>
+        /// <param name="addUserDTO"></param>
+        /// <returns></returns>
+        public WebResponseContent UpuserData(AddUserDTO addUserDTO)
+        {
+            try
+            {
+                // 1. 鏌ヨ鐢ㄦ埛
+                var sys = BaseDal.QueryData(x => x.User_Id == addUserDTO.id).FirstOrDefault();
+                if (sys == null)
+                {
+                    return new WebResponseContent { Status = false, Message = "娌℃壘鍒拌鐢ㄦ埛" };
+                }
+
+                // 2. 鏌ヨ浜鸿劯搴撳垎缁� ID
+                var faceGroupID = _faceServer.QueryData().Select(x => x.GroupID).FirstOrDefault();
+
+                // 3. 鍒ゆ柇鏄惁闇�瑕佹洿鏂颁汉鑴镐俊鎭�
+                string faceToken = null;
+                if (!string.IsNullOrEmpty(addUserDTO.path)) // 鍙湁浼犱簡鏂板浘鐗囷紝鎵嶆洿鏂颁汉鑴镐俊鎭�
+                {
+                    var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo
+                    {
+                        ImgPath = addUserDTO.path,
+                        user_id = addUserDTO.username,
+                        group_id = faceGroupID // 杩欓噷搴旇濉櫨搴︿汉鑴稿簱鍒嗙粍
+                    });
+
+                    // 4. 鍒ゆ柇鐧惧害 API 鏄惁鎴愬姛
+                    if (baiduResult == null || baiduResult.error_code != 0)
+                    {
+                        return new WebResponseContent { Status = false, Message = "璇ュ浘鐗囦篃瀛樺湪锛屼笉瑕侀噸澶嶄笂浼狅細" + baiduResult.error_msg };
+                    }
+
+                    // 5. 鍙湁褰撲笂浼犱簡鏂板浘鐗囧苟鎴愬姛鏃讹紝鎵嶆洿鏂拌繖浜涘瓧娈�
+                    faceToken = baiduResult.result.face_token;
+                    sys.Log_id = baiduResult.log_id;
+                    sys.HeadImageUrl = addUserDTO.path;
+                }
+
+                // 6. 鏇存柊鐢ㄦ埛鍏朵粬淇℃伅
+                sys.UserName = addUserDTO.username;
+                sys.UserTrueName = addUserDTO.usertruename;
+                sys.Face_token = faceToken ?? sys.Face_token; // 鍙湁褰� faceToken 鏈夊�兼椂鎵嶆洿鏂帮紝鍚﹀垯淇濇寔鍘熷��
+                sys.PhoneNo = addUserDTO.phoneno;
+                sys.Role_Id = addUserDTO.roleid;
+                sys.RoleName = addUserDTO.rolename;
+                sys.Enable = addUserDTO.enable;
+
+                // 7. 鏇存柊鏁版嵁搴�
+                BaseDal.UpdateData(sys);
+
+                return new WebResponseContent { Status = true, Data = sys };
+            }
+            catch (Exception ex)
+            {
+                return new WebResponseContent { Status = false, Message = "澶辫触锛�" + ex.Message };
+            }
+        }
+
+
+
+
+        /// <summary>
+        /// 鍒犻櫎
+        /// </summary>
+        /// <param name="deleteUserDTO"></param>
+        /// <returns></returns>
+        public WebResponseContent DeleteUserData(string account)
+        {
+            try
+            {
+
+                // 2. 鏌ヨ浜鸿劯搴撳垎缁� ID
+                var faceGroupID = _faceServer.QueryData().Select(x => x.GroupID).FirstOrDefault();
+
+                WIDESEAWCS_Common.DeleteUserImg deleteUserImg = new WIDESEAWCS_Common.DeleteUserImg();
+                deleteUserImg.group_id = faceGroupID;
+                deleteUserImg.user_id = account;
+
+                string apiResult = BaiDuFaceHelper.DeleteUser(deleteUserImg);//鍙缁檛oken鍜宭og_id
+
+                // 2. 瑙f瀽杩斿洖缁撴灉锛屽垽鏂垹闄ゆ槸鍚︽垚鍔�
+                dynamic resultObj = JsonConvert.DeserializeObject(apiResult);
+                if (resultObj.error_code == 0)
+                {
+                    // 鐧惧害鍒犻櫎鎴愬姛鍚庯紝鍒犻櫎鏁版嵁搴撲腑鐨勭敤鎴�
+                    var user = BaseDal.QueryData(x => x.UserName == account);
+                    if (user != null)
+                    {
+                        BaseDal.DeleteData(user);
+                    }
+                    return WebResponseContent.Instance.OK("鐢ㄦ埛鍒犻櫎鎴愬姛");
+                }
+                else
+                {
+                    return WebResponseContent.Instance.Error("鐧惧害 API 鍒犻櫎澶辫触锛�" + resultObj.error_msg);
+                }
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error("鍒犻櫎鐢ㄦ埛澶辫触锛�" + ex.Message);
+            }
+        }
+
+
+        public WebResponseContent SaveFaceFiles(IFormCollection files)
+        {
+            if (files == null || files.Files.Count == 0)
+                return new WebResponseContent { Status = false, Message = "璇蜂笂浼犳枃浠�" };
+
+            // 1. 纭繚瀛樺偍鐩綍瀛樺湪
+            string baseDirectory = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "UploadfaceImage");
+            if (!Directory.Exists(baseDirectory))
+                Directory.CreateDirectory(baseDirectory);
+
+            try
+            {
+                var file = files.Files[0]; // 鍙鐞嗙涓�涓枃浠�
+                string fileName = file.FileName; // 鐩存帴浣跨敤鍓嶇鐨勬枃浠跺悕
+
+                string fullFilePath = Path.Combine(baseDirectory, fileName);
+
+                // 2. 淇濆瓨鏂囦欢锛堝鏋滃瓨鍦紝鍒欒鐩栵級
+                using (var stream = new FileStream(fullFilePath, FileMode.Create))
+                {
+                    file.CopyTo(stream);
+                }
+
+                // 3. 杩斿洖鏂囦欢鍚�
+                return new WebResponseContent { Status = true, Message = "鏂囦欢涓婁紶鎴愬姛", Data = fileName };
+            }
+            catch (Exception ex)
+            {
+                return new WebResponseContent { Status = false, Message = "涓婁紶鏂囦欢澶辫触锛�" + ex.Message };
+            }
+        }
+
+
+        /// <summary>
+        /// 鍒犻櫎鏁版嵁搴撲腑娌℃湁浣跨敤鐨勫浘鐗�
+        /// </summary>
+        /// <returns></returns>
+        /// <exception cref="NotImplementedException"></exception>
+        public WebResponseContent CleanUnusedImages()
+        {
+            try
+            {
+                // 鑾峰彇鏂囦欢鐨勫畬鏁磋矾寰�
+                string pathimage = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot", "image");
+
+                // 濡傛灉鏂囦欢澶逛笉瀛樺湪锛岃繑鍥為敊璇俊鎭�
+                if (!Directory.Exists(pathimage))
+                {
+                    return new WebResponseContent { Status = false, Message = "鍥剧墖鏂囦欢澶逛笉瀛樺湪" };
+                }
+
+                // **浣跨敤 HashSet 鎻愰珮鏌ユ壘鏁堢巼**
+                var userImageSet = BaseDal.QueryData(x => !string.IsNullOrEmpty(x.HeadImageUrl))
+                                          .Select(x => x.HeadImageUrl)
+                                          .ToHashSet(); // **鎻愬崌鏌ヨ閫熷害**
+
+                // 鑾峰彇鏂囦欢澶逛腑鐨勬墍鏈夊浘鐗囨枃浠讹紙鏂囦欢鍚嶏級
+                var imageFiles = Directory.GetFiles(pathimage)
+                                          .Select(Path.GetFileName)
+                                          .ToList();
+
+                int deletedCount = 0;
+                foreach (var file in imageFiles)
+                {
+                    // **HashSet 鏌ヨ O(1)**
+                    if (!userImageSet.Contains(file))
+                    {
+                        string filePath = Path.Combine(pathimage, file);
+                        try
+                        {
+                            File.Delete(filePath);
+                            deletedCount++;
+                        }
+                        catch (Exception ex)
+                        {
+                            Console.WriteLine($"鏃犳硶鍒犻櫎鏂囦欢 {file}: {ex.Message}");
+                        }
+                    }
+                }
+
+                return new WebResponseContent { Status = true, Message = $"娓呯悊瀹屾垚锛屽垹闄や簡 {deletedCount} 寮犳湭浣跨敤鐨勫浘鐗�" };
+            }
+            catch (Exception ex)
+            {
+                return new WebResponseContent { Status = false, Message = $"娓呯悊澶辫触: {ex.Message}" };
+            }
+    }
+
+        /// <summary>
+        /// GetUserInfo鐧诲叆鏂规硶
+        /// </summary>
+        /// <param name="userName"></param>
+        /// <param name="password"></param>
+        /// <returns></returns>
+        public UserInfo GetUserInfo(string userName, string password)
+        {
+            return BaseDal.QueryFirst(x => x.UserName == userName && x.UserPwd == password, x => new UserInfo { HeadImageUrl = x.HeadImageUrl, RoleId = x.Role_Id, TenantId = x.TenantId, UserId = x.User_Id, UserName = x.UserName, UserTrueName = x.UserTrueName });
+        }
     }
 }
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TelescopicService/FaceRecognitionServer.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TelescopicService/FaceRecognitionServer.cs"
new file mode 100644
index 0000000..96b972e
--- /dev/null
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WIDESEAWCS_Server/WIDESEAWCS_TelescopicService/FaceRecognitionServer.cs"
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.BaseRepository;
+using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+
+namespace WIDESEAWCS_TelescopicService
+{
+    public class FaceRecognitionServer : ServiceBase<Dt_FaceRecognition, IRepository<Dt_FaceRecognition>>, IFaceRecognitionServer
+    {
+        public IRepository<Dt_FaceRecognition> Repository => BaseDal;
+        public FaceRecognitionServer(IRepository<Dt_FaceRecognition> BaseDal) : base(BaseDal)
+        {
+
+        }
+
+
+    }
+}

--
Gitblit v1.9.3