01-总纲:16个模块的低代码平台长什么样
browise 是一个跑了14年、经过3个生产级政务项目(海南新农保、海南异地就医、海口海关内控)验证的低代码平台,最终形态是 Spring Boot 2.7 + Vue3 + 16个Maven模块。这篇文章是整个系列的地图——每个模块是什么、依赖关系怎么排、一个请求怎么穿过它们。
文章目录
一、项目背景:三代演化
browise 不是从零设计出来的。它有一条清晰的演化链:
第一代(2010前后) PowerBuilder C/S 应用
│ DataWindow 数据窗口思想在这里形成
▼
第二代 wiserise Java + 自研 route.java 前端控制器 + Activiti 5.13
│ 615个Java文件,海口海关内控系统生产运行
│ commonSql.java 2135行的元数据SQL引擎
▼
第三代 browise Spring Boot 2.7 + Vue3 + 16模块
667个单测100%通过,Playwright E2E 79/79
第三代的重写不是推倒重来——PROJECT.md 里有一张完整的 wiserise→browise 迁移映射表:commonSql.java 拆成了 EaEngine + SqlBuilder,DataWindow.js 变成了 MetaGrid.vue,Row.java 的 _t/_o 语义在前端 useRowSet.ts 里原样复刻。
二、16个模块的职责
打开根目录 pom.xml,modules 段落定义了全部16个模块。按依赖层次从底到顶:
基础层(无内部依赖)
| 模块 | 文件数 | 职责 |
|---|---|---|
| browise-common | 20 | Result统一响应、BrowiseException、政务工具集(IdcardUtil/RMBUtil/PinyinUtil/DesensitizeUtil) |
| browise-crypto | 16 | 国密SM2/SM3/SM4——接口+BC/HSM双实现策略模式 |
核心层
| 模块 | 文件数 | 职责 |
|---|---|---|
| browise-metadata | 42 | EA元数据SQL引擎——五张表描述任意SQL,8方言,字段级SM4加密+脱敏 |
| browise-data | 24 | 数据协议——Row(_t/_o)/RowSet三缓冲/BaseEntity/MyBatisHelper |
业务层
| 模块 | 文件数 | 职责 |
|---|---|---|
| browise-platform | 67 | 认证(JWT双令牌)/用户/角色/菜单RBAC/文件(MinIO)/导出 |
| browise-workflow | 66 | Flowable 6.8集成——手动构建引擎、会签、委托、拦截器链 |
| browise-formbuilder | 20 | 表单设计器后端——EA元数据管理(EaAdminController 39.1KB全项目最大) |
| browise-report | 11 | POI模板引擎(指令解释器)/PDF水印 |
| browise-audit | 19 | 三表审计——ZE01操作/ZE02行快照/ZE03字段diff |
| browise-dict | 11 | 字典缓存——ConcurrentHashMap.computeIfAbsent |
| browise-notify | 11 | 通知——SPI(META-INF/services)注册渠道 |
| browise-ops | 7 | 在线SQL运维——DDL预览备份/影响行数熔断 |
| browise-cms | 63 | 内容管理——文章/问卷/投票/评论,发布走工作流 |
| browise-mail | 22 | 邮件——IMAP收取/SMTP发送/多账号 |
装配与启动层
| 模块 | 文件数 | 职责 |
|---|---|---|
| browise-spring-boot-starter | 4 | 条件装配——HSM优先/BC兜底/CryptoAspect AOP |
| browise-demo | 11 | 启动应用——@MapperScan六包/WebSocket/BPMN自动部署 |
加前端 browise-vue/(core 9文件 + components 76文件 + demo 53页)。
三、模块依赖的关键设计:data不依赖crypto
BROWISE-GUIDE.md 里明确记录了一条依赖原则:browise-data 不依赖 browise-crypto。
为什么?data模块的 BaseEntity 是业务实体的基类,它的 save() 需要在写库前做字段加密。如果 data 直接依赖 crypto,那么所有用 BaseEntity 的项目都被迫引入国密依赖——即使它根本不需要加密。
解法是 EntityLifecycleListener 接口(987B):
browise-data 定义接口:
interface EntityLifecycleListener {
beforeSave(entity)
afterQuery(entity)
}
browise-spring-boot-starter 桥接:
CryptoEntityLifecycleListener implements EntityLifecycleListener {
// 内部调 CryptoHelper 的签名+加密
}
starter 负责把 crypto 的能力"注入"到 data 的生命周期里——两个模块互相看不见,靠一个接口契约协作。这是依赖倒置在模块划分上的应用。
四、一个请求穿过哪些模块
浏览器
│ POST /ea/page/SYS_USER_s
▼
JwtAuthFilter (platform模块)
│ 验token → 黑名单 → CurrentUser.set → 菜单鉴权
▼
EaController (formbuilder模块)
│ /ea/page/{sqlId} 接收请求
▼
EaEngine (metadata模块)
│ ①EaMetadataCache查EA01-05元数据
│ ②SqlBuilder按方言拼SQL
│ ③EaConnectionProvider拿连接执行
│ ④postProcess: 字段解密+脱敏
│ ⑤SlowSqlMonitor计时
▼
Oracle (ojdbc8)
│
▼
Result { code, msg, data } (common模块)
│
▼
前端 useRowSet (browise-vue)
│ rows灌入primary缓冲,_t全为0
▼
MetaGrid渲染
一次分页查询穿过 4 个后端模块 + 2 个前端核心文件。后续每一篇都在拆解这条链上的某一段。
五、规模盘点
| 分类 | 数量 |
|---|---|
| 后端Java | ~290文件 / ~18,000行 |
| 前端Vue+TS | ~100文件 / ~12,000行 |
| 测试代码 | ~70文件 / ~7,600行(667单测+Playwright三套E2E) |
| 建表脚本 | 13个(doc/目录) |
667个单测100%通过,含15个Oracle集成测试(真实连库验证EA01≥74条元数据、审计三表写入)。
六、系列规划
这个系列59篇,按数据流顺序拆:
| 部 | 主题 | 篇数 |
|---|---|---|
| 一 | 全景与设计哲学 | 4 |
| 二 | EA元数据引擎 | 12 |
| 三 | 数据协议 | 8 |
| 四 | 认证与安全 | 10 |
| 五 | 工作流 | 9 |
| 六 | 前端组件库 | 9 |
| 七 | 周边模块 | 4 |
| 八 | 工程实践 | 3 |
每篇绑定真实源码路径,代码占比不低于40%。
✅ 亮点:以模块依赖图+请求全链路两张地图组织16个模块的介绍,点出"data不依赖crypto靠starter桥接"这条最关键的架构决策。适合想了解多模块低代码平台怎么分层的技术负责人。扩展方向:第02篇拆DataWindow设计哲学、第04篇展开请求全链路每一跳。
2787

被折叠的 条评论
为什么被折叠?



