【提升编程效率】最强代码模板生成器

系列文章

【提升编程效率】单号生成器(定义编号规则、流水号、产生业务单号)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129129787

【提升编程效率】日期范围生成器(构建开始日期、结束日期)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129040663

【提升编程效率】Excel数据批量导入工具
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126427323

【提升编程效率】打印解决方案(支持打印模板、条形码、二维码、图片)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/129415723


前言

本专栏为【提升编程效率】,主要介绍开发过程中,遇到的一些重复性、机械性、简单性的问题,采用工具代替人工,提升生产力,解放程序员,让其有更多精力投入软件设计。

我的初心是:将软件开发中弯弯绕绕、易错代码逻辑自动生成,软件开发者可以直接复制到项目。总之就是给软件开发者减负,使得写代码变成一件开心的事情。

本专栏会持续更新,不断优化【提高编程效率】专栏,大家有任何问题,可以私信我。如果您对本专栏其它生产力工具感兴趣,欢迎关注,我将带你用最简洁的代码,实现最复杂的功能。

一、应用场景

本文主要介绍自动代码模板生成器,其实就是通过我的工具,您可以自动完成一些代码的编写。它自动生成了 “类文件”,您可以直接拷贝到项目中运行。
本文已经实现:数据模型的构建(Model层)、数据逻辑代码的构建(BLL层)、数据库交互代码的构建(DAL层)

二、工具开发(源码)

2.1 设计软件界面

这我也没什么好讲的,你们自己看我设计的界面吧,当然你们也可以设计最佳界面,把源码直接展现在功能上。
在这里插入图片描述

2.2 创建数据库访问类MySQLHelper.cs

这段代码,取自于我的《底层库》专栏,链接附上就不过多介绍了。

C#底层库–MySQL数据库访问操作辅助类(推荐阅读)
本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379

2.3 创建数据库操作类DBOperation.cs

创建数据库操作类 DBOperation.cs,复制以下代码:
注意:这里用到 底层库专栏《C#底层库--MySQL数据库访问操作辅助类(推荐阅读)》、《C#底层库--MySQL数据库脚本构建类(推荐阅读)》、《C#底层库--XML配置参数读写辅助类(推荐阅读)》,是不是还有人没有关注啊?我不提醒你们知道吗?

using System.Data;

namespace CreateCode.DAL
{
    public class DBOperation
    {
        /// <summary>
        /// 查询所有库
        /// </summary>
        /// <returns></returns>
        public static DataTable GetDataBases()
        {
            string l_strSql = "SHOW DATABASES";
            return MySQLHelper.ShowDataBases(l_strSql).Tables[0] ;
        }

        /// <summary>
        /// 查询表
        /// </summary>
        /// <returns></returns>
        public static DataTable GetDataTables()
        {
            string l_strSql = $@"select table_name from information_schema.tables 
                                where table_schema='{MySQLHelper.dataBaseName}'
                                order by table_name";
            return MySQLHelper.Query(l_strSql).Tables[0];
        }

        /// <summary>
        /// 查询列
        /// </summary>
        /// <returns></returns>
        public static DataSet GetDataColumns(string a_strTableName)
        {
            string l_strSql = $@"select column_name,data_type from information_schema.columns
                    WHERE TABLE_SCHEMA = '{MySQLHelper.dataBaseName}' AND TABLE_NAME = '{a_strTableName}'";
            return MySQLHelper.Query(l_strSql);
        }
    }
}

2.5 创建数据库类型转换类ConvertDataType.cs

创建类ConvertDataType.cs,这里面包含 数据库类型到C#数据类型的转换,以及文件的操作、类、命名空间重命名。我就没有进一步细分,建议你们可以把它拆分一下,分成不同的类文件。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CreateCode.BLL
{
    public static class ConvertDataType
    {
        public static string SqlTypeToCType(string sqlType)
        {
            string cType = string.Empty;
            switch (sqlType.Trim().ToLower())
            {
                //字符型
                case "char":
                case "varchar":
                case "nvarchar":
                case "text":
                case "longtext":
                case "utext":
                case "set":
                    cType = "string";
                    break;

                //整型
                case "int":
                case "decimal":
                    cType = "decimal";
                    break;
                case "smallint":
                case "bigint":
                case "mediumint":
                    cType = "int";
                    break;

                case "tinyint":
                    cType = "sbyte";
                    break;


                //长整型
                case "longblob":
                    cType = "long";
                    break;

                //浮点型
                case "float":
                    cType = "float";
                    break;

                case "money":
                    cType = "Decimal";
                    break;

                //双精度浮点型
                case "double":
                    cType = "double";
                    break;

                //布尔型
                case "binary":
                case "bit":
                case "bool":
                case "boolean":

                    cType = "bool";
                    break;


                //日期型
                case "date":
                case "datetime":
                case "time":
                case "timestamp":
                case "year":
                    cType = "DateTime";
                    break;

                //字节
                case "varbinary":
                case "image":
                case "blob":
                case "mediumblob":
                    cType = "byte[]";
                    break;

                //枚举
                case "enum":
                    cType = "enum";
                    break;

                default:
                    cType = "string";
                    break;
            }
            return cType;
        }

        public static void FileWrite(string a_fileText, string a_FileFullPath)
        {
            string dir = Path.GetDirectoryName(a_FileFullPath);

            if (!Directory.Exists(dir)) //目录不存在创建目录
            {
                Directory.CreateDirectory(dir);
            }

            //if (!File.Exists(a_path))   //文件不存在创建文件
            //{
            //    File.Create(a_path).Close();//防止文件创建被占用,创建成功即文件流关闭
            //}
    
            using (FileStream fs = new FileStream(a_FileFullPath, FileMode.Create))
            {
                using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
                {
                    sw.Write(a_fileText);
                }
            }
        }

        /// <summary>
        /// 首字母大写
        /// </summary>
        /// <param name="a_strValue"></param>
        /// <returns></returns>
        public static string ToUpperFirstword(string a_strValue)
        {
            if (string.IsNullOrEmpty(a_strValue))
            {
                return string.Empty;
            }
            else
            {
                return a_strValue.Substring(0, 1).ToUpper() + a_strValue.Substring(1).ToLower();
            }
        }

        /// <summary>
        /// 驼峰命名法
        /// </summary>
        /// <param name="a_strValue"></param>
        /// <returns></returns>
        public static string ToCamelName(string a_strValue)
        {
            StringBuilder result = new StringBuilder();
            if (a_strValue == null || string.IsNullOrEmpty(a_strValue))
            {
                return string.Empty;
            }
            else if (!a_strValue.Contains("_"))// 不含下划线,仅将首字母大写
            {
                return ToUpperFirstword(a_strValue);
            }
            else
            {
                // 用下划线将原始字符串分割
                string[] camels = a_strValue.Split('_');
                foreach (string camel in camels)
                {
                    // 跳过原始字符串中开头、结尾的下换线或双重下划线
                    if (string.IsNullOrEmpty(camel))
                    {
                        continue;
                    }

                    if (result.Length == 0) // 第一个驼峰片段,全部字母都小写
                    {
                        result.Append(camel.ToLower());
                    }
                    else
                    {
                        // 其他的驼峰片段,首字母大写,其它小写
                        result.Append(camel.Substring(0, 1).ToUpper());
                        result.Append(camel.Substring(1).ToLower());
                    }
                }
            }
            return result.ToString();
        }
    }
}

2.6 创建代码工厂类CodeFactory.cs

创建类代码工厂类CodeFactory.cs,作用就是产生代码模板,复制以下代码:

using CreateCode.DAL;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CreateCode.BLL
{
    public static class CodeFactory
    {
        #region 创建Model
        public static void CreateModel(string a_strNameSpace, string a_strTableName, string a_strDirPath)
        {
            StringBuilder l_sb = new StringBuilder();
            l_sb.AppendLine("using System;");
            l_sb.AppendLine();
            l_sb.AppendLine($"namespace {a_strNameSpace}.Model");
            l_sb.AppendLine("{");
            l_sb.AppendLine(@"    /// </summary>");
            l_sb.AppendLine($@"    /// Model层 {a_strTableName}(以下代码由工具自动生成,有错误请反馈)");
            l_sb.AppendLine(@"    /// </summary>");
            l_sb.AppendLine($"    public class {ConvertDataType.ToUpperFirstword(a_strTableName)}");
            l_sb.AppendLine("    {");
            l_sb.AppendLine("        public "+ ConvertDataType.ToUpperFirstword(a_strTableName)+ "() { }");

            var dt = DBOperation.GetDataColumns(a_strTableName).Tables["ds"];
            foreach (DataRow dr in dt.Rows)
            {
                string l_strType = ConvertDataType.SqlTypeToCType(dr["data_type"].ToString());
                l_sb.Append($"        public  {l_strType} {dr["column_name"].ToString()}").Append(" { get; set; }").AppendLine();
            }

            l_sb.AppendLine("    }");
            l_sb.AppendLine("}");//命名空间结束括号

            string l_strFilePath = Path.Combine(a_strDirPath, "Model", $"{a_strTableName}Model.cs");
            ConvertDataType.FileWrite(l_sb.ToString(), l_strFilePath);
        }
        #endregion

        #region 创建DAL数据访问层
        public static void CreateDAL(string a_strNameSpace, string a_strTableName, string a_strDirPath)
        {
            //去除自增列
            //string colsNotAutoKey = GetColumns(a_dtTable).Where(m => m != txt.AutoAdd.text.trim()).toarry(); 
            //l_sb.AppendLine("       DBHelperMySQL sh = new DBHelperMySQL();");
            //l_sb.AppendLine($"    {string.Join(",", l_strs)} values");
            //l_sb.AppendLine($"    ({string.Join(",", l_strs.Select(m => "@" + m))}\", values");

            StringBuilder l_sb = new StringBuilder();
            l_sb.AppendLine("using System;");
            l_sb.AppendLine("using System.Collections.Generic;");
            l_sb.AppendLine("using System.Data;");
            l_sb.AppendLine("using CreateCode.DAL;");
            l_sb.AppendLine();
            l_sb.AppendLine(@"/// </summary>");
            l_sb.AppendLine($@"/// DAL层 {a_strTableName}(以下代码由工具自动生成,有错误请反馈)");
            l_sb.AppendLine(@"/// </summary>");
            l_sb.AppendLine($"namespace {a_strNameSpace}.DAL"); //命名空间
            l_sb.AppendLine("{"); //命名空间
            l_sb.AppendLine($"    public class {ConvertDataType.ToUpperFirstword(a_strTableName)}");
            l_sb.AppendLine("    {");
            l_sb.AppendLine("        /// <summary>");
            l_sb.AppendLine("        /// 执行语句(带事务回滚机制):插入、修改、删除");
            l_sb.AppendLine("        /// 使用条件:需引入封装类DBHelperMySQL.cs、MakeSQLHelper.cs");
            l_sb.AppendLine("        /// </summary>");
            l_sb.AppendLine("        /// <returns>返回执行行数</returns>");
            l_sb.AppendLine("        public int ExecuteSql()");
            l_sb.AppendLine("        {");
            l_sb.AppendLine("            List<T> list = new List<T>();");
            l_sb.AppendLine("            List<String> SQLTextList = new List<string>();");
            l_sb.AppendLine("            SQLTextList.Clear();");
            l_sb.AppendLine("");
            l_sb.AppendLine("            //1、插入语句");
            l_sb.AppendLine("            MakeSQLHelper MakeSQL = new MakeSQLHelper();");
            l_sb.AppendLine($"            string l_strInsertSql = MakeSQL.CreateInsertSQLBuilder({a_strTableName}, list);");
            l_sb.AppendLine("             SQLTextList.Add(l_strInsertSql);");
            l_sb.AppendLine("");
            l_sb.AppendLine("            //2、修改语句");
            l_sb.AppendLine("            string l_strModifySql = \"update \";");
            l_sb.AppendLine("            SQLTextList.Add(l_strModifySql);");
            l_sb.AppendLine("");
            l_sb.AppendLine("            //3、删除语句");
            l_sb.AppendLine("            string l_strDeleteSql = \"\";");
            l_sb.AppendLine("            SQLTextList.Add(l_strDeleteSql);");
            l_sb.AppendLine("");
            l_sb.AppendLine("        }");
            l_sb.AppendLine("");
            l_sb.AppendLine("        /// <summary>");
            l_sb.AppendLine("        /// 查询语句");
            l_sb.AppendLine("        /// 使用条件:需引入封装类DBHelperMySQL.cs");
            l_sb.AppendLine("        /// </summary>");
            l_sb.AppendLine("        /// <returns>DataTable</returns>");
            l_sb.AppendLine("        public DataTable GetData()");
            l_sb.AppendLine("        {");
            l_sb.AppendLine("            string l_strSql = \"select * from tb\";");
            l_sb.AppendLine("            return DBHelperMySQL.Query(l_strSql).Tables[0];");
            l_sb.AppendLine("        }");
            l_sb.AppendLine("    }");
            l_sb.AppendLine("}");

            string l_strFilePath = Path.Combine(a_strDirPath, "DAL", $"{a_strTableName}DAL.cs");
            ConvertDataType.FileWrite(l_sb.ToString(), l_strFilePath);
        }
        #endregion

        #region 创建BLL业务逻辑层
        public static void CreateBLL(string a_strNameSpace, string a_strTableName, string a_strDirPath)
        {
            StringBuilder l_sb = new StringBuilder();
            l_sb.AppendLine("using System;");
            l_sb.AppendLine("using System.Collections.Generic;");
            l_sb.AppendLine("using System.Data;");
            l_sb.AppendLine("using WBF.Utils;");
            l_sb.AppendLine();
            l_sb.AppendLine($"namespace {a_strNameSpace}.BLL");
            l_sb.AppendLine("{");
            l_sb.AppendLine("    /// </summary>");
            l_sb.AppendLine("    /// BLL业务逻辑层 t_wutiao(以下代码由工具自动生成,有错误请反馈)");
            l_sb.AppendLine("    /// </summary>");
            l_sb.AppendLine($"    public class {ConvertDataType.ToUpperFirstword(a_strTableName)}");
            l_sb.AppendLine("    {");
            l_sb.AppendLine("		//构造数据对象");
            l_sb.AppendLine($"        {ConvertDataType.ToUpperFirstword(a_strTableName)} {ConvertDataType.ToUpperFirstword(a_strTableName)}Model = new {ConvertDataType.ToUpperFirstword(a_strTableName)}()");
            l_sb.AppendLine("        {");
            var dt = DBOperation.GetDataColumns(a_strTableName).Tables["ds"];
            foreach (DataRow dr in dt.Rows)
            {
                l_sb.Append($"            {dr["column_name"].ToString()} = baseDataInput_{dr["column_name"].ToString()}.StringValue,").AppendLine();
            }
            l_sb.AppendLine("        };");
            l_sb.AppendLine("");
            l_sb.AppendLine("        //数据对象转json格式");
            l_sb.AppendLine($"        string l_strSend = ConvertJson.SerializeObject({ConvertDataType.ToUpperFirstword(a_strTableName)}Model);");
            l_sb.AppendLine("");
            l_sb.AppendLine("        //实例化消息类,定义消息ID");
            l_sb.AppendLine("        BaseSuperMessage SuperMsg = new BaseSuperMessage(仓库消息_临时.钨条打标);");
            l_sb.AppendLine("		//构造传递参数");
            l_sb.AppendLine("        SuperMsg.Append(\"PrinterPCName\", System.Net.Dns.GetHostName());");
            l_sb.AppendLine("        SuperMsg.Append(\"t_wutiao\", l_strSend);");
            l_sb.AppendLine("        //向服务端发送消息");
            l_sb.AppendLine("        BaseNetClient.SendSuperMessage(SuperMsg);");
            l_sb.AppendLine("    }");
            l_sb.AppendLine("}");
            string l_strFilePath = Path.Combine(a_strDirPath, "BLL", $"{a_strTableName}BLL.cs");
            ConvertDataType.FileWrite(l_sb.ToString(), l_strFilePath);
        }
        #endregion
    }

}

三、调用方法

3.1 下拉选择数据库,查询所有表

   private void cbo_DataBases_SelectedIndexChanged(object sender, EventArgs e)
   {
       this.lBC_Left.Items.Clear();
       this.lBC_Right.Items.Clear();
       if (this.cbo_DataBases.Text.Contains("请选择"))
       {
           return;
       }
       else
       {
           MySQLHelper.dataBaseName = this.cbo_DataBases.Text.Trim();//修改库
           DataTable l_dtTables = DBOperation.GetDataTables();
           foreach (DataRow dr in l_dtTables.Rows)
           {
               this.lBC_Left.Items.Add(dr["table_name"].ToString());
           }
       }
   }

3.2 点击按钮,生成代码文件

  #region 按钮事件
  private void sbtn_Create_Click(object sender, EventArgs e)
   {
       string l_strNameSpace = text_nameSpace.Text.Trim();
       dxErrorProvider1.ClearErrors();
       if (this.lBC_Right.Items.Count <= 0)
       {
           XtraMessageBox.Show("请选择要生成表!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
           return;
       }

       if (string.IsNullOrWhiteSpace(l_strNameSpace))
       {
           dxErrorProvider1.SetError(text_nameSpace, "命名空间不能为空!"); //必须为dev控件
           text_nameSpace.Focus();
           return;
       }

       if (!(cb_Models.Checked || cb_DAL.Checked || cb_Bll.Checked))
       {
           XtraMessageBox.Show("生成策略至少勾选一个!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
           return;
       }

       FolderBrowserDialog fbd = new FolderBrowserDialog();
       fbd.Description = "选择代码保存目录";
       fbd.SelectedPath = AppDomain.CurrentDomain.BaseDirectory;
       DialogResult dialogResult = fbd.ShowDialog();
       if (dialogResult == DialogResult.OK)
       {
           string l_strDir = Path.Combine(fbd.SelectedPath, l_strNameSpace);

           foreach (string l_strTableName in lBC_Right.Items)
           {
               if (cb_Models.Checked)
               {
                   CodeFactory.CreateModel(l_strNameSpace, l_strTableName, l_strDir);
               }

               if (cb_DAL.Checked)
               {
                   CodeFactory.CreateDAL(l_strNameSpace, l_strTableName, l_strDir);
               }

               if (cb_Bll.Checked)
               {
                   CodeFactory.CreateBLL(l_strNameSpace, l_strTableName, l_strDir);
               }
           }
           XtraMessageBox.Show("代码生成成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
           System.Diagnostics.Process.Start(l_strDir);
       }
   }
   #endregion

四、项目样例

我是用于MES系统开发,C/S架构,目前代码生成的很简洁,出于项目保密,我仅开放部分图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
服务器调用代码,是不是很简洁:
在这里插入图片描述

五、资源链接

代码模板生成器,链接如下:
链接:https://pan.baidu.com/s/1epm6is-dJ-b1cdJwY1XvQw?pwd=30zq
提取码:30zq

系统地讲解了如何构建一个日常生产环境实用的基于Spring Boot并且集成springmvc + shiro + mybatis-plus + beetl的后台管理系统,可管理代码生成模版,管理连接生成代码的数据库. Guns框架自带的功能:1.用户管理 2.角色管理 3.部门管理 4.菜单管理 5.字典管理 6.业务日志 7.登录日志 8.监控管理 9.通知管理 10.代码生成 Guns特点: 1. 基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 2. 完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库,通过@BussinessLog注解和LogObjectHolder.me().set()方法,业务操作日志可具体记录哪个用户,执行了哪些业务,修改了哪些数据,并且日志记录为异步执行,详情请见@BussinessLog注解和LogObjectHolder,LogManager,LogAop类。 3. 利用beetl模板引擎对前台页面进行封装和拆分,使臃肿的html代码变得简洁,更加易维护。 4. 对常用js插件进行二次封装,使js代码变得简洁,更加易维护,具体请见webapp/static/js/common文件夹内js代码。 5. 利用ehcache框架对经常调用的查询进行缓存,提升运行速度,具体请见ConstantFactory类中@Cacheable标记的方法。 6. controller层采用map + warpper方式的返回结果,返回给前端更为灵活的数据,具体参见com.stylefeng.guns.modular.system.warpper包中具体类。 7. 防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。 8. 简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制、html页面以及相关的js,还可以生成Service和Dao,并且这些生成项都为可选的,通过ContextConfig下的一些列xxxSwitch开关,可灵活控制生成模板代码,让您把时间放在真正的业务上。 9. 控制层统一的异常拦截机制,利用@ControllerAdvice统一对异常拦截,具体见com.stylefeng.guns.core.aop.GlobalExceptionHandler类。 10. 页面统一的js key-value单例模式写法,每个页面生成一个唯一的全局变量,提高js的利用效率,并且有效防止多个人员开发引起的函数名/类名冲突,并且可以更好地去维护代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花北城

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值