From 0e06eb8a769bcec55f1b7791d2dba51245e07304 Mon Sep 17 00:00:00 2001 From: Chunkit Yeung Date: Sun, 18 Dec 2022 14:05:10 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E6=B3=A8=E5=85=A5?= =?UTF-8?q?=E5=8A=A0=E5=AF=86=E7=BB=84=E4=BB=B6=E4=BB=A3=E7=A0=81=E3=80=82?= =?UTF-8?q?=202=E3=80=81=E4=BF=AE=E5=A4=8D=E5=9B=A0=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=A1=86=E6=9E=B6=E4=B8=8D=E5=AF=B9=E7=9A=84?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E6=8A=A5=E9=94=99=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Business/Customer/CustoService.cs | 11 +- .../Business/Reser/ReserService.cs | 20 ++- .../EOM.TSHotelManager.Application.csproj | 7 +- .../Worker/Picture/WorkerPicService.cs | 13 +- .../Worker/WorkerService.cs | 21 ++-- .../Zero/Admin/AdminService.cs | 23 +++- .../Controllers/Worker/WorkerController.cs | 117 ++++++++++++++++++ .../EOM.TSHotelManager.WebApi.csproj | 4 +- .../EOM.TSHotelManager.WebApi.xml | 96 ++++++++++++-- .../MvcOptionsExtensions.cs | 0 .../{ => Router_Extension}/RouteConvention.cs | 2 +- EOM.TSHotelManager.WebApi/Startup.cs | 7 +- Library/EOM.Encrypt.dll | Bin 0 -> 12288 bytes 13 files changed, 278 insertions(+), 43 deletions(-) create mode 100644 EOM.TSHotelManager.WebApi/Controllers/Worker/WorkerController.cs rename EOM.TSHotelManager.WebApi/{ => Router_Extension}/MvcOptionsExtensions.cs (100%) rename EOM.TSHotelManager.WebApi/{ => Router_Extension}/RouteConvention.cs (97%) create mode 100644 Library/EOM.Encrypt.dll diff --git a/EOM.TSHotelManager.Application/Business/Customer/CustoService.cs b/EOM.TSHotelManager.Application/Business/Customer/CustoService.cs index 5a56b51..70ae768 100644 --- a/EOM.TSHotelManager.Application/Business/Customer/CustoService.cs +++ b/EOM.TSHotelManager.Application/Business/Customer/CustoService.cs @@ -26,7 +26,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using CK.Common; -using EncryptTools.Core; +using EOM.Encrypt; using EOM.TSHotelManager.Core; using EOM.TSHotelManager.EntityFramework; using Npgsql; @@ -63,7 +63,10 @@ namespace EOM.TSHotelManager.Application /// private readonly PgRepository custoTypeRepository; - Encrypt encrypt = new Encrypt(); + /// + /// 加密 + /// + private readonly EOM.Encrypt.Encrypt encrypt; /// /// @@ -73,13 +76,15 @@ namespace EOM.TSHotelManager.Application /// /// /// - public CustoService(PgRepository custoRepository, PgRepository spendRepository, PgRepository sexTypeRepository, PgRepository passPortTypeRepository, PgRepository custoTypeRepository) + /// + public CustoService(PgRepository custoRepository, PgRepository spendRepository, PgRepository sexTypeRepository, PgRepository passPortTypeRepository, PgRepository custoTypeRepository, EOM.Encrypt.Encrypt encrypt) { this.custoRepository = custoRepository; this.spendRepository = spendRepository; this.sexTypeRepository = sexTypeRepository; this.passPortTypeRepository = passPortTypeRepository; this.custoTypeRepository = custoTypeRepository; + this.encrypt = encrypt; } #region 添加客户信息 diff --git a/EOM.TSHotelManager.Application/Business/Reser/ReserService.cs b/EOM.TSHotelManager.Application/Business/Reser/ReserService.cs index 1797641..58716aa 100644 --- a/EOM.TSHotelManager.Application/Business/Reser/ReserService.cs +++ b/EOM.TSHotelManager.Application/Business/Reser/ReserService.cs @@ -21,7 +21,7 @@ *SOFTWARE. * */ -using EncryptTools.Core; +using EOM.Encrypt; using EOM.TSHotelManager.Common; using EOM.TSHotelManager.Core; using EOM.TSHotelManager.EntityFramework; @@ -40,7 +40,21 @@ namespace EOM.TSHotelManager.Application /// private readonly PgRepository reserRepository; - Encrypt encrypt = new Encrypt(); + /// + /// 加密 + /// + private readonly EOM.Encrypt.Encrypt encrypt; + + /// + /// + /// + /// + /// + public ReserService(PgRepository reserRepository, EOM.Encrypt.Encrypt encrypt) + { + this.reserRepository = reserRepository; + this.encrypt = encrypt; + } /// /// 获取所有预约信息 @@ -97,7 +111,7 @@ namespace EOM.TSHotelManager.Application /// public bool InserReserInfo(Reser r) { - var cryStr = encrypt.Encryption(r.CustoTel); + var cryStr = encrypt.Encryption(r.CustoTel, EncryptionLevel.Enhanced); r.CustoTel = cryStr; return reserRepository.Insert(r); } diff --git a/EOM.TSHotelManager.Application/EOM.TSHotelManager.Application.csproj b/EOM.TSHotelManager.Application/EOM.TSHotelManager.Application.csproj index fb379c1..e2a2d10 100644 --- a/EOM.TSHotelManager.Application/EOM.TSHotelManager.Application.csproj +++ b/EOM.TSHotelManager.Application/EOM.TSHotelManager.Application.csproj @@ -15,10 +15,6 @@ 1701;1702;8618; - - - - @@ -29,6 +25,9 @@ ..\Library\CK.Common.dll + + ..\Library\EOM.Encrypt.dll + diff --git a/EOM.TSHotelManager.Application/Worker/Picture/WorkerPicService.cs b/EOM.TSHotelManager.Application/Worker/Picture/WorkerPicService.cs index f231388..4919447 100644 --- a/EOM.TSHotelManager.Application/Worker/Picture/WorkerPicService.cs +++ b/EOM.TSHotelManager.Application/Worker/Picture/WorkerPicService.cs @@ -1,4 +1,4 @@ -using EncryptTools.Core; +using EOM.Encrypt; using EOM.TSHotelManager.Common; using EOM.TSHotelManager.Core; using EOM.TSHotelManager.EntityFramework; @@ -21,17 +21,22 @@ namespace EOM.TSHotelManager.Application /// private readonly PgRepository workerPicRepository; + /// + /// 加密 + /// + private readonly EOM.Encrypt.Encrypt encrypt; + /// /// /// /// - public WorkerPicService(PgRepository workerPicRepository) + /// + public WorkerPicService(PgRepository workerPicRepository, EOM.Encrypt.Encrypt encrypt) { this.workerPicRepository = workerPicRepository; + this.encrypt = encrypt; } - Encrypt encrypt = new Encrypt(); - /// /// 查询员工照片 /// diff --git a/EOM.TSHotelManager.Application/Worker/WorkerService.cs b/EOM.TSHotelManager.Application/Worker/WorkerService.cs index e711697..36354df 100644 --- a/EOM.TSHotelManager.Application/Worker/WorkerService.cs +++ b/EOM.TSHotelManager.Application/Worker/WorkerService.cs @@ -21,7 +21,7 @@ *SOFTWARE. * */ -using EncryptTools.Core; +using EOM.Encrypt; using EOM.TSHotelManager.Common; using EOM.TSHotelManager.Core; using EOM.TSHotelManager.EntityFramework; @@ -67,9 +67,9 @@ namespace EOM.TSHotelManager.Application private readonly PgRepository positionRepository; /// - /// 实例化信息加密插件 + /// 加密 /// - Encrypt encrypt = new Encrypt(); + private readonly EOM.Encrypt.Encrypt encrypt; /// /// @@ -80,7 +80,8 @@ namespace EOM.TSHotelManager.Application /// /// /// - public WorkerService(PgRepository workerRepository, PgRepository sexTypeRepository, PgRepository educationRepository, PgRepository nationRepository, PgRepository deptRepository, PgRepository positionRepository) + /// + public WorkerService(PgRepository workerRepository, PgRepository sexTypeRepository, PgRepository educationRepository, PgRepository nationRepository, PgRepository deptRepository, PgRepository positionRepository, EOM.Encrypt.Encrypt encrypt) { this.workerRepository = workerRepository; this.sexTypeRepository = sexTypeRepository; @@ -88,6 +89,7 @@ namespace EOM.TSHotelManager.Application this.nationRepository = nationRepository; this.deptRepository = deptRepository; this.positionRepository = positionRepository; + this.encrypt = encrypt; } #region 修改员工信息 @@ -102,13 +104,13 @@ namespace EOM.TSHotelManager.Application var sourceTelStr = string.Empty; if (!string.IsNullOrEmpty(worker.WorkerTel)) { - sourceTelStr = encrypt.Encryption(worker.WorkerTel); + sourceTelStr = encrypt.Encryption(worker.WorkerTel,EncryptionLevel.Enhanced); } //加密身份证 var sourceIdStr = string.Empty; if (!string.IsNullOrEmpty(worker.CardId)) { - sourceIdStr = encrypt.Encryption(worker.CardId); + sourceIdStr = encrypt.Encryption(worker.CardId, EncryptionLevel.Enhanced); } worker.WorkerTel = sourceTelStr; worker.CardId = sourceIdStr; @@ -281,12 +283,15 @@ namespace EOM.TSHotelManager.Application return w; } - if (!encrypt.Compare(w.WorkerPwd, worker.WorkerPwd)) + var frontEncryed = encrypt.Encryption(w.WorkerPwd, EncryptionLevel.Enhanced); + var backEncryed = encrypt.Encryption(worker.WorkerPwd, EncryptionLevel.Enhanced); + + if (!encrypt.Compare(frontEncryed, backEncryed)) { w = null; return w; } - + w.WorkerPwd = ""; //性别类型 var sexType = sexTypeRepository.GetSingle(a => a.sexId == w.WorkerSex); w.WorkerSexName = string.IsNullOrEmpty(sexType.sexName) ? "" : sexType.sexName; diff --git a/EOM.TSHotelManager.Application/Zero/Admin/AdminService.cs b/EOM.TSHotelManager.Application/Zero/Admin/AdminService.cs index c6d8a05..d413ab1 100644 --- a/EOM.TSHotelManager.Application/Zero/Admin/AdminService.cs +++ b/EOM.TSHotelManager.Application/Zero/Admin/AdminService.cs @@ -22,10 +22,11 @@ * */ using CK.Common; -using EncryptTools.Core; +using EOM.Encrypt; using EOM.TSHotelManager.Common; using EOM.TSHotelManager.Core; using EOM.TSHotelManager.EntityFramework; +using SqlSugar.DistributedSystem.Snowflake; using System; using System.Collections.Generic; using System.Linq; @@ -47,17 +48,22 @@ namespace EOM.TSHotelManager.Application /// private readonly PgRepository adminTypeRepository; - Encrypt encrypt = new Encrypt(); + /// + /// 加密 + /// + private readonly EOM.Encrypt.Encrypt encrypt; /// /// /// /// /// - public AdminService(PgRepository adminRepository, PgRepository adminTypeRepository) + /// + public AdminService(PgRepository adminRepository, PgRepository adminTypeRepository, EOM.Encrypt.Encrypt encrypt) { this.adminRepository = adminRepository; this.adminTypeRepository = adminTypeRepository; + this.encrypt = encrypt; } #region 根据超管密码查询员工类型和权限 @@ -79,11 +85,16 @@ namespace EOM.TSHotelManager.Application admins = null; return admins; } - if (!encrypt.Compare(admins.AdminPassword, admin.AdminPassword)) + + var frontEncryed = encrypt.Encryption(admins.AdminPassword, EncryptionLevel.Enhanced); + var backEncryed = encrypt.Encryption(admin.AdminPassword, EncryptionLevel.Enhanced); + + if (!encrypt.Compare(frontEncryed, backEncryed)) { admins = null; return admins; } + admins.AdminPassword = ""; return admins; } #endregion @@ -134,7 +145,7 @@ namespace EOM.TSHotelManager.Application /// public bool UpdateNewPwdByOldPwd(Admin admin) { - admin.AdminPassword = encrypt.Encryption(admin.AdminPassword); + admin.AdminPassword = encrypt.Encryption(admin.AdminPassword, EncryptionLevel.Enhanced); return adminRepository.Update(a => new Admin() { AdminPassword = admin.AdminPassword, @@ -169,7 +180,7 @@ namespace EOM.TSHotelManager.Application /// public bool AddAdmin(Admin admin) { - admin.AdminPassword = encrypt.Encryption(admin.AdminPassword); + admin.AdminPassword = encrypt.Encryption(admin.AdminPassword, EncryptionLevel.Enhanced); bool result = adminRepository.Insert(admin); return result; } diff --git a/EOM.TSHotelManager.WebApi/Controllers/Worker/WorkerController.cs b/EOM.TSHotelManager.WebApi/Controllers/Worker/WorkerController.cs new file mode 100644 index 0000000..d527b42 --- /dev/null +++ b/EOM.TSHotelManager.WebApi/Controllers/Worker/WorkerController.cs @@ -0,0 +1,117 @@ +using EOM.TSHotelManager.Application; +using EOM.TSHotelManager.Core; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Collections.Generic; + +namespace EOM.TSHotelManager.WebApi.Controllers +{ + /// + /// 员工信息控制器 + /// + public class WorkerController : ControllerBase + { + /// + /// 员工信息 + /// + private readonly IWorkerService workerService; + + /// + /// + /// + /// + public WorkerController(IWorkerService workerService) + { + this.workerService = workerService; + } + + /// + /// 修改员工信息 + /// + /// + /// + [HttpPost] + public bool UpdateWorker([FromBody]Worker worker) + { + return workerService.UpdateWorker(worker); + } + + /// + /// 员工账号禁/启用 + /// + /// + /// + [HttpPost] + public bool ManagerWorkerAccount([FromBody]Worker worker) + { + return workerService.ManagerWorkerAccount(worker); + } + + /// + /// 更新员工职位和部门 + /// + /// + /// + [HttpPost] + + public bool UpdateWorkerPositionAndClub([FromBody]Worker worker) + { + return workerService.UpdateWorkerPositionAndClub(worker); + } + + /// + /// 添加员工信息 + /// + /// + /// + [HttpPost] + public bool AddWorker(Worker worker) + { + return workerService.AddWorker(worker); + } + + /// + /// 获取所有工作人员信息 + /// + /// + [HttpGet] + public List SelectWorkerAll() + { + return workerService.SelectWorkerAll(); + } + + /// + /// 根据登录名称查询员工信息 + /// + /// + /// + [HttpGet] + public Worker SelectWorkerInfoByWorkerId([FromQuery]string? workerId) + { + return workerService.SelectWorkerInfoByWorkerId(workerId); + } + + /// + /// 根据登录名称、密码查询员工信息 + /// + /// + /// + [HttpPost] + public Worker SelectWorkerInfoByWorkerIdAndWorkerPwd([FromBody]Worker worker) + { + return workerService.SelectWorkerInfoByWorkerIdAndWorkerPwd(worker); + } + + /// + /// 根据员工编号和密码修改密码 + /// + /// + /// + /// + [HttpPost] + public bool UpdWorkerPwdByWorkNo([FromBody]string? workId, string? workPwd) + { + return workerService.UpdWorkerPwdByWorkNo(workId, workPwd); + } + } +} diff --git a/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.csproj b/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.csproj index cbf3888..e831fc1 100644 --- a/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.csproj +++ b/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.csproj @@ -31,7 +31,9 @@ - + + ..\Library\EOM.Encrypt.dll + diff --git a/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.xml b/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.xml index 48f3b92..46ab6b8 100644 --- a/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.xml +++ b/EOM.TSHotelManager.WebApi/EOM.TSHotelManager.WebApi.xml @@ -714,6 +714,78 @@ + + + 员工信息控制器 + + + + + 员工信息 + + + + + + + + + + + 修改员工信息 + + + + + + + 员工账号禁/启用 + + + + + + + 更新员工职位和部门 + + + + + + + 添加员工信息 + + + + + + + 获取所有工作人员信息 + + + + + + 根据登录名称查询员工信息 + + + + + + + 根据登录名称、密码查询员工信息 + + + + + + + 根据员工编号和密码修改密码 + + + + + 管理员控制器 @@ -1247,18 +1319,6 @@ - - - Mvc扩展方法 - - - - - 扩展方法 - - - - @@ -1277,6 +1337,18 @@ + + + Mvc扩展方法 + + + + + 扩展方法 + + + + 全局路由前缀配置 diff --git a/EOM.TSHotelManager.WebApi/MvcOptionsExtensions.cs b/EOM.TSHotelManager.WebApi/Router_Extension/MvcOptionsExtensions.cs similarity index 100% rename from EOM.TSHotelManager.WebApi/MvcOptionsExtensions.cs rename to EOM.TSHotelManager.WebApi/Router_Extension/MvcOptionsExtensions.cs diff --git a/EOM.TSHotelManager.WebApi/RouteConvention.cs b/EOM.TSHotelManager.WebApi/Router_Extension/RouteConvention.cs similarity index 97% rename from EOM.TSHotelManager.WebApi/RouteConvention.cs rename to EOM.TSHotelManager.WebApi/Router_Extension/RouteConvention.cs index 42eb6dd..a97e035 100644 --- a/EOM.TSHotelManager.WebApi/RouteConvention.cs +++ b/EOM.TSHotelManager.WebApi/Router_Extension/RouteConvention.cs @@ -7,7 +7,7 @@ namespace EOM.TSHotelManager.WebApi /// /// 全局路由前缀配置 /// - public class RouteConvention:IApplicationModelConvention + public class RouteConvention : IApplicationModelConvention { /// /// 定义一个路由前缀变量 diff --git a/EOM.TSHotelManager.WebApi/Startup.cs b/EOM.TSHotelManager.WebApi/Startup.cs index 3d7e3b4..7cf2a6d 100644 --- a/EOM.TSHotelManager.WebApi/Startup.cs +++ b/EOM.TSHotelManager.WebApi/Startup.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Reflection; using System.Threading.Tasks; using Autofac; -using EncryptTools.Core; +using EOM.Encrypt; using EOM.TSHotelManager.EntityFramework; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -126,6 +126,11 @@ namespace EOM.TSHotelManager.WebApi .AsImplementedInterfaces() .InstancePerDependency() .PropertiesAutowired(); + + //עӽ + var encryptionService = Assembly.LoadFrom(Path.Combine(AppContext.BaseDirectory, "EOM.Encrypt.dll")); + builder.RegisterAssemblyTypes(encryptionService) + .PropertiesAutowired(); } catch (Exception ex) { diff --git a/Library/EOM.Encrypt.dll b/Library/EOM.Encrypt.dll new file mode 100644 index 0000000000000000000000000000000000000000..447e57bd0cef09ee0300a754bcdabf57ff575b3d GIT binary patch literal 12288 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 HJrDd3CE^ol literal 0 HcmV?d00001 -- Gitee