如何3分钟,快速开发一个新功能

news/2024/5/19 21:30:22

背景

关于为什么做这个代码生成器,其实主要有两点:

  1. 参与的项目中有很多分析报表需要展示给业务部门,公司使用的商用产品,或多或少有些问题,这部分可能是历史选型导致的,这里撇开不不谈;
  2. 项目里面也有很多CRUD的功能,而这些功能的实现代码基本上差不多,这些功能都去手写,也比较浪费时间而且效率很低,还可能会写错;

针对这两个问题,就思考做一个简单的半自动的代码生成器,帮助团队的提升开发效率,只要在数据库中设计好表结构,就可以一键生成前后端代码、Swagger接口文档 、Validator参数校验。

设计

此篇主要是聊聊关于单表CRUD代码生成器的实现,后续大家可以扩展到树表、主子表,甚至还可以接入一些AI来扩展一下。整体技术方案,后端采用Spring Boot、Freemarker、MybatisPlus、Swagger等,前端使用Vue3、Element Plus。看到这里我想很多后端就知道我是如何做的了,整体核心实现就是通过Freemarker模版,增加一些配置项,动态生成CRUD的代码。这里做了一些细化设计,首先来看下整体的一个界面效果。
image.png
image.png
image.png
image.png

表结构设计

核心设计不变,只是增加三张表,可以进行自定义配置,让整个流程更加丝滑,整体表结构设计如下:
image.png
三张表分别是数据源配置表(tool_data_source_config)、表定义(tool_generator_table)以及列定义(tool_generator_column),数据源配置表主要是连接数据库相关的配置,表定义主要是类的抽象,包括整个类的包结构目录,列定义主要类字段的定义,并且包含一些CRUD条件定义。通过这三张表的定义,就可以实现半自动化代码生成。

代码设计

整体设计分为两部分,一部分通过MyBatis Plus Generator读取数据源配置,获取对应表的TableInfo信息,最终映射到表定义和列定义的表中,另外一部分就是通过Freemarker定义模板生成对应前端和后端代码。这里需要注意的是每个表名定义都是模块名加自身的业务抽象。
image.png
给大家看下核心代码,以下代码是通过MyBatis Plus Generator获取TableInfo,TableInfo包含数据库表的定义,后需要主要使用tableName、columns、tableComment等相关的属性,转换为tool_generator_table和tool_generator_column表相关的内容;

    private List<TableInfo> getAllTable(Long dataSourceConfigId, String tableName) {// 获得数据源配置ToolDataSourceConfig config =dataSourceConfigService.getDataSourceConfig(dataSourceConfigId);// 使用 MyBatis Plus Generator 解析表结构DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(),config.getPassword()).build();StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder();if (StringUtils.isNotEmpty(tableName)) {strategyConfig.addInclude(tableName);}GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.TIME_PACK).build();ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfig, strategyConfig.build(),null, globalConfig, null);List<TableInfo> tables = builder.getTableInfoList();tables.sort(Comparator.comparing(TableInfo::getName));return tables;}

以下代码是通过Freemarker生成对应的模版,具体的细节部分,可以在GitHub上查看;

public Map<String, String> execute(ToolGeneratorTable table, List<ToolGeneratorColumn> columns) {//初始化Map<String, Object> bindingMap = initBindingMap(table, columns);//获取对应模版Map<String, String> templates = getTemplates();Map<String, String> result = Maps.newLinkedHashMapWithExpectedSize(templates.size());templates.forEach((key, value) -> {generateCode(result, key, value, bindingMap);});return result;
}private void generateCode(Map<String, String> result, String vmPath, String filePath, Map<String, Object> bindingMap) {filePath = formatFilePath(filePath, bindingMap);try {StringWriter writer = new StringWriter();Template template = configuration.getTemplate(vmPath);template.process(bindingMap, writer);result.put(filePath, writer.toString());} catch (Exception exception) {log.error(vmPath + "模版加载异常" + exception);}
}

结束

GIt地址 欢迎大家Star,下图截图是核心代码的重要实现的类。
image.png


http://www.mrgr.cn/p/00254068

相关文章

js逆向实战之喜马拉雅Xm-Sign参数解密

url:https://www.ximalaya.com/channel/11/ 分析过程抓包,关注有页面数据回显的数据包。该url的请求头中有个加密的参数,找到该参数的加密过程。由于该参数名比较不常见,可以直接全局搜索这个参数名。只有一处,打断点。切换页码,触发断点。非常直接,xm-sign是由d.getSig…

【中级软件设计师】上午题12-软件工程(2):单元测试、黑盒测试、白盒测试、软件运行与维护

【中级软件设计师】上午题12-软件工程&#xff08;2&#xff09; 1 系统测试1.1 单元测试1.2 集成测试1.2.1 自顶向下1.2.2 自顶向上1.2.3 回归测试 2 测试方法2.1 黑盒测试2.1.1 McCabe度量法 2.2 白盒测试2.2.1 语句覆盖-“每个流程”执行一次2.2.2 判定覆盖2.2.3 条件覆盖-A…

可审批可审计追溯的单网络导出文件方案,了解一下!

在物理隔离状态下,单网络导出文件是一个重要的安全需求,特别是在处理敏感数据时。在这种环境下,数据导出需要采取特殊的安全措施,以确保数据传输的安全性和合规性。需要考虑以下因素: 安全性:确保传输过程加密,防止数据在传输过程中被截获。 性能:对于大文件或大量数据…

pyclipper的多边形操作(转载)

等距离缩放多边形: 参考博客:https://blog.csdn.net/jizhidexiaoming/article/details/134435885文本检测DBnet中对标签的预处理里面需要用到这个操作:将文本标注框等距离缩放用于生成标签二值图像和阈值图像,如下所示: 备注:上图出自Dbnet论文 原来python有个库pyclippe…

什么是K8s架构?一文让你全面了解K8s(Kubernetes)

什么是K8s架构?一文让你全面了解K8s(Kubernetes)K8S架构定义K8S是一个开源的容器部署和管理平台。它提供容器编排、容器运行时、以容器为中心的基础设施编排、负载平衡、自我修复机制和服务发现。K8S体系结构,有时也称为K8S应用程序部署体系结构或K8S客户端-服务器体系结构,…

Java并发编程:ThreadPoolExecutor详细源码解析与应用

Thread直接创建线程的弊端 在开始解析ThreadPoolExecutor类之前&#xff0c;让我们先来了解直接创建线程所带来的弊端。在Java中&#xff0c;线程是资源密集型对象&#xff0c;每当需要并发执行任务时&#xff0c;直接创建新线程会带来以下问题&#xff1a; 资源消耗 每个线…

使用 ForAttributeWithMetadataName 提高 IIncrementalGenerator 增量 Source Generator 源代码生成开发效率和性能

本文将告诉大家如何使用 ForAttributeWithMetadataName 方法用来提高 IIncrementalGenerator 增量 Source Generator 源代码生成的开发效率以及提高源代码生成器的运行效率这是一个在 2022 的 6 月 15 才合入的新功能。原因是 Roslyn 团队发现了大量的源代码生成器和分析器项目…

新媒体运营-----短视频运营-----PR视频剪辑----软件基础

新媒体运营-----短视频运营-----PR视频剪辑-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/138079659 文章目录 1.1 PR软件重置与初始化设置1.2 新建项目及序列设置1.3 PR工作区的管理方法1.4 导入4K超高清视频并与ME配合工作1…

Devops基本概念和原理,什么是 DevOps? DevOps 介绍

Devops基本概念和原理,什么是 DevOps? DevOps 介绍Devops基本概念和原理,什么是 DevOps? DevOps 介绍 一、什么是DevOps 1、 DevOps概述 DevOps,即Development and Operations,是一组过程、方法与系统的统称,用于促进软件开发、运维和质量保障部门之间的沟通、协作与整合…

矩阵树定理 BEST 定理

傲慢的青蛙矩阵树定理 \(\text{BEST}\) 定理 证明很复杂,连 \(\text{cmd}\) 这种无敌神犇都不会,而且对定理本身的可扩展性几乎为 \(0\),即每次套用的定理都跟模板一模一样。 矩阵树 无论任何情况,一定要不能有自环 无论任何情况,一定要不能有自环 无论任何情况,一定要不…

T1级,生产环境事故—Shell脚本一键备份K8s的YAML文件

大家好&#xff0c;我叫秋意零。 最近对公司进行日常运维工作时&#xff0c;出现了一个 T1 级别事故。导致公司的“酒云网”APP的无法使用。我和我领导一起搞了一个多小时&#xff0c;业务也停了一个多小时。 起因是&#xff1a;我的部门直系领导&#xff0c;叫我**删除一个 …

深入分析nginx偶尔502错误根因-以及常见错误总结

以架构师的能力标准去分析每个问题&#xff0c;过后由表及里分析问题的本质&#xff0c;复盘总结经验&#xff0c;并把总结内容记录下来。当你解决各种各样的问题&#xff0c;也就积累了丰富的解决问题的经验&#xff0c;解决问题的能力也将自然得到极大的提升。励志做架构师的…

二项式系数

火大二项式系数 更完整的思考过程以及代数推理过程都可以看数学书,所以我尽量给每个式子都赋予组合意义。 因为在有足够强的代数推理能力之前,没有组合意义往往是困难的。 恒等式赋予组合意义往往都是左边右边分开找意义。 常见公式: \[\begin{aligned} \binom{n}{k}&=\…

Verilog2001中bit slicing特性

1、问题来源 HDLBits题目:Mux256to1v 实现256-1且位宽为4的多路选择器 从下图可以发现,直接使用in[ sel4+3 : sel4 ]是不行的,会报错2、两种解决方法利用bit slicing特性 bit slicing特性的内容可以参考link1module top_module( input [1023:0] in,input [7:0] sel,output […

TODO-力扣-661. 图片平滑器

1.题目 题目地址(661. 图片平滑器 - 力扣(LeetCode)) https://leetcode.cn/problems/image-smoother/ 题目描述 图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。 每个单元格的 平均灰度 定义为:该单元格…

力扣-提交执行报错类型

1.参考 参考链接:提交执行报错 1.1 超出内存限制1.2 数组访问越界1.3 初始化有误1.4 递归基线错误

uniapp H5实现签名

第一种&#xff1a;跳转签名页面 1、创建审核页面audit.vue <template><view><uni-section title""><view class"auditClass"><uni-forms :model"baseFormData" ref"baseFormRef" :rules"rules&quo…

zigbee开发,低功耗,通信加密开发

一。低功耗 1.低功耗应用场景1、不利于更换电池的设备2、手持便携设备3、实时性要求不高的设备 2.低功耗工作原理1、时钟降至最低2、暂时不用的外设关闭、需要在启动3、I/O配置 用电情况可以简化为: 等一会运行一下。 3.zigbee实现低功耗 1.协调器+路由器+终端 补充:CC2530(…

爽了!免费的SSL,还能自动续期!

作者:小傅哥 博客:https://bugstack.cn沉淀、分享、成长,让自己和他人都能有所收获!😄大家好,我是技术UP主小傅哥。 兄弟👬🏻,当你手里有不少域名,每个域名又配置子域名,那么ssl将是一笔不小的费用。当然各个云厂商,也都有提供免费的ssl证书,但这里有一个问题,…

【C++】---STL之list的模拟实现

【C】---STL之list的模拟实现 一、list模拟实现思路二、结点类的实现三、list迭代器的实现1、ListIterator类2、构造函数3、operator*运算符重载5、operator->运算符重载6、operator&#xff01;运算符重载7、operator运算符重载8、前置9、后置10、前置--11、后置-- 四、lis…