Skip to content

4.12 扩展性设计 ​

概述

系统的扩展点都是显式声明的:钩子承接业务差异、生成器模板可自定义、任务自注册、驱动可注册、中间件能力可接线裁剪。本页汇总"想加东西时从哪下手"。

扩展点地图 ​

想做什么扩展点位置
模块特有 CRUD 差异ModuleSpec 钩子service 各模块
标准方法覆盖不了的逻辑手写方法(合法逃生舱)service 各模块
新定时任务init 自注册internal/task
新数据库方言RegisterDriverinternal/model/db
生成产物样式模板替换templates/*.tpl
中间件依赖的业务能力Set*Loader / SetLogSink 接线middleware + service init
新基础设施能力新建 utility 包utility/
新配置节config.yaml + .env.example 同步config/

ModuleSpec 钩子(最常用扩展点) ​

十个钩子覆盖 CRUD 全生命周期:

text
BeforeAdd / AfterAdd          新增前后
BeforeUpdate / AfterUpdate    修改前后
BeforeDelete / AfterDelete    删除前后
BeforeBatchDelete / AfterBatchDelete
AfterPageList / AfterDetail   读侧后处理

约束:错误原样上抛、禁 HTTP/文件 IO、禁 append。超出约束的逻辑放 service 手写方法,不要硬塞钩子。

代码生成器模板 ​

text
templates/
├── dto.tpl / repository.tpl / service.tpl / handler.tpl   后端四件套
├── ui/     标准页面模板(api.ts/columns.ts/index/edit/detail/querySchemas)
└── ui2/    树形表页面模板

替换对应 tpl 即改变全项目生成风格;生成器同时负责菜单幂等创建与 router.go 声明块追加。见 10.5 模板体系。

任务自注册 ​

go
// internal/task/xxx.go
func init() { Register("任务名", spec) }   // 调度器启动时自动纳入

调度器、执行锁、任务日志由 task 包统一提供,任务实现只写业务。

驱动注册(数据库扩展) ​

go
db.RegisterDriver("oracle", factory)   // 扩展方言经构建标签隔离

内置四方言在包内注册;Oracle 等重依赖方言用构建标签(-tags oracle)避免拖累默认构建。

中间接线与裁剪 ​

go
middleware.SetIdentityLoader(...)   // auth 模块
middleware.SetTenantLoader(...)     // auth 模块
middleware.SetLogSink(...)          // operation_log 模块

未接线的能力被 WireCheck 探测到只告警降级——按模块裁剪部署形态(如去掉内容管理模块)不会引发启动失败。

前端扩展 ​

扩展点方式
公共组件ui/src/components 新增,全局注册
布局插槽layout components 按区域扩展
主题styles 主题变量 + designSetting store
路由动态(菜单 API)+ constant 静态补充

扩展的边界 ​

扩展不应破坏的稳定面:dto 契约字段名、RouteSpec 声明语义、统一信封结构、gin_ 表列约定。生成器与前端都依赖这些稳定面,改动前先评估连锁影响。

下一步 ​

→ 第 5 章 核心功能

小蚂蚁云团队 · 提供技术支持