diff --git a/README.md b/README.md index 93f9a2d..91bf80e 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,6 @@ Vue版前端技术栈 :基于vue、vuex、vue-router 、vue-cli 、axios 和 e ZRAdmin解决方案包含: -Infrastructure[基础类库]:包框架的核心组件,包含一系列快速开发中经常用到的Utility辅助工具功能,部分核心功能的实现; - ZR.Service[服务层类库]:提供WebApi接口调用; ZR.Tasks[定时任务类库]:提供项目定时任务实现功能; diff --git a/ZR.Admin.WebApi/Controllers/CodeGeneratorController.cs b/ZR.Admin.WebApi/Controllers/CodeGeneratorController.cs index c504bf6..d6a4f55 100644 --- a/ZR.Admin.WebApi/Controllers/CodeGeneratorController.cs +++ b/ZR.Admin.WebApi/Controllers/CodeGeneratorController.cs @@ -94,7 +94,7 @@ namespace ZR.Admin.WebApi.Controllers //生成代码 CodeGeneratorTool.Generate(genTableInfo, dto); //下载文件 - CodeGeneratorTool.ZipGenCode(dto); + FileHelper.ZipGenCode(dto); //HttpContext.Response.Headers.Add("Content-disposition", $"attachment; filename={zipFileName}"); return SUCCESS(new { zipPath = "/Generatecode/" + dto.ZipFileName, fileName = dto.ZipFileName }); @@ -145,7 +145,7 @@ namespace ZR.Admin.WebApi.Controllers } /// - /// 导入表 + /// 导入表结构(保存) /// /// /// @@ -218,5 +218,32 @@ namespace ZR.Admin.WebApi.Controllers } return SUCCESS(rows); } + + /// + /// 预览代码 + /// + /// + /// + [HttpGet("preview/{tableId}")] + [ActionPermissionFilter(Permission = "tool:gen:preview")] + public IActionResult Preview(long tableId) + { + if (tableId <= 0) + { + throw new CustomException(ResultCode.CUSTOM_ERROR, "请求参数为空"); + } + var genTableInfo = GenTableService.GetGenTableInfo(tableId); + genTableInfo.Columns = GenTableColumnService.GenTableColumns(tableId); + GenerateDto dto = new(); + dto.GenTable = genTableInfo; + dto.ZipPath = Path.Combine(WebHostEnvironment.WebRootPath, "Generatecode"); + dto.GenCodePath = Path.Combine(dto.ZipPath, DateTime.Now.ToString("yyyyMMdd")); + dto.IsPreview = 1; + dto.GenCodeFiles = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }; + //生成代码 + CodeGeneratorTool.Generate(genTableInfo, dto); + + return SUCCESS(dto.GenCodes); + } } } diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ControllersTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ControllersTemplate.txt index af2cc5c..24973ce 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ControllersTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ControllersTemplate.txt @@ -18,14 +18,17 @@ using ZR.Common; namespace {ApiControllerNamespace}.Controllers { /// - /// 代码自动生成 + /// {FunctionName}Controller + /// + /// @author {Author} + /// @date {DateTime} /// [Verify] [Route("{ModuleName}/{ModelName}")] public class {ModelName}Controller: BaseController - { + { /// - /// {TableDesc}接口 + /// {FunctionName}接口 /// private readonly I{ModelName}Service _{ModelName}Service; @@ -35,7 +38,7 @@ namespace {ApiControllerNamespace}.Controllers } /// - /// 查询{TableDesc}列表 + /// 查询{FunctionName}列表 /// /// [HttpGet("list")] @@ -54,7 +57,7 @@ namespace {ApiControllerNamespace}.Controllers } /// - /// 查询{TableDesc}详情 + /// 查询{FunctionName}详情 /// /// /// @@ -68,7 +71,7 @@ namespace {ApiControllerNamespace}.Controllers } /// - /// 添加{TableDesc} + /// 添加{FunctionName} /// /// [HttpPost] @@ -90,7 +93,7 @@ namespace {ApiControllerNamespace}.Controllers } /// - /// 更新{TableDesc} + /// 更新{FunctionName} /// /// [HttpPut] @@ -115,7 +118,7 @@ namespace {ApiControllerNamespace}.Controllers } /// - /// 删除{TableDesc} + /// 删除{FunctionName} /// /// [HttpDelete("{ids}")] diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/IServiceTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/IServiceTemplate.txt index 8e3692b..b64fd98 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/IServiceTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/IServiceTemplate.txt @@ -4,7 +4,10 @@ using {ModelsNamespace}.Models; namespace {IServicsNamespace}.Business { /// - /// 定义{TableNameDesc}服务接口 + /// {FunctionName}service接口 + /// + /// @author {Author} + /// @date {DateTime} /// public interface I{ModelTypeName}Service: IBaseService<{ModelTypeName}> { diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/InputDtoTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/InputDtoTemplate.txt index 0398c07..ded802d 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/InputDtoTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/InputDtoTemplate.txt @@ -6,7 +6,7 @@ using {ModelsNamespace}.Models; namespace {DtosNamespace}.Dto { /// - /// {TableNameDesc}输入对象模型 + /// {FunctionName}输入对象模型 /// public class {ModelTypeName}Dto { @@ -14,7 +14,7 @@ namespace {DtosNamespace}.Dto } /// - /// {TableNameDesc}查询对象模型 + /// {FunctionName}查询对象模型 /// public class {ModelTypeName}QueryDto: PagerInfo { diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ModelTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ModelTemplate.txt index 7d9a00a..66bbcce 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ModelTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ModelTemplate.txt @@ -4,7 +4,10 @@ using System.Collections.Generic; namespace {ModelsNamespace}.Models { /// - /// {TableNameDesc},数据实体对象 + /// {FunctionName},数据实体对象 + /// + /// @author {Author} + /// @date {DateTime} /// [SqlSugar.SugarTable("{TableName}")] public class {ModelTypeName} diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/RepositoryTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/RepositoryTemplate.txt index e39f922..db312b9 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/RepositoryTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/RepositoryTemplate.txt @@ -6,20 +6,15 @@ using {ModelsNamespace}.Models; namespace {RepositoriesNamespace} { /// - /// 代码生成器生成 - /// {TableNameDesc}仓储接口的实现 + /// {FunctionName}仓储接口的实现 + /// + /// @author {Author} + /// @date {DateTime} /// [AppService(ServiceLifetime = LifeTime.Transient)] public class {ModelTypeName}Repository : BaseRepository { - public {ModelTypeName}Repository() - { - } - #region 业务逻辑代码 - - - #endregion } } \ No newline at end of file diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ServiceTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ServiceTemplate.txt index 340390a..c42b2eb 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ServiceTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/ServiceTemplate.txt @@ -13,15 +13,18 @@ using {IRepositoriesNamespace}; namespace {ServicesNamespace}.Business { /// - /// 代码生成器生成 + /// {FunctionName}Service业务层处理 + /// + /// @author {Author} + /// @date {DateTime} /// [AppService(ServiceType = typeof(I{ModelTypeName}Service), ServiceLifetime = LifeTime.Transient)] public class {ModelTypeName}Service: BaseService<{ModelTypeName}>, I{ModelTypeName}Service { - private readonly {ModelTypeName}Repository _repository; + private readonly {ModelTypeName}Repository _repository; public {ModelTypeName}Service({ModelTypeName}Repository repository) { - _repository = repository; + _repository = repository; } #region 业务逻辑代码 diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueJsTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueJsTemplate.txt index d4efae3..3d37ec0 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueJsTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueJsTemplate.txt @@ -1,7 +1,7 @@ import request from '@/utils/request' /** - * {ModelTypeDesc}分页查询 + * {FunctionName}分页查询 * @param {查询条件} data */ export function list{ModelTypeName}(query) { @@ -13,7 +13,7 @@ export function list{ModelTypeName}(query) { } /** - * 新增{ModelTypeDesc} + * 新增{FunctionName} * @param data */ export function add{ModelTypeName}(data) { @@ -25,7 +25,7 @@ export function add{ModelTypeName}(data) { } /** - * 修改{ModelTypeDesc} + * 修改{FunctionName} * @param data */ export function update{ModelTypeName}(data) { @@ -37,7 +37,7 @@ export function update{ModelTypeName}(data) { } /** - * 获取{ModelTypeDesc}详情 + * 获取{FunctionName}详情 * @param {Id} {ModelTypeDesc}Id */ export function get{ModelTypeName}(id) { diff --git a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueTemplate.txt b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueTemplate.txt index bca90fa..d6b050a 100644 --- a/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueTemplate.txt +++ b/ZR.Admin.WebApi/wwwroot/CodeGenTemplate/VueTemplate.txt @@ -2,8 +2,7 @@
- {vueQueryFormHtml} - +{vueQueryFormHtml} 搜索 重置 @@ -27,7 +26,7 @@ - {VueViewListContent} +{VueViewListContent} \r\n"; // vueViewListContent += " \r\n"; //} - else if(dbFieldInfo.IsList) + else if (dbFieldInfo.IsList) { - vueViewListContent += $" \r\n"; + sb.AppendLine($" "); } - return vueViewListContent; + return sb.ToString(); } } } diff --git a/ZR.CodeGenerator/CodeGeneratorTool.cs b/ZR.CodeGenerator/CodeGeneratorTool.cs index e310ef8..6e164b8 100644 --- a/ZR.CodeGenerator/CodeGeneratorTool.cs +++ b/ZR.CodeGenerator/CodeGeneratorTool.cs @@ -3,11 +3,7 @@ using SqlSugar; using System; using System.Collections.Generic; using System.IO; -using System.IO.Compression; using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using ZR.CodeGenerator.CodeGenerator; using ZR.CodeGenerator.Model; using ZR.Model.System.Generate; @@ -15,8 +11,6 @@ namespace ZR.CodeGenerator { /// /// 代码生成器。 - /// - /// 根据指定的实体域名空间生成Repositories和Services层的基础代码文件。 /// /// public class CodeGeneratorTool @@ -31,7 +25,7 @@ namespace ZR.CodeGenerator /// /// /// - public static List Generate(GenTable dbTableInfo, GenerateDto dto) + public static void Generate(GenTable dbTableInfo, GenerateDto dto) { _option.BaseNamespace = dbTableInfo.BaseNameSpace; _option.DtosNamespace = _option.BaseNamespace + "Model"; @@ -42,9 +36,7 @@ namespace ZR.CodeGenerator _option.ServicesNamespace = _option.BaseNamespace + "Service"; _option.ApiControllerNamespace = _option.BaseNamespace + "Admin.WebApi"; - List list = GenerateSingle(dbTableInfo?.Columns, dbTableInfo, dto); - - return list; + GenerateSingle(dbTableInfo?.Columns, dbTableInfo, dto); } /// @@ -53,17 +45,18 @@ namespace ZR.CodeGenerator /// 表字段集合 /// 表信息 /// - public static List GenerateSingle(List listField, GenTable tableInfo, GenerateDto dto) + public static void GenerateSingle(List listField, GenTable tableInfo, GenerateDto dto) { string PKName = "id"; string PKType = "int"; - List genPathList = new(); ReplaceDto replaceDto = new(); replaceDto.ModelTypeName = tableInfo.ClassName;//表名对应C# 实体类名 replaceDto.TableName = tableInfo.TableName;//表名 replaceDto.TableDesc = tableInfo.TableComment;//表说明描述 replaceDto.Permission = $"{tableInfo.ModuleName}:{tableInfo.ClassName.ToLower()}";//权限 replaceDto.ViewsFileName = FirstLowerCase(replaceDto.ModelTypeName); + replaceDto.Author = tableInfo.FunctionAuthor; + //循环表字段信息 foreach (GenTableColumn dbFieldInfo in listField) { @@ -96,9 +89,9 @@ namespace ZR.CodeGenerator if ((dbFieldInfo.HtmlType == GenConstants.HTML_SELECT || dbFieldInfo.HtmlType == GenConstants.HTML_RADIO) && !string.IsNullOrEmpty(dbFieldInfo.DictType)) { replaceDto.VueDataContent += $" // {dbFieldInfo.ColumnComment}选项列表\n"; - replaceDto.VueDataContent += $" {FirstLowerCase(dbFieldInfo.CsharpField)}Options: [],"; + replaceDto.VueDataContent += $" {FirstLowerCase(dbFieldInfo.CsharpField)}Options: [],\n"; - replaceDto.MountedMethod += $" this.getDicts(\"{dbFieldInfo.DictType}\").then((response) => {{\n"; + replaceDto.MountedMethod += $" this.getDicts(\"{dbFieldInfo.DictType}\").then((response) => {{\n"; replaceDto.MountedMethod += $" this.{FirstLowerCase(dbFieldInfo.CsharpField)}Options = response.data;\n"; replaceDto.MountedMethod += " })\n"; } @@ -115,110 +108,100 @@ namespace ZR.CodeGenerator replaceDto.PKName = PKName; replaceDto.PKType = PKType; - if (dto.genFiles.Contains(1)) + if (dto.GenCodeFiles.Contains(1)) { - Tuple tuple = GenerateModels(replaceDto, dto); - genPathList.Add(tuple.Item1); - WriteAndSave(tuple.Item1, tuple.Item2); + GenerateModels(replaceDto, dto); } - if (dto.genFiles.Contains(2)) + if (dto.GenCodeFiles.Contains(2)) { - Tuple tuple = GenerateInputDto(replaceDto, dto); - genPathList.Add(tuple.Item1); - WriteAndSave(tuple.Item1, tuple.Item2); + GenerateInputDto(replaceDto, dto); } - if (dto.genFiles.Contains(3)) + if (dto.GenCodeFiles.Contains(3)) { - Tuple tuple = GenerateRepository(replaceDto, dto); - genPathList.Add(tuple.Item1); - WriteAndSave(tuple.Item1, tuple.Item2); + GenerateRepository(replaceDto, dto); } - if (dto.genFiles.Contains(4)) + if (dto.GenCodeFiles.Contains(4)) { - Tuple tuple = GenerateIService(replaceDto, dto); - Tuple tuple_1 = GenerateService(replaceDto, dto); - genPathList.Add(tuple.Item1); - genPathList.Add(tuple_1.Item1); - WriteAndSave(tuple.Item1, tuple.Item2); - WriteAndSave(tuple_1.Item1, tuple_1.Item2); + GenerateIService(replaceDto, dto); + GenerateService(replaceDto, dto); } - if (dto.genFiles.Contains(5)) + if (dto.GenCodeFiles.Contains(5)) { - Tuple tuple = GenerateControllers(replaceDto, dto); - genPathList.Add(tuple.Item1); - WriteAndSave(tuple.Item1, tuple.Item2); + GenerateControllers(replaceDto, dto); } - if (dto.genFiles.Contains(6)) + if (dto.GenCodeFiles.Contains(6)) { - Tuple tuple = GenerateVueViews(replaceDto, dto); - Tuple tuple_1 = GenerateVueJs(replaceDto, dto); - genPathList.Add(tuple.Item1); - genPathList.Add(tuple_1.Item1); - WriteAndSave(tuple.Item1, tuple.Item2); - WriteAndSave(tuple_1.Item1, tuple_1.Item2); + GenerateVueViews(replaceDto, dto); } - if (dto.genFiles.Contains(7)) + if (dto.GenCodeFiles.Contains(7)) { - Tuple tuple = GenerateSql(replaceDto, dto); - WriteAndSave(tuple.Item1, tuple.Item2); + GenerateVueJs(replaceDto, dto); + } + if (dto.GenCodeFiles.Contains(8)) + { + GenerateSql(replaceDto, dto); + } + if (dto.IsPreview == 1) + { + return; + } + foreach (var item in dto.GenCodes) + { + FileHelper.WriteAndSave(item.Path, item.Content); } - return genPathList; } #region 生成Model /// - /// 生成Models文件 + /// 生成实体类Model /// /// /// 替换实体 - private static Tuple GenerateModels(ReplaceDto replaceDto, GenerateDto generateDto) + private static void GenerateModels(ReplaceDto replaceDto, GenerateDto generateDto) { - //../ZR.Model - var servicesPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Models"); - Console.WriteLine("创建文件夹" + servicesPath); - CreateDirectory(servicesPath); // ../ZR.Model/Models/User.cs - var fullPath = Path.Combine(servicesPath, replaceDto.ModelTypeName + ".cs"); + var fullPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Models", replaceDto.ModelTypeName + ".cs"); - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); + if (File.Exists(fullPath) && !generateDto.Coverd) + return; - var content = ReadTemplate("ModelTemplate.txt") + var content = FileHelper.ReadTemplate("ModelTemplate.txt") .Replace("{ModelsNamespace}", _option.ModelsNamespace) .Replace("{ModelTypeName}", replaceDto.ModelTypeName) - .Replace("{TableNameDesc}", replaceDto.TableDesc) + .Replace("{FunctionName}", generateDto.GenTable.FunctionName) .Replace("{KeyTypeName}", replaceDto.PKName) .Replace("{PropertyName}", replaceDto.ModelProperty) - .Replace("{TableName}", replaceDto.TableName); + .Replace("{TableName}", replaceDto.TableName) + .Replace("{Author}", replaceDto.Author) + .Replace("{DateTime}", replaceDto.AddTime); - return Tuple.Create(fullPath, content); + generateDto.GenCodes.Add(new GenCode(1, "实体类", fullPath, content)); } /// - /// 生成InputDto文件 + /// 生成表单提交输入参数Dto /// /// /// 替换实体 - private static Tuple GenerateInputDto(ReplaceDto replaceDto, GenerateDto generateDto) + private static void GenerateInputDto(ReplaceDto replaceDto, GenerateDto generateDto) { - var servicesPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Dto"); - CreateDirectory(servicesPath); - // ../ZR.Model/Dto/User.cs - var fullPath = Path.Combine(servicesPath, $"{replaceDto.ModelTypeName}Dto.cs"); + var fullPath = Path.Combine(generateDto.GenCodePath, _option.ModelsNamespace, "Dto", $"{replaceDto.ModelTypeName}Dto.cs"); - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); + if (File.Exists(fullPath) && !generateDto.Coverd) + return; - var content = ReadTemplate("InputDtoTemplate.txt") + var content = FileHelper.ReadTemplate("InputDtoTemplate.txt") .Replace("{DtosNamespace}", _option.DtosNamespace) .Replace("{ModelsNamespace}", _option.ModelsNamespace) - .Replace("{TableNameDesc}", replaceDto.TableDesc) + .Replace("{FunctionName}", generateDto.GenTable.FunctionName) .Replace("{PropertyName}", replaceDto.InputDtoProperty) .Replace("{QueryProperty}", replaceDto.QueryProperty) - .Replace("{ModelTypeName}", replaceDto.ModelTypeName); + .Replace("{ModelTypeName}", replaceDto.ModelTypeName) + .Replace("{Author}", replaceDto.Author) + .Replace("{DateTime}", replaceDto.AddTime); - return Tuple.Create(fullPath, content); + //generateDto.GenCodes.Add(new GenCode(2, "数据传输实体类", fullPath, content)); } #endregion @@ -229,24 +212,23 @@ namespace ZR.CodeGenerator /// /// /// 替换实体 - private static Tuple GenerateRepository(ReplaceDto replaceDto, GenerateDto generateDto) + private static void GenerateRepository(ReplaceDto replaceDto, GenerateDto generateDto) { - var repositoryPath = Path.Combine(generateDto.GenCodePath, _option.RepositoriesNamespace, "Repositories"); - CreateDirectory(repositoryPath); + var fullPath = Path.Combine(generateDto.GenCodePath, _option.RepositoriesNamespace, "Repositories", $"{replaceDto.ModelTypeName}Repository.cs"); - var fullPath = Path.Combine(repositoryPath, $"{replaceDto.ModelTypeName}Repository.cs"); + if (File.Exists(fullPath) && !generateDto.Coverd) + return; - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); - - var content = ReadTemplate("RepositoryTemplate.txt") + var content = FileHelper.ReadTemplate("RepositoryTemplate.txt") .Replace("{ModelsNamespace}", _option.ModelsNamespace) .Replace("{RepositoriesNamespace}", _option.RepositoriesNamespace) .Replace("{ModelTypeName}", replaceDto.ModelTypeName) - .Replace("{TableNameDesc}", replaceDto.TableDesc) - .Replace("{TableName}", replaceDto.TableName); + .Replace("{FunctionName}", generateDto.GenTable.FunctionName) + .Replace("{TableName}", replaceDto.TableName) + .Replace("{Author}", replaceDto.Author) + .Replace("{DateTime}", replaceDto.AddTime); - return Tuple.Create(fullPath, content); + generateDto.GenCodes.Add(new GenCode(3, "仓储层", fullPath, content)); } #endregion @@ -257,48 +239,47 @@ namespace ZR.CodeGenerator /// /// /// 替换实体 - private static Tuple GenerateIService(ReplaceDto replaceDto, GenerateDto generateDto) + private static void GenerateIService(ReplaceDto replaceDto, GenerateDto generateDto) { - var iServicesPath = Path.Combine(generateDto.GenCodePath, _option.IServicsNamespace, "Business", "IBusService"); - CreateDirectory(iServicesPath); + var fullPath = Path.Combine(generateDto.GenCodePath, _option.IServicsNamespace, "Business", "IBusService", $"I{replaceDto.ModelTypeName}Service.cs"); - var fullPath = Path.Combine(iServicesPath, $"I{replaceDto.ModelTypeName}Service.cs"); - Console.WriteLine(fullPath); - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); - var content = ReadTemplate("IServiceTemplate.txt") + if (File.Exists(fullPath) && !generateDto.Coverd) + return; + var content = FileHelper.ReadTemplate("IServiceTemplate.txt") .Replace("{ModelsNamespace}", _option.ModelsNamespace) - .Replace("{TableNameDesc}", replaceDto.TableDesc) + .Replace("{FunctionName}", generateDto.GenTable.FunctionName) .Replace("{DtosNamespace}", _option.DtosNamespace) .Replace("{IServicsNamespace}", _option.IServicsNamespace) .Replace("{RepositoriesNamespace}", _option.RepositoriesNamespace) - .Replace("{ModelTypeName}", replaceDto.ModelTypeName); + .Replace("{ModelTypeName}", replaceDto.ModelTypeName) + .Replace("{Author}", replaceDto.Author) + .Replace("{DateTime}", replaceDto.AddTime); - return Tuple.Create(fullPath, content); + //generateDto.GenCodes.Add(new GenCode(4, "接口层", fullPath, content)); } /// /// 生成Service文件 /// - private static Tuple GenerateService(ReplaceDto replaceDto, GenerateDto generateDto) + private static void GenerateService(ReplaceDto replaceDto, GenerateDto generateDto) { - var servicesPath = Path.Combine(generateDto.GenCodePath, _option.ServicesNamespace, "Business"); - CreateDirectory(servicesPath); - var fullPath = Path.Combine(servicesPath, $"{replaceDto.ModelTypeName}Service.cs"); - Console.WriteLine(fullPath); - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); + var fullPath = Path.Combine(generateDto.GenCodePath, _option.ServicesNamespace, "Business", $"{replaceDto.ModelTypeName}Service.cs"); - var content = ReadTemplate("ServiceTemplate.txt") + if (File.Exists(fullPath) && !generateDto.Coverd) + return; + + var content = FileHelper.ReadTemplate("ServiceTemplate.txt") .Replace("{IRepositoriesNamespace}", _option.IRepositoriesNamespace) .Replace("{DtosNamespace}", _option.DtosNamespace) .Replace("{IServicsNamespace}", _option.IServicsNamespace) - .Replace("{TableNameDesc}", replaceDto.TableDesc) + .Replace("{FunctionName}", generateDto.GenTable.FunctionName) .Replace("{ModelsNamespace}", _option.ModelsNamespace) .Replace("{ServicesNamespace}", _option.ServicesNamespace) - .Replace("{ModelTypeName}", replaceDto.ModelTypeName); + .Replace("{ModelTypeName}", replaceDto.ModelTypeName) + .Replace("{Author}", replaceDto.Author) + .Replace("{DateTime}", replaceDto.AddTime); - return Tuple.Create(fullPath, content); + generateDto.GenCodes.Add(new GenCode(4, "服务层", fullPath, content)); } #endregion @@ -307,47 +288,42 @@ namespace ZR.CodeGenerator /// /// 生成控制器ApiControllers文件 /// - private static Tuple GenerateControllers(ReplaceDto replaceDto, GenerateDto generateDto) + private static void GenerateControllers(ReplaceDto replaceDto, GenerateDto generateDto) { - var servicesPath = Path.Combine(generateDto.GenCodePath, _option.ApiControllerNamespace, "Controllers", generateDto.GenTable.ModuleName); - CreateDirectory(servicesPath); + var fullPath = Path.Combine(generateDto.GenCodePath, _option.ApiControllerNamespace, "Controllers", generateDto.GenTable.ModuleName, $"{replaceDto.ModelTypeName}Controller.cs"); + if (File.Exists(fullPath) && !generateDto.Coverd) + return; - var fullPath = Path.Combine(servicesPath, $"{replaceDto.ModelTypeName}Controller.cs"); - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); - - var content = ReadTemplate("ControllersTemplate.txt") + var content = FileHelper.ReadTemplate("ControllersTemplate.txt") .Replace("{ApiControllerNamespace}", _option.ApiControllerNamespace) .Replace("{ServicesNamespace}", _option.ServicesNamespace) .Replace("{ModelsNamespace}", _option.ModelsNamespace) - .Replace("{TableDesc}", replaceDto.TableDesc) + .Replace("{FunctionName}", generateDto.GenTable.FunctionName) .Replace("{ModelName}", replaceDto.ModelTypeName) .Replace("{Permission}", replaceDto.Permission) .Replace("{PrimaryKey}", replaceDto.PKName) .Replace("{UpdateColumn}", replaceDto.UpdateColumn) .Replace("{InsertColumn}", replaceDto.InsertColumn) .Replace("{ModuleName}", generateDto.GenTable.ModuleName) - .Replace("{PKCsharpType}", replaceDto.PKType); + .Replace("{PKCsharpType}", replaceDto.PKType) + .Replace("{Author}", replaceDto.Author) + .Replace("{DateTime}", replaceDto.AddTime); - return Tuple.Create(fullPath, content); + generateDto.GenCodes.Add(new GenCode(5, "控制器", fullPath, content)); } #endregion - #region 生成Vue页面 + #region 生成Vue页面 & api /// - /// 生成Vue页面 - private static Tuple GenerateVueViews(ReplaceDto replaceDto, GenerateDto generateDto) + /// 6、生成Vue页面 + private static void GenerateVueViews(ReplaceDto replaceDto, GenerateDto generateDto) { - var parentPath = Path.Combine(generateDto.GenCodePath, "ZR.Vue", "src"); - var servicesPath = Path.Combine(parentPath, "views", generateDto.GenTable.ModuleName, replaceDto.ViewsFileName); - CreateDirectory(servicesPath); + var fullPath = Path.Combine(generateDto.GenCodePath, "ZR.Vue", "src", "views", generateDto.GenTable.ModuleName, replaceDto.ViewsFileName, "index.vue"); - var fullPath = Path.Combine(servicesPath, "index.vue"); + if (File.Exists(fullPath) && !generateDto.Coverd) + return; - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); - - var content = ReadTemplate("VueTemplate.txt") + var content = FileHelper.ReadTemplate("VueTemplate.txt") .Replace("{fileClassName}", replaceDto.ViewsFileName) .Replace("{VueViewListContent}", replaceDto.VueViewListHtml)//查询 table列 .Replace("{VueViewFormContent}", replaceDto.VueViewFormHtml)//添加、修改表单 @@ -357,42 +333,43 @@ namespace ZR.CodeGenerator .Replace("{vueJsMethod}", replaceDto.VueJsMethod) .Replace("{vueQueryFormHtml}", replaceDto.VueQueryFormHtml) .Replace("{VueDataContent}", replaceDto.VueDataContent) - .Replace("{primaryKey}", FirstLowerCase(replaceDto.PKName)) + .Replace("{PrimaryKey}", FirstLowerCase(replaceDto.PKName)) .Replace("{MountedMethod}", replaceDto.MountedMethod) .Replace("{VueViewEditFormRuleContent}", replaceDto.VueViewEditFormRuleContent);//添加、修改表单验证规则 - return Tuple.Create(fullPath, content); + generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, content)); } - public static Tuple GenerateVueJs(ReplaceDto replaceDto, GenerateDto generateDto) + /// + /// 7、生成vue页面api + /// + /// + /// + /// + public static void GenerateVueJs(ReplaceDto replaceDto, GenerateDto generateDto) { - //api js - var parentPath = Path.Combine(generateDto.GenCodePath, "ZR.Vue", "src"); - string servicesPath = Path.Combine(parentPath, "api"); - CreateDirectory(servicesPath); + string fullPath = Path.Combine(generateDto.GenCodePath, "ZR.Vue", "src", "api", replaceDto.ViewsFileName + ".js"); - string fullPath = Path.Combine(servicesPath, replaceDto.ViewsFileName + ".js"); + if (File.Exists(fullPath) && !generateDto.Coverd) + return; - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); - - var content = ReadTemplate("VueJsTemplate.txt") + var content = FileHelper.ReadTemplate("VueJsTemplate.txt") .Replace("{ModelTypeName}", replaceDto.ModelTypeName) - .Replace("{ModelTypeDesc}", replaceDto.TableDesc) + .Replace("{FunctionName}", generateDto.GenTable.FunctionName) .Replace("{ModuleName}", generateDto.GenTable.ModuleName); - return Tuple.Create(fullPath, content); + generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPath, content)); } #endregion - #region 生成SQL + #region 8、生成SQL - public static Tuple GenerateSql(ReplaceDto replaceDto, GenerateDto generateDto) + public static void GenerateSql(ReplaceDto replaceDto, GenerateDto generateDto) { string fullPath = Path.Combine(generateDto.GenCodePath, replaceDto.ViewsFileName + ".sql"); - if (File.Exists(fullPath) && !generateDto.coverd) - return Tuple.Create(fullPath, ""); + if (File.Exists(fullPath) && !generateDto.Coverd) + return; var tempName = ""; switch (generateDto.DbType) { @@ -405,7 +382,7 @@ namespace ZR.CodeGenerator default: break; } - var content = ReadTemplate($"{tempName}.txt") + var content = FileHelper.ReadTemplate($"{tempName}.txt") .Replace("{ModelTypeName}", replaceDto.ModelTypeName) .Replace("{Permission}", replaceDto.Permission) .Replace("{ModelTypeDesc}", replaceDto.TableDesc) @@ -413,7 +390,7 @@ namespace ZR.CodeGenerator .Replace("{ViewsFileName}", replaceDto.ViewsFileName) .Replace("{FunctionName}", generateDto.GenTable.FunctionName); - return Tuple.Create(fullPath, content); + generateDto.GenCodes.Add(new GenCode(8, "sql", fullPath, content)); } #endregion @@ -465,94 +442,6 @@ namespace ZR.CodeGenerator { return string.IsNullOrEmpty(columnDescription) ? columnName : columnDescription; } - /// - /// 从代码模板中读取内容 - /// - /// 模板名称,应包括文件扩展名称。比如:template.txt - /// - private static string ReadTemplate(string templateName) - { - string path = Environment.CurrentDirectory; - string fullName = $"{path}/wwwroot/CodeGenTemplate/{templateName}"; - - Console.WriteLine("开始读取模板=" + fullName); - string temp = fullName; - string str = ""; - if (!File.Exists(temp)) - { - return str; - } - StreamReader sr = null; - try - { - sr = new StreamReader(temp); - str = sr.ReadToEnd(); // 读取文件 - } - catch (Exception ex) - { - Console.WriteLine($"读取模板出错了{ex.Message}"); - } - sr?.Close(); - sr?.Dispose(); - return str; - } - - /// - /// 写文件 - /// - /// - /// - private static void WriteAndSave(string fileName, string content) - { - fileName = fileName.Replace("\\", "/").Replace("//", "/"); - Console.WriteLine("写入文件:" + fileName); - try - { - //实例化一个文件流--->与写入文件相关联 - using var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write); - //实例化一个StreamWriter-->与fs相关联 - using var sw = new StreamWriter(fs); - //开始写入 - sw.Write(content); - //清空缓冲区 - sw.Flush(); - //关闭流 - sw.Close(); - fs.Close(); - } - catch (Exception ex) - { - Console.WriteLine("写入文件出错了:" + ex.Message); - } - } - - /// - /// 创建文件夹 - /// - /// - /// - public static bool CreateDirectory(string path) - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - path = path.Replace("\\", "/").Replace("//", "/"); - } - try - { - if (!Directory.Exists(path)) - { - DirectoryInfo info = Directory.CreateDirectory(path); - Console.WriteLine("不存在创建文件夹" + info); - } - } - catch (Exception ex) - { - Console.WriteLine($"创建文件夹出错了,{ex.Message}"); - return false; - } - return true; - } - #endregion /// @@ -573,7 +462,7 @@ namespace ZR.CodeGenerator ColumnType = column.DataType, TableId = genTable.TableId, TableName = genTable.TableName, - CsharpType = TableMappingHelper.GetCSharpDatatype(column.DataType), + CsharpType = GetCSharpDatatype(column.DataType), CsharpField = column.DbColumnName.Substring(0, 1).ToUpper() + column.DbColumnName[1..], IsRequired = !column.IsNullable, IsIncrement = column.IsIdentity, @@ -623,35 +512,32 @@ namespace ZR.CodeGenerator } /// - /// 压缩代码 + /// 获取C# 类型 /// - /// + /// /// - public static string ZipGenCode(GenerateDto dto) + public static string GetCSharpDatatype(string sDatatype) { - try + sDatatype = sDatatype.ToLower(); + string sTempDatatype = sDatatype switch { - //生成压缩包 - string zipReturnFileName = dto.GenTable.BaseNameSpace + DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip"; - - CreateDirectory(dto.GenCodePath); - string zipFileName = Path.Combine(dto.ZipPath, zipReturnFileName); - if (File.Exists(zipFileName)) - { - File.Delete(zipFileName); - } - - ZipFile.CreateFromDirectory(dto.GenCodePath, zipFileName); - FileHelper.DeleteDirectory(dto.GenCodePath); - dto.ZipFileName = zipReturnFileName; - return zipReturnFileName; - } - catch (Exception ex) - { - Console.WriteLine("压缩文件出错。" + ex.Message); - return ""; - } + "int" or "number" or "integer" or "smallint" => "int", + "bigint" => "long", + "tinyint" => "byte", + "numeric" or "real" or "float" => "float", + "decimal" or "numer(8,2)" => "decimal", + "bit" => "bool", + "date" or "datetime" or "datetime2" or "smalldatetime" => "DateTime", + "money" or "smallmoney" => "double", + _ => "string", + }; + return sTempDatatype; } + public static bool IsNumber(string tableDataType) + { + string[] arr = new string[] { "int", "long" }; + return arr.Any(f => f.Contains(GetCSharpDatatype(tableDataType))); + } } } diff --git a/ZR.CodeGenerator/FileHelper.cs b/ZR.CodeGenerator/FileHelper.cs index 66c08e7..6d1e32d 100644 --- a/ZR.CodeGenerator/FileHelper.cs +++ b/ZR.CodeGenerator/FileHelper.cs @@ -1,141 +1,142 @@ -using ICSharpCode.SharpZipLib.Checksum; -using ICSharpCode.SharpZipLib.Zip; -using System; +using System; using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; +using ZR.CodeGenerator.Model; namespace ZR.CodeGenerator { public class FileHelper { /// - /// 制作压缩包(多个文件压缩到一个压缩包,支持加密、注释) + /// 创建文件夹 /// - /// 要压缩的文件 - /// 压缩文件目录 - /// 压缩包文件名 - /// 压缩级别 1-9 - /// 密码 - /// 注释 - public static void ZipFiles(string[] fileNames, string topDirectoryName, string zipedFileName, int? compresssionLevel, string password = "", string comment = "") + /// + /// + public static bool CreateDirectory(string path) { - using (ZipOutputStream zos = new ZipOutputStream(File.Open(zipedFileName, FileMode.OpenOrCreate))) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - if (compresssionLevel.HasValue) + path = path.Replace("\\", "/").Replace("//", "/"); + } + try + { + if (!Directory.Exists(path)) { - zos.SetLevel(compresssionLevel.Value);//设置压缩级别 - } - - if (!string.IsNullOrEmpty(password)) - { - zos.Password = password;//设置zip包加密密码 - } - - if (!string.IsNullOrEmpty(comment)) - { - zos.SetComment(comment);//设置zip包的注释 - } - - foreach (string file in fileNames) - { - //string fileName = string.Format("{0}/{1}", topDirectoryName, file); - string fileName = file; - - if (File.Exists(fileName)) - { - FileInfo item = new FileInfo(fileName); - FileStream fs = File.OpenRead(item.FullName); - byte[] buffer = new byte[fs.Length]; - fs.Read(buffer, 0, buffer.Length); - - ZipEntry entry = new ZipEntry(item.Name); - zos.PutNextEntry(entry); - zos.Write(buffer, 0, buffer.Length); - } + DirectoryInfo info = Directory.CreateDirectory(path); + Console.WriteLine("不存在创建文件夹" + info); } } + catch (Exception ex) + { + Console.WriteLine($"创建文件夹出错了,{ex.Message}"); + return false; + } + return true; } /// - /// 压缩多层目录 + /// 写文件 /// - /// 压缩文件目录 - /// 压缩包文件名 - /// 压缩级别 1-9 - /// 密码 - /// 注释 - /// 文件类型 - public static void ZipFileDirectory(string topDirectoryName, string zipedFileName, int compresssionLevel, string password, string comment, string filetype) + /// 完整路径带扩展名的 + /// + public static void WriteAndSave(string path, string content) { - using (System.IO.FileStream ZipFile = File.Open(zipedFileName, FileMode.OpenOrCreate)) + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - using (ZipOutputStream zos = new ZipOutputStream(ZipFile)) - { - if (compresssionLevel != 0) - { - zos.SetLevel(compresssionLevel);//设置压缩级别 - } - if (!string.IsNullOrEmpty(password)) - { - zos.Password = password;//设置zip包加密密码 - } - if (!string.IsNullOrEmpty(comment)) - { - zos.SetComment(comment);//设置zip包的注释 - } - ZipSetp(topDirectoryName, zos, "", filetype); - } + path = path.Replace("\\", "/").Replace("//", "/"); + } + if (!Directory.Exists(Path.GetDirectoryName(path))) + { + Directory.CreateDirectory(Path.GetDirectoryName(path)); + } + Console.WriteLine("写入文件:" + path); + try + { + //实例化一个文件流--->与写入文件相关联 + using var fs = new FileStream(path, FileMode.Create, FileAccess.Write); + //实例化一个StreamWriter-->与fs相关联 + using var sw = new StreamWriter(fs); + //开始写入 + sw.Write(content); + //清空缓冲区 + sw.Flush(); + //关闭流 + sw.Close(); + fs.Close(); + } + catch (Exception ex) + { + Console.WriteLine("写入文件出错了:" + ex.Message); } } - /// - /// 递归遍历目录 - /// - /// The directory. - /// The ZipOutputStream Object. - /// The parent path. - private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath, string filetype) - { - if (strDirectory[^1] != Path.DirectorySeparatorChar) - { - strDirectory += Path.DirectorySeparatorChar; - } - Console.WriteLine("strDirectory=" + strDirectory); - Crc32 crc = new Crc32(); - string[] filenames = Directory.GetFileSystemEntries(strDirectory, filetype); - foreach (string file in filenames)// 遍历所有的文件和目录 + /// + /// 从代码模板中读取内容 + /// + /// 模板名称,应包括文件扩展名称。比如:template.txt + /// + public static string ReadTemplate(string templateName) + { + string path = Environment.CurrentDirectory; + string fullName = $"{path}/wwwroot/CodeGenTemplate/{templateName}"; + + Console.WriteLine("开始读取模板=" + fullName); + string temp = fullName; + string str = ""; + if (!File.Exists(temp)) { - if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 + return str; + } + StreamReader sr = null; + try + { + sr = new StreamReader(temp); + str = sr.ReadToEnd(); // 读取文件 + } + catch (Exception ex) + { + Console.WriteLine($"读取模板出错了{ex.Message}"); + } + sr?.Close(); + sr?.Dispose(); + return str; + } + + + /// + /// 压缩代码 + /// + /// + /// + public static string ZipGenCode(GenerateDto dto) + { + try + { + //生成压缩包 + string zipReturnFileName = dto.GenTable.BaseNameSpace + DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip"; + + CreateDirectory(dto.GenCodePath); + string zipFileName = Path.Combine(dto.ZipPath, zipReturnFileName); + if (File.Exists(zipFileName)) { - string pPath = parentPath; - pPath += file[(file.LastIndexOf("/") + 1)..]; - pPath += "/"; - Console.WriteLine("递归路径" + pPath); - ZipSetp(file, s, pPath, filetype); - } - else // 否则直接压缩文件 - { - //打开压缩文件 - using (FileStream fs = File.OpenRead(file)) - { - byte[] buffer = new byte[fs.Length]; - fs.Read(buffer, 0, buffer.Length); - string fileName = parentPath + file[(file.LastIndexOf("/") + 1)..]; - ZipEntry entry = new ZipEntry(fileName); - entry.DateTime = DateTime.Now; - entry.Size = fs.Length; - fs.Close(); - crc.Reset(); - crc.Update(buffer); - entry.Crc = crc.Value; - s.PutNextEntry(entry); - s.Write(buffer, 0, buffer.Length); - } + File.Delete(zipFileName); } + + ZipFile.CreateFromDirectory(dto.GenCodePath, zipFileName); + DeleteDirectory(dto.GenCodePath); + dto.ZipFileName = zipReturnFileName; + return zipReturnFileName; + } + catch (Exception ex) + { + Console.WriteLine("压缩文件出错。" + ex.Message); + return ""; } } diff --git a/ZR.CodeGenerator/Model/GenerateDto.cs b/ZR.CodeGenerator/Model/GenerateDto.cs index 7c7d599..9ce7d07 100644 --- a/ZR.CodeGenerator/Model/GenerateDto.cs +++ b/ZR.CodeGenerator/Model/GenerateDto.cs @@ -10,30 +10,29 @@ namespace ZR.CodeGenerator.Model public class GenerateDto { public long TableId { get; set; } - public string[] QueryColumn { get; set; } - + //public string[] QueryColumn { get; set; } + /// + /// 是否预览代码 + /// + public int IsPreview { get; set; } /// /// 要生成的文件 /// - public int[] genFiles { get; set; } + public int[] GenCodeFiles { get; set; } /// /// 如果目标文件存在,是否覆盖。默认为false /// - public bool coverd { get; set; } = true; + public bool Coverd { get; set; } = true; /// /// 生成代码的数据库类型 0、mysql 1、sqlserver /// public int DbType { get; set; } public GenTable GenTable { get; set; } #region 存储路径 - //public string ModelPath { get; set; } - //public string ServicePath { get; set; } - //public string RepositoryPath { get; set; } - //public string ApiPath { get; set; } - //public string VuePath { get; set; } - //public string VueApiPath { get; set; } - - //public string ParentPath { get; set; } = ".."; + /// + /// 代码模板预览存储路径存放 + /// + public List GenCodes { get; set; } = new List(); /// /// 代码生成路径 /// @@ -48,4 +47,20 @@ namespace ZR.CodeGenerator.Model public string ZipFileName { get; set; } #endregion } + + public class GenCode + { + public int Type { get; set; } + public string Title { get; set; } + public string Path { get; set; } + public string Content { get; set; } + + public GenCode(int type, string title, string path, string content) + { + Type = type; + Title = title; + Path = path; + Content = content; + } + } } diff --git a/ZR.CodeGenerator/Model/ReplaceDto.cs b/ZR.CodeGenerator/Model/ReplaceDto.cs index 35effe0..425e63a 100644 --- a/ZR.CodeGenerator/Model/ReplaceDto.cs +++ b/ZR.CodeGenerator/Model/ReplaceDto.cs @@ -100,5 +100,7 @@ namespace ZR.CodeGenerator.Model /// views、js文件名 /// public string ViewsFileName { get; set; } + public string Author { get; set; } + public string AddTime { get; set; } = DateTime.Now.ToString("yyyy-MM-dd"); } } diff --git a/ZR.CodeGenerator/TableMappingHelper.cs b/ZR.CodeGenerator/TableMappingHelper.cs deleted file mode 100644 index 7a0a938..0000000 --- a/ZR.CodeGenerator/TableMappingHelper.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Infrastructure.Extensions; -using ZR.Common.Extension; - -namespace ZR.CodeGenerator.CodeGenerator -{ - public class TableMappingHelper - { - /// - /// UserService转成userService - /// - /// - /// - public static string FirstLetterLowercase(string instanceName) - { - instanceName = instanceName.ParseToString(); - if (!instanceName.IsEmpty()) - { - StringBuilder sb = new StringBuilder(); - sb.Append(instanceName[0].ToString().ToLower() + instanceName.Substring(1)); - return sb.ToString(); - } - else - { - return instanceName; - } - } - - /// - /// sys_menu_authorize变成MenuAuthorize - /// - public static string GetClassNamePrefix(string tableName) - { - string[] arr = tableName.Split('_'); - if (arr.Length <= 0) return tableName; - - StringBuilder sb = new StringBuilder(); - for (int i = 1; i < arr.Length; i++) - { - sb.Append(arr[i][0].ToString().ToUpper() + arr[i].Substring(1)); - } - return sb.ToString(); - } - - /// - /// 获取C# 类型 - /// - /// - /// - public static string GetCSharpDatatype(string sDatatype) - { - sDatatype = sDatatype.ToLower(); - string sTempDatatype = sDatatype switch - { - "int" or "number" or "integer" or "smallint" => "int", - "bigint" => "long", - "tinyint" => "byte", - "numeric" or "real" or "float" => "float", - "decimal" or "numer(8,2)" => "decimal", - "bit" => "bool", - "date" or "datetime" or "datetime2" or "smalldatetime" => "DateTime", - "money" or "smallmoney" => "double", - _ => "string", - }; - return sTempDatatype; - } - - public static bool IsNumber(string tableDataType) - { - string[] arr = new string[] { "int", "long" }; - return arr.Any(f => f.Contains(GetCSharpDatatype(tableDataType))); - } - } -} diff --git a/ZR.Vue/package.json b/ZR.Vue/package.json index 48dafb0..fce507a 100644 --- a/ZR.Vue/package.json +++ b/ZR.Vue/package.json @@ -28,6 +28,7 @@ "element-ui": "2.15.6", "file-saver": "2.0.1", "fuse.js": "3.4.4", + "highlight.js": "^11.2.0", "js-beautify": "1.10.2", "js-cookie": "2.2.0", "jsencrypt": "3.0.0-rc.1", diff --git a/ZR.Vue/src/api/gendemo.js b/ZR.Vue/src/api/gendemo.js index 545231c..7fd0c43 100644 --- a/ZR.Vue/src/api/gendemo.js +++ b/ZR.Vue/src/api/gendemo.js @@ -6,7 +6,7 @@ import request from '@/utils/request' */ export function listGendemo(query) { return request({ - url: 'bus/Gendemo/list', + url: 'business/Gendemo/list', method: 'get', params: query, }) @@ -18,7 +18,7 @@ export function listGendemo(query) { */ export function addGendemo(data) { return request({ - url: '/bus/Gendemo', + url: 'business/Gendemo', method: 'post', data: data, }) @@ -30,7 +30,7 @@ export function addGendemo(data) { */ export function updateGendemo(data) { return request({ - url: '/bus/Gendemo', + url: 'business/Gendemo', method: 'PUT', data: data, }) @@ -42,7 +42,7 @@ export function updateGendemo(data) { */ export function getGendemo(id) { return request({ - url: '/bus/Gendemo/' + id, + url: 'business/Gendemo/' + id, method: 'get' }) } @@ -53,7 +53,7 @@ export function getGendemo(id) { */ export function delGendemo(pid) { return request({ - url: '/bus/Gendemo/' + pid, + url: 'business/Gendemo/' + pid, method: 'delete' }) } diff --git a/ZR.Vue/src/api/tool/gen.js b/ZR.Vue/src/api/tool/gen.js index 14bbcb1..ea4af5c 100644 --- a/ZR.Vue/src/api/tool/gen.js +++ b/ZR.Vue/src/api/tool/gen.js @@ -94,6 +94,13 @@ export function updateGenTable(data) { }) } +// 预览生成代码 +export function previewTable(tableId) { + return request({ + url: '/tool/gen/preview/' + tableId, + method: 'get' + }) +} // /** // * diff --git a/ZR.Vue/src/views/tool/gen/index.vue b/ZR.Vue/src/views/tool/gen/index.vue index 14e9b11..f0cd9bc 100644 --- a/ZR.Vue/src/views/tool/gen/index.vue +++ b/ZR.Vue/src/views/tool/gen/index.vue @@ -33,7 +33,7 @@ diff --git a/ZRAdmin.xml b/ZRAdmin.xml index 356e87d..6a4d9d8 100644 --- a/ZRAdmin.xml +++ b/ZRAdmin.xml @@ -119,7 +119,7 @@ - 导入表 + 导入表结构(保存) @@ -131,6 +131,13 @@ + + + 预览代码 + + + + 心跳