From 87a685b823ee1728ae11aa93ed92dc6825328f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Wed, 28 Sep 2022 18:05:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E7=94=A8=E6=95=B0=E6=8D=AE=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Config/SwaggerDoc.xml | 30 +++--- .../BaseController/BaseCrudController.cs | 10 +- .../BaseController/BaseExcelController.cs | 76 ++++++++++++++ .../BaseSimpleCrudController.cs | 10 +- .../BaseController/BaseSimpleRdController.cs | 10 +- .../Controllers/UserController.cs | 99 +++++++++--------- ...2209281710231548UserEntity_DataExport.xlsx | Bin 0 -> 4612 bytes ...2209281714190694UserEntity_DataExport.xlsx | Bin 0 -> 4612 bytes ...2209281714277080UserEntity_DataExport.xlsx | Bin 0 -> 4612 bytes .../wwwroot/excel/T_DataTemplate.xlsx | Bin 0 -> 4018 bytes 10 files changed, 155 insertions(+), 80 deletions(-) create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseExcelController.cs create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Temp/202209281710231548UserEntity_DataExport.xlsx create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Temp/202209281714190694UserEntity_DataExport.xlsx create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Temp/202209281714277080UserEntity_DataExport.xlsx create mode 100644 Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/excel/T_DataTemplate.xlsx diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml index 356fd6a0..cef7ad07 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Config/SwaggerDoc.xml @@ -114,6 +114,24 @@ + + + 下载模板 + + + + + + 导出数据 + + + + + + 导入数据 + + + Json To Sql 类比模式,通用模型 @@ -465,18 +483,6 @@ 用户管理 - - - 下载模板 - - - - - - 导出数据 - - - 动态条件分页查询 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseCrudController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseCrudController.cs index 17f005ce..524c0d4d 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseCrudController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseCrudController.cs @@ -16,16 +16,14 @@ namespace Yi.Framework.ApiMicroservice.Controllers /// /// [ApiController] - public class BaseCrudController : ControllerBase where T : class,new() + public class BaseCrudController : BaseExcelController where T : class,new() { - private readonly ILogger _logger; - private IBaseService _baseService; - private IRepository _repository; - public BaseCrudController(ILogger logger, IBaseService iBaseService) + protected readonly ILogger _logger; + protected IBaseService _baseService; + public BaseCrudController(ILogger logger, IBaseService iBaseService):base(iBaseService._repository) { _logger = logger; _baseService = iBaseService; - _repository = iBaseService._repository; } /// diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseExcelController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseExcelController.cs new file mode 100644 index 00000000..81bdee27 --- /dev/null +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseExcelController.cs @@ -0,0 +1,76 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Localization; +using Yi.Framework.Common.Const; +using Yi.Framework.Common.Enum; +using Yi.Framework.Common.Helper; +using Yi.Framework.Common.Models; +using Yi.Framework.Interface; +using Yi.Framework.Language; +using Yi.Framework.Model.Models; +using Yi.Framework.Model.Query; +using Yi.Framework.Repository; +using Yi.Framework.WebCore.AttributeExtend; + +namespace Yi.Framework.ApiMicroservice.Controllers +{ + [ApiController] + public class BaseExcelController : ControllerBase where T : class, new() + { + protected IRepository _repository; + public BaseExcelController(IRepository repository) + { + _repository = repository; + } + /// + /// 下载模板 + /// + /// + [HttpGet] + [AllowAnonymous] + public IActionResult Template() + { + List users = new(); + var fileName = nameof(T) + PathConst.DataTemplate; + var path = ExcelHelper.DownloadImportTemplate(users, fileName, Path.Combine(PathConst.wwwroot, PathEnum.Excel.ToString())); + var file = System.IO.File.OpenRead(path); + return File(file, "text/plain", $"{DateTime.Now.ToString("yyyyMMddHHmmssffff") + fileName }.xlsx"); + } + + + /// + /// 导出数据 + /// + /// + [HttpGet] + [AllowAnonymous] + public async Task Export() + { + var users = await _repository.GetListAsync(); + var fileName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + nameof(T) + PathConst.DataExport; + var path = ExcelHelper.ExportExcel(users, fileName, Path.Combine(PathConst.wwwroot, PathEnum.Temp.ToString())); + var file = System.IO.File.OpenRead(path); + return File(file, "text/plain", $"{ fileName }.xlsx"); + } + + + /// + /// 导入数据 + /// + /// + [HttpPost] + [AllowAnonymous] + public async Task Import(IFormFile formFile) + { + List datas = ExcelHelper.ImportData(formFile.OpenReadStream()); + + //全量删除在重新插入 + var res = await _repository.UseTranAsync(async () => + { + await _repository.DeleteAsync(u => true); + await _repository.InsertRangeAsync(datas); + }); + return Result.Success().SetStatus(res); + } + } +} diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleCrudController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleCrudController.cs index c59f9265..c3969036 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleCrudController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleCrudController.cs @@ -16,16 +16,14 @@ namespace Yi.Framework.ApiMicroservice.Controllers /// /// [ApiController] - public class BaseSimpleCrudController : ControllerBase where T : class, new() + public class BaseSimpleCrudController : BaseExcelController where T : class, new() { - private readonly ILogger _logger; - private IBaseService _baseService; - private IRepository _repository; - public BaseSimpleCrudController(ILogger logger, IBaseService iBaseService) + protected readonly ILogger _logger; + protected IBaseService _baseService; + public BaseSimpleCrudController(ILogger logger, IBaseService iBaseService):base(iBaseService._repository) { _logger = logger; _baseService = iBaseService; - _repository = iBaseService._repository; } /// diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleRdController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleRdController.cs index fbd01fef..1f5be22b 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleRdController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/BaseController/BaseSimpleRdController.cs @@ -16,16 +16,14 @@ namespace Yi.Framework.ApiMicroservice.Controllers /// /// [ApiController] - public class BaseSimpleRdController : ControllerBase where T : class, new() + public class BaseSimpleRdController : BaseExcelController where T : class, new() { - private readonly ILogger _logger; - private IBaseService _baseService; - private IRepository _repository; - public BaseSimpleRdController(ILogger logger, IBaseService iBaseService) + protected readonly ILogger _logger; + protected IBaseService _baseService; + public BaseSimpleRdController(ILogger logger, IBaseService iBaseService):base(iBaseService._repository) { _logger = logger; _baseService = iBaseService; - _repository = iBaseService._repository; } /// diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs index abd465df..583e750d 100644 --- a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs +++ b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/Controllers/UserController.cs @@ -37,58 +37,58 @@ namespace Yi.Framework.ApiMicroservice.Controllers //数据导入导出将会被写入到基类 - /// - /// 下载模板 - /// - /// - [HttpGet] - [AllowAnonymous] - public IActionResult Template() - { - List users = new(); - var fileName = nameof(UserEntity) + PathConst.DataTemplate; - var path = ExcelHelper.DownloadImportTemplate(users, fileName, Path.Combine(PathConst.wwwroot, PathEnum.Excel.ToString())); - var file = System.IO.File.OpenRead(path); - return File(file, "text/plain", $"{DateTime.Now.ToString("yyyyMMddHHmmssffff") + fileName }.xlsx"); - } + ///// + ///// 下载模板 + ///// + ///// + //[HttpGet] + //[AllowAnonymous] + //public IActionResult Template() + //{ + // List users = new(); + // var fileName = nameof(UserEntity) + PathConst.DataTemplate; + // var path = ExcelHelper.DownloadImportTemplate(users, fileName, Path.Combine(PathConst.wwwroot, PathEnum.Excel.ToString())); + // var file = System.IO.File.OpenRead(path); + // return File(file, "text/plain", $"{DateTime.Now.ToString("yyyyMMddHHmmssffff") + fileName }.xlsx"); + //} - /// - /// 导出数据 - /// - /// - [HttpGet] - [AllowAnonymous] - public async Task Export() - { - var users = await _iUserService._repository.GetListAsync(); - var fileName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + nameof(UserEntity) + PathConst.DataExport; - var path = ExcelHelper.ExportExcel(users, fileName, Path.Combine(PathConst.wwwroot, PathEnum.Temp.ToString())); - var file = System.IO.File.OpenRead(path); - return File(file, "text/plain", $"{ fileName }.xlsx"); - } + ///// + ///// 导出数据 + ///// + ///// + //[HttpGet] + //[AllowAnonymous] + //public async Task Export() + //{ + // var users = await _iUserService._repository.GetListAsync(); + // var fileName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + nameof(UserEntity) + PathConst.DataExport; + // var path = ExcelHelper.ExportExcel(users, fileName, Path.Combine(PathConst.wwwroot, PathEnum.Temp.ToString())); + // var file = System.IO.File.OpenRead(path); + // return File(file, "text/plain", $"{ fileName }.xlsx"); + //} - /// - /// 导入数据 - /// - /// - [HttpGet] - [AllowAnonymous] - public async Task Import([FromForm(Name = "file")] IFormFile formFile) - { - List users = ExcelHelper.ImportData(formFile.OpenReadStream()); + ///// + ///// 导入数据 + ///// + ///// + //[HttpPost] + //[AllowAnonymous] + //public async Task Import(IFormFile formFile) + //{ + // List users = ExcelHelper.ImportData(formFile.OpenReadStream()); - var _repository = _iUserService._repository; + // var _repository = _iUserService._repository; - //全量删除在重新插入 - var res = await _repository.UseTranAsync(async () => - { - await _repository.DeleteAsync(u => true); - await _repository.InsertRangeAsync(users); - }); - return Result.Success().SetStatus(res); - } + // //全量删除在重新插入 + // var res = await _repository.UseTranAsync(async () => + // { + // await _repository.DeleteAsync(u => true); + // await _repository.InsertRangeAsync(users); + // }); + // return Result.Success().SetStatus(res); + //} /// /// 动态条件分页查询 @@ -114,8 +114,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers [Permission("system:user:edit")] public async Task UpdateStatus(long userId, bool isDel) { - return Result.Success().SetData(await _iUserService._repository.UpdateIgnoreNullAsync(new UserEntity() { Id = userId, IsDeleted = isDel })); - + return Result.Success().SetData(await _repository.UpdateIgnoreNullAsync(new UserEntity() { Id = userId, IsDeleted = isDel })); } /// @@ -153,7 +152,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers [Permission("system:user:edit")] public async Task Update(UserInfoDto userDto) { - if (await _iUserService._repository.IsAnyAsync(u => userDto.User.UserName.Equals(u.UserName) && !userDto.User.Id.Equals(u.Id))) + if (await _repository.IsAnyAsync(u => userDto.User.UserName.Equals(u.UserName) && !userDto.User.Id.Equals(u.Id))) { return Result.Error("用户名已存在,修改失败!"); } @@ -182,7 +181,7 @@ namespace Yi.Framework.ApiMicroservice.Controllers [Permission("system:user:add2")] public async Task Add(UserInfoDto userDto) { - if (await _iUserService._repository.IsAnyAsync(u => userDto.User.UserName.Equals(u.UserName))) + if (await _repository.IsAnyAsync(u => userDto.User.UserName.Equals(u.UserName))) { return Result.Error("用户已经存在,添加失败!"); } diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Temp/202209281710231548UserEntity_DataExport.xlsx b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Temp/202209281710231548UserEntity_DataExport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..33fa2a86a92746ff631db7ebdf043f7b22fa46cf GIT binary patch literal 4612 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 XJlW}M;S>CNj|g}E+Prk~Ur+x72S#)| literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Temp/202209281714190694UserEntity_DataExport.xlsx b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/Temp/202209281714190694UserEntity_DataExport.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8867cbdfa426132bad5423624d2e609f4cfb6441 GIT binary patch literal 4612 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 T8=v6UdqlYN*XCuC|9bi#4l;c` literal 0 HcmV?d00001 diff --git a/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/excel/T_DataTemplate.xlsx b/Yi.Framework.Net6/Yi.Framework.ApiMicroservice/wwwroot/excel/T_DataTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e7eee9a3a2f4ebbe2f0df6e5b2d9ee6f45bcfc6d GIT binary patch literal 4018 zcmZ`+2T)UM6HVy7NfAVpB26F(B~%dtNQok$cO(kZ(IiL{3`IIbYNR7YihvXW+mk9F zNKu-C0YrLl8fo%Jee*xyJ#S`m=VoTl&7M8GXFmftIR!g_iiQS&iB>VGdh;dy3=jZ# zLJj~N1F!?EG(0^p4jvdgW8WJNXd5XXcem737QoS~Ch^kcW-vq8zFzWK%j%nIG-V?} zIKk79KrH^L`;*&Z-&((|=o*Fg$_goLPAWWJnz3(}C zg4or!XlmRtF85))l2t^g(pFNwFv57s_HyiO>X*!;tYI!%dNeJMx7 z_gwav4u?wK3^%h(i^~>Pa#7NZ_+=0LoRuX{j!t1D!S{Xdhqz(cW&z} zahz#j=#!DKibv7V$RHr1yM8TNrz-Sy=!J;OoO21$h*XxYiW;9tYYLv`e9smB2Z3Lb z>K50zb|t<;1v&@IRDlMEn7%)}5M55Ml!F@@B=z(AzZj0~X=DlpGf<72 zS@_|DsIM}FL_2#heaYz*(w{7B1UzP22f;9T_C&cNJw09jB&b+}zx12IEP)&gx8@tL z21)rEFN|Tq50F~nXy?*l)rCca(bypE362{)T3~5{_jcfNU%;I}xe?}-er4S%UdyKh z;~dfB%kBy_;Hl5kz*-x$y<$Bi+XNAA45z=^T{)15_ZrtQmF|C~PPY*zLfHO6cYD@u*=>B>6*|*h2_9zdtaU-8=*1Xj&?!9|} z!}J6p6LJSh^vIF{06f3x`7MTnB>hnsW$`^Oq}B_!dp-L~VeU!{q7Dz4t+~Ue_Cb#~ z?L+JP;i)B8sHvgo)$pv)YnywjrBmCky#0~VM96Wc5*~KS6E>%m$iw&A`p$}SGBAZ7 zZ*S0KSQtRT$@MJk$3#r;vVOpF>3UjLf0Y$5gCImf?r#P4oY95Hh6Qisb9wFMZe#%K zF4o+nT5pxh`DT>6UvYKhTgqtO9v4P#?ovs2GMh z@O0SOUJBfAz&WC7M-SBS!L0xhIS9w z6pG`Yv{MPK5&UsXv+G1+_V@V)@d`nhp{)p*my+e4(ig=td0ID3FbxK_N242hkhz)^||a@T@FTuozo@lO8_djJwcc z^JS@dIPA_VO5 zSaB@vjr8R!y_M}jT$wq^07bDIR>fAY>iIE7;(G$1=l5gGs$P&?=vo+Yi$PNCr!85`d$j@wC8WWlDi{UM?@RvMnaQuD7 zNTSqDMIqIvnogo@ zB%I26+=U``hnO#q{(Q{lYe5n5)RmtCR!{E}w6;}LPjx_UTdIkO)b@AbA}D8~X!`h) z<`8Ekl2o|KSrG(Gi}Z>=yHY{#M)v7F>cc8Kmp~r#nAC@Yq%kGp*4PgM5QE=&dn3a?)p=MS#vgaLZ z!p;RV58HPUxs;nWq}a*cRDAJ*l?7x=4K(wS*OO}`$a4cNJUl3O%+hSr&BW?E-kaiFvV8~jci7Iu zC>d}rr4Xm^i3Te^l>eB4NTGT>T{qX_h%WJX7bg1ywBn>xI!{Q7 z9y(vVbwt0z6XK{(q}mzK07#YlWwRK2B&l|wU$;L_$js!%xIQq8+KSF@$dq!rteS;s zS9ytzxJht<%L^_K;Z!JR+(}(f=Gw6hf zPk;9`>Q=HIu=YklZJV{~l9^|Dftq2hajQl96t}@B;Z8}JV%|}kO1*@FAZmGn4B z<2yfg)m;oD3pFoF`J{J(?0nX-Hx9L+)zQ@2T2Zs(>eX8S30&!}x5keE1*c#Uik`-o*~o8cb?IB!EjDANjAsM4 z?<1cMShu}+O$}CScs_x9XIRm}){|(VWbj<(bBAhsD!wzkWs!^fkUbtVM{=lu*z$SPt7Kff{^>1rN`6^~%F z{2~Y|i&HDPFVDfsWf5ikDDGMPK-w@<@B`gNAli}32%ORUWT;;RoT3C^vc24idKhxE zC<@BdUX#{s49W37b!CkjML%Txsno6DS@EWrQliMQ@dUyWrR8K6gH^C>)<*@4X$bQx z