RuoYi-Vue 前后端分离版代码浅析-代码生成模块(三)

635 阅读2分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

前言

本节介绍RuoYi-Vue的代码生成模块是如何进行配置生成代码的,它的可视化代码编辑模式对于开发者而言可以很好的解决重复代码编写问题,只需一键就可以将大部分的重复代码都生成出来,开发者可以将自己的注意力完全放在业务逻辑的编写上,解决掉无聊的增删改查。

生成代码的基础

要想生成我们想要的格式,我们必须要给程序一个模板,那么这个模板不可避免要有变量的替换等问题出现,在Ruoyi中,我们使用的模板引擎是Velocity,在它的帮助下我们可以很轻松的将我们想要的模板样式告诉给程序

image.png 可以看到对应的各种domain,控制器,mapper和xml,vue页面的模板,我们就是通过它们来生成我们想要的代码的。

生成代码的具体逻辑

/**
 * 生成代码(自定义路径)
 * 
 * @param tableName 表名称
 */
@Override
public void generatorCode(String tableName)
{
    // 查询表信息
    GenTable table = genTableMapper.selectGenTableByName(tableName);
    // 设置主子表信息
    setSubTable(table);
    // 设置主键列信息
    setPkColumn(table);

    VelocityInitializer.initVelocity();

    VelocityContext context = VelocityUtils.prepareContext(table);

    // 获取模板列表
    List<String> templates = VelocityUtils.getTemplateList(table.getTplCategory());
    for (String template : templates)
    {
        if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm"))
        {
            // 渲染模板
            StringWriter sw = new StringWriter();
            Template tpl = Velocity.getTemplate(template, Constants.UTF8);
            tpl.merge(context, sw);
            try
            {
                String path = getGenPath(table, template);
                FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8);
            }
            catch (IOException e)
            {
                throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
            }
        }
    }
}

取出表信息

我们首先要将之前的存入数据库中的表信息取出,究竟我们的模板要怎么渲染,都是由我们刚才设置的

image.png 这个页面上的属性所决定的。

初始化Velocity引擎并填充变量数据

 VelocityInitializer.initVelocity();

初始化方法帮助我们定义了字符集,加载了vm文件 image.pngVelocityContext这个上下文包含了我们的各种变量信息,为接下来渲染模板打下了基础。

循环渲染模板

image.png 建立了一个StringWriter,用来接收模板渲染之后的数据信息,最后写入了文件中,保存了下来,到此,生成代码的过程就结束了。