Stategen
springboot+spring cloud alibaba(nacos,seata,sentinel,dubbo)分布式+微服务+本地服务,全栈架构含有前端(java服务端,H5、iOS、andriod前端),后端骨架代码生成器+前端骨架生成器+后端迭代开发生成器+前端与后端交互(至响应式状态)生成器,内含大名鼎鼎的支付宝dalgen之freemarker开源实现之商用升级版dalgenX,大量前、后端代码通过生成器生成,把前后端分离开发模式"拉"回来,目前前端已支持react(dva+umi+typescript)和flutter(provider),后续加入kotlin、swift。免去前端文档、调试、postman、mockjs...繁琐。开发中迭代生成,不改变原开发流程、生成80%代码,兼容后20%你自己的代码,拒绝挖坑! https://github.com/stategen/stategen
Install / Use
/learn @stategen/StategenREADME
截图
<p float="left"> <img src="https://github.com/stategen/docs/blob/master/javaCodeDemo.png" width="600" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/typescriptCodeDemo.png" width="600" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/flutterCodeDemo.png" width="600" alt="drawing" /> </p> <p float="left"> <img src="https://github.com/stategen/docs/blob/master/category.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/homeApis.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/category_json.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/dva_react_model.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/flutter_goods_provider.png" width="400" alt="drawing" /> <img src="https://github.com/stategen/docs/blob/master/stategenAppSnapshort.png" width="400" alt="drawing" /> </p> mobile端 <img src="https://github.com/stategen/docs/blob/master/stategenWebSnapShort1.png" width="400" alt="drawing" /> web端 上面2张图,按通常的开发量需要上千行代码,现在只需要开发10多行代码我非常赞同的
- 重复可能是软件中一切邪恶的根源。—— Robert C.Martin
StateGen?
- 轻代码or敏捷开发? NO;
- 用可视化界面配置生成? NO
- 改变原开发模式? NO
- StateGen不是DEMO,而是一个架构,追求的是易于上手、高效开发、容易维护、可拓展、运行稳定,易于排查的架构
Stategen架构的构成
-
springboot
- 直接支持 jar war打包模式
-
spring cloud alibaba
- nacos,seata,sentinel,dubbo,mybatis|ibatis开箱即用
- 分布式 微服务+本地服务
- 超动态自动装配消息系统 (spring-stream-3,支持 rocketMq,原则上同时支持kafuka和activeMq)
-
后端骨架生成器
-
前端骨架生成器
-
后端可迭代开发生器(dalgen演化而来dalgenX,全网唯一可支持迭代开发??)
-
前端开发生成器,可把后端所有任意java api转化为前端的交互代码(mvvm,reactive,react(umi,dva,saga),flutter(provider),依据模版种类)
-
没有限定使用者集成其它技术
StateGen中的开发生成器,和市面上那些谈虎色变的生成器什么区别?
- 后端dalgenx生成器:
a.从大名鼎鼎的支付宝生成器dalgen演化而来,单dalgen可以说把市面上所有的java orm层生成器秒成渣,dalgenX则在此基础上拓展可迭代功能。dalgen只支持ibatis(个人认为:不开源和不支持mybatis使它推广不开来),而dalgenX则可以在ibatis与mybatis之间自由切换.
b. dalgenX生成器中的sql相当于Batis sql的用来简化开发的语法糖,它生成可见的纯batis sql和相关java,xml代码,代替肉身做一系列复杂的工作包括查找替换。语法糖不参与运行期,不用提心”国产“框架的坑。
c.dalgenX生成代码时,会解析已有的java代码,自动增量比对生成,代替肉身备份代码比对还原代码。更方便维护pojo等一系列代码,它也有效治好了DDD模型中的失血模式下的失忆的毛病。 - 前端生成器只是在原controller层api方法上加了个java标注 @State而已,对后端代码零侵入,零工作量.
它成立的理论基础是:
a. 响应式前端,交互和页面是分开的。
b. 后端任意一个api,它对应的前端代码:入参、出参对象化,序列化,反序列化,网络调用,状态化都是固定,谁肉身来写都相同的,所以可以用生成器覆盖。
c. 前端开发生成器只是托管intergrade文件夹下的内容,重点是响应式前端前后端交互部分代码,其它代码只是辅助生成,不再覆盖,使用的同学可无限制优化里面的代码,可以换成自己的理想的前端骨架。 - 个人觉得几个生成器可以减少80%的工作,这还不算主要的,主要是底层代码规范,上层代码就不会乱
骨架代码生成流程图
-
虚线为人工参与点
-
实线为maven或系统自动装配
-
粗实线为StateGen自动生成的线路
-
系统骨架和项目骨架生成器运行时都是幂等,在已有的项目上重新运行只会追加,不会覆盖,不用担心手贱的毛病.
-
图中"trade"指stategen架构中的系统名 app或cms或xxx指项目
-
-
直观文件夹树型图: 为什么是多层的?这不是技术范畴而是为了规范和原则,业务系统会做大,层越单纯越安全,通过限定每层pom中引用jar包来限定了每层的功能,比如限定dao只能crud不能出现业务,这种方式比写硬邦邦规章制度好。
-
stg.2.3.1.RELEASE版本可选3种文件夹格式: numHeader(默认):1-trade-pojo;numMid:trade-1-pojo; numNone:trade-pojo,在ide中排序后人眼对系统结构顺序一目了然(有序依赖的业务系统在ide内有序排列工作效率会高)
trade (trade相当于微服务中当前服务名、系统名)
├── 1-trade-pojo //失血或贫血模式,无复杂业务逻辑,不暴露隐私业务逻辑。
├── 2-trade-facade //和1-trade-pojo组成对外jar包,越纯洁越好
├── 2-trade-sink-facade //消息订阅方jar,别人按你的格式发送消息,Provider不需要配置,配置自动装配
├── 3-trade-intergrade //单纯引用别的系统中的jar,不依赖于本系统中其它jar,方便做jar冲突排查
├── 4-trade-dao //限定为crud,无业务逻辑
├── 5-trade-service //业务逻辑实现部分
├── 6-trade-web-base //业务逻辑实现部分+和共用项目controller,让后面的7遵从每个数据库只有一套curd服务的原则。
├── 7-trade-web-app //springboot application,引用 6-trade-web-base和实现自身独特业务逻辑
│ ├── app-frontend-flutter
│ ├── app-frontend-h5
│ └── WebRoot
├── 7-trade-web-cms //springboot application,引用 6-trade-web-base和实现自身独特业务逻辑
│ ├── cms-frontend-web
│ └── WebRoot
├── 7-trade-web-... //springboot application,引用 6-trade-web-base和实现自身独特业务逻辑
├── opt
│ └── config
│ └── stategen
└── tables
骨架快速开始
运行环境
服务端/windows(linux类似)
A. java 1.8+
B. maven 3 (3.5.0有bug,请使用3.5.2+) C. mysql5.7
D. gitbash(安装git2.0 自带,目的是可在windows上执行bash脚本)
E. nacos-server-1.3.2 (因为目前架构中用到的spring cloud alibaba denpencies版本为2.2.3,其中限定nacos client为1.3.3,它与nacos1.4.0-server通信有障碍,本架构用于生产,不在尝鲜版上纠缠,等他们稳定了再升级) F. sentinel dashboard-1.8.0 ps:因为在dashboard上操作不能反向持久化到nacos中,开发和生产很不方便,有大神制从原版中修改了代码制了nacos反向持久化版,我稍微忧化可用性和方便性,,https://github.com/stategen/sentinel-dashboard-nacos 它的启动方式是这样的:
java -Dnacos.server-addr=localhost:8848 -Dserver.port=8880 -Dcsp.sentinel.dashboard.server=localhost:8880 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-nacos-1.8.0.jar
G. seata-server-1.4.0
开发环境安装
因项目依赖jars我已经发布maven中央仓库了,不需要使用的同学再辛苦自行编译,只需要git clone dalgenX,这是一个GMAVEN项目,无需打包
- 配置 dalgenX (ps:dalgenX并不依赖于相StateGen架构,它可以配到其它spring项目中单独生成前后端代码),
git clone https://github.com/stategen/dalgenx.git
(把 gen.custom.xml.templete 复制一份为 把 gen.custom.xml)
-
设置 DALGENX_HOME 环境变量为 dalgenx所在目录
-
将 %DALGENX_HOME% 添加至 PATH 中
-
Ide中配置(eclipse|myeclipse|idea)xml文件,方便开发时打字提示.
location: {DALGENX_HOME}\gen.schemas-1.0.dtd
key type: system Id
key: https://github.com/stategen/dalgenx/blob/master/gen.schemas-1.0.dtd
用命令初始化系统及项目/范例
ps: 以下gen.sh 必须在gitbash中运行,不能在cmd中运行。linux可以无需考虑。
- 帮助
gen.sh -h
- 创建系统骨架,注意,骨架|脚手架生成器操作是幂等的,可以多次执行. -e 是当有错误时,输出错误信息.
gen.sh system com.mycompany.biz trade -e
com.mycompany.biz 为包名
trade 系统名 /数据库名 dubbo 系统名
至些,一个StateGen系统分分中创建完成,接下来添加项目,可以无限添加项目,为啥这样搞?它们遵从同一个数据库只有一套crud服务的原则.减少扯皮,减少在泡在会议室的时间,谁改完了表,都得改想关的影响点,,好在,因为架构上它们在同一个系统中,ide会帮你及时发现兼容bug
- 创建app web api 项目 (可选) , (不想参与前端的同学,涉及到前端的命令参数都可以忽略)
//创建后端项目时,同时创建前端,前端目前有3个模版 h5,web,flutter
gen.sh project app h5 –e //带前端
//也可以:
gen.sh project app –e //不带前端
//**h5和web对应的前端是nodojs项目,ssr模式,因此打包时,maven插件会编译前端**
//**必须安装nojs和yarn才能编译通过,也可到7-tradeApp的pom.xml中,把编译注释掉**
//因为app项目上面已创建,生成器会判断,以下命令只创建了一个flutter前端
gen.sh project app flutter –e
//或者时入子目录
cd 7-trade-web-app
gen.sh client flutter -e //这样也可以创建flutter前端
- 创建cms web 项目 cms指后台管理系统, (可选,也可以以后再创建或不要)
gen.sh project cms web –e
也可以
gen.sh project cms –e
- 创建shedule项目,不带前端, (可选,也可以以后再创建或不要)
gen.sh project schedule –e //无前端,可以跑定时任务
//变为git版本控制, trade 为git 项目,app-frontend-flutter为trade的子项目,(git子项目其实也是一个独立的git项目,我个人觉得git这点比svn理念先进).
sh gitinit.sh //变为git项目
cd app-frontend-flutter
sh git_add_to_parent_as_sub.sh //变为trade 的git子项目
- 环境及表
创建trade数据库并运行 运行 trade.sql 也可以建一个空表. 把opt复制到同盘(tomcat所以盘或者你的ide同盘,这样目的是保持开发和运行环境一致。windows下/opt指的容器同盘目录)根目录下,修改stategen.xml中的数据库配置,只需要关注mysql,nacos,相关配置,zookeeper和redis可以不用管 7-xxx下的stategen.xml相关的内容合并到/opt/config/stategen/stategen.xml中 修改gen_config.xml中的开发数据库配置
因为一些文件可以用生成器获取,所以不在版本控制里,先后在 gitbatsh中运行 tablebatch.sh 和 dalbatch.sh ,空表则不需要运行.
sh ./tablebatch.sh
sh ./dalbatch.sh
启动TradeAppApplication.java 每个7中都有一个TradeXxxApplication.java
启动成功后控制台可以看到以下信息:
Application is running! Access URLs:
servletWebServerFactory 类型 :UndertowServletWebServerFactory:
Local访问网址: http://localhost:8080/tradeApp
应用访问网址: http://192.168.112.1:8080/tradeApp
Swagger网址: http://192.168.112.1:8080/tradeApp/doc/index.html
ps: 1.StateGen生成的架构的代码,启动时对端口做了占用检查,因此:一个项目启动多个实例也是没问题(只要不启动太快),如8080端口,它的配置是这样的
<bean class="org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory">
<property name="contextPath" value="/${spring.application.name}" />
<!-- 逻辑:如果端口被占用,则往上找直到没有被占用的端口 -->
<property name="port" value="#{T(util.Net).from(${tradeApp.port:8080})} " />
</bean>
ps: 2. StateGen默认你的项目会越来越大(谁个系统还没有百把张表或者自定义实现spring系统bean),因此:除了必要的bean是代码创建的外,都是xml配置的,大系统,xml才是王道 .
在nacos上应该可以看到dubbo服务:

在swagger中 调用一下一个AppController.java中的 testSentinel api
/***测试限流降级分布式事务*/
@ApiRequestMappingAutoWithMethodName(method = RequestMethod.GET)
@SentinelResource()
public User testSentinel(@ApiParam(value="用户ID",defaultValue="1") @RequestParam() String userId) {
//MockUtil只能用于测试,不能打包,执行 mvn package 由 插件 forbiddenapis 检测
MockUtil.throwRandomException(2);
User user = this.userService.getUserByUserId(userId);
return user;
}
到Sentinel-dashboard中可以看到

设置限流降级,单机阈值设为2,快速在swagger中调用testSentinel,可以看到如下限流返回值
{
"code": 500,
"exeptionClass": "FlowException",
"message": "该阶段不支持该操作(限流),请稍后再试",
"status": "ERROR",
"success": false
}
上面的message信息可以配置的:
<bean class="org.stategen.framework.spring.mvc.SentinelBlockHandler">
<property name="blockResponseStatus">
<util:constant static-field="com.mycompany.biz.enums.ResponseStatus.BLOCK" />
</property>
<property name="msgFlowException" value="该阶段不支持该操作(限流),请稍后再试"/>
</bean>
-
微服务集群相互调用:
按上面我们再创建一个系统:verify ,(另一个文件夹),
//创建系统
gen.sh system com.mycompany.verify auth -e
//创建系统中的项目
gen.sh project microServ -e
mavan打包发到公司私有仓库或者安装到本地仓库:
mvn install|deploy
在原来的trade系统中3-trade-intergrade中pom.xml里面,只要引用即可。
<dependency>
<groupId>com.mycompany.verify</groupId>
<artifactId>auth-facade</artifactId>
<!-- verify 系统每次变更,要改 verfy-facade.version版本号-->
<version>1.0.0</version>
</dependency>
10 . 一个典型Stategen 系统 结构图

迭代开发流程图
-
虚线为人工代码参与点
-
实线为maven或系统自动装配
-
粗实线为dalgenX自动生成和迭代的线路
-
从流行程上来看,
- dalgenX没有改变原开发模式
- 保留之前工作代码成果,新生成代码增量添加
- 人工编写的代码可以做到仅限业务
演示User需求开发 (一键开发,一键迭代,显式代码,所见即所得)
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`teacher_id` varchar(64) CHARACTER SET ut
Related Skills
node-connect
341.6kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
341.6kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.6kCommit, push, and open a PR
