yanjinhui
2025-04-01 8ea14f10bfd3ed7a6b445d53feeb399b6bcf5d78
人脸识别
已修改9个文件
已添加17个文件
627 ■■■■■ 文件已修改
项目代码/WIDESEAWCS_Server 正式/ISerialPortRepository/IFaceRecognitionRepository.cs 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/ISerialPortService/IFaceRecognitionServer .cs 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/SerialPortRepository/FaceRecognitionRepository.cs 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/SerialPortService/FaceRecognitionServer .cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Common/BaiDuFaceHelper.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_DTO/SerialPort/AddUserDTO.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_DTO/SerialPort/PaginationDTO.cs 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_DTO/SerialPort/UserDTO.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_ISystemServices/ISys_UserService.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Model/LoginInfo.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Model/Models/SerialPort/Dt_FaceRecognition.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Model/Models/System/Sys_User.cs 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/Controllers/SerialPort/ArticleInfomController.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/Controllers/SerialPort/FaceRecognitionController .cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492051182.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492244242.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492263811.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492568523.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492760375.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492791698.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492809549.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/1743492833343.png 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_Server/wwwroot/image/files 补丁 | 查看 | 原始文档 | blame | 历史
项目代码/WIDESEAWCS_Server 正式/WIDESEAWCS_SystemServices/Sys_UserService.cs 305 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/ISerialPortRepository/IFaceRecognitionRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEA_ISerialPortRepository
{
    public interface IFaceRecognitionRepository : IRepository<Dt_FaceRecognition>
    {
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/ISerialPortService/IFaceRecognitionServer .cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_DTO.Telescopic;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_ITaskInfoService
{
    public interface IFaceRecognitionServer : IService<Dt_FaceRecognition>
    {
        WebResponseContent AddGroup(string groupName);
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/SerialPortRepository/FaceRecognitionRepository.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
using WIDESEA_ISerialPortRepository;
using WIDESEAWCS_Core.BaseRepository;
using WIDESEAWCS_Model.Models;
namespace WIDESEA_SerialPortRepository
{
    public class FaceRecognitionRepository : RepositoryBase<Dt_FaceRecognition>, IFaceRecognitionRepository
    {
        public FaceRecognitionRepository(IUnitOfWorkManage unitOfWorkManage) : base(unitOfWorkManage)
        {
        }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/SerialPortService/FaceRecognitionServer .cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using WIDESEA_ISerialPortRepository;
using WIDESEA_SerialPortRepository;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_DTO.Telescopic;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
namespace WIDESEAWCS_TaskInfoService
{
    public class FaceRecognitionServer : ServiceBase<Dt_FaceRecognition, IFaceRecognitionRepository>, IFaceRecognitionServer
    {
        public FaceRecognitionServer( IFaceRecognitionRepository BaseDal) : base(BaseDal)
        {
        }
        public override PageGridData<Dt_FaceRecognition> GetPageData(PageDataOptions options)
        {
            OrderByParameters = new Dictionary<string, SqlSugar.OrderByType> {
                { nameof(Dt_ArticleInfom.ID),SqlSugar.OrderByType.Asc  },
            };
            return base.GetPageData(options);
        }
        public WebResponseContent AddGroup(string groupName)
        {
            try
            {
                // 1. è°ƒç”¨ç™¾åº¦ API è¿›è¡Œç”¨æˆ·ç»„创建
                string apiResult = BaiDuFaceHelper.GroupAdd(groupName);
                // 2. è§£æž API è¿”回的 JSON ç»“æžœ
                dynamic resultObj = JsonConvert.DeserializeObject(apiResult);
                if (resultObj.error_code == 0)
                {
                    return WebResponseContent.Instance.OK("用户组创建成功");
                }
                else
                {
                    return WebResponseContent.Instance.Error("百度 API åˆ›å»ºå¤±è´¥ï¼š" + resultObj.error_msg);
                }
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("创建用户组失败:" + ex.Message);
            }
        }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Common/BaiDuFaceHelper.cs
@@ -22,7 +22,7 @@
            NLog.LogManager.GetCurrentClassLogger().Trace("百度人脸识别返回:" + returnStr);
            BDToken token = JsonConvert.DeserializeObject<BDToken>(returnStr);
            token.getdate = DateTime.Now.ToString();
          token.getdate = DateTime.Now.ToString();
            return token.access_token;
        }
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Common/WIDESEAWCS_Common.csproj
@@ -7,6 +7,8 @@
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
    <PackageReference Include="NLog" Version="5.4.0" />
  </ItemGroup>
</Project>
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_DTO/SerialPort/AddUserDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.SerialPort
{
    public class AddUserDTO
    {
        public string  username { get; set; }
        public int log_id { get; set; }
        //public string facetoken { get; set; }
        public string  phoneno { get; set; }
        public int roleid { get; set; }
        public string rolename { get; set; }
        public  byte    enable { get; set; }
        public string    path { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_DTO/SerialPort/PaginationDTO.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WIDESEAWCS_DTO.Telescopic
{
    public class PaginationDTO
    {
        /// <summary>
        /// ç¬¬å‡ é¡µ
        /// </summary>
        public int pageIndex { get; set; }
        /// <summary>
        /// ä¸€é¡µå¤šå°‘个数据
        /// </summary>
        public int pageSize { get; set; }
        /// <summary>
        /// æ¨¡ç³ŠæŸ¥è¯¢çš„字段
        /// </summary>
        public string? searchKeyword { get; set; }
        /// <summary>
        /// å¼€å§‹æ—¶é—´
        /// </summary>
        public DateTime ?startDate { get; set; }
        /// <summary>
        /// ç»“束时间
        /// </summary>
        public DateTime? endDate { get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_DTO/SerialPort/UserDTO.cs
@@ -26,7 +26,7 @@
        /// <summary>
        /// ç”µè¯
        /// </summary>
        public string phone { get; set; }
        public string  phone { get; set; }
        /// <summary>
        /// å›¾ç‰‡
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_ISystemServices/ISys_UserService.cs
@@ -6,9 +6,11 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.BaseServices;
using WIDESEAWCS_DTO.SerialPort;
using WIDESEAWCS_DTO.Telescopic;
using WIDESEAWCS_Model;
using WIDESEAWCS_Model.Models;
@@ -61,5 +63,25 @@
        /// <param name="id"></param>
        /// <returns></returns>
        WebResponseContent Upuserbase(UserDTO userDTO);
        /// <summary>
        /// äººè„¸è¯†åˆ«
        /// </summary>
        /// <param name="paginationDTO"></param>
        /// <returns></returns>
        WebResponseContent GetUserFace(PaginationDTO paginationDTO);
        /// <summary>
        /// æ·»åŠ ç”¨æˆ·
        /// </summary>
        /// <param name="addUserDTO"></param>
        /// <returns></returns>
        WebResponseContent AdduserData(AddUserDTO addUserDTO);
        WebResponseContent UpuserData(AddUserDTO addUserDTO);
        WebResponseContent DeleteUserData(DeleteUserImg deleteUserDTO);
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Model/LoginInfo.cs
@@ -11,5 +11,10 @@
        public string UserName { get; set; }
        public string Password { get; set; }
        /// <summary>
        /// äººè„¸è¯†åˆ«
        /// </summary>
        public string? path {  get; set; }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Model/Models/SerialPort/Dt_FaceRecognition.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
using 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; }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Model/Models/System/Sys_User.cs
@@ -21,6 +21,13 @@
        /// </summary>
        [SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnDescription = "用户ID")]
        public int User_Id { get; set; }
        [SugarColumn( IsNullable = true, ColumnDescription = "人脸识别id")]
        public int Log_id { get; set; }
        [SugarColumn(Length = 100, IsNullable = true, ColumnDescription = "人脸识别token")]
        public string  Face_token { get; set; }
        /// <summary>
        ///帐号
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/Controllers/SerialPort/ArticleInfomController.cs
@@ -17,7 +17,7 @@
        public ArticleInfomController(IArticleInfomServer service) : base(service)
        {
        }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/Controllers/SerialPort/FaceRecognitionController .cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
using 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)
        {
        }
        [HttpPost,Route("AddGroup"),AllowAnonymous]
        public WebResponseContent AddGroup(string groupName)
        {
            return Service.AddGroup(groupName);
        }
    }
}
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/Controllers/System/Sys_UserController.cs
@@ -5,6 +5,7 @@
using Microsoft.Extensions.Caching.Memory;
using Newtonsoft.Json;
using StackExchange.Profiling;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Authorization;
using WIDESEAWCS_Core.BaseController;
@@ -14,6 +15,7 @@
using WIDESEAWCS_Core.HttpContextUser;
using WIDESEAWCS_Core.Utilities;
using WIDESEAWCS_DTO.SerialPort;
using WIDESEAWCS_DTO.Telescopic;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_Model;
using WIDESEAWCS_Model.Models;
@@ -181,6 +183,52 @@
        {
            return Service.Upuserbase(userDTO);
        }
        /// <summary>
        /// å±•示人脸用户信息
        /// </summary>
        /// <param name="paginationDTO"></param>
        /// <returns></returns>
        [HttpPost, Route("GetUserFace"), AllowAnonymous]
        public WebResponseContent GetUserFace([FromBody] PaginationDTO paginationDTO)
        {
            return Service.GetUserFace(paginationDTO);
        }
        /// <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([FromBody] DeleteUserImg deleteUserDTO)
        {
            return Service.DeleteUserData(deleteUserDTO);
        }
    }
       
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492051182.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492244242.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492263811.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492568523.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492760375.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492791698.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492809549.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/1743492833343.png
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_Server/wwwroot/image/files
Binary files differ
ÏîÄ¿´úÂë/WIDESEAWCS_Server Õýʽ/WIDESEAWCS_SystemServices/Sys_UserService.cs
@@ -17,6 +17,9 @@
using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
using Microsoft.AspNetCore.Builder;
using WIDESEAWCS_DTO.SerialPort;
using WIDESEAWCS_DTO.Telescopic;
using WIDESEAWCS_Common;
using Newtonsoft.Json;
namespace WIDESEAWCS_SystemServices
{
@@ -28,8 +31,11 @@
        private readonly ISys_RoleRepository _RoleRepository;
        private readonly ILoginHistoryRepository _loginHistoryRepository;
        private readonly IPutakeRepository _putakeRepository;
        private readonly IFaceRecognitionRepository _faceRecognitionRepository;
        public Sys_UserService(ISys_UserRepository repository, IUnitOfWorkManage unitOfWorkManage,
        public Sys_UserService(IFaceRecognitionRepository faceRecognitionRepository, ISys_UserRepository repository, IUnitOfWorkManage unitOfWorkManage,
            ICacheService cacheService, ISys_MenuService menuService, ISys_RoleRepository roleRepository, ILoginHistoryRepository loginHistoryRepository, IPutakeRepository putakeRepository) : base(repository)
        {
            _unitOfWorkManage = unitOfWorkManage;
@@ -39,6 +45,8 @@
            _RoleRepository = roleRepository;
            _loginHistoryRepository = loginHistoryRepository;
            _putakeRepository = putakeRepository;
            _faceRecognitionRepository = faceRecognitionRepository;
        }
        public WebResponseContent Login(LoginInfo loginInfo)
@@ -46,7 +54,7 @@
            WebResponseContent content = new WebResponseContent();
            try
            {
                //BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
                // BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);
                string msg = string.Empty;
@@ -60,51 +68,71 @@
                }
                #endregion
                UserInfo user = BaseDal.GetUserInfo(loginInfo.UserName, loginInfo.Password);
                var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);//根据这个用户名来查看用户
                if (user != null)
                if (!string.IsNullOrEmpty(loginInfo.path))
                {
                    object obj = _menuService.GetMenuActionList(user.RoleId);
                    if (obj is not IEnumerable<object> list)
                    var faceResult = BaiDuFaceHelper.FaceSearch(loginInfo.path);
                    if (faceResult != null && faceResult.error_code == 0)
                    {
                        return WebResponseContent.Instance.Error("无登录权限");
                    }
                    if (!list.Any())
                    {
                        return WebResponseContent.Instance.Error("无登录权限");
                    }
                    if (disbled.Enable != 1)
                    {
                        return WebResponseContent.Instance.Error("你的账号已被禁用,请联系管理员");
                        // èŽ·å–æœ€é«˜åŒ¹é…åº¦çš„ç”¨æˆ·
                        var bestMatch = faceResult.result.user_list.OrderByDescending(u => u.score).FirstOrDefault();//拿第一个最高的
                        if (bestMatch != null && double.TryParse(bestMatch.score, out double score) && score > 80) // è®¾å®š80分为可信度阈值
                        {
                            return new WebResponseContent { Data = true };
                        }
                    }
                    string token = JwtHelper.IssueJwt(new TokenModelJwt()
                    {
                        UserId = user.UserId,
                        RoleId = user.RoleId,
                        UserName = user.UserName,
                        TenantId = user.TenantId,
                    });
                    var loghis = new Dt_LoginHistory
                    {
                        Account = user.UserName,
                        TrurName = user.UserTrueName,
                        CreateDate = DateTime.Now
                    };
                    _cacheService.AddOrUpdate(user.UserId.ToString(), token);
                    _loginHistoryRepository.AddData(loghis);
                    content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl, ID = user.UserId, RoleId=user.RoleId });
                    return WebResponseContent.Instance.Error("人脸识别失败,请重试");
                }
                else
                {
                    content = WebResponseContent.Instance.Error("账号或密码错误");
                    UserInfo user = BaseDal.GetUserInfo(loginInfo.UserName, loginInfo.Password);
                    var disbled = BaseDal.QueryFirst(x => x.UserName == loginInfo.UserName);//根据这个用户名来查看用户
                    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("无登录权限");
                        }
                        if (disbled.Enable != 1)
                        {
                            return WebResponseContent.Instance.Error("你的账号已被禁用,请联系管理员");
                        }
                        string token = JwtHelper.IssueJwt(new TokenModelJwt()
                        {
                            UserId = user.UserId,
                            RoleId = user.RoleId,
                            UserName = user.UserName,
                            TenantId = user.TenantId,
                        });
                        var loghis = new Dt_LoginHistory
                        {
                            Account = user.UserName,
                            TrurName = user.UserTrueName,
                            CreateDate = DateTime.Now
                        };
                        _cacheService.AddOrUpdate(user.UserId.ToString(), token);
                        _loginHistoryRepository.AddData(loghis);
                        content = WebResponseContent.Instance.OK(data: new { token, userName = user.UserTrueName, img = user.HeadImageUrl, ID = user.UserId, RoleId = user.RoleId });
                    }
                    else
                    {
                        content = WebResponseContent.Instance.Error("账号或密码错误");
                    }
                }
            }
            catch (Exception ex)
            {
                content = WebResponseContent.Instance.Error(ex.Message);
@@ -355,7 +383,7 @@
                if (newPwd.Length < 6) return content.Error("密码不能少于6位");
                // èŽ·å–ç”¨æˆ·å½“å‰å¯†ç 
                 string userCurrentPwd = BaseDal.QueryFirst(x => x.User_Id == id, s => s.UserPwd) ?? "";
                string userCurrentPwd = BaseDal.QueryFirst(x => x.User_Id == id, s => s.UserPwd) ?? "";
                if (string.IsNullOrEmpty(userCurrentPwd)) return content.Error("用户不存在或密码未设置");
@@ -398,7 +426,7 @@
            try
            {
                var user = BaseDal.QueryData(x => x.User_Id == userDTO.id).FirstOrDefault();
                if (user==null)
                if (user == null)
                {
                    return new WebResponseContent { Status = false, Message = "没找到该用户" };
                }
@@ -411,10 +439,205 @@
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false ,Message="失败:"+ex};
                return new WebResponseContent { Status = false, Message = "失败:" + ex };
            }
        }
        /// <summary>
        /// æŸ¥çœ‹ç”¨æˆ·ä¿¡æ¯å’Œäººè„¸è¯†åˆ«è¡¨
        /// </summary>
        /// <param name="paginationDTO"></param>
        /// <returns></returns>
        public WebResponseContent GetUserFace(PaginationDTO paginationDTO)
        {
            try
            {
                int totalCount = 0;
                var sys = Db.Queryable<Sys_User>();
                var face = _faceRecognitionRepository.Db.Queryable<Dt_FaceRecognition>();
                if (face == null)
                {
                    return new WebResponseContent { Status = false, Message = "数据为空" };
                }
                var query = sys.LeftJoin<Dt_FaceRecognition>((a, b) => a.Log_id == b.ID);
                if (!string.IsNullOrEmpty(paginationDTO.searchKeyword))
                {
                    query = query.Where((a, b) =>
                        a.UserName.Contains(paginationDTO.searchKeyword) ||
                        a.UserTrueName.Contains(paginationDTO.searchKeyword) ||
                        a.PhoneNo.Contains(paginationDTO.searchKeyword) ||
                        a.RoleName.Contains(paginationDTO.searchKeyword) ||
                        a.Role_Id.ToString().Contains(paginationDTO.searchKeyword)
                    );
                }
                if (paginationDTO.startDate.HasValue && paginationDTO.endDate.HasValue)
                {
                    query = query.Where((a, b) => a.CreateDate >= paginationDTO.startDate && a.CreateDate <= paginationDTO.endDate);
                }
                var result = query.Select((a, b) => new
                {
                    a.User_Id,
                    a.UserName,
                    a.UserTrueName,
                    a.PhoneNo,
                    a.Role_Id,
                    a.RoleName,
                    a.HeadImageUrl,
                    a.Enable,
                    a.CreateDate,
                    a.Face_token,
                    b.GroupID,
                }).ToPageList(paginationDTO.pageIndex, paginationDTO.pageSize, ref totalCount);
                return new WebResponseContent
                {
                    Status = true,
                    Data = new
                    {
                        TotalCount = totalCount,//总数
                        PageIndex = paginationDTO.pageIndex,//页数
                        PaseSize = paginationDTO.pageSize,//一页多少数据
                        Items = result//返回字段
                    }
                };
            }
            catch (Exception)
            {
                throw;
            }
        }
        public WebResponseContent AdduserData(AddUserDTO addUserDTO)
        {
            try
            {
                var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo
                {
                    ImgPath = addUserDTO.path,
                    user_id = addUserDTO.username,
                    group_id = addUserDTO.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,
                    HeadImageUrl=addUserDTO.path,
                    Log_id = addUserDTO.log_id,
                    Face_token = baiduResult.result.face_token,
                    PhoneNo = addUserDTO.phoneno,
                    Role_Id = addUserDTO.roleid,
                    RoleName = addUserDTO.rolename,
                    Enable = addUserDTO.enable,
                    UserPwd= "j79rYYvCz4vdhcboB1Ausg=="
                };
                BaseDal.AddData(sys);
                return new WebResponseContent { Status = true, Data = sys };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = "失败" + ex };
            }
        }
        public WebResponseContent UpuserData(AddUserDTO addUserDTO)
        {
            try
            {
                var baiduResult = BaiDuFaceHelper.AddUser(new BDUserInfo
                {
                    ImgPath = addUserDTO.path,
                    user_id = addUserDTO.username,
                    group_id = addUserDTO.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,
                    HeadImageUrl = addUserDTO.path,
                    Log_id = addUserDTO.log_id,
                    Face_token = baiduResult.result.face_token,
                    PhoneNo = addUserDTO.phoneno,
                    Role_Id = addUserDTO.roleid,
                    RoleName = addUserDTO.rolename,
                    Enable = addUserDTO.enable,
                };
                BaseDal.UpdateData(sys);
                return new WebResponseContent { Status = true, Data = sys };
            }
            catch (Exception ex)
            {
                return new WebResponseContent { Status = false, Message = "失败" + ex };
            }
        }
        /// <summary>
        /// åˆ é™¤
        /// </summary>
        /// <param name="deleteUserDTO"></param>
        /// <returns></returns>
        public WebResponseContent DeleteUserData(DeleteUserImg deleteUserDTO)
        {
            try
            {
                string apiResult = BaiDuFaceHelper.DeleteUser(deleteUserDTO);
                // 2. è§£æžè¿”回结果,判断删除是否成功
                dynamic resultObj = JsonConvert.DeserializeObject(apiResult);
                if (resultObj.error_code == 0)
                {
                   // ç™¾åº¦åˆ é™¤æˆåŠŸåŽï¼Œåˆ é™¤æ•°æ®åº“ä¸­çš„ç”¨æˆ·
                    var user = BaseDal.QueryData(deleteUserDTO.user_id);
                    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);
            }
        }
    }
}