01-项目总览
遵循企业项目开发的标准流程:
- 需求分析
- 技术选型
- 项目设计
- 项目初始化
- Demo 编写
- 前后端开发实现
- 测试验证
- 部署上线
1. 项目介绍
基于 React + Spring Boot + Vert.x
响应式编程的 定制化代码生成项目,完整项目分为 3 个阶段:
- 制作《本地代码生成器》,是一个 基于命令行的脚手架 ,能够根据用户的交互式输入快速生成特定代码
- 开发制作《代码生成器的工具》
- eg:有一段常用的项目代码,使用该工具,可以快速把项目代码制作为代码生成器,提高工作效率
- 开发《在线代码生成器平台》,可以在平台上制作发布自己的代码生成器,还可以在线使用别人的代码生成器,甚至可以共享协作
2. 项目背景
也是一个需求分析的过程
1. 学习意义
- 教程资料少:网上虽然有现成的项目模板,但基本都是别人封装好的,只能按作者的要求生成,并且缺少项目教程;而本项目不仅带大家做自己的代码生成器,还会进一步扩展,打造制作自定义代码生成器的工具和平台
- 新颖且亮眼:别人写代码,而你做生产代码的脚手架、工具和平台来提高研发效能,降维打击
- 能学到东西:不再是增删改查的项目,而是包含了大量的实际业务场景、系统设计和解决方案
- 有区分度:区别于传统 Web 应用,项目涉及命令行应用、响应式编程、性能优化的入门及实战,简历增加竞争力
2. 解决的问题
- 代码生成器本身作用:自动生成常见、重复性的代码片段, 解决重复编码、效率低下的问题
- 虽然网上有很多代码生成器,但都是别人制作封装好的,很多时候还是 无法满足实际开发的定制化需求
- 在团队开发中,要生成的代码可能需要频繁变化和持续更新维护。如果有一个线上平台来维护多个不同的代码生成器,支持在线编辑和共享生成器,在提高开发效率的同时、将有利于协作共建,打造更高质量的代码生成器
3. 实际应用
- 经常做算法题目的同学,可能需要一套 Java ACM 代码输入模板,能够支持多种不同输入模式
- eg:单次读取和循环
- 开发新项目,可能需要一套初始化项目模板代码
- eg:一键生成 Controller(替换其中的对象)、整合 Redis 和 MySQL 依赖等
- 甚至可以制作项目 ”换皮” 工具,支持一键给网络热门项目换皮
- eg:替换项目的名称、Logo 等
3. 需求分析
1. 调研
- 网上有一些代码生成器项目。但这些项目都是开发者提前制作好了代码生成器,然后 根据设置好的规则 生成代码(或拉取特定位置的代码),生成后的代码通常还要再二次修改,不够灵活
- 前端 Ant Design Pro 中后台项目脚手架,能够让用户交互式地创建指定的项目
- 后端 MyBatis X 插件,能够让用户通过界面来创建 CRUD 重复代码
- 还有很多所谓的代码生成项目,其实本质上是一个现成的项目模板,通过编写对应的配置文件来使用项目,或还是基于预设的程序来生成特定代码
- eg:ooxx导航 的 Spring Boot 万用项目模板,或网上很多知名的开源管理系统
4. 技术选型
1. 前端
- React 开发框架 + 组件库 + 代码编辑器
- 前端工程化:ESLint + Prettier + TypeScript
2. 后端
- Spring Boot + MySQL + MyBatis Plus(万用后端模板)
- Java 命令行应用开发
- FreeMarker 模板引擎
- Vert.x 响应式编程
- Caffeine + Redis 多级缓存
- 分布式任务调度系统
- 多种设计模式
- 多种系统设计的巧思
- 对象存储
3. 学习重点
- Java 命令行应用开发、FreeMarker 模板引擎、Vert.x 响应式编程、设计模式、系统设计的巧思、分布式任务调度系统
- Vert.x 框架,并发连接处理能力吊打 Spring 几条街!
- Web Framework Benchmarks 性能对比网站
5. 项目设计
1. 核心原理
一句话:参数 + 模板文件 = 生成的完整代码
- 比如参数:
作者 = ooxx
- 模板文件代码:
-----------
我是 ${作者}
-----------
- 将参数注入到模板文件中,得到生成的完整代码:
-----------
我是 谷牛
-----------
1. 本地代码生成器
- 目标是做一个本地(离线)的代码生成器,实现一个简易的 Java ACM 模板项目的定制化生成
1. 业务流程
- 准备用于制作代码生成器的原始代码(eg:Java ACM 模板项目),用于后续生成
- 开发者基于原始代码,设置参数、编写动态模板
- 制作可交互的命令行工具,支持用户输入参数,得到代码生成器 jar 包
- 使用者得到代码生成器 jar 包,执行程序并输入参数,从而生成完整代码
流程图如下:
2. 实现思路
- 先根据本地项目,扫描文件树,实现同样的静态代码生成
- 根据本地的项目,预设部分动态参数、编写模板文件,能够传入配置对象进行生成
- 制作可交互的命令行工具,接受用户输入的参数,并动态生成代码
- 封装制作代码生成器 jar 包文件,并简化使用命令
3. 关键问题
- 如何根据一套项目文件,完整地生成同样一套项目?
- 如何编写动态模板文件?怎么根据模板和参数生成代码?
- 如何制作命令行工具?如何交互式接受用户的输入?
- 怎么将命令行工具制作为 jar 包?怎么简化使用命令?
2. 生成器制作工具
- 目标:做一个本地的代码生成器制作工具,能够快速将一个项目制作为可以动态定制部分内容的代码生成器。并且以一个 Spring Boot 初始化项目模板(Maven 项目)为例,演示如何根据自己的需要动态生成 Java 后端初始化项目
- 需要一定的 Spring Boot 开发知识,最好先完成 ooxx导航的其他项目 ,推荐用户中心和聚合搜索
1. 业务流程
- 准备用于制作代码生成器的原始代码(Spring Boot 项目模板),用于后续生成
- 开发者基于原始代码, 使用工具 ,来快速设置参数、生成动态模板
- 使用工具 ,动态生成代码生成器 jar 包
- 使用者得到生成器 jar 包,执行程序并输入参数,从而生成完整代码
2. 实现思路
- 使用独立空间来存储管理要生成的原始文件、动态模板文件等
- 使用配置文件来记录要生成的参数和模板文件信息、自定义配置等 元信息
- 工具需要有多种可单独或组合使用的功能(eg:从原始文件中抽取参数、动态生成命令行工具、打 jar 包等)
3. 关键问题
- 如何使用配置文件来记录参数和模板文件信息?何种结构?
- 怎么能够提高生成器的制作效率?工具应该提供哪些能力?
- 如何从原始文件中抽取参数?有哪些类型的参数?有哪些抽取规则?(布尔类型参数(是否生成)、字符串类型参数(生成指定的值)等)
- 如何动态生成配置类?如何动态生成命令行工具?如何动态打 jar 包?
3. 在线代码生成器平台
- 经过前两个阶段,已经能够使用工具来快速定制生成器了
- 但如果想和团队共同维护生成器、或使用其他人的生成器,通过本地文件互传的方式肯定就很麻烦了
- 所以本阶段要打造一个在线生成器平台,可以理解为生成器的 应用市场 。所有人都能发布、使用、甚至是在线制作自己的生成器!
1. 业务流程
- 获取用于制作代码生成器的原始代码(手动准备或远程拉取代码)
- 开发者基于原始代码,使用工具,来快速制作生成器
- 开发者发布生成器至平台
- 使用者在平台上搜索生成器,支持在线使用或下载离线 jar 包(甚至还可以支持接口调用)
2. 实现思路
- 使用 Web 开发框架实现生成器信息的 CRUD
- 将本地的配置和文件 上云 ,存储到DB、对象存储等云服务
- 通过可视化界面来操作第二阶段的工具,复用阶段二的成果
3. 关键问题
- 怎么在云上存储管理生成器?
- 如何通过前端开发,提高生成器的制作效率?
- 如何通过后端优化,提高生成器的制作性能?
- 如何保证生成器的存储空间不超限、如何优化存储?