2023年7月13日发(作者:)
C#实现代码⽣成器最近在⽤layui做后台管理,增删改查这些⼀成不变的东西写起来浪费⼤量时间,于是做了个简单的代码⽣成器快速⽣成代码⽣成器的原理其实很简单,都是基于模板实现替换,Razor是个不错的选择(或者Nvelocity。。),还可以⽤字符串占位符替换的⽅式⽣成。技术栈采⽤:1.模板引擎使⽤SqlSugar3.⽣成压缩包SharpZipLib代码结构如下图:标准的Razor语法写起来⽐较舒服核⼼代码就两个cs:------------------------------------------using MySqlSugar;using RazorEngine;using System;using c;using ;using ;using ;namespace ConsoleApp1{public class Coder{private SqlSugarClient _sqlsugarClient;public SqlSugarClient db{get{if (_sqlsugarClient == null){var conn = "Database=easycms;Data Source=127.0.0.1;UserId=root;Password=root;pooling=false;CharSet=utf8;port=3306;SslMode=None";var db = new SqlSugarClient(conn);_sqlsugarClient = db;}return _sqlsugarClient;}}public string entity_template { get; set; }public string dto_template { get; set; }public string app_template { get; set; }public string ctrl_template { get; set; }/// <summary>/// 数据库名/// </summary>public string dbschema { get; set; }public Coder(){var path = e(ationBase, "Template", "实体类");entity_template = lText(path);var dto_path = e(ationBase, "Template", "DTO类");dto_template = lText(dto_path);var app_path = e(ationBase, "Template", "应⽤类");app_template = lText(app_path);var ctrl_path = e(ationBase, "Template", "控制器");ctrl_template = lText(ctrl_path);dbschema = "easycms";}public string Builder(){var keyword = "sys_user,sys_dict,sys_parameter,sys_role";var dir = e(ationBase, "CodeGenerate");if ((dir)){(dir, true);}StringBuilder builder = new StringBuilder();var tables = ry<TableInfo>((@"select table_name,table_comment frominformation_where table_schema='{0}'", dbschema)).ToList();foreach (var tb in (',')){var tablecomment = (c => _name == tb).table_comment;var ret = RazorParse(tb, tablecomment);(ret);}var srcdir = e(ationBase, "CodeGenerate", "Code");var folders = new List<string>();(srcdir);var bl = new ZipHelper().ZipManyFilesOrDictorys(erable(),e(ationBase, "CodeGenerate", ""), "");return ng(); ;}public string RazorParse(string tablename, string tablecomment){StringBuilder builder = new StringBuilder();var columsInfo = ry<ColumnInfo>((@"selecttable_name,column_name,ordinal_position,is_nullable,data_type,character_maximum_length,column_key,column_commentfrom information_Swhere table_schema = '{0}' and table_name = '{1}'", dbschema, tablename)).ToList();foreach (var item in columsInfo){_type = ype(_type);if (!_("string") && _("YES")){_type = _type + "?";}}#region entityvar entity_result = (entity_template, new{EntityNameSpace = "",EntityName = tablename,Columns = columsInfo},"entity");(e(ationBase, "CodeGenerateCodeEntity", $"{tablename}.cs"), entity_result);(entity_result);#endregion#region dtovar dto_result = (dto_template, new{DtoNameSpace = "",DtoName = lName(tablename) + "Info",Columns = columsInfo},"dto");(e(ationBase, "CodeGenerateCodeDto", $"{lName(tablename) + "Info"}.cs"), dto_result);(dto_result);#endregion#region appvar app_result = (app_template, new{AppNameSpace = "ents",DtoName = lName(tablename) + "Info",AppClassName = lName(tablename),Table = tablename,Columns = columsInfo},"app");(e(ationBase, "CodeGenerateCodeApplication", $"{lName(tablename) + "Service"}.cs"), app_result);(app_result);#endregion#region controllervar ctrl_result = (ctrl_template, new{AppClassName = lName(tablename),DtoName = lName(tablename) + "Info",TableComment = tablecomment,},"ctrl");(e(ationBase, "CodeGenerateCodeController", $"{lName(tablename) + "Controller"}.cs"), ctrl_result);(ctrl_result);#endregionreturn ng();}public class ColumnInfo{public string table_name { get; set; }public string column_name { get; set; }public int? ordinal_position { get; set; }public string is_nullable { get; set; }public string data_type { get; set; }public int? character_maximum_length { get; set; }public string column_key { get; set; }public string column_comment { get; set; }}public class TableInfo{public string table_name { get; set; }public string table_comment { get; set; }}}}----------------------------------------------------------------------using ;using ;namespace ConsoleApp1{public class Utils{/// <summary>/// 类型转化/// </summary>/// <param name="dbType"></param>/// <returns></returns>public static string GetCsType(string dbType){string csType = "";switch (r()){case "varchar":case "varchar2":case "nvarchar":case "nvarchar2":case "char":case "nchar":case "text":case "longtext":case "string":csType = "string";break;case "date":case "datetime":case "smalldatetime":case "timestamp":csType = "DateTime";break;case "int":case "number":case "smallint":case "integer":csType = "int";break;case "bigint":csType = "Int64";break;case "float":case "numeric":case "decimal":case "money":case "smallmoney":case "real":case "double":csType = "decimal";break;case "tinyint":case "bit":csType = "bool";break;case "binary":case "varbinary":case "image":case "raw":case "long":case "long raw":case "blob":case "bfile":csType = "byte[]";break;case "uniqueidentifier":csType = "Guid";break;case "xml":case "json":csType = "string";break;default:csType = "object";break;}return csType;}/// <summary>/// 保存/// </summary>/// <param name="path"></param>/// <param name="content"></param>/// <returns></returns>public static string Save(string path, string content){string dir = ing(0, dexOf("") + 1);if (!(dir)) Directory(dir);llText(path, content);return path;}private static regSpace = new (@"s");/// <summary>/// 去掉空格/// </summary>/// <param name="value"></param>/// <returns></returns>public static string ReplaceSpace(string value){if (OrEmpty(value))return ;char firstChar = value[0];if (firstChar >= 48 && firstChar <= 57){value = "_" + value;}return e((), " ");}/// <summary>/// ⾸字母⼤写/// </summary>/// <param name="value"></param>/// <returns></returns>public static string ToUpperFirstword(string value){if (OrEmpty(value))return ;return ing(0, 1).ToUpper() + ing(1);}/*** 将下划线⼤写⽅式命名的字符串转换为驼峰式。如果转换前的下划线⼤写⽅式命名的字符串为空,则返回空字符串。</br>* 例如:HELLO_WORLD->HelloWorld* @param name 转换前的下划线⼤写⽅式命名的字符串* @return 转换后的驼峰式命名的字符串*//// <summary>/// 转换为驼峰命名/// </summary>/// <param name="name"></param>/// <returns></returns>public static string ToCamelName(string name){StringBuilder result = new StringBuilder();// 快速检查if (name == null || OrEmpty(name)){// 没必要转换return "";}else if (!ns("_")){// 不含下划线,仅将⾸字母⼤写return ing(0, 1).ToUpper() + ing(1).ToLower();}// ⽤下划线将原始字符串分割string[] camels = ('_');foreach (string camel in camels){// 跳过原始字符串中开头、结尾的下换线或双重下划线if (OrEmpty(camel)){continue;}// 处理真正的驼峰⽚段//if ( == 0)//{// // 第⼀个驼峰⽚段,全部字母都⼩写// (r());//}//else//{// 其他的驼峰⽚段,⾸字母⼤写(ing(0, 1).ToUpper());(ing(1).ToLower());//}}return ng();}}}
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689249627a225748.html
评论列表(0条)