================================================================================ EasyGoAdmin 后端开发者文档 · 18 扩展开发与变更管理 ================================================================================ 按“变更类型”给出标准操作清单(checklist),保证不漏步骤、不变异架构。 -------------------------------------------------------------------------------- 1. 给现有模块新增一个接口 -------------------------------------------------------------------------------- □ api/v1/{模块}.go:新增 {Mod}{Action}Req(内嵌 gmeta.Meta,path 带 /api 前缀、 permission、log、logType)+ {Mod}{Action}Res □ controller:同名方法,签名 func (c *CXxx) Action(ctx, req) (res, err) □ service/{模块}.go:接口追加方法声明(手维护) □ logic:实现方法(基座可表达走 spec 钩子,复杂走手写) □ 权限节点同步:若 permission 为新码,需在菜单管理为角色勾选 (或插入 goframe_menu type=1 节点) □ go build ./... && gofmt;重启;/api.json 核对新条目 □ 变更回归(16 章第 6 节对应行) -------------------------------------------------------------------------------- 2. 给现有模块加字段 -------------------------------------------------------------------------------- □ MySQL ALTER(列注释按枚举规范写“字段:1-x 2-y”;需要唯一性则补 uk_*) □ gf gen dao -c hack/config.yaml(刷新 entity/do/dao internal;service 不动) □ api/v1:Req/Res/Item 结构体补字段(json 驼峰 + dc 注释) □ logic:ToData 补键;如为枚举补 SerializeMaps(字典编码 {模块}_{字段}); 文件字段补 FileFields+FileSaveDir;富文本补 ContentFields □ 前端:columns.ts / querySchemas.ts / edit.vue 同步(生成器模块可 -preview 对照模板手改) □ resource/sql 五份方言 DDL 同步;必要时 12 章清单更新 □ go build → 重启 → page/detail 黄金样本更新 -------------------------------------------------------------------------------- 3. 新增模块 -------------------------------------------------------------------------------- □ 设计表(统一审计列 + del_flag + uk_* + 注释枚举)→ DDL 落库 □ 租户级?→ hooks.tenantTables 登记(12 章第 6 节) □ go run ./cmd/generator -tables "goframe_x|中文名"(或手动四件套) □ logic 调整:spec 声明(筛选/树形/字典/文件/唯一 Group)、扩展接口 □ service 接口核对(生成器已产出,按需扩展);router.go 注册行确认 □ go build ./... → 重启 → 角色勾选新权限节点 □ 00 章模块表、11 章接口清单、12 章表清单同步更新(文档纪律) -------------------------------------------------------------------------------- 4. 新增中间件 -------------------------------------------------------------------------------- □ internal/middleware/{name}.go:func(r *ghttp.Request),职责单一; 读配置用 cfgBool/cfgInt;客户端 IP 用 realClientIP;响应用 utility/response □ 不得 import 业务包——需要业务数据时在 wire.go 增加 Loader 函数变量, 由 logic init 注册(参照 IdentityLoader 模式) □ router.Register 的 s.Use 链按序插入(顺序即语义,评审明确插入点) □ public 路径行为:确认对 IsPublicPath 的放行策略 □ 02 章与 00 章链路描述同步更新 -------------------------------------------------------------------------------- 5. 新增定时任务 -------------------------------------------------------------------------------- □ internal/task/{task_name}.go + init RegisterJobHandler("TaskName", h) □ handler 签名 (ctx, params) (string, error);长任务分批+上限;禁 HTTP 于 事务内;可复用 base(WithTrans/ChunkQuery) □ 任务表配置:url="TaskName"、params JSON、cron(6 段或 # 5 段)、 execute_policy/is_sync;发布(status=1) □ 验证:daemonStatus 挂载 + runOnce + job/log 成功记录 □ go build 重启(init 注册发生在进程加载期) -------------------------------------------------------------------------------- 6. 自定义 / 扩展 dao -------------------------------------------------------------------------------- □ 生成的 dao/{m}.go(自定义模板 hack/tpl/dao_index.tpl 产物)可安全手改: 挂钩子 + Ctx 覆写已在生成模板内;在文件尾部“Add your custom methods” 区追加方法(如统计/联查),保持只依赖 dao 内部与 gdb □ 修改模板本身:改 hack/tpl/dao_index.tpl 后 gf gen dao 重新生成全部 (overwriteDao:false 保留手工扩展文件——注意新旧模板产物差异需人工合并) □ 红线:自定义方法也必须以 Ctx(ctx) 为查询入口(否则丢失租户/软删过滤); 禁止在 dao 内做业务判断 -------------------------------------------------------------------------------- 7. 逃生舱与扩展挂点 -------------------------------------------------------------------------------- BodyUnmarshaler 请求体形态不规则(平铺 map 等)时,Req 实现 UnmarshalBody(r) 跳过默认 Parse(自行做 gvalid) ModuleSpec.Filter 复杂查询条件(不与 Like/Eq 重复) ModuleSpec.DataScope 数据权限挂点(已接通):共享工厂 ApplyDataScope(col) 位于 logic/data_scope.go;模块声明 DataScope 即生效, 作用于 Page/List/导出;档位见 17 章授权安全细节 ModuleSpec 钩子写不进 基座禁止按模块分支——写不进钩子就整个方法手写 (合法逃生舱,如 job.Detail 因嵌入结构手写) logic 包级共享函数 跨模块复用放具体模块文件顶部(同包可见); 横切能力进 base.go(导出上限 15 个,超出拆子包) RegisterJobHandler 本地任务处理器全局注册表(重名 panic) middleware wire 三 Loader/Sink 函数变量,业务与中间件解耦 -------------------------------------------------------------------------------- 8. 配置变更 -------------------------------------------------------------------------------- □ manifest/config/config.yaml 修改(键义见 10 章) □ 多环境差异用 GF_GENV_ 环境变量覆盖(如 GF_GENV_DATABASE_DEFAULT_LINK), 不改文件 □ 新增配置键:config.yaml 注释说明 + 代码 cfgBool/cfgInt 带默认值读取 (缺失不 panic)+ 10 章文档同步 □ 影响限流/日志/上传/调度的键变更后跑对应回归(16 章第 6 节) -------------------------------------------------------------------------------- 9. 未启用项与前端遗留 -------------------------------------------------------------------------------- 项 现状 启用/处理要点 ---------------- --------------------------------------- ----------------- 用户注册 publicPaths 含 /api/register 启用时补建表逻辑+ (路由未注册) 开放策略+租户归属规则 数据范围自定义档 现四档纯列值(role.data_scope) 第5档+部门关联表+ 角色表单部门树多选 导出增强 当前导出返回临时文件 URL 可加流式下载/异步导出 SendSms 任务 task/send_sms.go 仅记日志 接短信通道时替换实现 站内信/数据源 前端废弃功能(sendMsg.vue、 后端不实现;前端调用 dataSource.ts) 点为遗留死代码 短信/OSS/WebSocket 后端桩接口已删除 前端遗留调用为废弃代码, 不再调用即无影响 注:角色数据权限(四档)已实现,见 17 章授权安全细节与 logic/data_scope.go。 -------------------------------------------------------------------------------- 10. 封板后的变更纪律 -------------------------------------------------------------------------------- 1) 一切接口行为以 11 章清单 + /api.json 为准,改动即更新文档 2) 表结构改动三同步:MySQL 定稿 → resource/sql 四方言 → 迁移(如跨环境) 3) 破坏性变更(改名/删字段/改枚举值)必须走版本化说明 + 前端同步 + 黄金 样本更新,禁止静默变更 4) 架构红线复查:绕过 dao/手写租户条件/反向依赖 task/超 15 导出的 base/ 未登记 tenantTables——任何一项都应打回