{"id":41217607,"url":"https://github.com/ixre/tto","last_synced_at":"2026-01-23T00:07:12.614Z","repository":{"id":57482300,"uuid":"188645688","full_name":"ixre/tto","owner":"ixre","description":"The simple code generator written by golang, support multiple program language, mysql, postgresql databases.  一个使用Go编写的支持多种编程语言的代码生成器, 数据库支持mysql和postgresql","archived":false,"fork":false,"pushed_at":"2025-05-18T18:50:11.000Z","size":2542,"stargazers_count":27,"open_issues_count":0,"forks_count":6,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-05-18T19:37:47.012Z","etag":null,"topics":["code-generators","free-generator","java-generators","vue-generators"],"latest_commit_sha":null,"homepage":"","language":"Smarty","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ixre.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2019-05-26T05:54:50.000Z","updated_at":"2025-05-18T18:50:14.000Z","dependencies_parsed_at":"2023-02-04T04:00:15.053Z","dependency_job_id":"952e8c1e-7b04-4e79-97f3-f78ae7c9e286","html_url":"https://github.com/ixre/tto","commit_stats":null,"previous_names":[],"tags_count":34,"template":false,"template_full_name":null,"purl":"pkg:github/ixre/tto","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ixre%2Ftto","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ixre%2Ftto/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ixre%2Ftto/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ixre%2Ftto/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ixre","download_url":"https://codeload.github.com/ixre/tto/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ixre%2Ftto/sbom","scorecard":{"id":499043,"data":{"date":"2025-08-11","repo":{"name":"github.com/ixre/tto","commit":"5d14423f5a51f0aeb0fd928081ad1386a3b7aa58"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Maintained","score":0,"reason":"1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.15.21 not signed: https://api.github.com/repos/ixre/tto/releases/160863212","Warn: release artifact v0.5.7 not signed: https://api.github.com/repos/ixre/tto/releases/133155786","Warn: release artifact v0.5.5 not signed: https://api.github.com/repos/ixre/tto/releases/94749775","Warn: release artifact v0.5.3 not signed: https://api.github.com/repos/ixre/tto/releases/86881392","Warn: release artifact v0.5.1 not signed: https://api.github.com/repos/ixre/tto/releases/74062620","Warn: release artifact v1.15.21 does not have provenance: https://api.github.com/repos/ixre/tto/releases/160863212","Warn: release artifact v0.5.7 does not have provenance: https://api.github.com/repos/ixre/tto/releases/133155786","Warn: release artifact v0.5.5 does not have provenance: https://api.github.com/repos/ixre/tto/releases/94749775","Warn: release artifact v0.5.3 does not have provenance: https://api.github.com/repos/ixre/tto/releases/86881392","Warn: release artifact v0.5.1 does not have provenance: https://api.github.com/repos/ixre/tto/releases/74062620"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T21:19:47.016Z","repository_id":57482300,"created_at":"2025-08-19T21:19:47.016Z","updated_at":"2025-08-19T21:19:47.016Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28675444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-22T20:48:19.482Z","status":"ssl_error","status_checked_at":"2026-01-22T20:48:14.968Z","response_time":144,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["code-generators","free-generator","java-generators","vue-generators"],"created_at":"2026-01-23T00:07:12.544Z","updated_at":"2026-01-23T00:07:12.599Z","avatar_url":"https://github.com/ixre.png","language":"Smarty","readme":"# 代码生成器\n\n**TTO 是一款使用 Go 编写的代码生成器,兼容多种数据库,支持多种语言,支持自定义模板生成代码.**\n\n特点:\n\n- 支持 windows,macos,linux 操作系统.\n- 支持 mysql/mariadb、postgresql 和 sqlserver 数据库.\n- 支持代码模板和模板函数,内置十多种开箱即用代码模板.\n- 支持模型逆向生成数据库和代码.\n- 支持 Go,JAVA,Python,Js,C#,Kotlin,Html 等多种语言.\n- 支持生成前端代码,内置 vue2/vue3 模板\n- 内置 Protobuf 和 Thrift 等 RPC 框架模板\n- 自带版本升级和自动更新功能\n\n## 安装\n\n### 命令行工具\n\n在 Linux/Mac 下安装，使用以下命令安装\n\n```bash\ncurl -L https://raw.githubusercontent.com/ixre/tto/master/install | sh\n```\n\nWindows 用户进入下载页面([链接](https://github.com/ixre/tto/releases/)),下载最新版本(文件:tto-generator-client.tar.gz)后解压,将目录中的`tto.exe`文件复制到`C:\\windows`下完成安装.　请注意 windows10 以下版本需要复制到`C:\\windows\\System32`目录.\n\n### 图形界面\n\n`tto`提供基于 B/S 的图形界面，可进行模板管理和代码生成等功能，使用`docker`运行图形界面，参考以下命令：\n\n```bash\ndocker run -d --name gdp -p 8000:8000 \\\n    -v $(pwd)/conf:/app/conf\\\n    -v $(pwd)/storage:/app/storage\\\n    jarry6/gdp\n```\n\n或直接下载运行二进制包后，输入以下网址运行:\n\n```text\nhttp://localhost:8000\n```\n\n## 升级\n\n`tto`内置了版本更新功能,命令如下:\n`tto update`\n_注：在 windows 下升级功能如无法正常使用,可以手动重新安装_\n\n## 快速开始\n\n### 　下载程序包\n\n到下载页面([链接](https://github.com/ixre/tto/releases/)),下载最新版本(文件:tto-generator-bin.tar.gz)后解压;\n\n### 　配置数据库\n\n`tto.conf`为程序的默认配置文件,　打开文件进行找到`[database]`节点配置数据库.\n\n### 　使用模板\n\n您可以直接使用安装包里的模板文件,　或按照您的风格对模板进行修改,　甚至单独创建模板.\n\n### 运行命令生成代码\n\n执行以下命令生成代码,代码会生成到`output`目录\n\n`tto -clean`\n\n但实际应用中,推荐使用脚本文件来完成生成,　您可以参考安装包中的示例脚本文件:`./example.sh`;\n\n在 windows 中可以使用`git-bash`来执行该脚本\n\n## 模板\n\n`tto`模板使用`Go Template`,　具体语法参考:\n\n- [Go 模板语法-中](http://www.g-var.com/posts/translation/hugo/hugo-21-go-template-primer/)\n- [Go 模板语法-English](https://golang.org/pkg/text/template/)\n\n### 预定义语法\n\n预定义语法用来在代码模板中定义一些数据, 在生成代码时预定义语法不输入任何内容. 预定义语法格式为: !预定义参数名:预定义参数值\n\n目前,支持的预定义语法如下:\n\n- \\#!kind: 定义模板生成类型,0:普通,1:生成所有表 2:按表名前缀生成,默认为 0\n- \\#!target: 用来定义代码文件存放的目标路径\n- \\#!append: 是否追加到文件,可选值为:true 和 false , 默认为 false\n- \\#!format: 是否启用格式化代码，可选值为:true 和 false，默认开启\n- \\#!lang: 指定当前生成代码的语言 如:\n\n```text\n#!target:java/{{.global.pkg}}/pojo/{{.table.Title}}{{.global.entity_suffix}}.java\n```\n\n多个预定义表达式可以放在一行\n\n```text\n#!format:true#!target:Entity.java\n```\n\n### 模板注释\n\n模板注释,使用`/** #! 注释 */`的语法,使用`#!`与普通的代码注释区分\n\n```java\n/** #! 这是模板注释,不会出现在生成的代码中 */\n```\n\n### 模板函数\n\n获取用户环境变量\n\n```text\n{{env \"PROJECT_MEMBERS\"}}\n```\n\n大/小写函数: lower 和 upper\n\n```text\n{{lower .table.Name}}\n{{upper .table.Name}}\n```\n\n单词首字大写函数:title\n\n```text\n{{title .table.Name}}\n```\n\n首字母小写函数: lower_title\n\n```text\n{{lower_title .table.Name}}\n```\n\n语言类型函数: type\n\n```text\n{{type \"go\" .columns[0].Type}}\n```\n\n返回 SQL/ORM 类型: sql_type\n\n```text\n{{sql_type \"py\" .columns[0].Type .columns[0].Length}}\n```\n\n返回 ORM 字段类型,通常在 Java 中使用\n\n```text\n{{orm_type \"java\" 3 }}  // 输出: Integer\n```\n\n是否为数值类型\n\n```text\n{{num_type .table.PkType}}\n```\n\n包函数: pkg, 用于获取包的路径\n\n```text\n{{pkg \"go\" .global.pkg}} # github.com/ixre\n```\n\n路径函数: path, 用于生成 url 路径\n\n```text\n{{path .global.pkg}} # sys/option/list\n```\n\n包名函数:\n\n```text\n{{pkg_name \"go\" \"github/com/ixre\"}} # ixre\n```\n\n默认值函数: default\n\n```text\n{{default \"go\" .columns[0].TypeId}}\n```\n\n是否相等\n\n```text\n{{equal (3%2) 1}}\n```\n\n是否与任意值相等, 如表的主键是否为 int 类型\n\n```text\n{{equal_any .table.PkType 3 4 5}}\n```\n\n替换, 如将`table_name`替换为:`table-name`\n\n```text\n{{replace \"table_name\" \"_\" \"-\"}}\n```\n\n替换 N 次, 如将`table_name`替换为:`table-name`\n\n```text\n{{replace_n \"table_name\" \"_\" \"-\" 1}}\n```\n\n截取字符串函数：substr\n\n```text\n{{substr \"sys_user_list\" 0 3 }} # 结果：sys\n{{substr \"sys_user_list\" 4 }} 结果:sys_list\n```\n\n截取第 N 个字符位置后的字符串,如以下语句将输出:user_list\n\n```text\n{{substr_n \"sys_user_list\" \"_\" 1}}\n```\n\n截取索引为 N 的元素\n\n```text\n{{$first_table := get_n .tables 0}}\n```\n\n字符组合,如以下语句将输出:`1,2,3`\n\n```text\n{{join \",\" \"1\",\"2\",\"3\"}}\n{{$api := join \"/\" .global.base_path (name_path .table.Raw.Name)}}\n```\n\n包含函数\n\n```text\n{{contain .table.Pk \"id\"}}\n```\n\n是否以指定字符开始\n\n```text\n{{starts_with .table.Pk \"user_\"}}\n```\n\n是否以指定字符结束\n\n```text\n{{ends_with .table.Pk \"_time\"}}\n```\n\n是否为表的列(数组)的最后一列\n\n```text\n{{$columns := .columns}}\n{{range $,$v := .columns}}\n{{if is_last $i .columns}} last column {{end}}\n{{if not (is_last $i .columns) }} not last column {{end}}\n{{end}}\n```\n\n排除列元素, 组成新的列数组, 如：\n\n```text\n{{ $columns := exclude .columns \"id\",\"create_time\" }}\n```\n\n尝试获取一个列,返回列, 如:\n\n```text\n{{ $c := try_get .columns \"update_time\" }}\n{{if $c}}prop={{$c.Prop}}{{end}}\n```\n\n将名称转为路径,规则： 替换首个\"\\_\"为\"/\"\n\n```text\n{{$path := name_path .table.Name}}\n```\n\n计算求余数\n\n```go\n{{$mod := mod 3 2}}\n```\n\n### 代码模板\n\n模板目录默认为`templates`, 我们可以通过结合内置的函数和语法, 生成项目代码.\n\n模板主要包含三大对象:\n\n- global\n- table\n- columns\n\n按所有表(前缀分组)模板包含对象：\n\n- global\n- tables\n\n### 全局变量(global)\n\n输出生成器的版本号\n\n```text\n// this file created by generate {{.global.version}}\n```\n\n输出包名,包名通过配置文件配置.格式为: com/pkg\n\n```text\npackage {{.global.pkg}}\n```\n\n如果是 Java 或其他语言, 包名以\".\"分割, 可使用 pkg 函数,如:\n\n```text\n// java package\npackage {{pkg \"java\" .global.pkg}}\n// c# namespace\nnamespace {{pkg \"csharp\" .global.pkg}}\n```\n\n输出当前时间\n\n```text\ngenerate time {{.global.time}}\n```\n\n获取数据库驱动 可选值：pgsql | mysql, 可针对不同数据库生成代码\n\n```text\n{{.global.db}}\n```\n\n输出自定义变量 用户可以通过在配置文件的节点`[global]`中进行添加变量,如:\n\n```text\n[global]\nbase_path=\"/api\"\n```\n\n使用以下语法读取变量\n\n```text\n{{.global.base_path}}\n```\n\n### 数据表对象(table)\n\n数据表对象对来返回表的信息,包含如下属性:\n\n- Name: 表名\n- Prefix: 表前缀\n- Pk: 主键,默认为:id\n- PkProp: 主键属性, 首字母大写\n- PkType: 主键类型编号\n- Title: 表名单词首字大写,通常用来表示类型, 如:user_info 对应的 Title 为 UserInfo\n- ShortTitle: 同 title, 但不包含前缀\n- Comment: 表注释\n- Engine: 数据库引擎\n- Schema: 架构\n- Charset: 数据库编码\n- Ordinal: 表的序号\n\n### 数据列对象(columns)\n\n数据列对象存储表的数据列数组, 并且可遍历. 每个数据列都包含如下属性:\n\n- Name: 列名\n- Prop: 列名首字大写, 通常用作属性\n- IsPk: 是否主键(bool)\n- IsAuto: 是否自动生成(bool)\n- NotNull: 是否不能为空(bool)\n- DbType: 数据库数据类型\n- Comment: 注释\n- Length: 长度\n- Type: 类型编号,使用 type 函数转换为对应语言的类型\n- Ordinal: 列的序号\n\n示例:\n\n```text\n{{range $i,$c := .columns}}\n    列名:$c.Name {{if $c.IsPk}}是主键{{end}}, 类型:{{type \"java\" $c.Type}}\n{{end}}\n```\n\n## 模板示例\n\n以下代码用于生成 Java 的 Pojo 对象, 更多示例点击[这里](templates)\n\n```text\n#!target:{{.global.pkg}}/pojo/{{.table.Title}}{{.global.entity_suffix}}.java\npackage {{pkg \"java\" .global.pkg}}.pojo;\n\nimport javax.persistence.Basic;\nimport javax.persistence.Id;\nimport javax.persistence.Column;\nimport javax.persistence.Entity;\nimport javax.persistence.Table;\nimport javax.persistence.GenerationType;\nimport javax.persistence.GeneratedValue;\n\n/** {{.table.Comment}} */\n@Entity\n@Table(name = \"{{.table.Name}}\", schema = \"{{.table.Schema}}\")\npublic class {{.table.Title}}{{.global.entity_suffix}} {\n    {{range $i,$c := .columns}}{{$type := type \"java\" $c.Type}}\n    private {{$type}} {{$c.Name}}\n    public void set{{$c.Prop}}({{$type}} {{$c.Name}}){\n        this.{{$c.Name}} = {{$c.Name}}\n    }\n\n    /** {{$c.Comment}} */{{if $c.IsPk}}\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY){{else}}\n    @Basic{{end}}\n    @Column(name = \"{{$c.Name}}\"\n     {{if not $c.NotNull}}, nullable = true{{end}}\n     {{if ne $c.Length 0}},length = {{$c.Length}}{{end}})\n    public {{$type}} get{{$c.Prop}}() {\n        return this.{{$c.Name}};\n    }\n    {{end}}\n}\n\n```\n\n## 逆向生成代码\n\n参见代码：[generate_test.go](generate_test.go)\n\n**如果您觉得这个项目不错, 请给个 star 吧.**\n\n\u003cimg src=\"images/cq-alipay.png\" width=\"320\" style=\"display:inline-block\"/\u003e\u003cimg src=\"images/cq-wxpay.png\" width=\"354\" style=\"display:inline-block\"/\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fixre%2Ftto","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fixre%2Ftto","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fixre%2Ftto/lists"}