01-项目总览

遵循企业项目开发的标准流程:

  • 需求分析
  • 技术选型
  • 项目设计
  • 项目初始化
  • Demo 编写
  • 前后端开发实现
  • 测试验证
  • 部署上线

1. 项目介绍

基于 React + Spring Boot + Vert.x 响应式编程的 定制化代码生成项目,完整项目分为 3 个阶段:

  1. 制作《本地代码生成器》,是一个 基于命令行的脚手架 ,能够根据用户的交互式输入快速生成特定代码
  2. 开发制作《代码生成器的工具》
    • eg:有一段常用的项目代码,使用该工具,可以快速把项目代码制作为代码生成器,提高工作效率
  3. 开发《在线代码生成器平台》,可以在平台上制作发布自己的代码生成器,还可以在线使用别人的代码生成器,甚至可以共享协作

2. 项目背景

也是一个需求分析的过程

1. 学习意义

  1. 教程资料少:网上虽然有现成的项目模板,但基本都是别人封装好的,只能按作者的要求生成,并且缺少项目教程;而本项目不仅带大家做自己的代码生成器,还会进一步扩展,打造制作自定义代码生成器的工具和平台
  2. 新颖且亮眼:别人写代码,而你做生产代码的脚手架、工具和平台来提高研发效能,降维打击
  3. 能学到东西:不再是增删改查的项目,而是包含了大量的实际业务场景、系统设计和解决方案
  4. 有区分度:区别于传统 Web 应用,项目涉及命令行应用、响应式编程、性能优化的入门及实战,简历增加竞争力

2. 解决的问题

  1. 代码生成器本身作用:自动生成常见、重复性的代码片段, 解决重复编码、效率低下的问题
  2. 虽然网上有很多代码生成器,但都是别人制作封装好的,很多时候还是 无法满足实际开发的定制化需求
  3. 在团队开发中,要生成的代码可能需要频繁变化和持续更新维护。如果有一个线上平台来维护多个不同的代码生成器,支持在线编辑和共享生成器,在提高开发效率的同时、将有利于协作共建,打造更高质量的代码生成器

3. 实际应用

  1. 经常做算法题目的同学,可能需要一套 Java ACM 代码输入模板,能够支持多种不同输入模式
    • eg:单次读取和循环
  2. 开发新项目,可能需要一套初始化项目模板代码
    • eg:一键生成 Controller(替换其中的对象)、整合 Redis 和 MySQL 依赖等
  3. 甚至可以制作项目 ”换皮” 工具,支持一键给网络热门项目换皮
    • eg:替换项目的名称、Logo 等

3. 需求分析

1. 调研

  • 网上有一些代码生成器项目。但这些项目都是开发者提前制作好了代码生成器,然后 根据设置好的规则 生成代码(或拉取特定位置的代码),生成后的代码通常还要再二次修改,不够灵活
    • 前端 Ant Design Proopen in new window 中后台项目脚手架,能够让用户交互式地创建指定的项目
    • 后端 MyBatis X 插件,能够让用户通过界面来创建 CRUD 重复代码
  • 还有很多所谓的代码生成项目,其实本质上是一个现成的项目模板,通过编写对应的配置文件来使用项目,或还是基于预设的程序来生成特定代码

4. 技术选型

1. 前端

  • React 开发框架 + 组件库 + 代码编辑器
  • 前端工程化:ESLint + Prettier + TypeScript

2. 后端

  • Spring Boot + MySQL + MyBatis Plus(万用后端模板)
  • Java 命令行应用开发
  • FreeMarker 模板引擎
  • Vert.x 响应式编程
  • Caffeine + Redis 多级缓存
  • 分布式任务调度系统
  • 多种设计模式
  • 多种系统设计的巧思
  • 对象存储

3. 学习重点

image.png
image.png

5. 项目设计

1. 核心原理

一句话:参数 + 模板文件 = 生成的完整代码

  • 比如参数:
作者 = ooxx
  • 模板文件代码:
-----------
我是 ${作者}
-----------
  • 将参数注入到模板文件中,得到生成的完整代码:
-----------
我是 谷牛
-----------

1. 本地代码生成器

  • 目标是做一个本地(离线)的代码生成器,实现一个简易的 Java ACM 模板项目的定制化生成

1. 业务流程

  1. 准备用于制作代码生成器的原始代码(eg:Java ACM 模板项目),用于后续生成
  2. 开发者基于原始代码,设置参数、编写动态模板
  3. 制作可交互的命令行工具,支持用户输入参数,得到代码生成器 jar 包
  4. 使用者得到代码生成器 jar 包,执行程序并输入参数,从而生成完整代码

流程图如下:

img

2. 实现思路

  1. 先根据本地项目,扫描文件树,实现同样的静态代码生成
  2. 根据本地的项目,预设部分动态参数、编写模板文件,能够传入配置对象进行生成
  3. 制作可交互的命令行工具,接受用户输入的参数,并动态生成代码
  4. 封装制作代码生成器 jar 包文件,并简化使用命令

3. 关键问题

  • 如何根据一套项目文件,完整地生成同样一套项目?
  • 如何编写动态模板文件?怎么根据模板和参数生成代码?
  • 如何制作命令行工具?如何交互式接受用户的输入?
  • 怎么将命令行工具制作为 jar 包?怎么简化使用命令?

2. 生成器制作工具

  • 目标:做一个本地的代码生成器制作工具,能够快速将一个项目制作为可以动态定制部分内容的代码生成器。并且以一个 Spring Boot 初始化项目模板(Maven 项目)为例,演示如何根据自己的需要动态生成 Java 后端初始化项目
  • 需要一定的 Spring Boot 开发知识,最好先完成 ooxx导航的其他项目open in new window ,推荐用户中心和聚合搜索

1. 业务流程

  1. 准备用于制作代码生成器的原始代码(Spring Boot 项目模板),用于后续生成
  2. 开发者基于原始代码, 使用工具 ,来快速设置参数、生成动态模板
  3. 使用工具 ,动态生成代码生成器 jar 包
  4. 使用者得到生成器 jar 包,执行程序并输入参数,从而生成完整代码
img

2. 实现思路

  1. 使用独立空间来存储管理要生成的原始文件、动态模板文件等
  2. 使用配置文件来记录要生成的参数和模板文件信息、自定义配置等 元信息
  3. 工具需要有多种可单独或组合使用的功能(eg:从原始文件中抽取参数、动态生成命令行工具、打 jar 包等)

3. 关键问题

  1. 如何使用配置文件来记录参数和模板文件信息?何种结构?
  2. 怎么能够提高生成器的制作效率?工具应该提供哪些能力?
  3. 如何从原始文件中抽取参数?有哪些类型的参数?有哪些抽取规则?(布尔类型参数(是否生成)、字符串类型参数(生成指定的值)等)
  4. 如何动态生成配置类?如何动态生成命令行工具?如何动态打 jar 包?

3. 在线代码生成器平台

  • 经过前两个阶段,已经能够使用工具来快速定制生成器了
  • 但如果想和团队共同维护生成器、或使用其他人的生成器,通过本地文件互传的方式肯定就很麻烦了
  • 所以本阶段要打造一个在线生成器平台,可以理解为生成器的 应用市场 。所有人都能发布、使用、甚至是在线制作自己的生成器!

1. 业务流程

  1. 获取用于制作代码生成器的原始代码(手动准备或远程拉取代码)
  2. 开发者基于原始代码,使用工具,来快速制作生成器
  3. 开发者发布生成器至平台
  4. 使用者在平台上搜索生成器,支持在线使用或下载离线 jar 包(甚至还可以支持接口调用)
img

2. 实现思路

  1. 使用 Web 开发框架实现生成器信息的 CRUD
  2. 将本地的配置和文件 上云 ,存储到DB、对象存储等云服务
  3. 通过可视化界面来操作第二阶段的工具,复用阶段二的成果

3. 关键问题

  1. 怎么在云上存储管理生成器?
  2. 如何通过前端开发,提高生成器的制作效率?
  3. 如何通过后端优化,提高生成器的制作性能?
  4. 如何保证生成器的存储空间不超限、如何优化存储?