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)
- 详情
+ {{ ${t}t('btn.details') }}
$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)