SkeyeVSS开发-代码生成脚本(0.generate.sh)
代码生成脚本scripts/dev/0.generate.sh1. 说明scripts/dev/0.generate.sh是一个面向业务模块快速初始化的编排脚本。通过一次执行串联生成并补齐数据模型repository modelsAPI 协议与服务代码RPC 协议与服务代码API/RPC 逻辑模板代码操作日志类型权限定义及 handler 权限替换前端 TS/TSX 模块模板代码可快速生成一套前后端 CRUD 模块。2. 使用前准备在执行0.generate.sh前需要先完成两件事在templates/sql/下创建表结构 SQL 文件例如templates/sql/users.sql修改0.generate.sh中以下变量rpc_sev_clientBackendrpc_sev_moduleBackendServicemodel_name_zh用户model_nameusermodel_namesusers变量含义rpc_sev_clientAPI 调用 RPC 的客户端名用于 API logic/handler 模板替换rpc_sev_moduleRPC proto 内目标 service 名例如service BackendService {}model_name_zh中文模块名日志、权限展示文案model_name英文单数如usermodel_names英文复数/模块目录名如users3. 执行方式在项目根目录执行cdscripts/devbash0.generate.sh脚本会自动source ./constants.sh并完成 goctl/tool 校验含 goctl 环境检查。4. 执行流程按顺序0.generate.sh依次调用多个子脚本下面是每一步的输入、动作与结果。Step 1生成 model1.sev-db.sh调用bash./1.sev-db.sh-name$model_names主要动作读取templates/sql/${model_names}.sql使用sql2gorm生成 model输出/更新目录core/repositories/models/${model_names}/model.go结构体与模型方法variables.go字段常量、主键常量、Columnsdata.goItem 转换模板首次生成db.goDB foundation 封装首次生成说明会临时修改 SQL去掉DEFAULT (JSON_ARRAY())后恢复原文件会自动插入ToMap/Columns/PrimaryKey/TableName/Correction/...等通用方法Step 2注册 model 到 db service contextset-db-model.sh调用bash./set-db-model.sh-name$model_names-name-zh$model_name_zh主要动作确保core/app/sev/db/internal/svc/service_context.go中存在model import${PascalModel}Model *${model_names}.DB字段NewServiceContext内对应初始化结果DB 服务上下文可以直接访问新模型。Step 3追加 API 描述set-api.sh调用bash./set-api.sh-path${MAIN_PATH}/templates/apis/backend-api.api-name$model_name-names$model_names-name-zh$model_name_zh主要动作向templates/apis/backend-api.api追加模块 CRUD 路由定义Create/Update/List/Row/Delete带AuthMiddleware和 group$model_names若已存在同类片段则跳过结果API 源描述文件具备新模块接口定义。Step 4生成 API 服务代码2.sev-api.sh调用bash./2.sev-api.sh-namebackend主要动作用goctl api go基于templates/apis/backend-api.api生成/刷新core/app/sev/backend期间临时替换默认 handler/logic 模板为自定义模板生成后恢复模板文件处理入口与配置backend.go-main.go若需要etc/backend-api.yaml-etc/.backend-api.yaml结果backend API 项目生成完成含新增接口骨架。Step 5补齐 RPC proto 方法set-db-proto.sh调用bash./set-db-proto.sh-path${MAIN_PATH}/core/app/sev/db/db.proto-name$model_name-names$model_names-name-zh$model_name_zh-sev$rpc_sev_module主要动作在db.proto的service ${rpc_sev_module}内补充缺失方法${Model}Create${Model}Delete${Model}Update${Model}Row${Models}列表结果RPC 协议层具备新模块 CRUD 方法签名。Step 6生成 RPC 代码3.sev-rpc.sh调用bash./3.sev-rpc.sh-namedb主要动作基于core/app/sev/db/db.proto执行goctl rpc protoc ...生成/刷新core/app/sev/db下 rpc 相关代码处理入口与配置db.go-main.goetc/db.yaml-etc/.db-rpc.yaml结果RPC 服务代码与 proto 同步。Step 7生成 RPC 业务逻辑模板5.sev-rpc-logic.sh调用bash./5.sev-rpc-logic.sh -sev-namedb-module$rpc_sev_module-name$model_name-names$model_names-model-name$model_names主要动作使用自定义模板创建 db rpc 逻辑文件${model_name}_create_logic.go${model_name}_delete_logic.go${model_name}_update_logic.go${model_names}_logic.go${model_name}_row_logic.go执行模板变量替换并格式化结果RPC 逻辑层生成标准 CRUD 模板代码。Step 8生成 API 逻辑与 handler 模板4.sev-api-rpc-logic.sh调用bash./4.sev-api-rpc-logic.sh -sev-namedb-module$rpc_sev_module-name$model_name-names$model_names-model-name$model_names-service-client$rpc_sev_client主要动作在core/app/sev/backend/internal/logic/${model_names}生成 5 个 logic 文件在core/app/sev/backend/internal/handler/${model_names}生成 5 个 handler 文件替换 ServiceClient/模块名/日志类型等模板变量结果API 层与 RPC 调用逻辑骨架全部补齐。Step 9注册操作日志类型set-operation-type.sh调用bash./set-operation-type.sh-name$model_name-name-zh$model_name_zh主要动作修改core/repositories/models/system-operation-logs/data.go增加该模块的 Create/Update/Delete 操作类型常量与显示文案结果新模块操作纳入统一操作日志类型系统。Step 10追加权限并回填 handler 权限set-permissions.sh调用output$(bash./set-permissions.sh -name-zh $model_name_zh-name$model_names -server-namebackend)主要动作修改权限定义文件core/common/source/permissions/backend.gocore/common/source/permissions/frontend.go自动生成新的权限 ID 段如P_0_xx、P_1_xx回填 API handler 中permissions.TODO为具体权限常量输出backend_permissions_id...frontend_permissions_id...结果后端权限树、前端权限树、接口权限绑定三者打通。Step 11生成前端 TSX 模板代码set-tsx.sh调用bash./set-tsx.sh-name$model_name-names$model_names-backend-permissions$backend_permissions_id-frontend-permissions$frontend_permissions_id-model-path${SERVER_REPOSITORIES_PATH}/models/${model_names}主要动作从core/repositories/models/${model_names}/model.go解析结构体字段自动映射为 TS 类型number/string/boolean/any[]/…套用模板输出到tmp/tsx/${model_names}/model.tsxtmp/tsx/${model_names}/index.tsxtmp/tsx/${model_names}/api.ts结果前端模块初始代码生成完成位于tmp/tsx/...可再搬运到正式前端目录。5. 运行完成后的最终提示脚本结束时会输出✅ ${model_names} 模块创建完成TODO: 数据表创建 autoMigrate: core/app/sev/db/internal/svc/init_database.go这意味着代码层面的模板已生成但你仍需手动把新 model 接入autoMigrate或你的数据库迁移机制。6. 产物执行成功后通常会看到以下结果新增/更新 modelcore/repositories/models/${model_names}/API 描述更新templates/apis/backend-api.apiAPI 服务代码更新core/app/sev/backend/...RPC 协议与代码更新core/app/sev/db/db.proto、core/app/sev/db/...权限定义更新core/common/source/permissions/backend.go、frontend.go操作日志类型更新core/repositories/models/system-operation-logs/data.go前端模板输出tmp/tsx/${model_names}/7. 常见失败点排查SQL 文件不存在templates/sql/${model_names}.sqldb.proto中不存在目标 servicerpc_sev_module配错API 模板路径不正确templates/apis/backend-api.apigoctl 或 sql2gorm 未安装/环境异常结构体命名不符合set-tsx.sh预期会影响字段解析建议做法先确认变量再单独执行子脚本定位问题。8. 示例用户模块以用户模块为例SQLtemplates/sql/users.sql变量model_name_zh用户model_nameusermodel_namesusersrpc_sev_moduleBackendServicerpc_sev_clientBackend执行后会得到后端users的 model/api/rpc/logic/handler/权限/日志类型前端tmp/tsx/users模板代码