From 2ad3ea1fd8084ba0cf368fc67661f4d8079f98a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=8D=E5=81=9A=E7=A0=81=E5=86=9C?= <599854767@qq.com> Date: Fri, 28 Jul 2023 17:37:36 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ZR.Admin.WebApi/Controllers/BaseController.cs | 30 +++++++------ .../System/CodeGeneratorController.cs | 2 +- ZR.Admin.WebApi/GlobalUsing.cs | 7 +++ .../CodeGenTemplate/TplControllers.txt | 43 ++++++++++++++++--- .../wwwroot/CodeGenTemplate/TplIService.txt | 4 ++ .../wwwroot/CodeGenTemplate/TplService.txt | 35 +++++++++++++++ .../wwwroot/CodeGenTemplate/v3/Vue.txt | 41 ++++++++++++++++-- ZR.CodeGenerator/CodeGeneratorTool.cs | 2 + ZR.CodeGenerator/Model/ReplaceDto.cs | 1 + ZR.Service/GlobalUsing.cs | 1 + ZR.Service/System/IService/ISysMenuService.cs | 2 +- ZR.Service/System/SysMenuService.cs | 18 +++++++- 12 files changed, 160 insertions(+), 26 deletions(-) create mode 100644 ZR.Admin.WebApi/GlobalUsing.cs create mode 100644 ZR.Service/GlobalUsing.cs diff --git a/ZR.Admin.WebApi/Controllers/BaseController.cs b/ZR.Admin.WebApi/Controllers/BaseController.cs index 5311026..50576ea 100644 --- a/ZR.Admin.WebApi/Controllers/BaseController.cs +++ b/ZR.Admin.WebApi/Controllers/BaseController.cs @@ -58,9 +58,11 @@ namespace ZR.Admin.WebApi.Controllers /// protected IActionResult ExportExcel(string path, string fileName) { - //IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); - //string fileDir = Path.Combine(webHostEnvironment.WebRootPath, path, fileName); - + //var webHostEnvironment = App.WebHostEnvironment; + if (!Path.Exists(path)) + { + throw new CustomException(fileName + "文件不存在"); + } var stream = Io.File.OpenRead(path); //创建文件流 Response.Headers.Add("Access-Control-Expose-Headers", "Content-Disposition"); @@ -169,23 +171,23 @@ namespace ZR.Admin.WebApi.Controllers /// /// 下载导入模板 /// - /// - /// - /// + /// 数据类型 + /// 空数据类型集合 /// 下载文件名 /// - protected string DownloadImportTemplate(List list, Stream stream, string fileName) + protected (string, string) DownloadImportTemplate(List list, string fileName) { - IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); - string sFileName = $"{fileName}模板.xlsx"; - string newFileName = Path.Combine(webHostEnvironment.WebRootPath, "ImportTemplate", sFileName); + IWebHostEnvironment webHostEnvironment = App.WebHostEnvironment; + string sFileName = $"{fileName}.xlsx"; + string fullPath = Path.Combine(webHostEnvironment.WebRootPath, "ImportTemplate", sFileName); - if (!Directory.Exists(newFileName)) + //不存在模板创建模板 + if (!Directory.Exists(fullPath)) { - Directory.CreateDirectory(Path.GetDirectoryName(newFileName)); + Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); + MiniExcel.SaveAs(fullPath, list, overwriteFile: true); } - MiniExcel.SaveAs(newFileName, list); - return sFileName; + return (sFileName, fullPath); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs index 2ae41e2..92187a7 100644 --- a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs +++ b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs @@ -280,7 +280,7 @@ namespace ZR.Admin.WebApi.Controllers CodeGeneratorTool.Generate(dto); if (genTableInfo.Options.GenerateMenu) { - SysMenuService.AddSysMenu(genTableInfo, dto.ReplaceDto.PermissionPrefix, dto.ReplaceDto.ShowBtnEdit, dto.ReplaceDto.ShowBtnExport); + SysMenuService.AddSysMenu(genTableInfo, dto.ReplaceDto.PermissionPrefix, dto.ReplaceDto.ShowBtnEdit, dto.ReplaceDto.ShowBtnExport, dto.ReplaceDto.ShowBtnImport); } foreach (var item in dto.GenCodes) diff --git a/ZR.Admin.WebApi/GlobalUsing.cs b/ZR.Admin.WebApi/GlobalUsing.cs new file mode 100644 index 0000000..4d4888f --- /dev/null +++ b/ZR.Admin.WebApi/GlobalUsing.cs @@ -0,0 +1,7 @@ +global using ZR.Common; +global using Microsoft.AspNetCore.Authorization; +global using Infrastructure; +global using Infrastructure.Attribute; +global using Infrastructure.Enums; +global using Infrastructure.Model; +global using Mapster; \ No newline at end of file diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt index 3727ab9..34b8aba 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt @@ -1,15 +1,12 @@ -using Infrastructure; -using Infrastructure.Attribute; -using Infrastructure.Enums; -using Infrastructure.Model; -using Mapster; using Microsoft.AspNetCore.Mvc; using ${options.DtosNamespace}; using ${options.ModelsNamespace}.${options.SubNamespace}; using ${options.IServicsNamespace}.${options.SubNamespace}.I${options.SubNamespace}Service; using ${options.ApiControllerNamespace}.Extensions; using ${options.ApiControllerNamespace}.Filters; -using ${options.BaseNamespace}Common; +$if(replaceDto.ShowBtnImport) +using MiniExcelLibs; +$end //创建时间:${replaceDto.AddTime} namespace ${options.ApiControllerNamespace}.Controllers @@ -168,6 +165,40 @@ $if(replaceDto.ShowBtnTruncate) } $end +$if(replaceDto.ShowBtnImport) + /// + /// 导入 + /// + /// + /// + [HttpPost("importData")] + [Log(Title = "${genTable.FunctionName}导入", BusinessType = BusinessType.IMPORT, IsSaveRequestData = false, IsSaveResponseData = true)] + [ActionPermissionFilter(Permission = "${replaceDto.PermissionPrefix}:import")] + public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile) + { + List<${replaceDto.ModelTypeName}> list = new(); + using (var stream = formFile.OpenReadStream()) + { + list = stream.Query<${replaceDto.ModelTypeName}>(startCell: "A1").ToList(); + } + + return SUCCESS(_${replaceDto.ModelTypeName}Service.Import${replaceDto.ModelTypeName}(list)); + } + + /// + /// ${genTable.FunctionName}导入模板下载 + /// + /// + [HttpGet("importTemplate")] + [Log(Title = "${genTable.FunctionName}模板", BusinessType = BusinessType.EXPORT, IsSaveRequestData = true, IsSaveResponseData = false)] + [AllowAnonymous] + public IActionResult ImportTemplateExcel() + { + var result = DownloadImportTemplate(new List<${replaceDto.ModelTypeName}>() { }, "${replaceDto.ModelTypeName}"); + return ExportExcel(result.Item2, result.Item1); + } +$end + $if(showCustomInput) /// /// 保存排序 diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplIService.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplIService.txt index 9e4cc3d..b2ae84b 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplIService.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplIService.txt @@ -24,5 +24,9 @@ $end $if(replaceDto.ShowBtnTruncate) bool Truncate${replaceDto.ModelTypeName}(); $end + +$if(replaceDto.ShowBtnImport) + (string, object, object) Import${replaceDto.ModelTypeName}(List<${replaceDto.ModelTypeName}> list); +$end } } diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt index 9a26f93..66c559e 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplService.txt @@ -159,5 +159,40 @@ $if(replaceDto.ShowBtnTruncate) return Truncate(); } $end + +$if(replaceDto.ShowBtnImport) + /// + /// 导入${genTable.FunctionName} + /// + /// + public (string, object, object) Import${replaceDto.ModelTypeName}(List<${replaceDto.ModelTypeName}> list) + { + var x = Context.Storageable(list) + .SplitInsert(it => !it.Any()) +$foreach(column in genTable.Columns) +$if(column.IsRequired && column.IsIncrement == false) + .SplitError(x => x.Item.${column.CsharpField}.IsEmpty(), "${column.ColumnComment}不能为空") +$end +$end + //.WhereColumns(it => it.UserName)//如果不是主键可以这样实现(多字段it=>new{it.x1,it.x2}) + .ToStorage(); + var result = x.AsInsertable.ExecuteCommand();//插入可插入部分; + + string msg = $"插入{x.InsertList.Count} 更新{x.UpdateList.Count} 错误数据{x.ErrorList.Count} 不计算数据{x.IgnoreList.Count} 删除数据{x.DeleteList.Count} 总共{x.TotalList.Count}"; + Console.WriteLine(msg); + + //输出错误信息 + foreach (var item in x.ErrorList) + { + Console.WriteLine("错误" + item.StorageMessage); + } + foreach (var item in x.IgnoreList) + { + Console.WriteLine("忽略" + item.StorageMessage); + } + + return (msg, x.ErrorList, x.IgnoreList); + } +$end } } \ No newline at end of file diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt index a126b9c..96eda45 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/v3/Vue.txt @@ -108,6 +108,25 @@ $if(replaceDto.ShowBtnTruncate) $end +$if(replaceDto.ShowBtnImport) + + + + {{ ${t}t('btn.import') }} + + + + +$end $if(replaceDto.ShowBtnExport) @@ -136,7 +155,7 @@ $end $if(sub) $end @@ -194,7 +213,7 @@ $end $else $if(replaceDto.ShowBtnView) - + $end $if(replaceDto.ShowBtnEdit) @@ -426,7 +445,9 @@ from '@/api/${tool.FirstLowerCase(genTable.ModuleName)}/${genTable.BusinessName. $if(replaceDto.ShowEditor == 1) import Editor from '@/components/Editor' $end - +$if(replaceDto.ShowBtnImport) +import importData from '@/components/ImportData' +$end const { proxy } = getCurrentInstance() const ids = ref([]) const loading = ref(false) @@ -746,6 +767,20 @@ function handlePreview(row) { } $end +$if(replaceDto.ShowBtnImport) +// 导入数据成功处理 +const handleFileSuccess = (response) => { + const { item1, item2 } = response.data + var error = '' + item2.forEach((item) => { + error += item.storageMessage + ',' + }) + proxy.${alert}alert(item1 + '

' + error + '

', '导入结果', { + dangerouslyUseHTMLString: true + }) +} +$end + $if(replaceDto.ShowBtnExport) // 导出按钮操作 function handleExport() { diff --git a/ZR.CodeGenerator/CodeGeneratorTool.cs b/ZR.CodeGenerator/CodeGeneratorTool.cs index 0495e04..c4d1947 100644 --- a/ZR.CodeGenerator/CodeGeneratorTool.cs +++ b/ZR.CodeGenerator/CodeGeneratorTool.cs @@ -50,6 +50,7 @@ namespace ZR.CodeGenerator ShowBtnView = dto.GenTable.Options.CheckedBtn.Any(f => f == 5), ShowBtnTruncate = dto.GenTable.Options.CheckedBtn.Any(f => f == 6), ShowBtnMultiDel = dto.GenTable.Options.CheckedBtn.Any(f => f == 7), + ShowBtnImport = dto.GenTable.Options.CheckedBtn.Any(f => f == 8), ViewFileName = dto.GenTable.BusinessName.FirstUpperCase(), OperBtnStyle = dto.GenTable.Options.OperBtnStyle }; @@ -586,6 +587,7 @@ namespace ZR.CodeGenerator options.Data.Set("refs", "$");//特殊标签替换 options.Data.Set("t", "$");//特殊标签替换 options.Data.Set("modal", "$");//特殊标签替换 + options.Data.Set("alert", "$");//特殊标签替换 options.Data.Set("index", "$");//特殊标签替换 options.Data.Set("confirm", "$");//特殊标签替换 options.Data.Set("nextTick", "$"); diff --git a/ZR.CodeGenerator/Model/ReplaceDto.cs b/ZR.CodeGenerator/Model/ReplaceDto.cs index e2f974e..3719e49 100644 --- a/ZR.CodeGenerator/Model/ReplaceDto.cs +++ b/ZR.CodeGenerator/Model/ReplaceDto.cs @@ -50,6 +50,7 @@ namespace ZR.CodeGenerator.Model public bool ShowBtnView { get; set; } public bool ShowBtnTruncate { get; set; } public bool ShowBtnMultiDel { get; set; } + public bool ShowBtnImport { get; set; } /// /// 上传URL data /// diff --git a/ZR.Service/GlobalUsing.cs b/ZR.Service/GlobalUsing.cs new file mode 100644 index 0000000..57439d9 --- /dev/null +++ b/ZR.Service/GlobalUsing.cs @@ -0,0 +1 @@ +global using System.Collections.Generic; \ No newline at end of file diff --git a/ZR.Service/System/IService/ISysMenuService.cs b/ZR.Service/System/IService/ISysMenuService.cs index 29bd021..5896af8 100644 --- a/ZR.Service/System/IService/ISysMenuService.cs +++ b/ZR.Service/System/IService/ISysMenuService.cs @@ -39,7 +39,7 @@ namespace ZR.Service.System.IService List BuildMenuTreeSelect(List menus); - void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport); + void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport, bool showImport); List SelectTreeMenuListByRoles(MenuQueryDto menu, List roles); List SelectRoleMenuListByRole(MenuQueryDto menu, int roleId); } diff --git a/ZR.Service/System/SysMenuService.cs b/ZR.Service/System/SysMenuService.cs index 2e62576..fbf84c2 100644 --- a/ZR.Service/System/SysMenuService.cs +++ b/ZR.Service/System/SysMenuService.cs @@ -588,7 +588,7 @@ namespace ZR.Service #endregion - public void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport) + public void AddSysMenu(GenTable genTableInfo, string permPrefix, bool showEdit, bool showExport, bool showImport) { var menu = GetFirst(f => f.MenuName == genTableInfo.FunctionName); if (menu is null) @@ -671,6 +671,18 @@ namespace ZR.Service Icon = "", }; + SysMenu menuImport = new() + { + MenuName = "导入", + ParentId = menu.MenuId, + OrderNum = 5, + Perms = $"{permPrefix}:import", + MenuType = "F", + Visible = "0", + Status = "0", + Icon = "", + }; + menuList.Add(menuQuery); menuList.Add(menuAdd); menuList.Add(menuDel); @@ -682,6 +694,10 @@ namespace ZR.Service { menuList.Add(menuExport); } + if (showImport) + { + menuList.Add(menuImport); + } //Insert(menuList); var x = Storageable(menuList)