基于ruoyi框架开发代码生成器

springboot基于ruoyi框架开发代码生成器

关于ruoyi框架的代码生成器

下载ruoyi源码

https://gitee.com/y_project/RuoYi

在这里插入图片描述

在这里插入图片描述

Velocity Engine Core(Velocity引擎核心)是一个用于生成文本的模板引擎,它是Apache Velocity项目的一部分。Velocity Engine Core 使用 Velocity 模板语言,允许用户在模板中插入变量、条件语句、循环等逻辑,最终生成所需的文本输出。

Velocity Engine Core 提供了一个简单而灵活的模板引擎,通常用于生成动态内容,比如生成代码、网页、电子邮件模板等。它支持模板文件和字符串模板,并提供了丰富的工具和方法来处理模板中的数据和逻辑。

第一步:编写模板引擎初始化方法

在这里插入图片描述

第二步:编写模板引擎工具类

在这里插入图片描述

创建代码生成器的实际过程就是

创建代码生成的模板信息,初始化Velocity引擎,将模板信息写入到模板中

这里只说明domain.java.vm这一个模板方法

第三步:创建虚拟模板

在这里插入图片描述

第四步:调用上述方法,完成模板内数据的填充以及文件的创建

在这里插入图片描述

分析完整个ruoyi框架中的代码生成器,现在我们进行代码生成器的集成

springboot集成velocity

注意事项

模板引擎中的数据信息这里与ruoyi框架不同的是减少了mapper.xml文件的编写且没有ruoyi框架中对crud以及树形操作的代码

1.添加maven依赖

  	    <!--velocity模板引擎-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.3</version>
        </dependency>

springboot的版本,这边选用的是2.3.2.RELEASE,

当时在开发的过程中是希望在局域网条件下,可以直接通过连接其他人的电脑数据库服务,方便使用,不需要将表中数据导入到部署服务的数据库中,且不需要使用动态数据源

2.编写模板引擎初始化方法

public class VelocityInitializer
{
    /**
     * 初始化vm方法
     */
    public static void initVelocity()
    {
        Properties p = new Properties();
        try
        {
            // 加载classpath目录下的vm文件
            p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
            // 定义字符集
            p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8);
            // 初始化Velocity引擎,指定配置Properties
            Velocity.init(p);
        }
        catch (Exception e)
        {
            throw new RuntimeException(e);
        }
    }
}

3.编写模板引擎工具类

public class VelocityUtils {
    /**
     * 项目空间路径
     */
    private static final String PROJECT_PATH = "main/java";


    /**
     * html空间路径
     */
    private static final String TEMPLATES_PATH = "main/resources/templates";
    
    /**
     * 获取模板信息
     *
     * @return 模板列表
     */
    public static List<String> getTemplateList() {
        List<String> templates = new ArrayList<String>();
        templates.add("vm/java/domain.java.vm");
        templates.add("vm/java/dto.java.vm");
        templates.add("vm/java/vo.java.vm");
        templates.add("vm/java/mapper.java.vm");
        templates.add("vm/java/service.java.vm");
        templates.add("vm/java/serviceImpl.java.vm");
        templates.add("vm/java/controller.java.vm");
        templates.add("vm/java/mapping.java.vm");
        return templates;
    }

    private static VelocityContext getContext(GenerateTable genTable) {
        VelocityContext context = new VelocityContext();
        String packageName = GenConfig.getPackageName();
        String author = GenConfig.getAuthor();
        context.put("packageName", packageName);
        context.put("moduleName", genTable.getClassName());
        context.put("author", author);
        context.put("functionName", genTable.getClassName());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        context.put("datetime", simpleDateFormat.format(new Date()));
        context.put("tableName", genTable.getTableName());
        context.put("className", genTable.getClassName());
        context.put("moduleName", genTable.getClassName().replaceAll("([A-Z])", "/$1").toLowerCase().replaceFirst("/", ""));
        List<GenTableColumn> list = genTable.getList();
        ArrayList<Map<String, String>> maps = new ArrayList<>();
        for (GenTableColumn genTableColumn : list) {
            Map<String, String> column1 = new HashMap<>();
            column1.put("columnComment", genTableColumn.getColumnComment());
            column1.put("javaType", genTableColumn.getJavaType());
            column1.put("javaField", genTableColumn.getJavaField());
            column1.put("columnName", genTableColumn.getColumnName());
            maps.add(column1);
        }
        context.put("columns", maps);
        return context;
    }

    public static void writeFile(String template, GenerateTable genTable, String absolutePath) {
        VelocityContext context = getContext(genTable);
        try (StringWriter sw = new StringWriter()) {
            Template tpl = Velocity.getTemplate(template, "UTF-8");
            tpl.merge(context, sw);
            String fileName = getFileName(template, genTable);
            if (StringUtils.isBlank(fileName)) {
                return;
            }
            String realFilePath = absolutePath + "/" + fileName;
            FileUtils.writeStringToFile(new File(realFilePath), sw.toString(), "UTF-8");
        } catch (IOException e) {
            throw new RuntimeException();
        }
    }

    /**
     * 获取文件名
     */
    public static String getFileName(String template, GenerateTable genTable) {
        // 文件名称
        String fileName = "";
        // 包路径
        String packageName = GenConfig.getPackageName();
        // 大写类名
        String className = genTable.getClassName();
        // 业务名称
        String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
        String htmlPath = TEMPLATES_PATH + "/" + StringUtils.replace(packageName, ".", "/");

        if (template.contains("domain.java.vm")) {
            fileName = StringUtils.format("{}/domain/entity/{}.java", javaPath, className);
        } else if (template.contains("mapper.java.vm")) {
            fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
        } else if (template.contains("service.java.vm")) {
            fileName = StringUtils.format("{}/service/{}Service.java", javaPath, className);
        } else if (template.contains("serviceImpl.java.vm")) {
            fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
        } else if (template.contains("controller.java.vm")) {
            fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
        } else if (template.contains("dto.java.vm")) {
            fileName = StringUtils.format("{}/domain/dto/{}Dto.java", javaPath, className);
        } else if (template.contains("vo.java.vm")) {
            fileName = StringUtils.format("{}/domain/vo/{}Vo.java", javaPath, className);
        } else if (template.contains("mapping.java.vm")) {
            fileName = StringUtils.format("{}/domain/mapping/{}Mapping.java", javaPath, className);
        }
        return fileName;
    }


}

4.调用方法完成创建以及文件下载操作

public void getTableData(List<String> tableNames, String clientId, HttpServletResponse response) {
        List<GenerateTable> generateTables = new ArrayList<>();
        for (String tableName : tableNames) {
            List<GenTableColumn> data = getData(tableName, clientId);
            generateTables.add(new GenerateTable(data, tableName, StringUtils.toCamelCase(tableName).substring(0, 1).toUpperCase() + StringUtils.toCamelCase(tableName).substring(1)));
        }
        // 初始化vm
        VelocityInitializer.initVelocity();
        processingFile(generateTables);
        // 获取文件夹地址,打包成zip
        String realPath = getRealPath()+"/main";
        // 打包,删除文件夹
        File zipFile = ZipUtil.zip(realPath, getRealPath() + "/" + System.currentTimeMillis() + ".zip");
        // 设置响应头
        response.reset();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=\"download.zip\"");
        // 写入响应输出流
        OutputStream outputStream = null;
        FileInputStream fis = null;
        try {
            outputStream = response.getOutputStream();
            fis = new FileInputStream(zipFile);
            IoUtil.copy(fis, outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (!Objects.isNull(outputStream)) {
                    outputStream.close();
                }
                if (!Objects.isNull(fis)) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 删除map里的值,完成跳转到首页
        map.remove(clientId);
        FileUtil.del(getRealPath());
    }
    

最后,上述的项目大家可以通过https://download.csdn.net/download/m0_56512023/89392583进行下载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值