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ʱñĿվ
-1App.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
+1App.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 @@
- {{ scope.row.elapsed }} ms
+ {{ scope.row.elapsed }}
+ ms
@@ -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格式文件。
+
下载模板