Code Generate V1.0 代码生成器

根据配置的模板,根据建表语句,生成Code。

例如java代码、vue代码、jsp代码以及html代码等等,均可根据自己的代码写作习惯进行配置。

缺点:配置的模板,需要在工程里面写死,不够灵活。

页面

Java

包括常用 Controller、Service、Mapper、Entity;

Vue

以Element-UI代码为例,表格、增加、删除、修改;

themyleaf

基于Layui 表格、增加、删除、修改;

Jsp

基于Layui 表格、增加、删除、修改;

测试样例

建表语句


CREATE TABLE `course`
(
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`course_no` int(11) DEFAULT NULL COMMENT '课程编号',
`course_name` varchar(255) DEFAULT NULL COMMENT '课程名称',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`creator` varchar(255) DEFAULT NULL COMMENT '创建人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

测试

以生成Java实体类为例

package ${packageName}.entity;

import java.util.Date;

import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data; import java.io.Serializable; /**
* (${className})表实体类
*
* @author ${author}
* @since ${date}
*/
@Data
public class ${className} extends Model<${className}> {
<#list fieldList as field>
/**
* ${field.comment}
*/
private ${field.type} ${field.name};
</#list>
}

Result

package com.java.entity;

import java.util.Date;

import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data; import java.io.Serializable; /**
* (Course)表实体类
*
* @author HelloWorld
* @since 2023-03-14 14:38:05
*/
@Data
public class Course extends Model<Course> {
/**
* 主键ID
*/
private Integer id;
/**
* 课程编号
*/
private Integer courseNo;
/**
* 课程名称
*/
private String courseName;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人
*/
private String creator;
}

Code

依赖

只列出关键依赖

  <!--freemarker依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

TemplateService.java


@Service
public class TemplateService { @Autowired
private ResourceLoader resourceLoader; /**
* 统一 返回代码段
*
* @param tem 模板实体
* @return
* @throws IOException
*/
public String commonReturnCode(TemplateEntity tem) throws IOException {
//template:resource目录下的ftl文件放置目录
SpringTemplateLoader templateLoader = new SpringTemplateLoader(resourceLoader, "classpath:templates");
// 创建配置实例
Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
// 设置编码
configuration.setDefaultEncoding(StandardCharsets.UTF_8.name());
configuration.setTemplateLoader(templateLoader);
try {
// 获取模板
Template template = configuration.getTemplate(tem.getTemplatePath()+tem.getTemplateName());
StringWriter writer = new StringWriter();
template.process(tem.getParams(), writer);
return writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

GenerateService.java

@Service
public class GenerateService { @Resource
private TemplateService templateService; /**
* 生成java代码
*
* @param typeList 需要的类型 例如 1:entity 2:mapper 等等
* @return
*/
public Result generateJavaCode(String sql ,String author,String packageName, List<Integer> typeList) {
// 接收结果
Map<String, String> result = new HashMap<>(); POJOmaker pojOmaker = ResolveSqlUtil.resolve(sql,"","",packageName,author);
Map<String, Object> params = new HashMap<>();
// 作者名
params.put("author",author);
// 类名
params.put("className",pojOmaker.getClassName());
// 字段集
params.put("fieldList",pojOmaker.getFieldList());
// 包名
params.put("packageName",pojOmaker.getPackageName());
// 创建时间
params.put("date",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); typeList.forEach(type -> {
// 实体类
if (type == ENTITY_TYPE) {
String code = "";
try {
code = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_JAVA,"Entity.java.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("entity",code);
}
// Mapper 层
if (type == MAPPER_TYPE) {
String code = "";
try {
code = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_JAVA,"Mapper.java.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("mapper",code);
} // service层
if (type == SERVICE_TYPE) {
String code = "";
try {
code = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_JAVA,"Service.java.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("service",code);
}
// serviceImpl 实现
if (type == SERVICE_IMPL_TYPE) {
String code = "";
try {
code = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_JAVA,"ServiceImpl.java.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("serviceImpl",code);
}
// controller
if (type == CONTROLLER_TYPE) {
String code = "";
try {
code = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_JAVA,"Controller.java.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("controller",code);
}
});
return Result.success("success",result);
} /**
* 生成vue 代码
* @return
*/
public Result generateVueCode(String sql){
POJOmaker pojOmaker = ResolveSqlUtil.resolve(sql,"","","","");
// 接收结果
Map<String, String> result = new HashMap<>();
// 参数
Map<String, Object> params = new HashMap<>();
// 字段
params.put("fieldList",pojOmaker.getFieldList());
// 类名
params.put("className",pojOmaker.getClassName());
// 生成表格
String vue = "";
try {
vue = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_VUE,"Table.vue.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("vue",vue); // 生成弹窗
String dialog = "";
try {
dialog = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_VUE,"Dialog.vue.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("dialog",dialog);
return Result.success("success",result);
} /**
* 生成JSP代码
* @return
*/
public Result generateJspCode(String sql,String author){
POJOmaker pojOmaker = ResolveSqlUtil.resolve(sql,"","","","");
// 接收结果
Map<String, String> result = new HashMap<>();
// 参数
Map<String, Object> params = new HashMap<>();
// 字段
params.put("fieldList",pojOmaker.getFieldList());
// 类名
params.put("className",pojOmaker.getClassName());
// 作者名
params.put("author",author);
// 创建时间
params.put("date",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// 生成表格
String html = "";
try {
html = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_JSP,"index.jsp.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("jsp",html); // 生成弹窗
String js = "";
try {
js = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_JSP,"index.js.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("js",js);
return Result.success("success",result);
} /**
* 生成ThemyLeaf 代码
* @return
*/
public Result generateThemyLeafCode(String sql){
POJOmaker pojOmaker = ResolveSqlUtil.resolve(sql,"","","","");
// 接收结果
Map<String, String> result = new HashMap<>();
// 参数
Map<String, Object> params = new HashMap<>();
// 字段
params.put("fieldList",pojOmaker.getFieldList());
// 类名
params.put("className",pojOmaker.getClassName());
// 生成表格
String html = "";
try {
html = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_THEMYLEAF,"index.html.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("html",html); // 生成弹窗
String js = "";
try {
js = templateService.commonReturnCode(new TemplateEntity(params,TEMPLATE_THEMYLEAF,"index.js.ftl"));
} catch (IOException e) {
throw new RuntimeException(e);
}
result.put("js",js);
return Result.success("success",result);
} /**
* mapper 在系统内部
*/
public void generateMapper() {
Configuration configuration = new Configuration(new Version("2.3.3"));
configuration.setDefaultEncoding("utf-8");
String absolutePath = System.getProperty("user.dir") + "\\src\\main\\resources\\templates";
try {
// 加载.ftl配置文件所在路径
configuration.setDirectoryForTemplateLoading(new File(absolutePath));
// 放模板变量的值
Map<String, Object> params = new HashMap<>();
params.put("package", "io.demo.generator");
params.put("mapper", "dao");
params.put("author", "xxx");
params.put("date", "2022-06-03");
params.put("comments", "freemarker模板");
params.put("className", "GenerateFile");
params.put("mapperSuffix", "Mapper");
//给文件赋值
Template template = configuration.getTemplate("Mapper.java.ftl");
// 文件输出路径
FileOutputStream file = new FileOutputStream("C:\\Users\\最可爱的WXQ\\Desktop\\文件资源\\GenerateFileMapper.java");
OutputStreamWriter out = new OutputStreamWriter(file, "utf-8");
template.process(params, out);
out.close();
} catch (IOException | TemplateException exception) {
exception.printStackTrace();
}
}
}

GenerateController.java

/**
* Code 接口
*/
@RestController
@RequestMapping("code")
public class GenerateController { @Resource
private GenerateService generateService; /**
* 生成java代码
*
* @return
*/
@PostMapping("/generateJavaCode")
public Result generateJava(@RequestBody BaseInfo baseInfo) {
return generateService.generateJavaCode(baseInfo.getSql(), baseInfo.getAuthor(), baseInfo.getPackageName(), baseInfo.getType());
} /**
* 生成Vue Code
*
* @return
*/
@PostMapping("/generateVueCode")
public Result generateVue(@RequestBody BaseInfo baseInfo) {
return generateService.generateVueCode(baseInfo.getSql());
} /**
* 生成ThemyLeaf Code
*
* @return
*/
@PostMapping("/generateThemyLeafCode")
public Result generateThemyLeaf(@RequestBody BaseInfo baseInfo) {
return generateService.generateThemyLeafCode(baseInfo.getSql());
} /**
* 生成 JSP Code
*
* @return
*/
@PostMapping("/generateJspCode")
public Result generateJsp(@RequestBody BaseInfo baseInfo) {
return generateService.generateJspCode(baseInfo.getSql(),baseInfo.getAuthor());
}
}

前端的代码,只需要调用接口即可。

Code Generate 代码生成器 V1.0的更多相关文章

  1. RDIFramework.NET平台代码生成器V1.0发布(提供下载)

    RDIFramework.NET平台代码生成器V1.0发布(提供下载)   RDIFramework.NET(.NET快速开发整合框架)框架做为信息化系统快速开发.整合的框架,其目的一至是给用户和开发 ...

  2. Windows环境下Android Studio v1.0安装教程

    Windows环境下Android Studio v1.0安装教程 准备工具 JDK安装包. 要求:JDK 7以及以上版本. Android Studio安装文件. Windows: exe(包含SD ...

  3. SQL防注入程序 v1.0

    /// ***************C#版SQL防注入程序 v1.0************ /// *使用方法: /// 一.整站防注入(推荐) /// 在Global.asax.cs中查找App ...

  4. 【转】Windows环境下Android Studio v1.0安装教程

    原文网址:http://ask.android-studio.org/?/article/9 http://android-studio.org/index.php/docs/experience/1 ...

  5. [iOS UI进阶 - 2.0] 彩票Demo v1.0

    A.需求 1.模仿“网易彩票”做出有5个导航页面和相应功能的Demo 2.v1.0 版本搭建基本框架   code source:https://github.com/hellovoidworld/H ...

  6. ZXing工具类v1.0

    package com.jadyer.util; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import jav ...

  7. MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能...

    MingQQ v1.0高仿版开源了,使用WebQQ协议实现了QQ客户端基本的聊天功能... MingQQ目前支持的功能如下:1.支持普通方式登录.验证码方式登录.注销.保持在线.改变在线状态.2.支持 ...

  8. MathExam小学一二年级计算题生成器V1.0

    MathExam小学一二年级计算题生成器v1.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning ...

  9. Python WSGI v1.0 中文版(转)

    add by zhj: WSGI全称Web Server Gateway Interface,即Web网关接口.其实它并不是OSI七层协议中的协议,它就是一个接口而已,即函数,而WSGI规定了该接口的 ...

  10. 安卓开发开发规范手册V1.0

    安卓开发开发规范手册V1.0 之前发布过一份Web安全开发规范手册V1.0,看到收藏文章的读者挺多,发现整理这些文档还挺有意义. 最近周末抽了些时间把之前收集关于安卓安全开发的资料也整理了一下,整理出 ...

随机推荐

  1. day26:装饰器&面向对象当中的方法&property

    目录 1.装饰器 1.1 装饰器的基本用法 1.2 @符号的使用 1.3 装饰器的嵌套 1.4 用装饰器扩展带有参数的原函数 1.5 用装饰器扩展带有参数和返回值的原函数 1.6 用类装饰器扩展原函数 ...

  2. IT技术相关学习网站推荐

    引入在线jQuery的地址   http://code.jquery.com 唠嗑吧 IT技术经验交流    http://www.laodao8.com 博学谷视频库  传智播客   http:// ...

  3. .Net 6.0 部署Linux+Nginx +PM2教程

    今天带大家将本地.Net6.0项目部署到Linux系统中,其中有用到Nginx反向代理和PM2进程管理工具,希望本偏文章能对你有所帮助,成为你成功路上的垫脚石! 背景: 在.Net 5.0横空出世之后 ...

  4. 如何将 Spire.Doc for C++ 集成到 C++ 程序中

    Spire.Doc for C++是一个专业的 Word 库,供开发人员在任何类型的 C++ 应用程序中阅读.创建.编辑.比较和转换 Word 文档. 本文演示了如何以两种不同的方式将 Spire.D ...

  5. 2021牛客OI赛前集训营-提高组(第三场) 第二题 交替 题解与结论证明

    题目描述 一个长度为 \(n\) 的数组\(A\),每秒都会变成一个长度为 \(n − 1\) 新数组 \(A'\),其变化规 则如下: 若当前数组 \(A\) 的长度 \(n\) 为偶数,则对于新数 ...

  6. ChatGPT不算新技术革命,带不来什么新机会(转载)

    吴军,1967年出生,毕业于清华大学和约翰霍普金斯大学,计算机专业博士,前Google高级资深研究员.原腾讯副总裁.硅谷风险投资人. 近日,计算机科学家.自然语言模型专家吴军,就人工智能和ChatGP ...

  7. 2020-10-15:mysql的双1设置是什么?

    福哥答案2020-10-15:#福大大架构师每日一题# [答案来自知乎:](https://www.zhihu.com/question/425704691) 其实就是innodb_flush_log ...

  8. 2022-02-06:等差数列划分 II - 子序列。 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目。 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称

    2022-02-06:等差数列划分 II - 子序列. 给你一个整数数组 nums ,返回 nums 中所有 等差子序列 的数目. 如果一个序列中 至少有三个元素 ,并且任意两个相邻元素之差相同,则称 ...

  9. 2021-08-21:给定一个数组arr,长度为N > 1,从中间切一刀,保证左部分和右部分都有数字,一共有N-1种切法,如此多的切法中,每一种都有:绝对值(左部分最大值 – 右部分最大值)。返回最大

    2021-08-21:给定一个数组arr,长度为N > 1,从中间切一刀,保证左部分和右部分都有数字,一共有N-1种切法,如此多的切法中,每一种都有:绝对值(左部分最大值 – 右部分最大值).返 ...

  10. vue全家桶进阶之路19:webpack资源打包工具

    Vue.js 是一个前端开发框架,它可以帮助我们快速构建单页应用和复杂的交互界面.而 Webpack 则是一个前端资源打包工具,它可以将多个 JavaScript.CSS.HTML.图片等资源打包成一 ...