From 15e90d4d163f20b6bd568a0d7a19ac9bbaec244f Mon Sep 17 00:00:00 2001 From: liguoyang Date: Thu, 11 Jan 2024 19:38:23 +0800 Subject: [PATCH] =?UTF-8?q?feat=20=E4=BA=BA=E8=84=B8=E4=B8=8A=E4=BC=A0,?= =?UTF-8?q?=E5=86=85=E9=83=A8=E6=94=AF=E6=8C=81=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevicePermissionsController.cs | 2 +- .../Request/DeviceGetAssignmentsRequest.cs | 5 -- .../Services/IDevicePermissionService.cs | 8 ++- .../Implements/DevicePermissionService.cs | 61 ++++++++++++++++++- .../Controllers/GainfosController.cs | 10 +++ .../Request/GainfoUploadFaceRequest.cs | 36 +++++++++++ .../Organization/Services/IGainfoService.cs | 3 + .../Services/Implements/GainfoService.cs | 46 +++++++++++++- Src/Dlhis.Basic/SqlSugarPack.cs | 11 +++- Src/Dlhis.Basic/appsettings.json | 1 + .../Basic/Entity/GainfoFaceEntity.cs | 27 ++++++++ Src/Dlhis.Sys/Dlhis.Sys.csproj | 4 ++ .../Menu/Services/Implements/MenuService.cs | 3 +- .../Identity/Controllers/OAuth2Controller.cs | 38 ++++++++++++ Src/Dlhis.User/{ => Packs}/SqlSugarPack.cs | 2 +- 15 files changed, 243 insertions(+), 14 deletions(-) create mode 100644 Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs create mode 100644 Src/Dlhis.Entity/Basic/Entity/GainfoFaceEntity.cs create mode 100644 Src/Dlhis.User/Identity/Controllers/OAuth2Controller.cs rename Src/Dlhis.User/{ => Packs}/SqlSugarPack.cs (91%) diff --git a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs index a97eb4c8..404e8e6e 100644 --- a/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs +++ b/Src/Dlhis.Basic/Device/Controllers/DevicePermissionsController.cs @@ -36,6 +36,6 @@ public class DevicePermissionsController : ControllerBase [HttpGet("assignments")] public async Task> GetAssignmentsAsync([FromQuery] DeviceGetAssignmentsRequest request) { - return await _devicePermissionService.GetAssignmentsAsync(request.UserNo, request.UniqueType, request.UniqueValue); + return await _devicePermissionService.GetAssignmentsAsync(request.UserNo, request.UniqueType); } } diff --git a/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs b/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs index f0f41bd5..f4974b17 100644 --- a/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs +++ b/Src/Dlhis.Basic/Device/Request/DeviceGetAssignmentsRequest.cs @@ -16,9 +16,4 @@ public class DeviceGetAssignmentsRequest /// [EnumDataType(typeof(DeviceAssignmentTypeEnumType))] public DeviceAssignmentTypeEnumType UniqueType { get; set; } - - /// - /// 类型对应的唯一值(可为空) - /// - public Guid? UniqueValue { get; set; } } diff --git a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs index 79118133..ee36c386 100644 --- a/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/IDevicePermissionService.cs @@ -12,5 +12,11 @@ public interface IDevicePermissionService : IScopeDependency /// Task AssignmentAsync(List reuqests); - Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType uniqueType, Guid? uniqueValue); + /// + /// 获取分配的权限 + /// + /// + /// + /// + Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType); } diff --git a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs index 418b2241..7c3645c2 100644 --- a/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs +++ b/Src/Dlhis.Basic/Device/Services/Implements/DevicePermissionService.cs @@ -1,4 +1,5 @@ using Dlhis.Basic.Device.Request; +using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; using Kurisu.SqlSugar.Services; @@ -36,15 +37,69 @@ public class DevicePermissionService : IDevicePermissionService } } - public async Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType uniqueType, Guid? uniqueValue) + public async Task> GetAssignmentsAsync(string userNo, DeviceAssignmentTypeEnumType? uniqueType) { var assignments = await _dbContext.Queryable() - .Where(x => x.UniqueType == uniqueType) - .WhereIF(uniqueValue.HasValue, x => x.UniqueValue == uniqueValue) + .WhereIF(uniqueType.HasValue, x => x.UniqueType == uniqueType) .Where(x => x.UserNo == userNo) .Select(x => x.UniqueValue) .ToListAsync(); return assignments; } + + public async Task> GetAssignDeviceCodesAsync(string userNo) + { + var groupCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Group); + var deviceGroups = await _dbContext.Queryable().ToListAsync(); + + return null; + //var deviceCodes = await GetAssignmentsAsync(userNo, DeviceAssignmentTypeEnumType.Device); + + + //var permissionCodes = await _dbContext.Queryable() + // .Where(x => x.UniqueType == uniqueType) + // .Where(x => x.UniqueValue == uniqueData) + // .Select(x => x.Code) + // .ToListAsync(); + + //var menus = await GetListAsync(PlatformEnumType.PCAdmin); + + //foreach (var menu in menus) + //{ + // if (menu.Items.Any()) + // { + // var codes = RecursionHandler(menu.Items, permissionCodes); + // permissionCodes.RemoveAll(x => codes.Contains(x)); + // } + //} + + //return permissionCodes; + + //static List RecursionHandler(List menus, List innerPermissions) + //{ + // var codes = new HashSet(); + // foreach (var menu in menus) + // { + // if (menu.Items.Any()) + // { + // var innerPermissionCodes = RecursionHandler(menu.Items, innerPermissions); + // foreach (var item in innerPermissionCodes) + // { + // codes.Add(item); + // } + // } + + // if (!innerPermissions.Contains(menu.Code)) + // { + // foreach (var item in menu.Items.Select(x => x.Code)) + // { + // codes.Add(item); + // } + // } + // } + + // return codes.ToList(); + //} + } } diff --git a/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs b/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs index 798db5e4..825e05ce 100644 --- a/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs +++ b/Src/Dlhis.Basic/Organization/Controllers/GainfosController.cs @@ -88,5 +88,15 @@ public class GainfosController : ControllerBase { return await _gainfoService.CurrentUserInfoAsync(); } + + /// + /// 上传人脸头像 + /// + /// + [HttpPost("face")] + public async Task UploadFaceAsync(GainfoUploadFaceRequest request) + { + await _gainfoService.UploadFaceAsync(request); + } } diff --git a/Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs b/Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs new file mode 100644 index 00000000..5f403df8 --- /dev/null +++ b/Src/Dlhis.Basic/Organization/Request/GainfoUploadFaceRequest.cs @@ -0,0 +1,36 @@ +using System.ComponentModel.DataAnnotations; + +namespace Dlhis.Basic.Organization.Request; + +public class GainfoUploadFaceRequest : IValidatableObject +{ + /// + /// 用户档案号 + /// + [Required(ErrorMessage = "用户档案号")] + public string UserNo { get; set; } + + /// + /// 人脸照片 + /// + [Required(ErrorMessage = "人脸照片不能为空")] + public string Face { get; set; } + + public IEnumerable Validate(ValidationContext validationContext) + { + bool v = true; + try + { + Convert.FromBase64String(Face); + } + catch (Exception) + { + v = false; + } + + if (!v) + { + yield return new ValidationResult("人脸照片需要为Base64格式", new[] { nameof(Face) }); + } + } +} diff --git a/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs b/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs index 81c198a0..416b7673 100644 --- a/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs +++ b/Src/Dlhis.Basic/Organization/Services/IGainfoService.cs @@ -18,4 +18,7 @@ public interface IGainfoService : IScopeDependency Task OnboardingAsync(GainfoDImissionRequest request); Task CurrentUserInfoAsync(); + + + Task UploadFaceAsync(GainfoUploadFaceRequest request); } diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs index c203989a..9eb3dd23 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoService.cs @@ -1,7 +1,10 @@ -using Dlhis.Basic.Organization.Request; +using System.Configuration; +using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; +using Kurisu.AspNetCore.Scope; +using Kurisu.AspNetCore.UnifyResultAndValidation; using Kurisu.AspNetCore.Utils.Extensions; using Kurisu.Core.DataAccess.Dto; using Kurisu.Core.User.Abstractions; @@ -181,4 +184,45 @@ public class GainfoService : IGainfoService } } } + + public async Task UploadFaceAsync(GainfoUploadFaceRequest request) + { + var gainfo = await _gainfoStore.Queryable(GainfoStatusEnumType.Working).Where(x => x.No == request.UserNo).FirstAsync(); + gainfo ??= await _gainfoStore.Queryable(GainfoStatusEnumType.External).Where(x => x.No == request.UserNo).FirstAsync(); + + gainfo.ThrowIfNull("人员档案信息不存在"); + + + + await Scoped.Request.Value.CreateAsync(async (sp) => + { + var configuration = sp.GetService(); + var faceConnectionString = configuration.GetSection("SqlSugarOptions:FaceConnectionString").Value; + if (faceConnectionString.IsEmpty()) + { + throw new UserFriendlyException("暂不支持人脸上传"); + } + + var dbContext = sp.GetService(); + //todo 切换连接字符串 + dbContext.Client.CurrentConnectionConfig.ConnectionString = faceConnectionString; + var face = await dbContext.Queryable().Where(x => x.UserCode == gainfo.Code).SingleAsync(); + + if (face == null) + { + face = new GainfoFaceEntity + { + UserCode = gainfo.Code, + Face = request.Face + }; + + await dbContext.InsertAsync(face); + } + else + { + face.Face = request.Face; + await dbContext.UpdateAsync(face); + } + }); + } } diff --git a/Src/Dlhis.Basic/SqlSugarPack.cs b/Src/Dlhis.Basic/SqlSugarPack.cs index 5adc1505..7d2d592e 100644 --- a/Src/Dlhis.Basic/SqlSugarPack.cs +++ b/Src/Dlhis.Basic/SqlSugarPack.cs @@ -1,4 +1,5 @@ -using Kurisu.AspNetCore; +using Dlhis.Entity.Basic.Entity; +using Kurisu.AspNetCore; using Kurisu.AspNetCore.Startup; using Kurisu.SqlSugar.Extensions; using SqlSugar; @@ -25,6 +26,14 @@ public class SqlSugarPack : BaseAppPack db.DbMaintenance.CreateDatabase(); db.CodeFirst.InitTables(tables); + + using var scopeFace = app.ApplicationServices.CreateScope(); + var dbFace = scopeFace.ServiceProvider.GetService(); + var faceConnectionString = Configuration.GetSection("SqlSugarOptions:FaceConnectionString").Value; + dbFace.CurrentConnectionConfig.ConnectionString = faceConnectionString; + dbFace.DbMaintenance.CreateDatabase(); + dbFace.CodeFirst.InitTables(); + #endif } } diff --git a/Src/Dlhis.Basic/appsettings.json b/Src/Dlhis.Basic/appsettings.json index 1b5c78f0..75960c44 100644 --- a/Src/Dlhis.Basic/appsettings.json +++ b/Src/Dlhis.Basic/appsettings.json @@ -13,6 +13,7 @@ "SqlSugarOptions": { "DefaultConnectionString": "server=192.168.199.124;port=3306;userid=root;password=dlhis123;database=yikatong;charset=utf8mb4;", "SlaveConnectionString": [], + "FaceConnectionString": "server=192.168.199.124;port=3306;userid=root;password=dlhis123;database=face;charset=utf8mb4;", "Timeout": 30, "SlowSqlTime": 1, "EnableSqlLog": true diff --git a/Src/Dlhis.Entity/Basic/Entity/GainfoFaceEntity.cs b/Src/Dlhis.Entity/Basic/Entity/GainfoFaceEntity.cs new file mode 100644 index 00000000..657f5878 --- /dev/null +++ b/Src/Dlhis.Entity/Basic/Entity/GainfoFaceEntity.cs @@ -0,0 +1,27 @@ +using Kurisu.SqlSugar; +using Microsoft.Extensions.DependencyInjection; +using SqlSugar; + +namespace Dlhis.Entity.Basic.Entity; + +/// +/// 档案人脸信息 +/// +[SkipScan] +[SugarTable(TableName = "GainfoFace", TableDescription = "档案人脸信息")] +public class GainfoFaceEntity : SugarBaseEntity +{ + + /// + /// 学工号 + /// + [SugarColumn(IsNullable = false)] + public string UserCode { get; set; } + + + /// + /// 人脸 + /// + [SugarColumn(ColumnDataType = "text", IsNullable = false)] + public string Face { get; set; } +} diff --git a/Src/Dlhis.Sys/Dlhis.Sys.csproj b/Src/Dlhis.Sys/Dlhis.Sys.csproj index 77c0be37..8a58f593 100644 --- a/Src/Dlhis.Sys/Dlhis.Sys.csproj +++ b/Src/Dlhis.Sys/Dlhis.Sys.csproj @@ -25,4 +25,8 @@ + + + + diff --git a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs index 10cffed3..dc4bfb45 100644 --- a/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs +++ b/Src/Dlhis.Sys/Menu/Services/Implements/MenuService.cs @@ -4,6 +4,7 @@ using Dlhis.Sys.Menu.Request; using Dlhis.Sys.Menu.Response; using Dlhis.User.Api; using Kurisu.AspNetCore.Utils.Extensions; +using Kurisu.Core.Result; using Kurisu.Core.User.Abstractions; using Kurisu.SqlSugar.Attributes; using Kurisu.SqlSugar.Services; @@ -268,7 +269,7 @@ public class MenuService : IMenuService private async Task> GetAllAssignmentCodesAsync() { var userApiResult = await _userApi.GetUserByIdAsync(_currentUser.GetIntSubjectId()); - (userApiResult.Code == Kurisu.Core.Result.ApiStateCode.Success).ThrowIfFalse(userApiResult.Msg); + (userApiResult.Code == ApiStateCode.Success).ThrowIfFalse(userApiResult.Msg); var user = userApiResult.Data; // var groupCodes = await GetAssignmentCodesAsync(MenuPermissionTypeEnumType.Group, manager.usergrp); diff --git a/Src/Dlhis.User/Identity/Controllers/OAuth2Controller.cs b/Src/Dlhis.User/Identity/Controllers/OAuth2Controller.cs new file mode 100644 index 00000000..b520af15 --- /dev/null +++ b/Src/Dlhis.User/Identity/Controllers/OAuth2Controller.cs @@ -0,0 +1,38 @@ +using System.Text; +using Dlhis.User.Identity.Request; +using Kurisu.AspNetCore.Authentication.Options; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Options; +using Newtonsoft.Json.Linq; + +namespace Dlhis.User.Identity.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class OAuth2Controller : ControllerBase + { + private readonly IHttpClientFactory _httpClientFactory; + private readonly IOptions _identityServerOption; + private readonly IServiceProvider _serviceProvider; + + public OAuth2Controller(IHttpClientFactory httpClientFactory, IOptions identityServerOption, IServiceProvider serviceProvider) + { + _httpClientFactory = httpClientFactory; + _identityServerOption = identityServerOption; + _serviceProvider = serviceProvider; + } + + [HttpPost("clientgrant")] + public async Task ClientGrant(ClientGrantRequest request) + { + var authority = _identityServerOption.Value.Authority; + + var httpClient = _httpClientFactory.CreateClient("oauth2"); + + var content = new StringContent($"grant_type=client_credentials&client_id={request.ClientId}&client_secret={request.ClientSecret}&scope={request.Scope}", Encoding.UTF8, "application/x-www-form-urlencoded"); + var response = await httpClient.PostAsync($"{authority}/connect/token", content); + var result = await response.Content.ReadAsStringAsync(); + return JObject.Parse(result); + } + } +} diff --git a/Src/Dlhis.User/SqlSugarPack.cs b/Src/Dlhis.User/Packs/SqlSugarPack.cs similarity index 91% rename from Src/Dlhis.User/SqlSugarPack.cs rename to Src/Dlhis.User/Packs/SqlSugarPack.cs index f20935cb..bfb8cc3c 100644 --- a/Src/Dlhis.User/SqlSugarPack.cs +++ b/Src/Dlhis.User/Packs/SqlSugarPack.cs @@ -1,7 +1,7 @@ using Kurisu.AspNetCore.Startup; using Kurisu.SqlSugar.Extensions; -namespace Dlhis.User; +namespace Dlhis.User.Packs; public class SqlSugarPack : BaseAppPack {