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

embedded/2024/9/20 3:53:04/ 标签: java

背景

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

  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表相关的内容;

java">    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上查看;

java">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.ppmy.cn/embedded/16481.html

相关文章

融合创新:LangChain、阿里云通义千问与SerpApi搜索的强强联合

随着人工智能技术的飞速发展,各类创新工具不断涌现,旨在为用户提供更高效、精准的信息获取与处理能力。本文将聚焦于三个颇具代表性的技术平台——LangChain、阿里云通义千问与SerpApi搜索,探讨它们各自的特性与优势,并展望它们如何相互融合,共同构建强大的智能解决方案。…

Android TV 桌面图标闪

<?xml version"1.0" encoding"utf-8"?> <!-- Copyright (C) 2014 The Android Open Source ProjectLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the Lice…

mongodb使用debezium

前置 服务器上需要安装jdk11 jdk下载地址 kafka安装 官网下载地址 安装教程 debezium 安装 运行 Debezium 连接器需要 Java 11 或更高版本 Debezium 并不是一个独立的软件&#xff0c;而是很多个 Kafka 连接器的总称。这些 Kafka 连接器分别对应不同的数据库&#xff0c;…

LoRa技术在物联网领域的安全性挑战与应对策略分享

随着物联网技术的飞速发展&#xff0c;LoRa技术作为一种新兴的无线通信技术&#xff0c;在物联网领域展现出了广阔的应用前景。然而&#xff0c;与此同时&#xff0c;其安全性问题也日益凸显&#xff0c;成为了制约其进一步发展的重要因素。本文将深入分析LoRa网络存在的安全漏…

【QEMU系统分析之启动篇(十七)】

系列文章目录 第十七章 QEMU系统仿真的显示初始化分析 文章目录 系列文章目录第十七章 QEMU系统仿真的显示初始化分析 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的启动分析1.系统仿真的初始化代码2.主循环数据初始化3. qemu_init_displays()init_displaystate()qemu_di…

区块链技术与应用学习笔记(8-9节)——北大肖臻课程

目录 8.挖矿 对于全节点和轻节点思考问题&#xff1f; ①全节点在比特币的主要作用&#xff1f; ②挖矿时当监听到别人已经挖出区块并且延申了最长合法链此时应该立刻放弃当前区块在 本地重新组装一个指向最后这个新合法区块的候选区块&#xff0c;重新开始挖矿。节点这么做…

Swift - Hello World

文章目录 Swift - Hello World1. Hello World Swift - Hello World 1. Hello World 不用编写main函数&#xff0c;Swift将全局范围内的首句可执行代码作为程序入口一句代码尾部可以省略分号&#xff08;;&#xff09;&#xff0c;多句代码写到同一行时必须用分号&#xff08;…

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道&#xff0c;以收集、分析和利用客户数据&#xff0c;优化营销活动&#xff0c;并提高营销效果。 数字资产是一种新型的资产类别&#xff0c;它们以电子数据的形式存在&#xff0c;可…

基于Python实现心脏病数据可视化DEA+预测【500010103.1】

一、数据说明 该心脏病数据集是通过组合 5 个已经独立可用但以前未合并的流行心脏病数据集来策划的。在这个数据集中&#xff0c;5 个心脏数据集结合了 11 个共同特征&#xff0c;使其成为迄今为止可用于研究目的的最大心脏病数据集。 该数据集由 1190 个实例和 11 个特征组成…

Git工具的使用

文章目录 Git概述本地仓库命令远程仓库命令分支操作标签操作 IDEA上执行Git Git概述 一般工作流程如下&#xff1a; 从远程仓库中克隆 Git 资源作为本地仓库&#xff1b; 从本地仓库中checkout代码然后进行代码修改&#xff1b; 在提交本地仓库前先将代码提交到暂存区&#xff…

Qt——自定义富文本RichText

作者&#xff1a;小 琛 欢迎转载&#xff0c;请标明出处 文章目录 产品中的富文本富文本控件会面临的问题QTextBrowser例子&#xff1a;自定义富文本 产品中的富文本 用户界面中支持显示富文本格式&#xff08;如加粗、斜体、不同颜色、超链接等&#xff09;的文本内容。这种富…

政安晨:【Keras机器学习示例演绎】(十六)—— 用于图像分类的混合增强

目录 简介 设置 准备数据集 定义超参数 将数据转换为 TensorFlow 数据集对象 定义混合技术函数 可视化新的增强数据集 模型制作 1.使用混合数据集训练模型 2.在没有混合数据集的情况下训练模型 说明 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评…

C#鼠标拖拽无边框浮动窗体的方法:窗体控制

目录 (1)ReleaseCapture函数 (2)SendMessage函数 (3)实例 1.Resources.Designer.cs 2.Form1.Designer.cs 3.Form1.cs 一般情况下&#xff0c;在标题栏中按住鼠标左键不放即可实现拖动操作。 当做浮动窗体时&#xff0c;如果包含窗体边框&#xff0c;那么界面给使用者的感…

深度学习中的子空间、线性变换和矩阵概念应用

1.表示子空间 在深度学习中&#xff0c;“不同的表示子空间”通常是指模型通过不同的参数&#xff08;例如权重矩阵&#xff09;将输入数据映射到不同的高维空间&#xff0c;这些空间被称为表示子空间。每个子空间都能够捕获输入数据中不同的特征或模式。以下是一些详细解释&am…

php视图处理类

#简介 视图模版替换支持变量,for循环,foreach循环,if判断,if else判断 #调用 index.php <?php use ppt\tool\View; $haha 12; $id 111; $arr [x,y,3]; $pp [x>[id>1,name>12],y>[id>1,name>12],z>[id>1,name>12], ]; echo View::display…

Quarto Dashboards 教程 2:Dashboard Layout

「写在前面」 学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度&#xff0c;分享官方文档的中文教程。软件可能随时更新&#xff0c;建议配合官方文档一起阅读。推荐先按顺序阅读往期内容&#xff1a; 1.quarto 教程 1&#xff1a;Hello, Quarto 2.qu…

diskMirror-backEnd-spring-boot | diskMirror 后端服务器 SpringBoot 版本!

diskMirror-backEnd-spring-boot diskMirror 后端服务器的 SpringBoot 版本&#xff0c;此版本中拓展了 DiskMirrorBackEnd&#xff0c;是一个完全的SpringBoot项目&#xff01; 目录 文章目录 diskMirror-backEnd-spring-boot目录我如何部署与配置docker 方式部署 diskMirro…

ctfshow web入门 SQl注入 web185--web190

web185 这道题还有另外一个脚本就是用concat的拼接达到有数字的目的 concat(truetrue) 2 concat(true) 1 concat(true, true) 11 然后上脚本&#xff08;Y4tacker这个师傅的&#xff09; # Author:Y4tacker import requestsurl "http://341e93e1-a1e7-446a-b7fc-75beb…

【threejs教程9】threejs加载360全景图(VR)的两种方法

目录 前言 1.Equirectangular映射背景 实现步骤 1.初始化TextureLoader 2.加载Equirectangular纹理 3.配置映射类型和颜色空间 4.应用背景 完整代码如下 2.立方体贴图背景 实现步骤 1.创建CubeTextureLoader 2.加载立方体贴图 3.应用背景 完整代码如下 …

从国内盲盒小程序看国外市场的发展机遇与挑战

近年来&#xff0c;盲盒小程序在国内市场迅速崛起&#xff0c;凭借其独特的营销模式和消费者体验&#xff0c;赢得了大量年轻消费者的喜爱。从国内盲盒小程序的发展中&#xff0c;我们可以窥见国外市场的一些发展机遇与挑战&#xff0c;为进军国际市场提供有益的参考。 首先&a…