第六章 Net 5.0 快速开发框架 YC.Boilerplate -- 代码生成和数据库表生成

在线文档:http://doc.yc-l.com/#/README
在线演示地址:http://yc.yc-l.com/#/login
源码github:https://github.com/linbin524/yc.boilerplate
源码gitee:https://gitee.com/linxuanming/yc.boilerplate
元磁之力框架技术群QQ:1060819005

视频教程:

代码生成和数据库表生成

简介

数据库表生成和代码生成是元磁之力框架为了快速开发而编写的工具,可以实现前后端代码生成,
满足基础的增删改查基础的功能实现。节省60%的开发工作量。

代码生成模块YC.CodeGenerate是独立一个类库,实现数据库表生成逻辑和业务代码生成逻辑,框架并没有开发对应的界面化工具,主要考虑到在实际开发过程中,
各自需求变化多,采用单元测试模式,根据自己的需求微调代码,实现数据库表生成和代码生成。

数据库表生成介绍

数据库表生成需要配置DefaultConfig.json 中的 DefaultMysqlConnectionString是 mysql 连接字符串,用于创建数据库;
DefaultDbConnectionString 是将要被创建的数据库连接字符串,用于生成对应的数据库表时候的连接访问请求;
根据配置对应的Entity 以及对应的表名和注释,来进行映射。

举例:审计日志Entity,标识[Table("SysAuditLog")],那么就会映射表名为SysAuditLog,表名标识[Display(Name = "审计日志")] 表名的注释就为:审计日志
表字段根据当前实体属性对应的数据类型来进行映射数据库的类型,比如:属性为[StringLength(300)] 类型,那边自动映射数据库表类型为varchar(300),
如果有[NotMapped] 标注的属性,会自动跳过,不会对改属性生成对应的数据表字段。

单元测试代码

            using (CodeGenerateDBService codeGenerateDBRepository = new CodeGenerateDBService())
            {
                string msg = "";
                GenerateDbTableConfig config = new GenerateDbTableConfig();
                config.GenerateDbTableEntityList = new List<string>();
                config.GenerateDbTableEntityList.Add("SysOrganization");//要生成的表
                config.GenerateDbTableEntityList.Add("SysAuditLog");
                config.GenerateDbTableEntityList.Add("SysUserSysOrganization");
                bool result = codeGenerateDBRepository.CreateTable(config,out msg, false);
                Assert.IsTrue(result);
            }

代码生成介绍

代码生成主要组成是如下:

  • IAppservice业务接口代码
  • Appservice 业务代码
  • AddOrEditDto Dto实体代码
  • Vue 界面操作代码(增删改查都已经集成)
  • OtherCode 主要包含:
 1.  前端 main.js需要 api请求接口地址
 2.  前端router目录下index.js 需要的路由配置
 3.  后端 AutoMapper 配置的Dto映射 

代码生成操作流程

  1. 配置代码模板的路径
  2. 配置代码需要导出目录
  3. wantToGenerateCodeTypeList 依照自己的喜好,选择所有的代码模板生成全量代码,还是选择单元模板生成指定的代码。
  4. generateEntityList 配置指定要生成代码的实体,如果为空,默认全量生成。



        /// <summary>
        /// 代码生成器-生成对应代码
        /// </summary>
        [TestMethod]
        public void GenerateCodeTest()
        {
            #region 模板和生成代码路径配置
            TemplateDto templateDto = new TemplateDto();
            templateDto.AddOrEditDtoFilePath = System.AppContext.BaseDirectory + @"CodeTemplateAddOrEditDtoTemplate.txt";
            templateDto.EntityDtoFilePath = System.AppContext.BaseDirectory + @"CodeTemplateEntityDtoTemplate.txt";
            templateDto.ServiceFilePath = System.AppContext.BaseDirectory + @"CodeTemplateAppServiceTemplate.txt";
            templateDto.IServiceFilePath = System.AppContext.BaseDirectory + @"CodeTemplateIAppServiceTemplate.txt";
            templateDto.VueFilePath = System.AppContext.BaseDirectory + @"CodeTemplateViewVueTemplate.txt";
            templateDto.TreeServiceFilePath = System.AppContext.BaseDirectory + @"CodeTemplateTreeAppServiceTemplate.txt";
            templateDto.TreeIServiceFilePath = System.AppContext.BaseDirectory + @"CodeTemplateTreeIAppServiceTemplate.txt";
            templateDto.TreeVueFilePath = System.AppContext.BaseDirectory + @"CodeTemplateViewTreeVueTemplate.txt";
            templateDto.SaveDir = System.AppContext.BaseDirectory + "GenerateCode\";//生成代码保存位置
            #endregion
            #region 配置默认生成规格
            List<GenerateCodeEnumType> wantToGenerateCodeTypeList = new List<GenerateCodeEnumType>();
            wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.DefaultAddOrEditDto);//新增编辑Dto
            wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.DefaultEntityDto);//实体Dto

            bool isTree = true;
            wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.OtherCode);
            if (isTree)
            {
                wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.TreeAppService);
                wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.TreeIAppService);
                wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.TreeVuePage);
            }
            else
            {
                wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.DefaultAppService);
                wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.DefaultIAppService);
                wantToGenerateCodeTypeList.Add(GenerateCodeEnumType.DefaultVuePage);
            }
            #endregion

            ///树形代码完成后,注意修改vue界面
            ///1、手动修改分类 typeName那边
            //2、手动修改编辑 复选框内容父节点
            //3、这里的节点 默认使用Label,父节点ParentId 两个固定的字段名称
            //4、树的根节点要为0

            List<string> generateEntityList = new List<string>();
            generateEntityList.Add("SysOrganization");
            GenerateCodeConfig generateCodeConfig = new GenerateCodeConfig();
            generateCodeConfig.Template = templateDto;
            generateCodeConfig.WantToGenerateCodeTypeList = wantToGenerateCodeTypeList;
            generateCodeConfig.GenerateEntityList = generateEntityList;
            generateCodeConfig.IsTree = isTree;
            GenerateCodeService generateCodeRepository = new GenerateCodeService(generateCodeConfig);
            var result = generateCodeRepository.GenerateWork();
            Assert.IsTrue(result.Success);
        }

生成代码如何使用

完成代码生成后,依照对应的业务进行存放。

1. 将Appservice 代码放到YC.ApplicationService目录下。
2. 将前端代码放到前端components目录下。
3. 将OtherCode 生成的代码依次放到前端main.js、router/index.js、后台的
    YC.ApplicationService/MapConfig/MapConfig.cs 中。
4. 目录菜单如果还没有实现动态化,需要在home.vue 的菜单手动添加对应的目录。
5. 修改后台业务代码xxxAppservice,在分页查询方法手动调整自己的查询参数。
笔者原创!如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载请添加原博客连接,否则保留追究法律责任的权利,谢谢! YC.Boilerplate 快速开发框架交流,请加群:1060819005 区块链交流请加QQ群:538327407(已满),群2:135019400. 我的博客地址:http://www.cnblogs.com/linbin524/
原文地址:https://www.cnblogs.com/linbin524/p/15210283.html