查看原文
其他

我的新项目,已完结 6 期~

鱼皮 程序员鱼皮 2024-01-21

大家好,我是鱼皮,我的新项目 《鱼籽 - 定制化代码生成项目》 系列教程已经更新了 6 期,光文字教程就已经接近 60000 字了(足够一本书的量)~

本次项目依然是从 0 到 1 带大家开发,会遵循企业项目开发的标准流程:需求分析 => 技术选型 => 项目设计 => 项目初始化 => Demo 编写 => 前后端开发实现 => 测试验证 => 部署上线,带大家一步步完成整个项目。

本篇文章作为该项目的第一期教程,公开免费,给大家分享整个项目的介绍和背景、项目的技术选型、项目设计、业务流程、大致的实现思路和要解决的关键问题等,内容会比较轻松。

对于有能力的同学,学到了本文的思路,哪怕后面不跟着我的教程学习,应该也是能完成项目的,有一定的参考价值~

朋友们,准备开启新项目的学习之旅吧!

第一期视频教程免费:https://www.bilibili.com/video/BV1ie411Q7AV

开源地址:https://github.com/liyupi/yuzi-generator

文末有加入项目学习的方式,双 12 期间限时优惠 🧧



项目介绍

这次要带大家做的是一个非常有趣又实用的项目,基于 React + Spring Boot + Vert.x 响应式编程的 定制化代码生成项目

注意!这次的项目会很特别,听起来是一个项目,但其实是循序渐进的 3 个项目

完整项目分为 3 个阶段:

1)第一阶段,我会带大家制作属于自己的 本地代码生成器 ,是一个 基于命令行的脚手架 ,能够根据用户的交互式输入快速生成特定代码。

网上绝大多数的代码生成器教程,也只是讲到这个阶段。

2)第二阶段,让我们上升一个层次,带大家开发 制作代码生成器的工具 。比如你有一段常用的项目代码,使用该工具,可以快速把项目代码制作为代码生成器,将是提高工作效率的大杀器!

3)第三阶段,让我们再上升一个层次,带大家开发 在线代码生成器平台 !你可以在平台上制作发布自己的代码生成器,还可以在线使用别人的代码生成器,甚至可以共享协作!

之所以要分为 3 个阶段,一方面是因为项目是比较庞大的,拆分后学习会更轻松;另一方面是不同阶段的难度不同,大家可以根据自己的学习进度和时间独立学习。

比如即使你什么框架都没学过,也可以完成第一阶段;而如果你学过开发框架,可以完成第二阶段;如果你想学习更多高级知识和优化技巧,再去看第三阶段。够贴心吧~

项目背景

为什么要带大家做这个项目呢?

这也是一个需求分析的过程,我主要考虑的是:学习意义、解决的问题、实际应用三个方面。

学习意义

1)教程资料少:网上虽然有现成的项目模板,但基本都是别人封装好的,只能按作者的要求生成,并且缺少项目教程;而本项目不仅带大家做自己的代码生成器,还会 进 2 步 扩展,打造制作自定义代码生成器的工具和平台。

2)新颖且亮眼:别人写代码,而你做生产代码的脚手架、工具和平台来提高研发效能,降维打击。

3)能学到东西:不再是增删改查的项目,而是包含了大量的实际业务场景、系统设计和解决方案。

4)有区分度:区别于传统 Web 应用,项目涉及命令行应用、响应式编程、性能优化的入门及实战,给你的简历增加竞争力。

解决的问题

1)代码生成器本身的作用就是自动生成常见、重复性的代码片段,解决重复编码、效率低下的问题

2)虽然网上有很多代码生成器,但都是别人制作封装好的,很多时候还是 无法满足实际开发的定制化需求 (比如要在每个类上增加特定的注解和注释)。这也是为什么明明有代码生成器,很多开发者还是会抱怨自己的工作总是复制粘贴、编写重复的代码、天天 CRUD(增删改查)。如果能够有一个工具帮助开发者快速定制属于自己的代码生成器,那么将进一步提高开发效率。

3)在团队开发中,要生成的代码可能是需要频繁变化和持续更新维护的。如果有一个线上平台来维护多个不同的代码生成器,支持在线编辑和共享生成器,在提高开发效率的同时、将有利于协作共建,打造更高质量的代码生成器。

实际应用

举例一些代码生成的实际应用场景,我们将通过本项目进行解决:

1)经常做算法题目的同学,可能需要一套 Java ACM 代码输入模板,能够支持多种不同输入模式(比如单次读取和循环)。

2)经常开发新项目的同学,可能需要一套初始化项目模板代码,比如一键生成 Controller 层代码(替换其中的对象)、整合 Redis 和 MySQL 依赖等。

3)甚至可以制作项目 “换皮” 工具,支持一键给网络热门项目换皮(比如替换项目的名称、Logo 等)

项目特点

本次项目,会和之前的 鱼皮原创项目教程系列 一样,鱼皮依然会 从 0 到 1 全程直播无剪辑 地带大家开发完成项目,需求分析 => 技术选型 => 项目设计 => 项目初始化 => Demo 编写 => 前后端开发实现等,每个环节我都 从理论到实践 给大家讲的明明白白、每个细节都不放过!

鱼皮的实战项目系列还会提供以下服务:

  • 详细的直播笔记
  • 完整的项目源码
  • 答疑解惑
  • 专属项目交流群
  • ⭐️ 现成的简历写法(直接写满简历)
  • ⭐️ 项目的扩展思路(拉开和其他人的差距)
  • ⭐️ 项目相关面试题、题解和真实面经(提前准备,面试不懵逼)
  • ⭐️ Java 后端万用项目模板(快速创建项目)

而且这次的新项目,鱼皮会尝试一种新的模式:

1)代码全部开源:开源最大的好处是协作共建。一方面让项目持续发展、获取更多扩展点给大家学习参考;另一方面所有学完项目的同学都能参与项目共建、成为项目贡献者给简历加分,星球鱼友们在贡献代码时可以和大家交流,并且更容易参与贡献,我们争取一起做个很牛的项目!

从 0 开始跟学 1 个开源项目,然后直接成为贡献者,这绝对是一个非常刺激的体验~

2)讲解方式升级:会在原有直播带做项目的基础上,额外编写一套 文字教程 。兼容喜欢看文章学习的同学,并且便于大家复习~

虽然这种方式要花比原来多至少 1 倍的时间,但我还是希望能给大家更好的学习体验,毕竟看着大家拿到 offer,我也开心哈哈:

需求分析

其实上面已经带大家了解了项目的基本信息、项目的意义和价值。在需求分析阶段,我们通常还要进行一些调研工作,帮助我们明确需求、为后面的设计做好充分的准备。

调研

网上有一些代码生成器项目,比如前端 Ant Design Pro 中后台项目脚手架,能够让用户交互式地创建指定的项目;还有后端 MyBatis X 插件,能够让用户通过界面来创建 CRUD 重复代码。但这些项目都是开发者提前制作好了代码生成器,然后让你 根据他们设置好的规则 生成代码(或者拉取特定位置的代码),生成后的代码通常还要再自己二次修改,不够灵活。

还有很多所谓的代码生成项目,其实本质上是一个现成的项目模板,让你通过编写对应的配置文件来使用项目,或者还是基于预设的程序来生成特定代码。比如 编程导航知识星球 的 Spring Boot 万用项目模板,或者网上很多知名的开源管理系统。

这和我们要做的事情不同,我们的目标是升级一个层次!打造一个帮助大家快速制作代码生成器的工具,也就是 “造轮子的轮子”。

然后再升级一个层次!允许用户像发布应用一样,在平台上发布和管理代码生成器,便于共享和协作!

技术选型

暂定的核心技术如下,实际开发中还会引入新技术

前端

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

后端

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

学习重点

其中:Java 命令行应用开发、FreeMarker 模板引擎、Vert.x 响应式编程、设计模式、系统设计的巧思、分布式任务调度系统都是本项目的学习重点,也是校招简历上很少有同学提到的知识实践,学完后能够大大增加简历的区分度!

比如 Vert.x 框架,并发连接处理能力吊打 Spring 几条街!

Web Framework Benchmarks 性能对比网站:https://www.techempower.com/benchmarks/#section=data-r21&test=composite

项目设计

首先我们要理解代码生成的核心原理。

代码生成器的核心原理

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

比如参数:

作者 = 鱼皮

模板文件代码:

-----------
我是 ${作者}
-----------

将参数注入到模板文件中,得到生成的完整代码:

-----------
我是 鱼皮
-----------

如果想要使用这套模板生成其他的代码,只需要改变参数的值即可,而不需要改变模板文件。

理解了代码生成器的核心原理后,就可以开始思考项目的设计实现方案了。



项目总共分为 3 个阶段,让我们分别来进行设计。

第一阶段 - 本地代码生成器

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

本阶段不依赖复杂的开发框架,没学过任何开发框架也能学习。

业务流程

1)准备用于制作代码生成器的原始代码(比如 Java ACM 模板项目),用于后续生成

2)开发者基于原始代码,设置参数、编写动态模板

3)制作可交互的命令行工具,支持用户输入参数,得到代码生成器 jar 包

4)使用者得到代码生成器 jar 包,执行程序并输入参数,从而生成完整代码

流程图如下:

实现思路

1)先根据本地项目,扫描文件树,实现同样的静态代码生成

2)根据本地的项目,预设部分动态参数、编写模板文件,能够传入配置对象进行生成

3)制作可交互的命令行工具,接受用户输入的参数,并动态生成代码

4)封装制作代码生成器 jar 包文件,并简化使用命令

关键问题

1)如何根据一套项目文件,完整地生成同样一套项目?

2)如何编写动态模板文件?怎么根据模板和参数生成代码?

3)如何制作命令行工具?如何交互式接受用户的输入?

4)怎么将命令行工具制作为 jar 包?怎么简化使用命令?

第二阶段 - 代码生成器制作工具

这个阶段,我们的目标是做一个本地的代码生成器制作工具,能够快速将一个项目制作为可以动态定制部分内容的代码生成器。并且以一个 Spring Boot 初始化项目模板(Maven 项目)为例,演示如何根据自己的需要动态生成 Java 后端初始化项目。

本阶段的学习需要一定的 Spring Boot 开发知识,最好先完成 星球的其他项目 ,推荐用户中心和聚合搜索。

业务流程

1)准备用于制作代码生成器的原始代码(比如 Spring Boot 项目模板),用于后续生成

2)开发者基于原始代码,使用代码生成器制作工具,来快速设置参数、生成动态模板

3)使用代码生成器制作工具,动态生成代码生成器 jar 包

4)使用者得到代码生成器 jar 包,执行程序并输入参数,从而生成完整代码

相比第一阶段的业务流程,本阶段完成后,可以直接使用代码生成器制作工具来快速将固定的项目代码改造为可定制生成的动态模板,并自动生成命令行工具 jar 包。

流程图如下:

实现思路

1)使用独立空间来存储管理要生成的原始文件、动态模板文件等

2)使用配置文件来记录要生成的参数和模板文件信息、自定义配置等 元信息

3)代码生成器制作工具需要有多种可单独或组合使用的功能,比如从原始文件中抽取参数、动态生成命令行工具、打 jar 包等

关键问题

1)如何使用配置文件来记录参数和模板文件信息?何种结构?

2)怎么能够提高代码生成器的制作效率?工具应该提供哪些能力?

3)如何从原始文件中抽取参数?有哪些类型的参数?有哪些抽取规则?比如布尔类型参数(是否生成)、字符串类型参数(生成指定的值)等

4)如何动态生成配置类?如何动态生成命令行工具?如何动态打 jar 包?

第三阶段 - 在线代码生成器平台

经过前两个阶段,我们已经能够使用本地的代码生成器制作工具来快速定制自己的代码生成器了。

但如果我们想和团队其他同学共同维护代码生成器、或者使用其他人的代码生成器,通过本地文件互传的方式肯定就很麻烦了。

所以本阶段我们要打造一个在线代码生成器平台,可以理解为代码生成器的 应用市场。所有人都能发布、使用、甚至是在线制作自己的代码生成器!

本阶段我们的终极目标是,在平台上制作和发布项目 “换皮” 工具,帮助小伙伴们一键给网络热门项目换皮!

业务流程

1)获取用于制作代码生成器的原始代码(手动准备或者远程拉取代码)

2)开发者基于原始代码,使用 在线代码生成器制作工具,来快速制作代码生成器

3)开发者发布代码生成器至平台

4)使用者在平台上搜索代码生成器,支持在线使用或者下载离线 jar 包(甚至还可以支持接口调用)

完整业务流程图如下:

实现思路

1)使用 Web 开发框架实现代码生成器信息的增删改查

2)将本地的配置和文件 上云,存储到数据库、对象存储等云服务。

3)通过可视化界面来操作第二阶段的代码生成器制作工具,复用阶段二的成果。

关键问题

1)怎么在云上存储管理代码生成器?

2)如何通过前端开发,提高代码生成器的制作效率?

3)如何通过后端优化,提高代码生成器的制作性能?

4)如何保证代码生成器的存储空间不超限、如何优化存储?

新建代码仓库

先搭建个代码仓库,激励一下自己。

鱼皮新建的官方代码仓库:https://github.com/liyupi/yuzi-generator ,点 star 的都是精神股东~

最后

以上就是本期教程,相信大家看了上面的设计思路和关键问题后,已经对这个项目充满期待、迫不及待地想要解决这些问题了吧~

那就做好准备,让我们打起百分百的精神开启正式的项目学习~ 上面的问题,鱼皮都会一一带着大家解决!

双 12 期间,编程导航限时发放大额优惠 🧧,名额有限,加入即可学习鱼皮往期所有原创项目!欢迎小伙伴们扫码领券加入学习,快速提升项目实战能力 👏🏻


往期推荐

鱼皮往期编程文章汇总

为什么我强烈建议大家找实习?

写了个数据查询为空的 Bug,你会怎么办?

为什么 Maven 总是拉不到包?

什么时候都用微服务,只会害了你

Rust 这么厉害?为什么连前端都在卷它

继续滑动看下一个

我的新项目,已完结 6 期~

鱼皮 程序员鱼皮
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存