ruoyi 代码生成

news2024/12/25 12:35:38

子模块

ruoyi-generator

导入表信息

导入表信息时系统会默认读取ruoyi-generator/src/main/resources/generator.yml路径下的配置,配置如下

# 代码生成
gen:
  # 作者
  author: ruoyi
  # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
  packageName: com.ruoyi.demo
  # 自动去除表前缀,默认是false
  autoRemovePre: true
  # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
  tablePrefix: sys_

生成前配置

   自定义路径的方式可以直接生成到指定的子模块目录下

模板解析

代码模板存放位置,模板中填充的字段来自
ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
中的 prepareContext() 方法

prepareContext()中实现了字段的值注入到VelocityContext对象中会被

ruoyi-generator/src/main/java/com/ruoyi/generator/service/GenTableServiceImpl.java
中的generatorCode()方法调用
generatorCode()中把VelocityContext
对象中的数据写入到Template模板里

自定义生成路径

generatorCode() 方法中 有过滤 “sql.vm”, “api.js.vm”, “index.vue.vm”, “index-tree.vue.vm” 文件的代码,在实际使用时可以修改下过滤文件的,比如去除 “api.js.vm”, “index.vue.vm”,
这样系统就会生成vue2 相关的代码

鉴于ruoyi的代码生成模块在前台设置生成路径时需要每次都填写,故此在后端.yml文件中实现路径存储并更改部分代码实现后端自定义生成路径

generator.yml

增加代码的存放路径
java代码存放路径
javaPath: F:/Amy/project/RuoYi-Vue-demo/java/ruoyi-demo/src

vue代码存放路径
vuePath: F:/Amy/project/RuoYi-Vue-demo/vue/ruoyi-ui/src

# 代码生成
gen:
  # 作者
  author: ruoyi
  # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool
  packageName: com.ruoyi.demo
  # 自动去除表前缀,默认是false
  autoRemovePre: false
  # 表前缀(生成类名不会包含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # 代码存放路径
  javaPath: F:/Amy/project/RuoYi-Vue-demo/java/ruoyi-demo/src
  # vue代码路径
  vuePath: F:/Amy/project/RuoYi-Vue-demo/vue/ruoyi-ui/src

GenConfig.class读取代码生成相关配置

增加存放路径的读取
private static String javaPath;
private static String vuePath;

/**
 * 读取代码生成相关配置
 *
 * @author ruoyi
 */
@Component
@ConfigurationProperties(prefix = "gen")
@PropertySource(value = {"classpath:generator.yml"})
public class GenConfig {
    /**
     * 作者
     */
    public static String author;

    /**
     * 生成包路径
     */
    public static String packageName;

    /**
     * 自动去除表前缀,默认是false
     */
    public static boolean autoRemovePre;

    /**
     * 表前缀(类名不会包含表前缀)
     */
    public static String tablePrefix;

    /**
     * 代码生成路径
     */
    private static String javaPath;

    /**
     * 代码生成路径
     */
    private static String vuePath;



    public static String getAuthor() {
        return author;
    }

    @Value("${author}")
    public void setAuthor(String author) {
        GenConfig.author = author;
    }

    public static String getPackageName() {
        return packageName;
    }

    @Value("${packageName}")
    public void setPackageName(String packageName) {
        GenConfig.packageName = packageName;
    }

    public static boolean getAutoRemovePre() {
        return autoRemovePre;
    }

    @Value("${autoRemovePre}")
    public void setAutoRemovePre(boolean autoRemovePre) {
        GenConfig.autoRemovePre = autoRemovePre;
    }

    public static String getTablePrefix() {
        return tablePrefix;
    }

    @Value("${tablePrefix}")
    public void setTablePrefix(String tablePrefix) {
        GenConfig.tablePrefix = tablePrefix;
    }



    @Value("${javaPath}")
    public void setJavaPath(String path) {
        GenConfig.javaPath = path;
    }

    public static String getJavaPath() {
        return javaPath;
    }

    @Value("${vuePath}")
    public void setVuePath(String vuePath) {
        GenConfig.vuePath = vuePath;
    }

    public static String getVuePath() {
        return vuePath;
    }

}

生成代码(自定义路径)generatorCode()

如果table.getGenPath()的值等于"/",

来自com.ruoyi.generator.service.GenTableServiceImpl.class

  /**
     * 生成代码(自定义路径)
     *
     * @param tableName 表名称
     */
    @Override
    public void generatorCode(String tableName) {
        // 查询表信息
        GenTable table = genTableMapper.selectGenTableByName(tableName);
        //如果地址是默认则使用配置文件中的路径地址
        if (StringUtils.equals(table.getGenPath(), "/")) {
            table.setGenPath(GenConfig.getJavaPath());
            table.setVuePath(GenConfig.getVuePath());
        }


        // 设置主子表信息
        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, table.getGenPath());
                    FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8);
                } catch (IOException e) {
                    throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
                }
            }

            //过滤一些文件
            if (StringUtils.containsAny(template, "api.js.vm", "index.vue.vm")) {
                // 渲染模板
                StringWriter sw = new StringWriter();
                Template tpl = Velocity.getTemplate(template, Constants.UTF8);
                tpl.merge(context, sw);
                try {
                    String path = getGenPath(table, template, table.getVuePath());
                    FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8);
                } catch (IOException e) {
                    throw new ServiceException("渲染模板失败,表名:" + table.getTableName());
                }
            }
        }
    }

重写getGenPath()获取代码生成地址

 /**
     * 获取代码生成地址
     *
     * @param table    业务表信息
     * @param template 模板文件路径
     * @param genPath  要生成代码的路径
     * @return 生成地址
     */
    public static String getGenPath(GenTable table, String template, String genPath) {
        return genPath + File.separator + VelocityUtils.getFileNameNoVuePath(template, table);
    }

重写getFileNameNoVuePath()

/**
     * 获取文件名
     */
    public static String getFileNameNoVuePath(String template, GenTable genTable) {
        // 文件名称
        String fileName = "";
        // 包路径
        String packageName = genTable.getPackageName();
        // 模块名
        String moduleName = genTable.getModuleName();
        // 大写类名
        String className = genTable.getClassName();
        // 业务名称
        String businessName = genTable.getBusinessName();

        String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/");
        String mybatisPath = MYBATIS_PATH + "/" + moduleName;

        if (template.contains("domain.java.vm")) {
            fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
        }
        if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) {
            fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName());
        } 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/I{}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("mapper.xml.vm")) {
            fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
        } else if (template.contains("sql.vm")) {
            fileName = businessName + "Menu.sql";
        } else if (template.contains("api.js.vm")) {
            fileName = StringUtils.format("/api/{}/{}.js", moduleName, businessName);
        } else if (template.contains("index.vue.vm")) {
            fileName = StringUtils.format("/views/{}/{}/index.vue", moduleName, businessName);
        } else if (template.contains("index-tree.vue.vm")) {
            fileName = StringUtils.format("/views/{}/{}/index.vue", moduleName, businessName);
        }
        return fileName;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1605216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Proteus 8.17 2024年最新版 安装和汉化教程

Proteus是一款专业的电路设计和仿真软件&#xff0c;被广泛应用于电子设计、嵌入式系统开发等领域&#xff0c;是世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。 软件下载&#xff1a;长按识别关注“我爱单片机”公众号&#xff0c;回复“protues…

C语言进阶课程学习记录-第38课 - 动态内存分配

C语言进阶课程学习记录-第38课 - 动态内存分配 内存动态分配实验-malloc(0)实验实验-realloc和calloc小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 内存动态分配 实验-malloc(0) #include <st…

PMP报考别跟风!搞懂这些问题不踩坑!

1.PMP是什么&#xff1f; 1.PMP(Project ManagementProfessional)的中文全称是项目管理专业人士资格认证。该认证是由美国项目管理协会PMI在全球206个国家发起的针对项目经理的资格认证。 2.PMP认证是目前国际上项目管理领域认可度和含金量最高的证书。通过PMP就证明你的项目…

3.1 海思SS928开发 - 烧写工具 - ToolPlatform 安装及配置

3.1 烧写工具 - ToolPlatform 安装及配置 ToolPlatform 安装 进入到开发虚拟机&#xff0c;将文件 ~/hiss928/sdk/ema_2.0.2.2/pc/ToolPlatform/ToolPlatform-1.0.11-win32-x86_64.zip 拷贝至 PC 上。PC 要求安装了 win7 及以上的操作系统。解压压缩包 ToolPlatform-1.0.11-w…

ffmpeg入门

ffmpeg入——安装 Fmpeg地址 FFmpeg源码地址&#xff1a;https://github.com/FFmpeg/FFmpeg FFmpeg可执行文件地址&#xff1a;https://ffmpeg.org/download.html Windows平台 Windows平台下载解压后如图所示&#xff08;文件名称以-share结尾的是开发库&#xff09; FFmpeg…

当面试官的一些想法

前天被同事拉去面试了&#xff0c;一天面试很多人&#xff0c;很是疲惫。之前在小米的5年&#xff0c;也总是被组长拉去当面试官。虽然我个人已经对这种事很厌倦了&#xff0c;但在面试过程中获得的一些收获还是不错的。今天也就从面试官的角度来给一些小建议。 事先声明哈&…

【数学建模】机器人避障问题

已知&#xff1a; 正方形5的左下顶点坐标 ( 80 , 60 ) (80,60) (80,60)&#xff0c;边长 150 150 150机器人与障碍物的距离至少超过 10 10 10个单位规定机器人的行走路径由直线段和圆弧组成&#xff0c;其中圆弧是机器人转弯路径。机器人不能折线转弯&#xff0c;转弯路径由与…

单输入多输出(SIMO)和多输入多输出(MIMO)模型

我列举了一些单输入多输出&#xff08;SIMO&#xff09;和多输入多输出&#xff08;MIMO&#xff09;模型的例子&#xff1a; 单输入多输出&#xff08;SIMO&#xff09;模型&#xff1a; 股票价格预测&#xff1a;在这个例子中&#xff0c;输入可能是某只股票的历史价格数据…

武汉星起航:自运营团队力创佳绩,年流水千万展跨境新高度

在风起云涌的跨境电商领域中&#xff0c;武汉星起航电子商务有限公司凭借其卓越的自运营能力&#xff0c;成为一颗璀璨的明星。而这背后&#xff0c;离不开一支专业性极强、拥有多年自运营经验的团队。他们凭借深厚的行业积累与不懈的拼搏精神&#xff0c;成功在亚马逊平台上打…

《6G数据面架构研究》

目录 一、数据服务的定义二、6G数据服务驱动力及面临的挑战6G数据服务的业务驱动6G数据服务的技术驱动6G数据服务的网络内在驱动6G数据面面临的挑战 三、6G数据服务典型场景自动化网络运维用户体验提升通信感知数据服务 四、6G数据面架构研究数据面架构视图功能定义说明&#x…

比较鸿蒙应用中MVVM与MVP模式在处理数据流、响应用户事件以及职责划分上的异同?

鸿蒙应用中MVVM与MVP模式的异同比较&#xff1a; 数据流处理&#xff1a; MVVM&#xff1a; 数据流从Model流向ViewModel&#xff0c;通过数据绑定机制&#xff08;如ObservableField、LiveData等&#xff09;自动同步到View。ViewModel持有Model的引用&#xff0c;监听数据变…

图深度学习——1.介绍

1、介绍 在数学中&#xff0c;图是描述于一组对象的结构&#xff0c;其中某些对象对在某种意义上是“相关的”&#xff08;存在某种关系&#xff09;。这些对象对应于称为顶点的数学抽象&#xff08;也称为节点或点&#xff09;&#xff0c;并且每个相关的顶点对都称为边&…

视频批量采集下载爬取软件|短视频爬虫提取工具

轻松获取视频&#xff01;视频批量下载神器问世 在日常工作中&#xff0c;我们经常需要大量的视频资源来支持各种需求&#xff0c;但传统的获取方式通常耗时费力&#xff0c;一个一个复制链接下载实在效率太低。为了解决这一难题&#xff0c;我们自主研发了一款强大的短视频批…

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测 目录 分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进麻雀优化算法优化最小二乘支持向量机分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述…

flex上下固定中间占固定高度(中间左右菜单)且内容自动滚动

效果图 布局&#xff1a; <view class"pop_tSet"><view class"pop_Con"><view class"box_bb"><view class"bb_title">{{titleObj[popType]}}</view></view><view class"box_bb_bot"…

固体矿产资源储量分类GBT17766-2020

1999分类标准采用三轴体系划分资源量与处理&#xff0c;表达复杂、经济意义划分过细、实用性不强 虽然不再采用”三轴“表达方式&#xff0c;但依然考虑地质可靠程度、经济意义、可行性评价 矿产资源勘查&#xff1a;通常依靠地球科学知识&#xff0c;运用地质填图&#xff0…

8条指南教你设计奶油风客厅。福州中宅装饰,福州装修

作为一名专业的设计师&#xff0c;我将为您带来一些关于奶油风客厅设计的干货。奶油风是一种温馨、柔和的装修风格&#xff0c;以下是一些设计指南&#xff0c;帮助您打造一个舒适而美丽的奶油风客厅。 1. 色彩搭配 除了米色、浅黄色和淡粉色等基础色调&#xff0c;还可以尝试…

Python程序设计 二维列表(二)

实验九 二维列表 1. 血压统计 血压的正常范围是 60mmHg<舒张压<90mmHg 90mmHg<收缩压<140mmHg 输入小张测量血压的日期&#xff0c;舒张压和收缩压&#xff0c;存放到列表xy中 将小张血压不正常次数百分比计算并显示出来 将小张血压不正常的日期&#xff0c;舒张…

Vscode | Python | launch.json配置gevent多进程断点失效问题处理

Vscode | Python | launch.json配置gevent多进程断点失效问题处理 文章目录 情况描述↓↓↓解决办法直接看这里↓↓↓ 情况描述 launch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more i…

MATLAB中gurobi 运行报错与调试

问题背景如下&#xff1a;刚拿到一份MATLAB的代码&#xff0c;但是电脑第一次安装gurobi&#xff0c;在运行过程中发生了报错&#xff0c;使用断点进行调试和步进调试方法&#xff0c;最终发现&#xff0c;这个问题出在了哪一步&#xff0c;然后向了人工智能和CSDN、百度寻求答…