diff --git a/Infrastructure/CustomException/ResultCode.cs b/Infrastructure/CustomException/ResultCode.cs index 4c670da..d459ae9 100644 --- a/Infrastructure/CustomException/ResultCode.cs +++ b/Infrastructure/CustomException/ResultCode.cs @@ -19,6 +19,7 @@ namespace Infrastructure [Description("NO_DATA")] NODATA = 106, + [Description("操作失败")] FAIL = 1, [Description("服务端出错啦")] diff --git a/Quartz.NET.WindowsService/使用说明.txt b/Quartz.NET.WindowsService/使用说明.txt index 2eda9c4..9301000 100644 --- a/Quartz.NET.WindowsService/使用说明.txt +++ b/Quartz.NET.WindowsService/使用说明.txt @@ -1,8 +1,8 @@ -ֻǽquartz.netIISIISӦóػպͲִˣôʹôwindowsʱquartz.netվ +ֻǽĿIISIISӦóػպͲִˣôʹôwindowsʱñĿվ -1޸App.configеurlvalueֵΪ㵱ǰquertz.netվ+/Health/indexע⣺DZĿһҪ޸bin/Debug/Quartz.NET.WindowsService.exe.configurl -2ü±Install.batļ޸E:\Quartz.NET\Quartz.NET.WindowsService\bin\Debug\Quartz.NET.WindowsService.exe -Ϊ(дĿ·)\Quartz.NET\Quartz.NET.WindowsService\bin\Debug\Quartz.NET.WindowsService.exe +1޸App.configеurlvalueֵΪ㵱ǰquertz.netվ+/Common/Health +2ü±Install.batļ޸ ĿĿ¼\bin\Debug\Quartz.NET.WindowsService.exe +Ϊ(дĿ·)\Quartz.NET.WindowsService\bin\Debug\Quartz.NET.WindowsService.exe 3Ŀ 4Install.batװwindows diff --git a/README.md b/README.md index 4300583..dd1dd81 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ Vue版前端技术栈 :基于vue、vuex、vue-router 、vue-cli 、axios 和 e + @@ -123,4 +124,5 @@ Vue版前端技术栈 :基于vue、vuex、vue-router 、vue-cli 、axios 和 e 源码地址 -https://gitee.com/izory/ZrAdminNetCore \ No newline at end of file +[Gitee](https://gitee.com/izory/ZrAdminNetCore/)https://gitee.com/izory/ZrAdminNetCore +[Github](https://github.com/izhaorui/ZrAdmin.NET/)https://github.com/izhaorui/ZrAdmin.NET \ No newline at end of file diff --git a/ZR.Admin.WebApi/Controllers/BaseController.cs b/ZR.Admin.WebApi/Controllers/BaseController.cs index b34e50e..5565b2d 100644 --- a/ZR.Admin.WebApi/Controllers/BaseController.cs +++ b/ZR.Admin.WebApi/Controllers/BaseController.cs @@ -1,7 +1,6 @@ using Infrastructure; using Infrastructure.Model; using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; @@ -9,8 +8,6 @@ using OfficeOpenXml; using System; using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Reflection; using ZR.Admin.WebApi.Filters; namespace ZR.Admin.WebApi.Controllers @@ -18,8 +15,6 @@ namespace ZR.Admin.WebApi.Controllers [LogActionFilter] public class BaseController : ControllerBase { - private static readonly NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); - public static string TIME_FORMAT_FULL = "yyyy-MM-dd HH:mm:ss"; public static string TIME_FORMAT_FULL_2 = "MM-dd HH:mm:ss"; @@ -134,5 +129,37 @@ namespace ZR.Admin.WebApi.Controllers return sFileName; } + + /// + /// 下载导入模板 + /// + /// + /// + /// + /// 下载文件名 + /// + protected string DownloadImportTemplate(List list, Stream stream, string fileName) + { + IWebHostEnvironment webHostEnvironment = (IWebHostEnvironment)App.ServiceProvider.GetService(typeof(IWebHostEnvironment)); + string sFileName = $"{fileName}模板.xlsx"; + string newFileName = Path.Combine(webHostEnvironment.WebRootPath, "importTemplate", sFileName); + //调试模式需要加上 + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + if (!Directory.Exists(newFileName)) + { + Directory.CreateDirectory(Path.GetDirectoryName(newFileName)); + } + using (ExcelPackage package = new(new FileInfo(newFileName))) + { + // 添加worksheet + ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(fileName); + + //全部字段导出 + worksheet.Cells.LoadFromCollection(list, true, OfficeOpenXml.Table.TableStyles.Light13); + package.SaveAs(stream); + } + + return sFileName; + } } } diff --git a/ZR.Admin.WebApi/Controllers/CommonController.cs b/ZR.Admin.WebApi/Controllers/CommonController.cs index 7e3424c..14f1be7 100644 --- a/ZR.Admin.WebApi/Controllers/CommonController.cs +++ b/ZR.Admin.WebApi/Controllers/CommonController.cs @@ -43,6 +43,12 @@ namespace ZR.Admin.WebApi.Controllers return SUCCESS(true); } + [Route("/")] + public IActionResult Index() + { + return Content("Hello看到这里页面说明你已经成功启动了本项目,加油吧 少年。"); + } + /// /// 发送邮件 /// @@ -79,7 +85,7 @@ namespace ZR.Admin.WebApi.Controllers /// [HttpPost()] [Verify] - [ActionPermissionFilter(Permission = "system")] + [ActionPermissionFilter(Permission = "common")] public IActionResult UploadFile([FromForm(Name = "file")] IFormFile formFile) { if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空"); @@ -114,7 +120,7 @@ namespace ZR.Admin.WebApi.Controllers /// [HttpPost] [Verify] - [ActionPermissionFilter(Permission = "system")] + [ActionPermissionFilter(Permission = "common")] public IActionResult UploadFileAliyun([FromForm(Name = "file")] IFormFile formFile, string fileDir = "") { if (formFile == null) throw new CustomException(ResultCode.PARAM_ERROR, "上传文件不能为空"); diff --git a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs index f554632..5470b2e 100644 --- a/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs +++ b/ZR.Admin.WebApi/Controllers/System/CodeGeneratorController.cs @@ -4,7 +4,6 @@ using Infrastructure.Enums; using Mapster; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using SqlSugar; using System; @@ -19,7 +18,6 @@ using ZR.Common; using ZR.Model; using ZR.Model.System.Dto; using ZR.Model.System.Generate; -using ZR.Service; using ZR.Service.System.IService; namespace ZR.Admin.WebApi.Controllers @@ -31,20 +29,18 @@ namespace ZR.Admin.WebApi.Controllers [Route("tool/gen")] public class CodeGeneratorController : BaseController { - private CodeGeneraterService _CodeGeneraterService = new CodeGeneraterService(); - private IGenTableService GenTableService; - private IGenTableColumnService GenTableColumnService; - private readonly ISysDictDataService SysDictDataService; - private IWebHostEnvironment WebHostEnvironment; + private readonly CodeGeneraterService _CodeGeneraterService = new CodeGeneraterService(); + private readonly IGenTableService GenTableService; + private readonly IGenTableColumnService GenTableColumnService; + + private readonly IWebHostEnvironment WebHostEnvironment; public CodeGeneratorController( IGenTableService genTableService, IGenTableColumnService genTableColumnService, - ISysDictDataService dictDataService, IWebHostEnvironment webHostEnvironment) { GenTableService = genTableService; GenTableColumnService = genTableColumnService; - SysDictDataService = dictDataService; WebHostEnvironment = webHostEnvironment; } @@ -62,7 +58,7 @@ namespace ZR.Admin.WebApi.Controllers } /// - ///获取所有表根据数据名 + ///获取所有表根据数据库名 /// /// 数据库名 /// 表名 @@ -78,12 +74,13 @@ namespace ZR.Admin.WebApi.Controllers } /// - /// 获取代码生成表列表 + /// 查询生成表数据 /// /// 表名 /// 分页信息 /// - [HttpGet("listGenTable")] + [HttpGet("list")] + [ActionPermissionFilter(Permission = "tool:gen:list")] public IActionResult GetGenTable(string tableName, PagerInfo pagerInfo) { //查询原表数据,部分字段映射到代码生成表字段 @@ -93,18 +90,34 @@ namespace ZR.Admin.WebApi.Controllers } /// - /// 查询表字段列表 + /// 修改代码生成业务查询 /// /// genTable表id /// - [HttpGet("column/{tableId}")] + [HttpGet("{tableId}")] + [ActionPermissionFilter(Permission = "tool:gen:query")] public IActionResult GetColumnList(long tableId) { var tableColumns = GenTableColumnService.GenTableColumns(tableId); var tableInfo = GenTableService.GetGenTableInfo(tableId); - return SUCCESS(new { cloumns = tableColumns, info = tableInfo }); + var tables = GenTableService.GetGenTableAll(); + + return SUCCESS(new { columns = tableColumns, info = tableInfo, tables }); } + /// + /// 根据表id查询表列 + /// + /// genTable表id + /// + [HttpGet("column/{tableId}")] + [ActionPermissionFilter(Permission = "tool:gen:query")] + public IActionResult GetTableColumnList(long tableId) + { + var tableColumns = GenTableColumnService.GenTableColumns(tableId); + + return SUCCESS(new { columns = tableColumns }); + } /// /// 删除代码生成 /// @@ -144,18 +157,7 @@ namespace ZR.Admin.WebApi.Controllers var tabInfo = _CodeGeneraterService.GetTableInfo(dbName, tableName); if (tabInfo != null) { - GenTable genTable = new() - { - BaseNameSpace = "ZR.",//导入默认命名空间前缀 - ModuleName = "business",//导入默认模块名 - ClassName = CodeGeneratorTool.GetClassName(tableName), - BusinessName = CodeGeneratorTool.GetBusinessName(tableName), - FunctionAuthor = ConfigUtils.Instance.GetConfig(GenConstants.Gen_author), - TableName = tableName, - TableComment = tabInfo?.Description, - FunctionName = tabInfo?.Description, - Create_by = userName, - }; + GenTable genTable = CodeGeneratorTool.InitTable(dbName, userName, tableName, tabInfo?.Description); genTable.TableId = GenTableService.ImportGenTable(genTable); if (genTable.TableId > 0) @@ -242,7 +244,7 @@ namespace ZR.Admin.WebApi.Controllers [HttpPost("genCode")] [Log(Title = "代码生成", BusinessType = BusinessType.GENCODE)] [ActionPermissionFilter(Permission = "tool:gen:code")] - public IActionResult Generate([FromBody] GenerateDto dto) + public IActionResult CodeGenerate([FromBody] GenerateDto dto) { if (dto.TableId <= 0) { @@ -260,9 +262,29 @@ namespace ZR.Admin.WebApi.Controllers //下载文件 FileHelper.ZipGenCode(dto); - //HttpContext.Response.Headers.Add("Content-disposition", $"attachment; filename={zipFileName}"); - return SUCCESS(new { zipPath = "/Generatecode/" + dto.ZipFileName, fileName = dto.ZipFileName }); + return SUCCESS(new { path = "/Generatecode/" + dto.ZipFileName, fileName = dto.ZipFileName }); } + /// + /// 同步数据库 + /// + /// + /// + /// + [ActionPermissionFilter(Permission = "tool:gen:edit")] + [Log(Title = "代码生成", BusinessType = BusinessType.UPDATE)] + [HttpGet("synchDb/{tableId}")] + public IActionResult SynchDb(string tableName, long tableId = 0) + { + if (string.IsNullOrEmpty(tableName) || tableId <= 0) throw new CustomException("参数错误"); + GenTable table = GenTableService.GetGenTableInfo(tableId); + if (table == null) { throw new CustomException("原表不存在"); } + + List dbColumnInfos = _CodeGeneraterService.GetColumnInfo(table.DbName, tableName); + List dbTableColumns = CodeGeneratorTool.InitGenTableColumn(table, dbColumnInfos); + + GenTableService.SynchDb(tableId, table, dbTableColumns); + return SUCCESS(true); + } } } diff --git a/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs b/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs index 86e178b..9ec9fd1 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysDictDataController.cs @@ -3,9 +3,13 @@ using Infrastructure.Enums; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using System; +using System.Collections.Generic; +using System.Linq; using ZR.Admin.WebApi.Filters; +using ZR.Common; using ZR.Model; using ZR.Model.System; +using ZR.Model.System.Dto; using ZR.Model.Vo; using ZR.Service.System.IService; @@ -53,6 +57,30 @@ namespace ZR.Admin.WebApi.Controllers.System { return SUCCESS(SysDictDataService.SelectDictDataByType(dictType)); } + /// + /// 根据字典类型查询字典数据信息 + /// + /// + /// + [AllowAnonymous] + [HttpPost("types")] + public IActionResult DictTypes([FromBody] List dto) + { + var list = SysDictDataService.SelectDictDataByTypes(dto.Select(f => f.DictType).ToArray()); + List dataVos = new(); + + foreach (var dic in dto) + { + SysdictDataDto vo = new() + { + DictType = dic.DictType, + ColumnName = dic.ColumnName, + List = list.FindAll(f => f.DictType == dic.DictType) + }; + dataVos.Add(vo); + } + return SUCCESS(dataVos); + } /// /// 查询字典数据详细 diff --git a/ZR.Admin.WebApi/Controllers/System/SysPostController.cs b/ZR.Admin.WebApi/Controllers/System/SysPostController.cs index b87ebfa..5deb34a 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysPostController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysPostController.cs @@ -95,7 +95,7 @@ namespace ZR.Admin.WebApi.Controllers.System throw new CustomException($"修改岗位{post.PostName}失败,岗位编码已存在"); } post.Update_by = User.Identity.Name; - return ToResponse(ToJson(PostService.Update(post) ? 1 : 0)); + return ToResponse(PostService.Update(post)); } /// diff --git a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs index 5c1859a..800ad0f 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysRoleController.cs @@ -129,15 +129,18 @@ namespace ZR.Admin.WebApi.Controllers.System if (sysRoleDto == null || sysRoleDto.RoleId <= 0) return ToResponse(ApiResult.Error(101, "请求参数错误")); sysRoleDto.Create_by = HttpContext.GetName(); - //删除角色菜单 - sysRoleService.DeleteRoleMenuByRoleId(sysRoleDto.RoleId); - sysRoleService.InsertRoleMenu(sysRoleDto); + bool result = sysRoleService.UseTran2(() => + { + //删除角色菜单 + sysRoleService.DeleteRoleMenuByRoleId(sysRoleDto.RoleId); + sysRoleService.InsertRoleMenu(sysRoleDto); + }); - return SUCCESS(true); + return SUCCESS(result); } /// - /// 角色删除 √ + /// 角色删除 /// /// /// @@ -153,7 +156,7 @@ namespace ZR.Admin.WebApi.Controllers.System } /// - /// 修改角色状态 √ + /// 修改角色状态 /// /// 角色对象 /// diff --git a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs index fd2242e..ff92959 100644 --- a/ZR.Admin.WebApi/Controllers/System/SysUserController.cs +++ b/ZR.Admin.WebApi/Controllers/System/SysUserController.cs @@ -1,6 +1,7 @@ using Infrastructure.Attribute; using Infrastructure.Enums; using Infrastructure.Model; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -8,7 +9,9 @@ using OfficeOpenXml; using System; using System.Collections.Generic; using System.IO; +using System.Reflection; using ZR.Admin.WebApi.Filters; +using ZR.Common; using ZR.Model; using ZR.Model.System; using ZR.Service; @@ -170,43 +173,37 @@ namespace ZR.Admin.WebApi.Controllers.System return ToResponse(ToJson(result)); } - ///// - ///// 导入 ok - ///// - ///// 使用IFromFile必须使用name属性否则获取不到文件 - ///// - //[HttpPost("importData")] - //[Log(Title = "用户导入", BusinessType = BusinessType.IMPORT)] - //[ActionPermissionFilter(Permission = "system:user:import")] - //public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile) - //{ - // var mapper = new Mapper(formFile.OpenReadStream());// 从流获取 - // //读取的sheet信息 - // var rows = mapper.Take(0); - // foreach (var item in rows) - // { - // SysUser u = item.Value; - // } - // //TODO 业务逻辑 - // return SUCCESS(1); - //} + /// + /// 导入 + /// + /// 使用IFromFile必须使用name属性否则获取不到文件 + /// + [HttpPost("importData")] + [Log(Title = "用户导入", BusinessType = BusinessType.IMPORT)] + [ActionPermissionFilter(Permission = "system:user:import")] + public IActionResult ImportData([FromForm(Name = "file")] IFormFile formFile) + { + IEnumerable users = ExcelHelper.ImportData(formFile.OpenReadStream()); - ///// - ///// 用户模板 ok - ///// - ///// - //[HttpGet("importTemplate")] - //[Log(Title = "用户模板", BusinessType = BusinessType.EXPORT)] - //[ActionPermissionFilter(Permission = "system:user:export")] - //public IActionResult ImportTemplateExcel() - //{ - // List user = new List(); - // var mapper = new Mapper(); - // MemoryStream stream = new MemoryStream(); - // mapper.Save(stream, user, "sheel1", overwrite: true, xlsx: true); - // //Response.Headers.Append("content-disposition", "attachment;filename=sysUser.xlsx"); - // return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "sysUser.xlsx"); - //} + //TODO 业务逻辑,自行插入数据到db + return SUCCESS(users); + } + + /// + /// 用户导入模板下载 + /// + /// + [HttpGet("importTemplate")] + [Log(Title = "用户模板", BusinessType = BusinessType.EXPORT)] + [AllowAnonymous] + public IActionResult ImportTemplateExcel() + { + List user = new List(); + MemoryStream stream = new MemoryStream(); + + string sFileName = DownloadImportTemplate(user, stream, "用户列表"); + return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"{sFileName}"); + } /// /// 用户导出 diff --git a/ZR.Admin.WebApi/Controllers/System/TasksController.cs b/ZR.Admin.WebApi/Controllers/System/TasksController.cs index d2d8148..c3cb393 100644 --- a/ZR.Admin.WebApi/Controllers/System/TasksController.cs +++ b/ZR.Admin.WebApi/Controllers/System/TasksController.cs @@ -141,7 +141,7 @@ namespace ZR.Admin.WebApi.Controllers Update_by = User.Identity.Name, Update_time = DateTime.Now }); - if (response) + if (response > 0) { //先暂停原先的任务 var respon = await _schedulerServer.UpdateTaskScheduleAsync(tasksQz, tasksQz.JobGroup); diff --git a/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs b/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs index 3cf32ca..a677859 100644 --- a/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs +++ b/ZR.Admin.WebApi/Filters/ActionPermissionFilter.cs @@ -55,12 +55,12 @@ namespace ZR.Admin.WebApi.Filters bool isDemoMode = ConfigUtils.Instance.GetAppConfig("DemoMode", false); //演示公开环境屏蔽权限 - string[] denyPerms = new string[] { "update", "add", "remove", "add", "edit", "delete", "import", "run", "start", "stop", "clear", "send" ,"export"}; - if (isDemoMode && (denyPerms.Any(f => Permission.ToLower().Contains(f.ToLower())) || Permission.Equals("system"))) + string[] denyPerms = new string[] { "update", "add", "remove", "add", "edit", "delete", "import", "run", "start", "stop", "clear", "send" ,"export", "upload", "common"}; + if (isDemoMode && denyPerms.Any(f => Permission.ToLower().Contains(f))) { context.Result = new JsonResult(new { code = ResultCode.FORBIDDEN, msg = "演示模式 , 不允许操作" }); } - if (!HasPermi && !Permission.Equals("system")) + if (!HasPermi && !Permission.Equals("common")) { logger.Info($"用户{info.NickName}没有权限访问{context.HttpContext.Request.Path},当前权限[{Permission}]"); context.Result = new JsonResult(new { code = ResultCode.FORBIDDEN, msg = "你没有权限访问" }); diff --git a/ZR.Admin.WebApi/Properties/launchSettings.json b/ZR.Admin.WebApi/Properties/launchSettings.json index 8fd0a5e..7fb9b62 100644 --- a/ZR.Admin.WebApi/Properties/launchSettings.json +++ b/ZR.Admin.WebApi/Properties/launchSettings.json @@ -4,7 +4,7 @@ "commandName": "Project", "launchBrowser": false, "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Production" + "ASPNETCORE_ENVIRONMENT": "Stage" }, "applicationUrl": "http://localhost:8888" } diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/MySqlTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/MySqlTemplate.txt index dd44cd0..b48a0c3 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/MySqlTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/MySqlTemplate.txt @@ -1,6 +1,6 @@ -- 菜单 INSERT INTO sys_menu(menuName, parentId, orderNum, path, component, isFrame, isCache, menuType, visible, status, perms, icon, create_by, create_time, remark) -VALUES ('${genTable.functionName}', ${parentId}, 1, '${genTable.ModuleName}/${replaceDto.ModelTypeName}', '${genTable.ModuleName}/${genTable.BusinessName}/index', 0, 0, 'C', '0', '0', '${replaceDto.PermissionPrefix}:list', 'icon1', '', sysdate(), '${genTable.functionName}菜单'); +VALUES ('${genTable.functionName}', ${parentId}, 1, '${genTable.ModuleName}/${replaceDto.ModelTypeName}', '${genTable.ModuleName}/${genTable.BusinessName}', 0, 0, 'C', '0', '0', '${replaceDto.PermissionPrefix}:list', 'icon1', '', sysdate(), '${genTable.functionName}菜单'); -- 按钮父菜单id SELECT @menuId := LAST_INSERT_ID(); diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt index c3dd147..0996ead 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplControllers.txt @@ -101,14 +101,15 @@ $end //从 Dto 映射到 实体 var model = parm.Adapt<${replaceDto.ModelTypeName}>().ToCreate(HttpContext); - return SUCCESS(_${replaceDto.ModelTypeName}Service.Insert(model, it => new + var response = _${replaceDto.ModelTypeName}Service.Insert(model, it => new { $foreach(item in genTable.Columns) $if((item.IsInsert)) it.$item.CsharpField, $end ${end} - })); + }); + return ToResponse(response); } /// @@ -137,7 +138,7 @@ $end ${end} }); - return SUCCESS(response); + return ToResponse(response); } /// @@ -154,7 +155,7 @@ ${end} var response = _${replaceDto.ModelTypeName}Service.Delete(idsArr); - return SUCCESS(response); + return ToResponse(response); } /// diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt index 76d6a07..c643c81 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/TplVue.txt @@ -33,7 +33,7 @@ $end - + ${VueViewListContent} @@ -148,12 +148,21 @@ $end // 列表数据查询 this.getList(); + $set(index = 0) + var dictParams = [ $foreach(item in genTable.Columns) $if((item.HtmlType == "radio" || item.HtmlType == "select" || item.HtmlType == "checkbox") && item.DictType != "") - this.getDicts("${item.DictType}").then((response) => { - this.${item.ColumnName}Options = response.data; - }) + { dictType: "${item.DictType}", columnName: "${item.ColumnName}Options" }, +$set(index = index + 1) $end +$end + ]; +$if(index > 0) + this.getDicts(dictParams).then((response) => { + response.data.forEach((element) => { + this[element.columnName] = element.list; + }); + }); $end }, methods: { @@ -165,11 +174,12 @@ $if(item.HtmlType == "datetime" && item.IsQuery == true) this.queryParams["end${item.CsharpField}"] = this.addDateRange2(this.dateRange${item.CsharpField}, 1); $end $end - console.log(JSON.stringify(this.queryParams)); + this.loading = true; list${genTable.BusinessName}(this.queryParams).then(res => { if (res.code == 200) { this.dataList = res.data.result; this.total = res.data.totalNum; + this.loading = false; } }) }, @@ -185,6 +195,9 @@ $foreach(item in genTable.Columns) $if((item.IsEdit || item.IsInsert)) $item.ColumnName: undefined, $end +$if((item.HtmlType == "checkbox")) + ${item.ColumnName}Checked: [], +$end $end }; this.resetForm("form"); @@ -237,10 +250,19 @@ $end this.reset(); const id = row.${replaceDto.FistLowerPk} || this.ids; get${genTable.BusinessName}(id).then((res) => { - if (res.code == 200) { - this.form = res.data; - this.open = true; - this.title = "修改数据"; + const { code, data } = res; + if (code == 200) { + this.open = true; + this.title = "修改数据"; + + this.form = { + ...data, +$foreach(item in genTable.Columns) +$if(item.HtmlType == "checkbox") + ${item.ColumnName}Checked: data.${item.columnName} ? data.${item.columnName}.split(',') : [], +$end +$end + }; } }); }, @@ -278,28 +300,33 @@ $end submitForm: function () { this.${refs}refs["form"].validate((valid) => { if (valid) { +$foreach(item in genTable.Columns) +$if(item.HtmlType == "checkbox") + this.form.${item.ColumnName} = this.form.${item.columnName}Checked.toString(); +$end +$end console.log(JSON.stringify(this.form)); - if (this.form.${replaceDto.FistLowerPk} != undefined || this.title === "修改数据") { - update${genTable.BusinessName}(this.form).then((res) => { - if (!res.data) { - this.msgError("修改失败"); - return; - } + if (this.form.${replaceDto.FistLowerPk} != undefined && this.title === "修改数据") { + update${genTable.BusinessName}(this.form) + .then((res) => { this.msgSuccess("修改成功"); this.open = false; this.getList(); - }); + }) + .catch((err) => { + //TODO 错误逻辑 + }); } else { - add${genTable.BusinessName}(this.form).then((res) => { - if (!res.data) { - this.msgError("新增失败"); - return; - } + add${genTable.BusinessName}(this.form) + .then((res) => { this.msgSuccess("新增成功"); this.open = false; this.getList(); - }); + }) + .catch((err) => { + //TODO 错误逻辑 + }); } } }); diff --git a/ZR.CodeGenerator/CodeGenerateTemplate.cs b/ZR.CodeGenerator/CodeGenerateTemplate.cs index 57ce232..d1549be 100644 --- a/ZR.CodeGenerator/CodeGenerateTemplate.cs +++ b/ZR.CodeGenerator/CodeGenerateTemplate.cs @@ -118,6 +118,21 @@ namespace ZR.CodeGenerator sb.AppendLine(" "); sb.AppendLine(" "); } + else if( dbFieldInfo.HtmlType == GenConstants.HTML_CHECKBOX) + { + //多选框 + sb.AppendLine(" "); + sb.AppendLine($" "); + sb.AppendLine($" "); + if (string.IsNullOrEmpty(dbFieldInfo.DictType)) + { + sb.AppendLine($" 请选择字典生成"); + } + sb.AppendLine($" {{{{item.dictLabel}}}}"); + sb.AppendLine(" "); + sb.AppendLine(" "); + sb.AppendLine(" "); + } else { string inputNumTxt = CodeGeneratorTool.IsNumber(dbFieldInfo.CsharpType) ? ".number" : ""; diff --git a/ZR.CodeGenerator/CodeGeneratorTool.cs b/ZR.CodeGenerator/CodeGeneratorTool.cs index 0a1b9e3..41bd5a1 100644 --- a/ZR.CodeGenerator/CodeGeneratorTool.cs +++ b/ZR.CodeGenerator/CodeGeneratorTool.cs @@ -37,15 +37,7 @@ namespace ZR.CodeGenerator _option.ApiControllerNamespace = _option.BaseNamespace + "Admin.WebApi"; dto.GenOptions = _option; - GenerateSingle(dto); - } - /// - /// 单表生成代码 - /// - /// - public static void GenerateSingle(GenerateDto dto) - { string PKName = "Id"; string PKType = "int"; ReplaceDto replaceDto = new(); @@ -98,7 +90,7 @@ namespace ZR.CodeGenerator } } - #region 生成Model + #region 读取模板 /// /// 生成实体类Model @@ -128,9 +120,6 @@ namespace ZR.CodeGenerator var result = tpl.Render(); generateDto.GenCodes.Add(new GenCode(2, "Dto.cs", fullPath, result)); } - #endregion - - #region 生成Repository /// /// 生成Repository层代码文件 @@ -146,10 +135,6 @@ namespace ZR.CodeGenerator generateDto.GenCodes.Add(new GenCode(3, "Repository.cs", fullPath, result)); } - #endregion - - #region 生成Service - /// /// 生成Service文件 /// @@ -166,9 +151,6 @@ namespace ZR.CodeGenerator generateDto.GenCodes.Add(new GenCode(4, "IService.cs", fullPath2, result2)); } - #endregion - - #region 生成Controller /// /// 生成控制器ApiControllers文件 /// @@ -181,11 +163,9 @@ namespace ZR.CodeGenerator var result = tpl.Render(); generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result)); } - #endregion - #region 生成Vue页面 & api /// - /// 6、生成Vue页面 + /// 生成Vue页面 private static void GenerateVueViews(ReplaceDto replaceDto, GenerateDto generateDto) { var fullPath = Path.Combine(generateDto.GenCodePath, "ZR.Vue", "src", "views", generateDto.GenTable.ModuleName, $"{generateDto.GenTable.BusinessName}.vue"); @@ -200,8 +180,9 @@ namespace ZR.CodeGenerator var result = tpl.Render(); generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, result)); } + /// - /// 7、生成vue页面api + /// 生成vue页面api /// /// /// @@ -215,10 +196,11 @@ namespace ZR.CodeGenerator generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPath, result)); } - #endregion - - #region 生成SQL - + /// + /// 生成SQL + /// + /// + /// public static void GenerateSql(ReplaceDto replaceDto, GenerateDto generateDto) { string fullPath = Path.Combine(generateDto.GenCodePath, generateDto.GenTable.BusinessName + ".sql"); @@ -277,10 +259,6 @@ namespace ZR.CodeGenerator /// 业务名 public static string GetBusinessName(string tableName) { - //int firstIndex = tableName.IndexOf("_");//_前缀长度 - //int nameLength = tableName.Length; - //int subLength = (nameLength - lastIndex) - 1; - //string businessName = tableName[(lastIndex + 1)..]; return tableName.Substring(0, 1).ToUpper() + tableName[1..].Replace("_", ""); } @@ -334,6 +312,34 @@ namespace ZR.CodeGenerator } #endregion + #region 初始化信息 + + /// + /// 初始化表信息 + /// + /// + /// + /// + /// + /// + public static GenTable InitTable(string dbName, string userName, string tableName, string desc) + { + GenTable genTable = new() + { + DbName = dbName, + BaseNameSpace = "ZR.",//导入默认命名空间前缀 + ModuleName = "business",//导入默认模块名 + ClassName = GetClassName(tableName), + BusinessName = GetBusinessName(tableName), + FunctionAuthor = ConfigUtils.Instance.GetConfig(GenConstants.Gen_author), + TableName = tableName, + TableComment = desc, + FunctionName = desc, + Create_by = userName, + }; + return genTable; + } + /// /// 初始化列属性字段数据 /// @@ -344,68 +350,76 @@ namespace ZR.CodeGenerator List genTableColumns = new(); foreach (var column in dbColumnInfos) { - GenTableColumn genTableColumn = new() - { - ColumnName = FirstLowerCase(column.DbColumnName), - ColumnComment = column.ColumnDescription, - IsPk = column.IsPrimarykey, - ColumnType = column.DataType, - TableId = genTable.TableId, - TableName = genTable.TableName, - CsharpType = GetCSharpDatatype(column.DataType), - CsharpField = column.DbColumnName.Substring(0, 1).ToUpper() + column.DbColumnName[1..], - IsRequired = !column.IsNullable, - IsIncrement = column.IsIdentity, - Create_by = genTable.Create_by, - Create_time = DateTime.Now, - IsInsert = !column.IsIdentity,//非自增字段都需要插入 - IsEdit = true, - IsQuery = false, - HtmlType = GenConstants.HTML_INPUT - }; - - if (GenConstants.imageFiled.Any(f => column.DbColumnName.ToLower().Contains(f.ToLower()))) - { - genTableColumn.HtmlType = GenConstants.HTML_IMAGE_UPLOAD; - } - else if (GenConstants.COLUMNTYPE_TIME.Any(f => genTableColumn.CsharpType.ToLower().Contains(f.ToLower()))) - { - genTableColumn.HtmlType = GenConstants.HTML_DATETIME; - } - else if (GenConstants.radioFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase)) || - GenConstants.radioFiled.Any(f => column.DbColumnName.StartsWith(f, StringComparison.OrdinalIgnoreCase))) - { - genTableColumn.HtmlType = GenConstants.HTML_RADIO; - } - else if (GenConstants.selectFiled.Any(f => column.DbColumnName == f) || - GenConstants.selectFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase))) - { - genTableColumn.HtmlType = GenConstants.HTML_SELECT; - } - else if (column.Length > 500) - { - genTableColumn.HtmlType = GenConstants.HTML_TEXTAREA; - } - //编辑字段 - if (column.IsIdentity || column.IsPrimarykey || GenConstants.COLUMNNAME_NOT_EDIT.Any(f => column.DbColumnName.Contains(f))) - { - genTableColumn.IsEdit = false; - } - //列表字段 - if (!GenConstants.COLUMNNAME_NOT_LIST.Any(f => column.DbColumnName.Contains(f) && !column.IsPrimarykey)) - { - genTableColumn.IsList = true; - } - //时间类型初始化between范围查询 - if (genTableColumn.CsharpType == GenConstants.TYPE_DATE) - { - genTableColumn.QueryType = "BETWEEN"; - } - genTableColumns.Add(genTableColumn); + genTableColumns.Add(InitColumnField(genTable, column)); } return genTableColumns; } + private static GenTableColumn InitColumnField(GenTable genTable, DbColumnInfo column) + { + GenTableColumn genTableColumn = new() + { + ColumnName = FirstLowerCase(column.DbColumnName), + ColumnComment = column.ColumnDescription, + IsPk = column.IsPrimarykey, + ColumnType = column.DataType, + TableId = genTable.TableId, + TableName = genTable.TableName, + CsharpType = GetCSharpDatatype(column.DataType), + CsharpField = column.DbColumnName.Substring(0, 1).ToUpper() + column.DbColumnName[1..], + IsRequired = !column.IsNullable, + IsIncrement = column.IsIdentity, + Create_by = genTable.Create_by, + Create_time = DateTime.Now, + IsInsert = !column.IsIdentity,//非自增字段都需要插入 + IsEdit = true, + IsQuery = false, + HtmlType = GenConstants.HTML_INPUT + }; + + if (GenConstants.imageFiled.Any(f => column.DbColumnName.ToLower().Contains(f.ToLower()))) + { + genTableColumn.HtmlType = GenConstants.HTML_IMAGE_UPLOAD; + } + else if (GenConstants.COLUMNTYPE_TIME.Any(f => genTableColumn.CsharpType.ToLower().Contains(f.ToLower()))) + { + genTableColumn.HtmlType = GenConstants.HTML_DATETIME; + } + else if (GenConstants.radioFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase)) || + GenConstants.radioFiled.Any(f => column.DbColumnName.StartsWith(f, StringComparison.OrdinalIgnoreCase))) + { + genTableColumn.HtmlType = GenConstants.HTML_RADIO; + } + else if (GenConstants.selectFiled.Any(f => column.DbColumnName == f) || + GenConstants.selectFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase))) + { + genTableColumn.HtmlType = GenConstants.HTML_SELECT; + } + else if (column.Length > 500) + { + genTableColumn.HtmlType = GenConstants.HTML_TEXTAREA; + } + //编辑字段 + if (column.IsIdentity || column.IsPrimarykey || GenConstants.COLUMNNAME_NOT_EDIT.Any(f => column.DbColumnName.Contains(f))) + { + genTableColumn.IsEdit = false; + } + //列表字段 + if (!GenConstants.COLUMNNAME_NOT_LIST.Any(f => column.DbColumnName.Contains(f) && !column.IsPrimarykey)) + { + genTableColumn.IsList = true; + } + //时间类型初始化between范围查询 + if (genTableColumn.CsharpType == GenConstants.TYPE_DATE) + { + genTableColumn.QueryType = "BETWEEN"; + } + + return genTableColumn; + } + + #endregion + /// /// 初始化Jnt模板 /// diff --git a/ZR.CodeGenerator/Service/CodeGeneraterService.cs b/ZR.CodeGenerator/Service/CodeGeneraterService.cs index fd0ae3b..52901ad 100644 --- a/ZR.CodeGenerator/Service/CodeGeneraterService.cs +++ b/ZR.CodeGenerator/Service/CodeGeneraterService.cs @@ -49,7 +49,7 @@ namespace ZR.CodeGenerator.Service var tableList = GetSugarDbContext(dbName).DbMaintenance.GetTableInfoList(true); if (!string.IsNullOrEmpty(tableName)) { - return tableList.Where(f => f.Name.ToLower() == (tableName.ToLower())).FirstOrDefault(); + return tableList.Where(f => f.Name.Equals(tableName, System.StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); } return null; @@ -64,6 +64,5 @@ namespace ZR.CodeGenerator.Service { return GetSugarDbContext(dbName).DbMaintenance.GetColumnInfosByTableName(tableName, true); } - } } diff --git a/ZR.Common/ExcelHelper.cs b/ZR.Common/ExcelHelper.cs new file mode 100644 index 0000000..d40a98a --- /dev/null +++ b/ZR.Common/ExcelHelper.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using OfficeOpenXml; +namespace ZR.Common +{ + public class ExcelHelper where T : new() + { + /// + /// 导入数据 + /// + /// + /// + public static IEnumerable ImportData(Stream stream) + { + using ExcelPackage package = new(stream); + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + ExcelWorksheet worksheet = package.Workbook.Worksheets[0];//读取第1个sheet + //获取表格的列数和行数 + + int colStart = worksheet.Dimension.Start.Column; + int colEnd = worksheet.Dimension.End.Column; + int rowStart = worksheet.Dimension.Start.Row; + int rowEnd = worksheet.Dimension.End.Row; + //int rowCount = worksheet.Dimension.Rows; + //int ColCount = worksheet.Dimension.Columns; + + List resultList = new(); + List propertyInfos = new();// new(typeof(T).GetProperties()); + Dictionary dictHeader = new(); + for (int i = colStart; i < colEnd; i++) + { + var name = worksheet.Cells[rowStart, i].Value.ToString(); + dictHeader[name] = i; + + PropertyInfo propertyInfo = MapPropertyInfo(name); + if (propertyInfo != null) + { + propertyInfos.Add(propertyInfo); + } + } + for (int row = rowStart + 1; row <= rowEnd; row++) + { + T result = new(); + + foreach (PropertyInfo p in propertyInfos) + { + try + { + ExcelRange cell = worksheet.Cells[row, dictHeader[p.Name]]; + if (cell.Value == null) + { + continue; + } + switch (p.PropertyType.Name.ToLower()) + { + case "string": + p.SetValue(result, cell.GetValue()); + break; + case "int16": + p.SetValue(result, cell.GetValue()); break; + case "int32": + p.SetValue(result, cell.GetValue()); break; + case "int64": + p.SetValue(result, cell.GetValue()); break; + case "decimal": + p.SetValue(result, cell.GetValue()); + break; + case "double": + p.SetValue(result, cell.GetValue()); break; + case "datetime": + p.SetValue(result, cell.GetValue()); break; + case "boolean": + p.SetValue(result, cell.GetValue()); break; + case "char": + p.SetValue(result, cell.GetValue()); break; + default: + break; + } + } + catch (KeyNotFoundException ex) + { + Console.WriteLine("未找到该列将继续循环," + ex.Message); + continue; + } + } + resultList.Add(result); + } + + return resultList; + } + + /// + /// 查找Excel列名对应的实体属性 + /// + /// + /// + public static PropertyInfo MapPropertyInfo(string columnName) + { + PropertyInfo[] propertyList = GetProperties(typeof(T)); + PropertyInfo propertyInfo = propertyList.Where(p => p.Name == columnName).FirstOrDefault(); + if (propertyInfo != null) + { + return propertyInfo; + } + else + { + foreach (PropertyInfo tempPropertyInfo in propertyList) + { + System.ComponentModel.DescriptionAttribute[] attributes = (System.ComponentModel.DescriptionAttribute[])tempPropertyInfo.GetCustomAttributes(typeof(System.ComponentModel.DescriptionAttribute), false); + if (attributes.Length > 0) + { + if (attributes[0].Description == columnName) + { + return tempPropertyInfo; + } + } + } + } + return null; + } + + /// + /// 得到类里面的属性集合 + /// + /// + /// + /// + public static PropertyInfo[] GetProperties(Type type, string[] columns = null) + { + PropertyInfo[] properties = null; + properties = type.GetProperties(); + + if (columns != null && columns.Length > 0) + { + // 按columns顺序返回属性 + var columnPropertyList = new List(); + foreach (var column in columns) + { + var columnProperty = properties.Where(p => p.Name == column).FirstOrDefault(); + if (columnProperty != null) + { + columnPropertyList.Add(columnProperty); + } + } + return columnPropertyList.ToArray(); + } + else + { + return properties; + } + } + } +} diff --git a/ZR.Common/ZR.Common.csproj b/ZR.Common/ZR.Common.csproj index 1bffb47..9d290da 100644 --- a/ZR.Common/ZR.Common.csproj +++ b/ZR.Common/ZR.Common.csproj @@ -6,6 +6,7 @@ + diff --git a/ZR.Model/System/Dto/SysdictDataDto.cs b/ZR.Model/System/Dto/SysdictDataDto.cs new file mode 100644 index 0000000..e17cf2d --- /dev/null +++ b/ZR.Model/System/Dto/SysdictDataDto.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace ZR.Model.System.Dto +{ + public class SysdictDataDto + { + public string DictType { get; set; } + public string ColumnName { get; set; } + public List List { get; set; } + } +} diff --git a/ZR.Model/System/Generate/GenTable.cs b/ZR.Model/System/Generate/GenTable.cs index 6bbdd16..008233f 100644 --- a/ZR.Model/System/Generate/GenTable.cs +++ b/ZR.Model/System/Generate/GenTable.cs @@ -17,6 +17,10 @@ namespace ZR.Model.System.Generate [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int TableId { get; set; } /// + /// 数据库名 + /// + public string DbName { get; set; } + /// /// 表名 /// public string TableName { get; set; } diff --git a/ZR.Model/System/Generate/GenTableColumn.cs b/ZR.Model/System/Generate/GenTableColumn.cs index a19ee39..7c9decb 100644 --- a/ZR.Model/System/Generate/GenTableColumn.cs +++ b/ZR.Model/System/Generate/GenTableColumn.cs @@ -25,7 +25,7 @@ namespace ZR.Model.System.Generate /// /// 列说明 /// - public string ColumnComment { get; set; } + public string ColumnComment { get; set; } = string.Empty; /// /// 数据库列类型 /// diff --git a/ZR.Repository/BaseRepository.cs b/ZR.Repository/BaseRepository.cs index 71dc86a..a1ff09c 100644 --- a/ZR.Repository/BaseRepository.cs +++ b/ZR.Repository/BaseRepository.cs @@ -121,24 +121,24 @@ namespace ZR.Repository #region update - public bool Update(T entity, bool ignoreNullColumns = false) + public int Update(T entity, bool ignoreNullColumns = false) { - return Context.Updateable(entity).IgnoreColumns(ignoreNullColumns).ExecuteCommand() > 0; + return Context.Updateable(entity).IgnoreColumns(ignoreNullColumns).ExecuteCommand(); } - public bool Update(T entity, Expression> expression, bool ignoreAllNull = false) + public int Update(T entity, Expression> expression, bool ignoreAllNull = false) { - return Context.Updateable(entity).UpdateColumns(expression).IgnoreColumns(ignoreAllNull).ExecuteCommand() > 0; + return Context.Updateable(entity).UpdateColumns(expression).IgnoreColumns(ignoreAllNull).ExecuteCommand(); } - public bool Update(T entity, Expression> expression, Expression> where) + public int Update(T entity, Expression> expression, Expression> where) { - return Context.Updateable(entity).UpdateColumns(expression).Where(where).ExecuteCommand() > 0; + return Context.Updateable(entity).UpdateColumns(expression).Where(where).ExecuteCommand(); } - public bool Update(SqlSugarClient client, T entity, Expression> expression, Expression> where) + public int Update(SqlSugarClient client, T entity, Expression> expression, Expression> where) { - return client.Updateable(entity).UpdateColumns(expression).Where(where).ExecuteCommand() > 0; + return client.Updateable(entity).UpdateColumns(expression).Where(where).ExecuteCommand(); } /// @@ -148,7 +148,7 @@ namespace ZR.Repository /// /// 默认为true /// - public bool Update(T entity, List list = null, bool isNull = true) + public int Update(T entity, List list = null, bool isNull = true) { if (list == null) { @@ -158,7 +158,7 @@ namespace ZR.Repository "Create_time" }; } - return Context.Updateable(entity).IgnoreColumns(isNull).IgnoreColumns(list.ToArray()).ExecuteCommand() > 0; + return Context.Updateable(entity).IgnoreColumns(isNull).IgnoreColumns(list.ToArray()).ExecuteCommand(); } //public bool Update(List entity) @@ -169,9 +169,9 @@ namespace ZR.Repository // }); // return result.IsSuccess; //} - public bool Update(Expression> where, Expression> columns) + public int Update(Expression> where, Expression> columns) { - return Context.Updateable().SetColumns(columns).Where(where).RemoveDataCache().ExecuteCommand() > 0; + return Context.Updateable().SetColumns(columns).Where(where).RemoveDataCache().ExecuteCommand(); } #endregion update @@ -218,9 +218,9 @@ namespace ZR.Repository { return Context.Deleteable(id).ExecuteCommand(); } - public bool DeleteTable() + public int DeleteTable() { - return Context.Deleteable().ExecuteCommand() > 0; + return Context.Deleteable().ExecuteCommand(); } #endregion delete diff --git a/ZR.Repository/IBaseRepository.cs b/ZR.Repository/IBaseRepository.cs index 90ca56e..0dedf0f 100644 --- a/ZR.Repository/IBaseRepository.cs +++ b/ZR.Repository/IBaseRepository.cs @@ -44,7 +44,7 @@ namespace ZR.Repository #region update - bool Update(T entity, bool ignoreNullColumns = false); + int Update(T entity, bool ignoreNullColumns = false); /// /// 只更新表达式的值 @@ -52,13 +52,13 @@ namespace ZR.Repository /// /// /// - bool Update(T entity, Expression> expression, bool ignoreAllNull = false); + int Update(T entity, Expression> expression, bool ignoreAllNull = false); - bool Update(T entity, Expression> expression, Expression> where); + int Update(T entity, Expression> expression, Expression> where); - bool Update(SqlSugarClient client, T entity, Expression> expression, Expression> where); + int Update(SqlSugarClient client, T entity, Expression> expression, Expression> where); - bool Update(Expression> where, Expression> columns); + int Update(Expression> where, Expression> columns); #endregion update @@ -73,7 +73,7 @@ namespace ZR.Repository int Delete(Expression> expression); int Delete(object[] obj); int Delete(object id); - bool DeleteTable(); + int DeleteTable(); #endregion delete diff --git a/ZR.Repository/System/SysDictDataRepository.cs b/ZR.Repository/System/SysDictDataRepository.cs index 9012ec5..294e655 100644 --- a/ZR.Repository/System/SysDictDataRepository.cs +++ b/ZR.Repository/System/SysDictDataRepository.cs @@ -3,6 +3,7 @@ using Infrastructure.Model; using SqlSugar; using System; using System.Collections.Generic; +using System.Linq; using ZR.Model; using ZR.Model.System; @@ -41,6 +42,17 @@ namespace ZR.Repository.System .ToList(); } + /// + /// 根据字典类型查询 + /// + /// + /// + public List SelectDictDataByTypes(string[] dictTypes) + { + return Context.Queryable().Where(f => f.Status == "0" && dictTypes.Contains(f.DictType)) + .OrderBy(it => it.DictSort) + .ToList(); + } /// /// 新增保存字典数据信息 /// diff --git a/ZR.Service/BaseService.cs b/ZR.Service/BaseService.cs index 0b68a66..9c109fc 100644 --- a/ZR.Service/BaseService.cs +++ b/ZR.Service/BaseService.cs @@ -122,24 +122,24 @@ namespace ZR.Service #region update - public bool Update(T entity, bool ignoreNullColumns = false) + public int Update(T entity, bool ignoreNullColumns = false) { return baseRepository.Update(entity, ignoreNullColumns); } - public bool Update(T entity, Expression> expression, bool ignoreAllNull = false) + public int Update(T entity, Expression> expression, bool ignoreAllNull = false) { return baseRepository.Update(entity, expression, ignoreAllNull); } - public bool Update(T entity, Expression> expression, Expression> where) + public int Update(T entity, Expression> expression, Expression> where) { return baseRepository.Update(entity, expression, where); } - public bool Update(SqlSugarClient client, T entity, Expression> expression, Expression> where) + public int Update(SqlSugarClient client, T entity, Expression> expression, Expression> where) { - return client.Updateable(entity).UpdateColumns(expression).Where(where).ExecuteCommand() > 0; + return client.Updateable(entity).UpdateColumns(expression).Where(where).ExecuteCommand(); } ///// @@ -171,7 +171,7 @@ namespace ZR.Service // }); // return result.IsSuccess; //} - public bool Update(Expression> where, Expression> columns) + public int Update(Expression> where, Expression> columns) { return baseRepository.Update(where, columns); } @@ -220,7 +220,7 @@ namespace ZR.Service { return baseRepository.Delete(id); } - public bool DeleteTable() + public int DeleteTable() { return baseRepository.DeleteTable(); } diff --git a/ZR.Service/IBaseService.cs b/ZR.Service/IBaseService.cs index a4354f0..569e101 100644 --- a/ZR.Service/IBaseService.cs +++ b/ZR.Service/IBaseService.cs @@ -46,7 +46,7 @@ namespace ZR.Service #region update - bool Update(T entity, bool ignoreNullColumns = false); + int Update(T entity, bool ignoreNullColumns = false); /// /// 只更新表达式的值 @@ -54,11 +54,11 @@ namespace ZR.Service /// /// /// - bool Update(T entity, Expression> expression, bool ignoreAllNull = false); + int Update(T entity, Expression> expression, bool ignoreAllNull = false); - bool Update(T entity, Expression> expression, Expression> where); + int Update(T entity, Expression> expression, Expression> where); - bool Update(SqlSugarClient client, T entity, Expression> expression, Expression> where); + int Update(SqlSugarClient client, T entity, Expression> expression, Expression> where); /// /// @@ -70,7 +70,7 @@ namespace ZR.Service //bool Update(T entity, List list = null, bool isNull = true); //bool Update(List entity); - bool Update(Expression> where, Expression> columns); + int Update(Expression> where, Expression> columns); #endregion update @@ -85,7 +85,7 @@ namespace ZR.Service int Delete(Expression> expression); int Delete(object[] obj); int Delete(object id); - bool DeleteTable(); + int DeleteTable(); #endregion delete diff --git a/ZR.Service/System/GenTableService.cs b/ZR.Service/System/GenTableService.cs index 62454fe..18ec65f 100644 --- a/ZR.Service/System/GenTableService.cs +++ b/ZR.Service/System/GenTableService.cs @@ -60,6 +60,15 @@ namespace ZR.Service.System return info; } + /// + /// 获取所有代码生成表 + /// + /// + public List GetGenTableAll() + { + return GenTableRepository.GetAll(); + } + /// /// 设置代码生成其他参数 /// @@ -121,6 +130,35 @@ namespace ZR.Service.System genTable.Update_time = db.GetDate(); return db.Updateable(genTable).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommand(); } + + /// + /// 同步数据库 + /// + /// 表id + /// + /// + public void SynchDb(long tableId, GenTable genTable, List dbTableColumns) + { + List tableColumns = GenTableColumnService.GenTableColumns(tableId); + List tableColumnNames = tableColumns.Select(f => f.ColumnName).ToList(); + List dbTableColumneNames = dbTableColumns.Select(f => f.ColumnName).ToList(); + + List insertColumns = new(); + foreach (var column in dbTableColumns) + { + if (!tableColumnNames.Contains(column.ColumnName)) + { + insertColumns.Add(column); + } + } + GenTableColumnService.Insert(insertColumns); + + List delColumns = tableColumns.FindAll(column => !dbTableColumneNames.Contains(column.ColumnName)); + if (delColumns!= null && delColumns.Count > 0) + { + GenTableColumnService.Delete(delColumns.Select(f => f.ColumnId).ToList()); + } + } } /// diff --git a/ZR.Service/System/IService/IGenTableService.cs b/ZR.Service/System/IService/IGenTableService.cs index 9a996b7..9d118ae 100644 --- a/ZR.Service/System/IService/IGenTableService.cs +++ b/ZR.Service/System/IService/IGenTableService.cs @@ -12,8 +12,10 @@ namespace ZR.Service.System.IService int DeleteGenTableByIds(long[] tableIds); int DeleteGenTableByTbName(string tableName); - PagedInfo GetGenTables(GenTable genTable, Model.PagerInfo pagerInfo); + PagedInfo GetGenTables(GenTable genTable, PagerInfo pagerInfo); GenTable GetGenTableInfo(long tableId); + void SynchDb(long tableId, GenTable genTable, List dbTableColumns); + List GetGenTableAll(); int UpdateGenTable(GenTable genTable); } diff --git a/ZR.Service/System/IService/ISysDictDataService.cs b/ZR.Service/System/IService/ISysDictDataService.cs index 8380ffa..96c81f3 100644 --- a/ZR.Service/System/IService/ISysDictDataService.cs +++ b/ZR.Service/System/IService/ISysDictDataService.cs @@ -11,6 +11,7 @@ namespace ZR.Service.System.IService { public PagedInfo SelectDictDataList(SysDictData dictData, PagerInfo pagerInfo); public List SelectDictDataByType(string dictType); + public List SelectDictDataByTypes(string[] dictTypes); public SysDictData SelectDictDataById(long dictCode); public long InsertDictData(SysDictData dict); public long UpdateDictData(SysDictData dict); diff --git a/ZR.Service/System/IService/ISysRoleService.cs b/ZR.Service/System/IService/ISysRoleService.cs index 9c9f4a4..2df2b54 100644 --- a/ZR.Service/System/IService/ISysRoleService.cs +++ b/ZR.Service/System/IService/ISysRoleService.cs @@ -4,7 +4,7 @@ using ZR.Model.System; namespace ZR.Service.System.IService { - public interface ISysRoleService + public interface ISysRoleService : IBaseService { /// /// 根据条件分页查询角色数据 @@ -12,7 +12,7 @@ namespace ZR.Service.System.IService /// 角色信息 /// /// 角色数据集合信息 - public PagedInfo SelectRoleList(SysRole role, Model.PagerInfo pager); + public PagedInfo SelectRoleList(SysRole role, PagerInfo pager); /// /// 查询所有角色 @@ -113,7 +113,7 @@ namespace ZR.Service.System.IService /// /// public List SelectUserRoles(long userId); - + /// /// 获取用户权限字符串集合 /// diff --git a/ZR.Service/System/SysDictDataService.cs b/ZR.Service/System/SysDictDataService.cs index 7a13527..bbfdae4 100644 --- a/ZR.Service/System/SysDictDataService.cs +++ b/ZR.Service/System/SysDictDataService.cs @@ -49,7 +49,16 @@ namespace ZR.Service.System } return list; } - + public List SelectDictDataByTypes(string[] dictTypes) + { + string CK = $"SelectDictDataByTypes_{dictTypes}"; + if (CacheHelper.GetCache(CK) is not List list) + { + list = SysDictDataRepository.SelectDictDataByTypes(dictTypes); + CacheHelper.SetCache(CK, list, 30); + } + return list; + } /// /// 根据字典数据ID查询信息 /// diff --git a/ZR.Service/System/SysRoleService.cs b/ZR.Service/System/SysRoleService.cs index f0df631..d04a820 100644 --- a/ZR.Service/System/SysRoleService.cs +++ b/ZR.Service/System/SysRoleService.cs @@ -17,14 +17,14 @@ namespace ZR.Service /// 角色 /// [AppService(ServiceType = typeof(ISysRoleService), ServiceLifetime = LifeTime.Transient)] - public class SysRoleService: ISysRoleService + public class SysRoleService : BaseService, ISysRoleService { private SysRoleRepository SysRoleRepository; private ISysUserRoleService SysUserRoleService; public SysRoleService( - SysRoleRepository sysRoleRepository, - ISysUserRoleService sysUserRoleService) + SysRoleRepository sysRoleRepository, + ISysUserRoleService sysUserRoleService) : base(sysRoleRepository) { SysRoleRepository = sysRoleRepository; SysUserRoleService = sysUserRoleService; diff --git a/ZR.Vue/package.json b/ZR.Vue/package.json index 05b455e..0564ec4 100644 --- a/ZR.Vue/package.json +++ b/ZR.Vue/package.json @@ -21,7 +21,7 @@ "dependencies": { "@riophae/vue-treeselect": "0.4.0", "axios": "^0.21.4", - "clipboard": "2.0.4", + "clipboard": "2.0.8", "core-js": "3.6.5", "echarts": "^5.1.1", "element-ui": "2.15.6", diff --git a/ZR.Vue/src/api/system/dict/data.js b/ZR.Vue/src/api/system/dict/data.js index 8846862..0351dd6 100644 --- a/ZR.Vue/src/api/system/dict/data.js +++ b/ZR.Vue/src/api/system/dict/data.js @@ -19,10 +19,18 @@ export function getData(dictCode) { // 根据字典类型查询字典数据信息 export function getDicts(dictType) { - return request({ - url: '/system/dict/data/type/' + dictType, - method: 'get' - }) + if (typeof (dictType) === "object") { + return request({ + url: '/system/dict/data/types', + data: dictType, + method: 'post' + }) + } else { + return request({ + url: '/system/dict/data/type/' + dictType, + method: 'get' + }) + } } // 新增字典数据 @@ -58,4 +66,4 @@ export function exportData(query) { method: 'get', params: query }) -} +} \ No newline at end of file diff --git a/ZR.Vue/src/api/tool/gen.js b/ZR.Vue/src/api/tool/gen.js index e8678bf..59317ef 100644 --- a/ZR.Vue/src/api/tool/gen.js +++ b/ZR.Vue/src/api/tool/gen.js @@ -9,8 +9,8 @@ import request from '@/utils/request' // } /** - * 创建数据库连接 - */ + * 创建数据库连接 + */ // export function createGetDBConn(data) { // return request({ // url: 'tool/gen/CreateDBConn', @@ -19,8 +19,8 @@ import request from '@/utils/request' // }) // } /** - * 获取数据库 - */ + * 获取数据库 + */ export function codeGetDBList() { return request({ url: 'tool/gen/getDbList', @@ -28,8 +28,8 @@ export function codeGetDBList() { }) } /** - * 获取数据库表 - */ + * 获取数据库表 + */ export function listDbTable(data) { return request({ url: 'tool/gen/getTableList', @@ -38,8 +38,8 @@ export function listDbTable(data) { }) } /** - * 生成代码 - */ + * 生成代码 + */ export async function codeGenerator(data) { return await request({ url: 'tool/gen/genCode', @@ -60,15 +60,23 @@ export function queryColumnInfo(tableId) { }) } - -// 查询表详细信息 -export function getGenTable(params) { +// 查询生成表数据 +export function listTable(params) { return request({ - url: 'tool/gen/listGenTable', + url: 'tool/gen/list', method: 'get', params: params }) } + +// 查询表详细信息 +export function getGenTable(tableId) { + return request({ + url: '/tool/gen/' + tableId, + method: 'get' + }) +} + // 导入表 export function importTable(data) { return request({ @@ -99,28 +107,15 @@ export function previewTable(tableId, data) { return request({ url: '/tool/gen/preview/' + tableId, method: 'post', - data: data + data: data }) } -// /** -// * -// * 数据库解密 -// */ -// export function dbtoolsConnStrDecrypt(data) { -// return request({ -// url: 'DbTools/ConnStrDecrypt', -// method: 'post', -// params: data, -// }) -// } -// /** -// * 数据库加密 -// */ -// export function dbtoolsConnStrEncrypt(data) { -// return request({ -// url: 'DbTools/ConnStrEncrypt', -// method: 'post', -// params: data, -// }) -// } +// 同步数据库 +export function synchDb(tableId, data) { + return request({ + url: '/tool/gen/synchDb/' + tableId, + method: 'get', + params: data + }) +} \ No newline at end of file diff --git a/ZR.Vue/src/assets/image/login-background.jpg b/ZR.Vue/src/assets/image/login-background.jpg index 8a89eb8..3066bd1 100644 Binary files a/ZR.Vue/src/assets/image/login-background.jpg and b/ZR.Vue/src/assets/image/login-background.jpg differ diff --git a/ZR.Vue/src/components/DateRangePicker/index.vue b/ZR.Vue/src/components/DateRangePicker/index.vue deleted file mode 100644 index eef79bd..0000000 --- a/ZR.Vue/src/components/DateRangePicker/index.vue +++ /dev/null @@ -1,45 +0,0 @@ - diff --git a/ZR.Vue/src/components/FileUpload/index.vue b/ZR.Vue/src/components/FileUpload/index.vue index ad5d6e5..9617600 100644 --- a/ZR.Vue/src/components/FileUpload/index.vue +++ b/ZR.Vue/src/components/FileUpload/index.vue @@ -144,10 +144,12 @@ export default { }, // 上传成功回调 handleUploadSuccess(res, file) { + if (res.code != 200) { + this.msgError(`上传失败,原因:${res.msg}!`); + return; + } this.msgSuccess("上传成功"); - console.log(res.data.fileName, res.data.url); this.fileList.push({ name: res.data.fileName, url: res.data.url }); - this.$emit("input", this.column, this.listToString(this.fileList)); }, // 删除文件 diff --git a/ZR.Vue/src/components/UploadImage/index.vue b/ZR.Vue/src/components/UploadImage/index.vue index 72aafdb..d2fc509 100644 --- a/ZR.Vue/src/components/UploadImage/index.vue +++ b/ZR.Vue/src/components/UploadImage/index.vue @@ -111,9 +111,14 @@ export default { }, //上传成功回调 handleUploadSuccess(res) { + console.log(res); + this.loading.close(); + if (res.code != 200) { + this.msgError(`上传失败,原因:${res.msg}!`); + return; + } this.fileList.push({ name: res.data.fileName, url: res.data.url }); this.$emit(`input`, this.column, this.listToString(this.fileList)); - this.loading.close(); }, // 上传前loading加载 handleBeforeUpload(file) { @@ -167,7 +172,7 @@ export default { for (let i in list) { strs += list[i].url.replace(this.baseUrl, "") + separator; } - return strs != '' ? strs.substr(0, strs.length - 1) : ''; + return strs != "" ? strs.substr(0, strs.length - 1) : ""; }, handleUploadError() { this.$message({ diff --git a/ZR.Vue/src/directive/module/clipboard.js b/ZR.Vue/src/directive/module/clipboard.js new file mode 100644 index 0000000..635315a --- /dev/null +++ b/ZR.Vue/src/directive/module/clipboard.js @@ -0,0 +1,54 @@ +/** +* v-clipboard 文字复制剪贴 +* Copyright (c) 2021 ruoyi +*/ + +import Clipboard from 'clipboard' +export default { + bind(el, binding, vnode) { + switch (binding.arg) { + case 'success': + el._vClipBoard_success = binding.value; + break; + case 'error': + el._vClipBoard_error = binding.value; + break; + default: { + const clipboard = new Clipboard(el, { + text: () => binding.value, + action: () => binding.arg === 'cut' ? 'cut' : 'copy' + }); + clipboard.on('success', e => { + const callback = el._vClipBoard_success; + callback && callback(e); + }); + clipboard.on('error', e => { + const callback = el._vClipBoard_error; + callback && callback(e); + }); + el._vClipBoard = clipboard; + } + } + }, + update(el, binding) { + if (binding.arg === 'success') { + el._vClipBoard_success = binding.value; + } else if (binding.arg === 'error') { + el._vClipBoard_error = binding.value; + } else { + el._vClipBoard.text = function () { return binding.value; }; + el._vClipBoard.action = () => binding.arg === 'cut' ? 'cut' : 'copy'; + } + }, + unbind(el, binding) { + if (!el._vClipboard) return + if (binding.arg === 'success') { + delete el._vClipBoard_success; + } else if (binding.arg === 'error') { + delete el._vClipBoard_error; + } else { + el._vClipBoard.destroy(); + delete el._vClipBoard; + } + } +} diff --git a/ZR.Vue/src/directive/permission/index.js b/ZR.Vue/src/directive/permission/index.js index e3d76d3..9ef3379 100644 --- a/ZR.Vue/src/directive/permission/index.js +++ b/ZR.Vue/src/directive/permission/index.js @@ -1,9 +1,11 @@ import hasRole from './hasRole' import hasPermi from './hasPermi' +import clipboard from '../module/clipboard' const install = function(Vue) { Vue.directive('hasRole', hasRole) Vue.directive('hasPermi', hasPermi) + Vue.directive('clipboard', clipboard) } if (window.Vue) { diff --git a/ZR.Vue/src/main.js b/ZR.Vue/src/main.js index 3720641..9ccbc54 100644 --- a/ZR.Vue/src/main.js +++ b/ZR.Vue/src/main.js @@ -14,7 +14,7 @@ import permission from './directive/permission' import './assets/icons' // icon import './permission' // permission control -import { getDicts } from "@/api/system/dict/data"; +import { getDicts} from "@/api/system/dict/data"; import { getConfigKey } from "@/api/system/config"; import { parseTime, resetForm, addDateRange, addDateRange2, selectDictLabel, selectDictLabels, download, handleTree } from "@/utils/ruoyi"; //分页组件 @@ -44,15 +44,15 @@ Vue.prototype.selectDictLabels = selectDictLabels Vue.prototype.download = download Vue.prototype.handleTree = handleTree -Vue.prototype.msgSuccess = function(msg) { +Vue.prototype.msgSuccess = function (msg) { this.$message({ showClose: true, message: msg, type: "success" }); } -Vue.prototype.msgError = function(msg) { +Vue.prototype.msgError = function (msg) { this.$message({ showClose: true, message: msg, type: "error" }); } -Vue.prototype.msgInfo = function(msg) { +Vue.prototype.msgInfo = function (msg) { this.$message.info(msg); } diff --git a/ZR.Vue/src/utils/datetime.js b/ZR.Vue/src/utils/datetime.js deleted file mode 100644 index 67f808a..0000000 --- a/ZR.Vue/src/utils/datetime.js +++ /dev/null @@ -1,216 +0,0 @@ -/* eslint-disable */ - -/** - * Date对象的补充函数,包括类似Python中的strftime() - * 阿债 https://gitee.com/azhai/datetime.js - */ - -Date.prototype.toMidnight = function() { - this.setHours(0) - this.setMinutes(0) - this.setSeconds(0) - this.setMilliseconds(0) - return this -} - -Date.prototype.daysAgo = function(days, midnight) { - days = days ? days - 0 : 0 - const date = new Date(this.getTime() - days * 8.64E7) - return midnight ? date.toMidnight() : date -} - -Date.prototype.monthBegin = function(offset) { - offset = offset ? offset - 0 : 0 - const days = this.getDate() - 1 - offset - return this.daysAgo(days, true) -} - -Date.prototype.quarterBegin = function() { - const month = this.getMonth() - this.getMonth() % 3 - return new Date(this.getFullYear(), month, 1).toMidnight() -} - -Date.prototype.yearBegin = function() { - return new Date(this.getFullYear(), 0, 1).toMidnight() -} - -Date.prototype.strftime = function(format, local) { - if (!format) { - const str = new Date(this.getTime() + 2.88E7).toISOString() - return str.substr(0, 16).replace('T', ' ') - } - local = local && local.startsWith('zh') ? 'zh' : 'en' - const padZero = function(str, len) { - const pads = len - str.toString().length - return (pads && pads > 0 ? '0'.repeat(pads) : '') + str - } - format = format.replace('%F', '%Y-%m-%d') - format = format.replace(/%D|%x/, '%m/%d/%y') - format = format.replace(/%T|%X/, '%H:%M:%S') - format = format.replace('%R', '%H:%M') - format = format.replace('%r', '%H:%M:%S %p') - format = format.replace('%c', '%a %b %e %H:%M:%S %Y') - const _this = this - return format.replace(/%[A-Za-z%]/g, function(f) { - let ans = f - switch (f) { - case '%%': - ans = '%' - break - - case '%Y': - case '%G': - ans = _this.getFullYear() - break - - case '%y': - ans = _this.getFullYear() % 100 - break - - case '%C': - ans = _this.getFullYear() / 100 - break - - case '%m': - case '%n': - ans = _this.getMonth() + 1 - break - - case '%B': - local = local.startsWith('en') ? 'english' : local - - case '%b': - const m = _this.getMonth() - ans = local_labels.monthes[local][m] - break - - case '%d': - case '%e': - ans = _this.getDate() - break - - case '%j': - ans = _this.getDaysOfYear() - break - - case '%U': - case '%W': - const ws = _this.getWeeksOfYear(f === '%W') - ans = padZero(ws, 2) - break - - case '%w': - ans = _this.getDay() - - case '%u': - ans = ans === 0 ? 7 : ans - break - - case '%A': - local = local.startsWith('en') ? 'english' : local - - case '%a': - const d = _this.getDay() - ans = local_labels.weekdays[local][d] - break - - case '%H': - case '%k': - ans = _this.getHours() - break - - case '%I': - case '%l': - ans = _this.getHours() - ans = ans % 12 - break - - case '%M': - ans = _this.getMinutes() - break - - case '%S': - ans = _this.getSeconds() - break - - case '%s': - ans = parseInt(_this.getTime() / 1E3) - break - - case '%f': - const ms = _this.getMilliseconds() - ans = padZero(ms * 1E3, 6) - break - - case '%P': - local = local.startsWith('en') ? 'english' : local - - case '%p': - const h = _this.getHours() - ans = local_labels.meridians[local][h < 12 ? 0 : 1] - break - - case '%z': - let tzo = _this.getTimezoneOffset() - const sign = tzo < 0 ? '-' : '+' - tzo = Math.abs(tzo) - const ho = padZero(tzo / 60, 2) - const mo = padZero(tzo % 60, 2) - ans = sign + ho + mo - break - - default: - break - } - if (f === '%C' || f === '%y' || f === '%m' || f === '%d' || f === '%H' || f === '%M' || f === '%S') { - ans = padZero(ans, 2) - } - return ans.toString() - }) -} - -Date.prototype.humanize = function(local) { - local = local && local.startsWith('zh') ? 'zh' : 'en' - const result = this.strftime('', local) - const days = (Date.today() - this.toMidnight().getTime()) / 8.64E7 - if (days <= -10 || days >= 10) { - return result - } - const labels = local_labels.dayagos[local] - let lbl = '' - if (days === 0 || days === 1) { - lbl = labels[days] - } else if (days === -1) { - lbl = labels[2] - } else if (days >= 2) { - lbl = days + labels[3] - } else { - lbl = days + labels[4] - } - return lbl + result.substr(10, 6) -} - -const local_labels = { - monthes: { - english: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], - en: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - zh: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'] - }, - weekdays: { - english: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], - en: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], - zh: ['日', '一', '二', '三', '四', '五', '六'] - }, - meridians: { - english: ['a.m.', 'p.m.'], - en: ['AM', 'PM'], - zh: ['上午', '下午'] - }, - dayagos: { - english: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'], - en: ['Today', 'Yesterday', 'Tomorrow', ' days ago', ' days late'], - zh: ['今天', '昨天', '明天', '天前', '天后'] - } -} - -export default Date diff --git a/ZR.Vue/src/utils/request.js b/ZR.Vue/src/utils/request.js index 4336d66..e67bdd3 100644 --- a/ZR.Vue/src/utils/request.js +++ b/ZR.Vue/src/utils/request.js @@ -1,13 +1,10 @@ import axios from 'axios' -import { - MessageBox, - Message -} from 'element-ui' +import { MessageBox, Message } from 'element-ui' import store from '@/store' -import { - getToken -} from '@/utils/auth' +import { getToken } from '@/utils/auth' +// import { blobValidate } from "@/utils/ruoyi"; // import errorCode from '@/utils/errorCode' +// import { saveAs } from 'file-saver' // 解决后端跨域获取不到cookie问题 axios.defaults.withCredentials = true @@ -44,7 +41,10 @@ service.interceptors.response.use(res => { } // 未设置状态码则默认成功状态 const { code, msg } = res.data; - + // 二进制数据则直接返回 + if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') { + return res.data + } if (code == 401) { MessageBox.confirm('登录状态已过期,请重新登录', '系统提示', { confirmButtonText: '重新登录', @@ -57,7 +57,7 @@ service.interceptors.response.use(res => { }) return Promise.reject('无效的会话,或者会话已过期,请重新登录。') - } else if (code == 0 || code == 110 || code == 101 || code == 403 || code == 500) { + } else if (code == 0 || code == 1 || code == 110 || code == 101 || code == 403 || code == 500) { Message({ message: msg, type: 'error' @@ -138,4 +138,32 @@ export function postForm(url, data, config) { }) }) } + + +// 通用下载方法 +// export function download(url, params, filename) { +// //downloadLoadingInstance = Loading.service({ text: "正在下载数据,请稍候", spinner: "el-icon-loading", background: "rgba(0, 0, 0, 0.7)", }) +// return service.post(url, params, { +// //transformRequest: [(params) => { return tansParams(params) }], +// headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, +// responseType: 'blob' +// }).then(async (data) => { +// const isLogin = await blobValidate(data); +// if (isLogin) { +// const blob = new Blob([data]) +// saveAs(blob, filename) +// } else { +// const resText = await data.text(); +// const rspObj = JSON.parse(resText); +// const errMsg = "出錯了";// errorCode[rspObj.code] || rspObj.msg || errorCode['default'] +// Message.error(errMsg); +// } +// // downloadLoadingInstance.close(); +// }).catch((r) => { +// console.error(r) +// Message.error('下载文件出现错误,请联系管理员!') +// // downloadLoadingInstance.close(); +// }) +// } + export default service \ No newline at end of file diff --git a/ZR.Vue/src/utils/ruoyi.js b/ZR.Vue/src/utils/ruoyi.js index 03e3587..567601e 100644 --- a/ZR.Vue/src/utils/ruoyi.js +++ b/ZR.Vue/src/utils/ruoyi.js @@ -69,8 +69,8 @@ export function addDateRange2(dateRange, index) { var time = undefined; if (null != dateRange && '' != dateRange) { if (dateRange.length <= 2) { - time = dateRange[index]; - } + time = dateRange[index]; + } } return time; } @@ -119,7 +119,9 @@ export function download(fileName) { // 字符串格式化(%s ) export function sprintf(str) { - var args = arguments, flag = true, i = 1; + var args = arguments, + flag = true, + i = 1; str = str.replace(/%s/g, function () { var arg = args[i++]; if (typeof arg === 'undefined') { @@ -172,3 +174,14 @@ export function handleTree(data, id, parentId, children, rootId) { }); return treeData != '' ? treeData : data; } + +// 验证是否为blob格式 +export async function blobValidate(data) { + try { + const text = await data.text(); + JSON.parse(text); + return false; + } catch (error) { + return true; + } +} \ No newline at end of file diff --git a/ZR.Vue/src/utils/shortcuts.js b/ZR.Vue/src/utils/shortcuts.js deleted file mode 100644 index eff6686..0000000 --- a/ZR.Vue/src/utils/shortcuts.js +++ /dev/null @@ -1,108 +0,0 @@ -import Date from './datetime.js' - -export const calendarBaseShortcuts = [{ - text: '今天', - onClick(picker) { - const startTime = new Date(new Date().setHours(0, 0, 0)) - const endTime = new Date(new Date().setHours(23, 59, 59)) - picker.$emit('pick', [startTime, endTime]) - } -}, { - text: '昨天', - onClick(picker) { - const startTime = new Date(new Date().daysAgo(1).setHours(0, 0, 0)) - const endTime = new Date(new Date().daysAgo(1).setHours(23, 59, 59)) - picker.$emit('pick', [startTime, endTime]) - } -}, { - text: '最近一周', - onClick(picker) { - const startTime = new Date(new Date().daysAgo(7).setHours(0, 0, 0)) - const endTime = new Date(new Date().setHours(23, 59, 59)) - picker.$emit('pick', [startTime, endTime]) - } -}, { - text: '最近30天', - onClick(picker) { - const startTime = new Date(new Date().daysAgo(30).setHours(0, 0, 0)) - const endTime = new Date(new Date().setHours(23, 59, 59)) - picker.$emit('pick', [startTime, endTime]) - } -}, { - text: '这个月', - onClick(picker) { - const startTime = new Date(new Date().monthBegin().setHours(0, 0, 0)) - const endTime = new Date(new Date().setHours(23, 59, 59)) - picker.$emit('pick', [startTime, endTime]) - } -}, { - text: '本季度', - onClick(picker) { - const startTime = new Date(new Date().quarterBegin().setHours(0, 0, 0)) - const endTime = new Date(new Date().setHours(23, 59, 59)) - picker.$emit('pick', [startTime, endTime]) - } -}] - -export const calendarMoveShortcuts = [{ - text: '‹ 往前一天 ', - onClick(picker) { - let startTime = new Date(new Date().daysAgo(1).setHours(0, 0, 0)) - let endTime = new Date(new Date().daysAgo(1).setHours(23, 59, 59)) - if (!picker.value) { - picker.value = [startTime, endTime] - } - startTime = picker.value[0].daysAgo(1) - endTime = picker.value[1].daysAgo(1) - picker.$emit('pick', [startTime, picker]) - } -}, { - text: ' 往后一天 ›', - onClick(picker) { - let startTime = new Date(new Date().setHours(0, 0, 0)) - let endTime = new Date(new Date().setHours(23, 59, 59)) - if (!picker.value) { - picker.value = [startTime, endTime] - } - startTime = picker.value[0].daysAgo(-1) - endTime = picker.value[1].daysAgo(-1) - picker.$emit('pick', [startTime, endTime]) - } -}, { - text: '« 往前一周 ', - onClick(picker) { - let startTime = new Date(new Date().setHours(0, 0, 0)) - let endTime = new Date(new Date().setHours(23, 59, 59)) - if (!picker.value) { - picker.value = [startTime.daysAgo(new Date().getDay()), - endTime.daysAgo(new Date().getDay() + 1)] - } else { - picker.value = [picker.value[0].daysAgo(picker.value[0].getDay()), - picker.value[1].daysAgo(picker.value[1].getDay() + 1)] - } - startTime = picker.value[0].daysAgo(7) - endTime = picker.value[1] - picker.$emit('pick', [startTime, endTime]) - } -}, { - text: ' 往后一周 »', - onClick(picker) { - let startTime = new Date(new Date().setHours(0, 0, 0)) - let endTime = new Date(new Date().setHours(23, 59, 59)) - if (!picker.value) { - picker.value = [startTime.daysAgo(new Date().getDay() - 7), - endTime.daysAgo(new Date().getDay() - 6)] - } else { - picker.value = [picker.value[0].daysAgo(picker.value[0].getDay() - 7), - picker.value[1].daysAgo(picker.value[1].getDay() - 6)] - } - startTime = picker.value[0] - endTime = picker.value[1].daysAgo(-7) - picker.$emit('pick', [startTime, endTime]) - } -}] - -export const calendarShortcuts = [ - ...calendarBaseShortcuts, - ...calendarMoveShortcuts -] diff --git a/ZR.Vue/src/views/login.vue b/ZR.Vue/src/views/login.vue index 9d69617..60cc63a 100644 --- a/ZR.Vue/src/views/login.vue +++ b/ZR.Vue/src/views/login.vue @@ -151,9 +151,9 @@ export default { justify-content: center; align-items: center; height: 100%; - // background-image: url("../assets/image/login-background.jpg"); + background-image: url("../assets/image/login-background.jpg"); background-size: cover; - background-color: rgba(56, 157, 170, 0.82); + // background-color: rgba(56, 157, 170, 0.82); } .title { margin: 0px auto 30px auto; diff --git a/ZR.Vue/src/views/monitor/operlog/index.vue b/ZR.Vue/src/views/monitor/operlog/index.vue index d6eba23..77ba877 100644 --- a/ZR.Vue/src/views/monitor/operlog/index.vue +++ b/ZR.Vue/src/views/monitor/operlog/index.vue @@ -5,7 +5,8 @@ - + @@ -18,8 +19,8 @@ - - + 搜索 @@ -29,13 +30,15 @@ - 删除 + 删除 清空 - 导出 + 导出 + @@ -52,7 +55,8 @@ @@ -63,7 +67,8 @@ @@ -124,11 +129,8 @@ import { cleanOperlog, exportOperlog, } from "@/api/monitor/operlog"; -import DateRangePicker from "@/components/DateRangePicker"; -import { downloadFile } from "@/utils/zipdownload.js"; export default { - components: { DateRangePicker }, name: "Operlog", data() { return { @@ -267,10 +269,7 @@ export default { const { code, data } = response; if (code == 200) { this.msgSuccess("导出成功"); - downloadFile( - process.env.VUE_APP_BASE_API + data.path, - data.fileName - ); + this.download(data.path); } else { this.msgError("导出失败"); } diff --git a/ZR.Vue/src/views/system/post/index.vue b/ZR.Vue/src/views/system/post/index.vue index 993ede9..f1700e0 100644 --- a/ZR.Vue/src/views/system/post/index.vue +++ b/ZR.Vue/src/views/system/post/index.vue @@ -29,7 +29,7 @@ 删除 - 导出 + 导出 @@ -98,7 +98,6 @@ import { updatePost, exportPost, } from "@/api/system/post"; -import { downloadFile } from "@/utils/zipdownload.js"; export default { name: "Post", @@ -269,12 +268,7 @@ export default { return exportPost(queryParams); }) .then((response) => { - console.log(response) - // this.download(response.msg); - downloadFile( - process.env.VUE_APP_BASE_API + response.data.path, - response.data.fileName - ); + this.download(response.data.path); }); }, }, diff --git a/ZR.Vue/src/views/system/user/index.vue b/ZR.Vue/src/views/system/user/index.vue index eefb908..30a4ea8 100644 --- a/ZR.Vue/src/views/system/user/index.vue +++ b/ZR.Vue/src/views/system/user/index.vue @@ -7,17 +7,20 @@
- +
- + - + @@ -25,7 +28,8 @@ - + 搜索 @@ -38,16 +42,19 @@ 新增 - 修改 + 修改 - 删除 + 删除 - + - 导出 + 导出 + @@ -78,8 +85,10 @@ @@ -148,14 +157,16 @@ - + + - + + @@ -176,19 +187,17 @@ - + -
- 将文件拖到此处,或 - 点击上传 -
-
- 是否更新已经存在的用户数据 - 下载模板 -
-
- 提示:仅允许导入“xls”或“xlsx”格式文件! +
将文件拖到此处,或点击上传
+
+
+ 是否更新已经存在的用户数据 +
+ 仅允许导入xls、xlsx格式文件。 + 下载模板