CodeGeneratorTool.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  1. using Infrastructure;
  2. using Infrastructure.Extensions;
  3. using JinianNet.JNTemplate;
  4. using SqlSugar;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.IO;
  8. using System.Linq;
  9. using ZR.CodeGenerator.Model;
  10. using ZR.Common;
  11. using ZR.Model.System.Generate;
  12. namespace ZR.CodeGenerator
  13. {
  14. /// <summary>
  15. /// 代码生成器
  16. /// </remarks>
  17. /// </summary>
  18. public class CodeGeneratorTool
  19. {
  20. private static readonly string CodeTemplateDir = "CodeGenTemplate";
  21. /// <summary>
  22. /// 代码生成器配置
  23. /// </summary>
  24. private static CodeGenerateOption _option = new CodeGenerateOption();
  25. /// <summary>
  26. /// 代码生成器入口方法
  27. /// </summary>
  28. /// <param name="dto"></param>
  29. public static void Generate(GenerateDto dto)
  30. {
  31. _option.BaseNamespace = dto.GenTable.BaseNameSpace;
  32. _option.SubNamespace = dto.GenTable.ModuleName.FirstUpperCase();
  33. _option.DtosNamespace = _option.BaseNamespace + "Model";
  34. _option.ModelsNamespace = _option.BaseNamespace + "Model";
  35. _option.RepositoriesNamespace = _option.BaseNamespace + "Repository";
  36. _option.IRepositoriesNamespace = _option.BaseNamespace + "Repository";
  37. _option.IServicsNamespace = _option.BaseNamespace + "Service";
  38. _option.ServicesNamespace = _option.BaseNamespace + "Service";
  39. _option.ApiControllerNamespace = _option.BaseNamespace + "Admin.WebApi";
  40. var vuePath = AppSettings.GetConfig("gen:vuePath");
  41. dto.VueParentPath = dto.VueVersion == 3 ? "ZRAdmin-vue" : "ZR.Vue";
  42. if (!vuePath.IsEmpty())
  43. {
  44. dto.VueParentPath = vuePath;
  45. }
  46. dto.GenOptions = _option;
  47. string PKName = "Id";
  48. string PKType = "int";
  49. ReplaceDto replaceDto = new()
  50. {
  51. ModelTypeName = dto.GenTable.ClassName,//表名对应C# 实体类名
  52. PermissionPrefix = dto.GenTable?.Options?.PermissionPrefix,
  53. Author = dto.GenTable.FunctionAuthor,
  54. ShowBtnAdd = dto.GenTable.Options.CheckedBtn.Any(f => f == 1),
  55. ShowBtnEdit = dto.GenTable.Options.CheckedBtn.Any(f => f == 2),
  56. ShowBtnDelete = dto.GenTable.Options.CheckedBtn.Any(f => f == 3),
  57. ShowBtnExport = dto.GenTable.Options.CheckedBtn.Any(f => f == 4),
  58. ShowBtnView = dto.GenTable.Options.CheckedBtn.Any(f => f == 5),
  59. ShowBtnTruncate = dto.GenTable.Options.CheckedBtn.Any(f => f == 6),
  60. };
  61. //循环表字段信息
  62. foreach (GenTableColumn dbFieldInfo in dto.GenTable.Columns.OrderBy(x => x.Sort))
  63. {
  64. if (dbFieldInfo.IsPk || dbFieldInfo.IsIncrement)
  65. {
  66. PKName = dbFieldInfo.CsharpField;
  67. PKType = dbFieldInfo.CsharpType;
  68. }
  69. if (dbFieldInfo.HtmlType.Equals(GenConstants.HTML_IMAGE_UPLOAD) || dbFieldInfo.HtmlType.Equals(GenConstants.HTML_FILE_UPLOAD))
  70. {
  71. replaceDto.UploadFile = 1;
  72. }
  73. if (dbFieldInfo.HtmlType.Equals(GenConstants.HTML_SELECT_MULTI))
  74. {
  75. replaceDto.SelectMulti = 1;
  76. }
  77. if (dbFieldInfo.HtmlType.Equals(GenConstants.HTML_EDITOR))
  78. {
  79. replaceDto.ShowEditor = 1;
  80. }
  81. dbFieldInfo.CsharpFieldFl = dbFieldInfo.CsharpField.FirstLowerCase();
  82. }
  83. replaceDto.PKName = PKName;
  84. replaceDto.PKType = PKType;
  85. replaceDto.FistLowerPk = PKName.FirstLowerCase();
  86. InitJntTemplate(dto, replaceDto);
  87. GenerateModels(replaceDto, dto);
  88. GenerateService(replaceDto, dto);
  89. GenerateControllers(replaceDto, dto);
  90. if (dto.VueVersion == 3)
  91. {
  92. GenerateVue3Views(replaceDto, dto);
  93. }
  94. else
  95. {
  96. replaceDto.VueViewListHtml = GenerateVueTableList();
  97. replaceDto.VueQueryFormHtml = GenerateVueQueryForm();
  98. replaceDto.VueViewFormHtml = GenerateCurdForm();
  99. GenerateVueViews(replaceDto, dto);
  100. }
  101. if (dto.GenTable.Options.GenerateRepo == 1)
  102. {
  103. GenerateRepository(replaceDto, dto);
  104. }
  105. GenerateVueJs(replaceDto, dto);
  106. GenerateSql(replaceDto, dto);
  107. if (dto.IsPreview) return;
  108. foreach (var item in dto.GenCodes)
  109. {
  110. item.Path = Path.Combine(dto.GenCodePath, item.Path);
  111. FileUtil.WriteAndSave(item.Path, item.Content);
  112. }
  113. }
  114. #region 读取模板
  115. /// <summary>
  116. /// 生成实体类Model
  117. /// </summary>
  118. /// <param name="generateDto"></param>
  119. /// <param name="replaceDto">替换实体</param>
  120. private static void GenerateModels(ReplaceDto replaceDto, GenerateDto generateDto)
  121. {
  122. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, "TplModel.txt");
  123. var tplDto = JnHelper.ReadTemplate(CodeTemplateDir, "TplDto.txt");
  124. string fullPath = Path.Combine(_option.ModelsNamespace, "Models", _option.SubNamespace, replaceDto.ModelTypeName + ".cs");
  125. string fullPathDto = Path.Combine(_option.ModelsNamespace, "Dto", _option.SubNamespace, $"{replaceDto.ModelTypeName}Dto.cs");
  126. generateDto.GenCodes.Add(new GenCode(1, "Model.cs", fullPath, tpl.Render()));
  127. generateDto.GenCodes.Add(new GenCode(2, "Dto.cs", fullPathDto, tplDto.Render()));
  128. }
  129. /// <summary>
  130. /// 生成Repository层代码文件
  131. /// </summary>
  132. /// <param name="generateDto"></param>
  133. /// <param name="replaceDto">替换实体</param>
  134. private static void GenerateRepository(ReplaceDto replaceDto, GenerateDto generateDto)
  135. {
  136. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, "TplRepository.txt");
  137. var result = tpl.Render();
  138. var fullPath = Path.Combine(_option.RepositoriesNamespace, _option.SubNamespace, $"{replaceDto.ModelTypeName}Repository.cs");
  139. generateDto.GenCodes.Add(new GenCode(3, "Repository.cs", fullPath, result));
  140. }
  141. /// <summary>
  142. /// 生成Service文件
  143. /// </summary>
  144. private static void GenerateService(ReplaceDto replaceDto, GenerateDto generateDto)
  145. {
  146. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, "TplService.txt");
  147. var tpl2 = JnHelper.ReadTemplate(CodeTemplateDir, "TplIService.txt");
  148. var fullPath = Path.Combine(_option.ServicesNamespace, _option.SubNamespace, $"{replaceDto.ModelTypeName}Service.cs");
  149. var fullPath2 = Path.Combine(_option.IServicsNamespace, _option.SubNamespace, $"I{_option.SubNamespace}Service", $"I{replaceDto.ModelTypeName}Service.cs");
  150. generateDto.GenCodes.Add(new GenCode(4, "Service.cs", fullPath, tpl.Render()));
  151. generateDto.GenCodes.Add(new GenCode(4, "IService.cs", fullPath2, tpl2.Render()));
  152. }
  153. /// <summary>
  154. /// 生成控制器ApiControllers文件
  155. /// </summary>
  156. private static void GenerateControllers(ReplaceDto replaceDto, GenerateDto generateDto)
  157. {
  158. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, "TplControllers.txt");
  159. tpl.Set("QueryCondition", replaceDto.QueryCondition);
  160. var result = tpl.Render();
  161. var fullPath = Path.Combine(_option.ApiControllerNamespace, "Controllers", _option.SubNamespace, $"{replaceDto.ModelTypeName}Controller.cs");
  162. generateDto.GenCodes.Add(new GenCode(5, "Controller.cs", fullPath, result));
  163. }
  164. /// <summary>
  165. /// 生成Vue页面
  166. private static void GenerateVueViews(ReplaceDto replaceDto, GenerateDto generateDto)
  167. {
  168. string fileName = string.Empty;
  169. switch (generateDto.GenTable.TplCategory)
  170. {
  171. case "tree":
  172. fileName = "TplTreeVue.txt";
  173. break;
  174. case "crud":
  175. fileName = "TplVue.txt";
  176. break;
  177. case "subNav":
  178. fileName = "TplVue.txt";
  179. break;
  180. case "subNavMore":
  181. fileName = "TplVue.txt";
  182. break;
  183. case "select":
  184. fileName = "TplVueSelect.txt";
  185. break;
  186. default:
  187. break;
  188. }
  189. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName);
  190. tpl.Set("vueQueryFormHtml", replaceDto.VueQueryFormHtml);
  191. tpl.Set("VueViewFormContent", replaceDto.VueViewFormHtml);//添加、修改表单
  192. tpl.Set("VueViewListContent", replaceDto.VueViewListHtml);//查询 table列
  193. var result = tpl.Render();
  194. var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue");
  195. generateDto.GenCodes.Add(new GenCode(6, "index.vue", fullPath, result));
  196. }
  197. /// <summary>
  198. /// vue3
  199. /// </summary>
  200. /// <param name="replaceDto"></param>
  201. /// <param name="generateDto"></param>
  202. private static void GenerateVue3Views(ReplaceDto replaceDto, GenerateDto generateDto)
  203. {
  204. string fileName = generateDto.GenTable.TplCategory switch
  205. {
  206. "tree" => "TreeVue.txt",
  207. "crud" => "Vue.txt",
  208. //case "select":
  209. // fileName = "TplVueSelect.txt";
  210. // break;
  211. _ => "Vue.txt",
  212. };
  213. fileName = Path.Combine("v3", fileName);
  214. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, fileName);
  215. tpl.Set("treeCode", generateDto.GenTable?.Options?.TreeCode?.FirstLowerCase());
  216. tpl.Set("treeName", generateDto.GenTable?.Options?.TreeName?.FirstLowerCase());
  217. tpl.Set("treeParentCode", generateDto.GenTable?.Options?.TreeParentCode?.FirstLowerCase());
  218. tpl.Set("options", generateDto.GenTable?.Options);
  219. var result = tpl.Render();
  220. var fullPath = Path.Combine(generateDto.VueParentPath, "src", "views", generateDto.GenTable.ModuleName.FirstLowerCase(), $"{generateDto.GenTable.BusinessName.FirstUpperCase()}.vue");
  221. generateDto.GenCodes.Add(new GenCode(16, "index.vue", fullPath, result));
  222. }
  223. /// <summary>
  224. /// 生成vue页面api
  225. /// </summary>
  226. /// <param name="replaceDto"></param>
  227. /// <param name="generateDto"></param>
  228. /// <returns></returns>
  229. public static void GenerateVueJs(ReplaceDto replaceDto, GenerateDto generateDto)
  230. {
  231. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, "TplVueApi.txt");
  232. var result = tpl.Render();
  233. string fileName;
  234. if (generateDto.VueVersion == 3)
  235. {
  236. fileName = generateDto.GenTable.BusinessName.ToLower() + ".js";//vue3 api引用目前只能小写
  237. }
  238. else
  239. {
  240. fileName = generateDto.GenTable.BusinessName.FirstLowerCase() + ".js";
  241. }
  242. string fullPath = Path.Combine(generateDto.VueParentPath, "src", "api", generateDto.GenTable.ModuleName.FirstLowerCase(), fileName);
  243. generateDto.GenCodes.Add(new GenCode(7, "api.js", fullPath, result));
  244. }
  245. /// <summary>
  246. /// 生成SQL
  247. /// </summary>
  248. /// <param name="replaceDto"></param>
  249. /// <param name="generateDto"></param>
  250. public static void GenerateSql(ReplaceDto replaceDto, GenerateDto generateDto)
  251. {
  252. var tempName = "";
  253. switch (generateDto.DbType)
  254. {
  255. case 0:
  256. tempName = "MySqlTemplate";
  257. break;
  258. case 1:
  259. tempName = "SqlTemplate";
  260. break;
  261. default:
  262. break;
  263. }
  264. var tpl = JnHelper.ReadTemplate(CodeTemplateDir, $"{tempName}.txt");
  265. tpl.Set("parentId", generateDto.GenTable?.Options?.ParentMenuId ?? 0);
  266. var result = tpl.Render();
  267. string fullPath = Path.Combine(generateDto.GenCodePath, "sql", generateDto.GenTable.BusinessName + ".sql");
  268. generateDto.GenCodes.Add(new GenCode(8, "sql", fullPath, result));
  269. }
  270. /// <summary>
  271. /// 生成vue页面查询form
  272. /// </summary>
  273. /// <returns></returns>
  274. public static string GenerateVueQueryForm()
  275. {
  276. return JnHelper.ReadTemplate(CodeTemplateDir, "QueryForm.txt").Render();
  277. }
  278. /// <summary>
  279. /// 生成vue页面table
  280. /// </summary>
  281. /// <returns></returns>
  282. public static string GenerateVueTableList()
  283. {
  284. return JnHelper.ReadTemplate(CodeTemplateDir, "TableList.txt").Render();
  285. }
  286. /// <summary>
  287. /// 生成vue表单
  288. /// </summary>
  289. /// <returns></returns>
  290. public static string GenerateCurdForm()
  291. {
  292. return JnHelper.ReadTemplate(CodeTemplateDir, "CurdForm.txt").Render();
  293. }
  294. #endregion
  295. #region 帮助方法
  296. /// <summary>
  297. /// 如果有前缀替换将前缀替换成空,替换下划线"_"为空再将首字母大写
  298. /// 表名转换成C#类名
  299. /// </summary>
  300. /// <param name="tableName"></param>
  301. /// <returns></returns>
  302. public static string GetClassName(string tableName)
  303. {
  304. bool autoRemovePre = AppSettings.GetAppConfig(GenConstants.Gen_autoPre, false);
  305. string tablePrefix = AppSettings.GetAppConfig<string>(GenConstants.Gen_tablePrefix);
  306. if (!string.IsNullOrEmpty(tablePrefix) && autoRemovePre)
  307. {
  308. string[] prefixList = tablePrefix.Split(",", StringSplitOptions.RemoveEmptyEntries);
  309. for (int i = 0; i < prefixList.Length; i++)
  310. {
  311. if (!string.IsNullOrEmpty(prefixList[i].ToString()))
  312. {
  313. tableName = tableName.Replace(prefixList[i], "", StringComparison.OrdinalIgnoreCase);
  314. }
  315. }
  316. }
  317. return tableName.UnderScoreToCamelCase();
  318. }
  319. /// <summary>
  320. /// 获取前端标签名
  321. /// </summary>
  322. /// <param name="columnDescription"></param>
  323. /// <param name="columnName"></param>
  324. /// <returns></returns>
  325. public static string GetLabelName(string columnDescription, string columnName)
  326. {
  327. return string.IsNullOrEmpty(columnDescription) ? columnName : columnDescription;
  328. }
  329. /// <summary>
  330. /// 首字母转小写,模板使用(勿删)
  331. /// </summary>
  332. /// <param name="str"></param>
  333. /// <returns></returns>
  334. public static string FirstLowerCase(string str)
  335. {
  336. try
  337. {
  338. return string.IsNullOrEmpty(str) ? str : str[..1].ToLower() + str[1..];
  339. }
  340. catch (Exception ex)
  341. {
  342. Console.WriteLine(ex.Message);
  343. return "";
  344. }
  345. }
  346. /// <summary>
  347. /// 获取C# 类型
  348. /// </summary>
  349. /// <param name="sDatatype"></param>
  350. /// <returns></returns>
  351. public static string GetCSharpDatatype(string sDatatype)
  352. {
  353. sDatatype = sDatatype.ToLower();
  354. string sTempDatatype = sDatatype switch
  355. {
  356. "int" or "number" or "integer" or "smallint" => "int",
  357. "bigint" => "long",
  358. "tinyint" => "byte",
  359. "numeric" or "real" or "float" => "float",
  360. "decimal" or "numer(8,2)" or "numeric" => "decimal",
  361. "bit" => "bool",
  362. "date" or "datetime" or "datetime2" or "smalldatetime" or "timestamp" => "DateTime",
  363. "money" or "smallmoney" => "decimal",
  364. _ => "string",
  365. };
  366. return sTempDatatype;
  367. }
  368. public static bool IsNumber(string tableDataType)
  369. {
  370. string[] arr = new string[] { "int", "long" };
  371. return arr.Any(f => f.Contains(GetCSharpDatatype(tableDataType)));
  372. }
  373. #endregion
  374. #region 初始化信息
  375. /// <summary>
  376. /// 初始化表信息
  377. /// </summary>
  378. /// <param name="dbName"></param>
  379. /// <param name="userName"></param>
  380. /// <param name="tableName"></param>
  381. /// <param name="desc"></param>
  382. /// <returns></returns>
  383. public static GenTable InitTable(string dbName, string userName, string tableName, string desc)
  384. {
  385. GenTable genTable = new()
  386. {
  387. DbName = dbName,
  388. BaseNameSpace = "ZR.",//导入默认命名空间前缀
  389. ModuleName = "business",//导入默认模块名
  390. ClassName = GetClassName(tableName).FirstUpperCase(),
  391. BusinessName = tableName.UnderScoreToCamelCase().FirstUpperCase(),
  392. FunctionAuthor = AppSettings.GetConfig(GenConstants.Gen_author),
  393. TableName = tableName,
  394. TableComment = desc,
  395. FunctionName = desc,
  396. Create_by = userName,
  397. Options = new Options()
  398. {
  399. SortType = "asc",
  400. CheckedBtn = new int[] { 1, 2, 3 }
  401. }
  402. };
  403. genTable.Options.PermissionPrefix = $"{genTable.ModuleName.ToLower()}:{genTable.ClassName.ToLower()}";//权限
  404. return genTable;
  405. }
  406. /// <summary>
  407. /// 初始化列属性字段数据
  408. /// </summary>
  409. /// <param name="genTable"></param>
  410. /// <param name="dbColumnInfos"></param>
  411. public static List<GenTableColumn> InitGenTableColumn(GenTable genTable, List<DbColumnInfo> dbColumnInfos)
  412. {
  413. List<GenTableColumn> genTableColumns = new();
  414. foreach (var column in dbColumnInfos)
  415. {
  416. genTableColumns.Add(InitColumnField(genTable, column));
  417. }
  418. return genTableColumns;
  419. }
  420. /// <summary>
  421. /// 初始化表字段数据
  422. /// </summary>
  423. /// <param name="genTable"></param>
  424. /// <param name="column"></param>
  425. /// <returns></returns>
  426. private static GenTableColumn InitColumnField(GenTable genTable, DbColumnInfo column)
  427. {
  428. GenTableColumn genTableColumn = new()
  429. {
  430. ColumnName = column.DbColumnName.FirstLowerCase(),
  431. ColumnComment = column.ColumnDescription,
  432. IsPk = column.IsPrimarykey,
  433. ColumnType = column.DataType,
  434. TableId = genTable.TableId,
  435. TableName = genTable.TableName,
  436. CsharpType = GetCSharpDatatype(column.DataType),
  437. CsharpField = column.DbColumnName.ConvertToPascal("_"),
  438. IsRequired = !column.IsNullable,
  439. IsIncrement = column.IsIdentity,
  440. Create_by = genTable.Create_by,
  441. Create_time = DateTime.Now,
  442. IsInsert = !column.IsIdentity || GenConstants.inputDtoNoField.Any(f => f.Contains(column.DbColumnName, StringComparison.OrdinalIgnoreCase)),//非自增字段都需要插入
  443. IsEdit = true,
  444. IsQuery = false,
  445. IsExport = true,
  446. HtmlType = GenConstants.HTML_INPUT,
  447. };
  448. if (GenConstants.imageFiled.Any(f => column.DbColumnName.ToLower().Contains(f.ToLower())))
  449. {
  450. genTableColumn.HtmlType = GenConstants.HTML_IMAGE_UPLOAD;
  451. }
  452. else if (GenConstants.COLUMNTYPE_TIME.Any(f => genTableColumn.CsharpType.ToLower().Contains(f.ToLower())))
  453. {
  454. genTableColumn.HtmlType = GenConstants.HTML_DATETIME;
  455. }
  456. else if (GenConstants.radioFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase)) ||
  457. GenConstants.radioFiled.Any(f => column.DbColumnName.StartsWith(f, StringComparison.OrdinalIgnoreCase)))
  458. {
  459. genTableColumn.HtmlType = GenConstants.HTML_RADIO;
  460. }
  461. else if (GenConstants.selectFiled.Any(f => column.DbColumnName == f) ||
  462. GenConstants.selectFiled.Any(f => column.DbColumnName.EndsWith(f, StringComparison.OrdinalIgnoreCase)))
  463. {
  464. genTableColumn.HtmlType = GenConstants.HTML_SELECT;
  465. }
  466. else if (column.Length > 500)
  467. {
  468. genTableColumn.HtmlType = GenConstants.HTML_TEXTAREA;
  469. }
  470. //编辑字段
  471. if (column.IsIdentity || column.IsPrimarykey || GenConstants.COLUMNNAME_NOT_EDIT.Any(f => column.DbColumnName.Contains(f)))
  472. {
  473. genTableColumn.IsEdit = false;
  474. }
  475. //列表字段
  476. if (!GenConstants.COLUMNNAME_NOT_LIST.Any(f => column.DbColumnName.Contains(f) && !column.IsPrimarykey))
  477. {
  478. genTableColumn.IsList = true;
  479. }
  480. //时间类型初始化between范围查询
  481. if (genTableColumn.CsharpType == GenConstants.TYPE_DATE)
  482. {
  483. genTableColumn.QueryType = "BETWEEN";
  484. }
  485. return genTableColumn;
  486. }
  487. #endregion
  488. /// <summary>
  489. /// 初始化Jnt模板
  490. /// </summary>
  491. /// <param name="dto"></param>
  492. /// <param name="replaceDto"></param>
  493. private static void InitJntTemplate(GenerateDto dto, ReplaceDto replaceDto)
  494. {
  495. Engine.Current.Clean();
  496. dto.GenTable.Columns = dto.GenTable.Columns.OrderBy(x => x.Sort).ToList();
  497. bool showCustomInput = dto.GenTable.Columns.Any(f => f.HtmlType.Equals(GenConstants.HTML_CUSTOM_INPUT, StringComparison.OrdinalIgnoreCase));
  498. //jnt模板引擎全局变量
  499. Engine.Configure((options) =>
  500. {
  501. options.TagPrefix = "${";
  502. options.TagSuffix = "}";
  503. options.TagFlag = '$';
  504. options.OutMode = OutMode.Auto;
  505. //options.DisableeLogogram = true;//禁用简写
  506. options.Data.Set("refs", "$");//特殊标签替换
  507. options.Data.Set("t", "$");//特殊标签替换
  508. options.Data.Set("modal", "$");//特殊标签替换
  509. options.Data.Set("index", "$");//特殊标签替换
  510. options.Data.Set("confirm", "$");//特殊标签替换
  511. options.Data.Set("nextTick", "$");
  512. options.Data.Set("replaceDto", replaceDto);
  513. options.Data.Set("options", dto.GenOptions);
  514. options.Data.Set("genTable", dto.GenTable);
  515. options.Data.Set("showCustomInput", showCustomInput);
  516. options.Data.Set("tool", new CodeGeneratorTool());
  517. options.Data.Set("codeTool", new CodeGenerateTemplate());
  518. options.EnableCache = true;
  519. //...其它数据
  520. });
  521. }
  522. #region 模板用
  523. /// <summary>
  524. /// 模板用
  525. /// </summary>
  526. /// <param name="str"></param>
  527. /// <returns></returns>
  528. public static bool CheckInputDtoNoField(string str)
  529. {
  530. return GenConstants.inputDtoNoField.Any(f => f.Contains(str, StringComparison.OrdinalIgnoreCase));
  531. }
  532. public static bool CheckTree(GenTable genTable, string csharpField)
  533. {
  534. return (genTable.TplCategory.Equals("tree", StringComparison.OrdinalIgnoreCase) && genTable?.Options?.TreeParentCode != null && csharpField.Equals(genTable?.Options?.TreeParentCode));
  535. }
  536. #endregion
  537. }
  538. }