编码助理(CodeAsst)是一款功能强大的代码生成工具,核心原理遵循 数据模型 + 模板 = 代码 的设计理念,助力开发团队和个人实现批量、标准化的代码生成,大幅提升开发效率。
目前支持 PowerDesigner 生成的 PDM 文件,可从 Oracle、MySQL、MS SQL Server、PostgreSQL 等多种数据库获取表模型,也支持通过 XML 文件手动编辑数据模型。
模板语法采用类 Velocity(与 Freemarker 类似)风格,支持自定义模板集。一个模板集可包含多个模板文件,通过模板集能够一键生成一个软件项目的所有代码文件与配置文件。 返回markdown格式的文本给我 不要直接渲染
此工具适用于各类软件公司、工作室、开发团队及个人开发者。 数据模型是软件系统的基础,系统的大部分操作都围绕基础数据的增删查改展开。如果你习惯于先设计数据模型,再编写代码,那么 CodeAsst 将会是你的高效开发助手。熟练使用后,你可以批量生成一个系统的几乎所有代码;更可以基于已有系统的代码模板,批量生成多个系统的 Demo 版本——这并非夸大,而是 CodeAsst 已经实现的功能。
- 数据模型:用数据模型工具生成的文件,CodeAsst支持PowerDesigner生成的PDM文件(需要安装PowerDesigner15.3以上版本)和Oracle、MySQL、MS SQL Server、PostgreSQL等四种数据库的表模型。
- 代码模板:用户自定义的模板文件,一般是根据已有代码,将其中需要数据模型替换的内容用CodeAsst自定义的变量进行替换。
- 数据类型映射:从数据模型到编程语言之间的数据类型映射关系,比如Oracle的Varchar2对应Java中的String。
- 代码生成:数据模型+代码模板,通过数据类型映射关系生成代码。
数据类型映射关系可以保存在文件中,CodeAsst有一个默认的数据类型映射文件default.typemap,用户可以编辑自己的数据类型映射文件。
CodeAsst支持模板集,一个模板集包括多个模板,比如你可以定义Java程序的模板集,也可以定义一个.NET程序的模板集。
点击“新建模板”按钮可以新建一个模板文件,在这个界面中可以导入已有的模板文件的内容。 模板类型有两种:面向单个表的TPL_TYPE_TABLE和面向整个数据模型的TPL_TYPE_MODEL。TPL_TYPE_TABLE适合于对单表的增删查改操作的代码模板,TPL_TYPE_MODEL适合于面向多个表的操作文件。
此模板通过内置变量table获取数据模型中的一个table的相关属性。 模板的注释使用“#”“#”,此两者之间包括的内容的生成代码时会略掉。
#*模板使用方法
1、此模板使用Velocity语法;
2、模板类型为“TPL_TYPE_TABLE”需使用table作为引用对象,模板类型为“TPL_TYPE_MODEL”的需使用model作为引用对象;
3、此软件内置了一些功能函数,需用fun进行引用,目前支持函数列表如下,如需新的函数功能,请联系作者:
fun.lFormat(String code):将输出参数为下划线分隔的字符串中的下划线去掉,第一个词的首字母小写,其余分隔词的首字母大写;
fun.uFormat(String code):将输出参数为下划线分隔的字符串中的下划线去掉,第一个词的首字母大写,其余分隔词的首字母大写;
fun.lowerFirst(String str):将字符串的首字母小写,其余字母保持不变
fun.upperFirst(String str):将字符串的首字母大写,其余字母保持不变
fun.lower(String str):将字符串改为小写
fun.upper(String str):将字符串改为大写
fun.toLangDataType(String dbdt, String lang):查找typemap表,根据数据库的字段类型得到对应的语言的数据类型。
4、生成文件名规则的设置也使用Velocity语法,可以在文件名规则中使用子目录规则,文件路径分隔符可以用"${sep}",也可以直接用反斜杠"/"
*#
//表名
${table.name} $table.name
//表CODE
${table.code} $table.code
//表CODE,去下划线,首字母小写
${fun.lFormat($table.code)}
//表CODE,去下划线,首字母大写
${fun.uFormat($table.code)}
//表列集合
#foreach($col in $table.columns)
第${count}列
列名: ${col.name}
列CODE:${col.code} 格式化的列CODE:${fun.uFormat($col.code)},${fun.lFormat($col.code)}
列类型: ${col.type} 目标语言列类型:${fun.toLangDataType($col.type,"JAVA")}
#end
#if ($table.primaryKey.size()>0) ##先判断是否有主键
//表的主键(即主键只有一列)
单主键:${table.primaryColumn.name},${table.primaryColumn.code},${fun.lFormat($table.primaryColumn.code)},${fun.uFormat($table.primaryColumn.code)}
//复合主键(即主键由多列组成)
#foreach ($col in $table.primaryKey)
列名: ${col.name}
列CODE:${col.code} 格式化的列CODE:${fun.uFormat($col.code)},${fun.lFormat($col.code)}
列类型: ${col.type} 目标语言列类型:${fun.toLangDataType($col.type,"JAVA")}
#end
#end
//表的外键
#if ($table.refs.size() > 0)
#foreach ($ref in $table.refs)
子表:CODE=${ref.childTable.code},名称=${ref.childTable.name} //ref.childTable得到子表
父表:CODE=${ref.parentTable.code},名称=${ref.parentTable.name} //ref.parentTable得到父表
子表的列:CODE=${ref.childColumn.code},名称=${ref.childColumn.name}
父表的列:CODE=${ref.parentColumn.code},名称=${ref.parentColumn.name}
#end
#end
此模板通过内置变量model获取数据模型中的相关属性。 模板的注释使用“#”“#”,此两者之间包括的内容的生成代码时会略掉。
#*模板使用方法
1、此模板使用Velocity语法;
2、模板类型为“TPL_TYPE_TABLE”需使用table作为引用对象,模板类型为“TPL_TYPE_MODEL”的需使用model作为引用对象;
3、此软件内置了一些功能函数,需用fun进行引用,目前支持函数列模型如下,如需新的函数功能,请联系作者:
fun.lFormat(String code):将输出参数为下划线分隔的字符串中的下划线去掉,第一个词的首字母小写,其余分隔词的首字母大写;
fun.uFormat(String code):将输出参数为下划线分隔的字符串中的下划线去掉,第一个词的首字母大写,其余分隔词的首字母大写;
fun.toLangDataType(String dbdt, String lang):查找typemap模型,根据数据库的字段类型得到对应的语言的数据类型。
fun.lowerFirst(String str):将字符串的首字母小写,其余字母保持不变
fun.upperFirst(String str):将字符串的首字母大写,其余字母保持不变
fun.lower(String str):将字符串改为小写
fun.upper(String str):将字符串改为大写
4、生成文件名规则的设置也使用Velocity语法,可以在文件名规则中使用子目录规则,文件路径分隔符可以用"${sep}",也可以直接用反斜杠"/"
*#
//模型名
${model.name} $model.name
//遍历全部表
#foreach($table in $model.tables)
第${count}个表:表名:${table.name} 表CODE:${table.code}
#end
//遍历已选择的表
#foreach($table in $model.selectedTables)
第${count}个表:表名:${table.name} 表CODE:${table.code}
#end
//模型里所有外键
#if ($model.refs.size() > 0)
#foreach ($ref in $model.refs)
子表:CODE=${ref.childTable.code},名称=${ref.childTable.name} //ref.childTable得到子模型
父表:CODE=${ref.parentTable.code},名称=${ref.parentTable.name} //ref.parentTable得到父模型
子表的列:CODE=${ref.childColumn.code},名称=${ref.childColumn.name}
父表的列:CODE=${ref.parentColumn.code},名称=${ref.parentColumn.name}
#end
#end
每个模板可以自定义一个模板生成文件的命名规则 模板类型为TPL_TYPE_TABLE 的命名规则可以使用内置变量table进行定义,同时支持内置函数和子目录,例如表USER_BOOK对应命名规则为“txt/${fun.uFormat(${table.code})}_example.txt”,则生成的文件为目录txt下的“UserBook_example.txt”。 类似,模板类型为TPL_TYPE_MODEL的命名规则使用内置变量model进行定义。
模板内容可以直接在CodeAsst中进行编辑,也可以使用自己熟悉的文本编辑器编辑。

需要安装PowerDesigner15.3及以上版本,用户在文件选择对话框中选择了PDM文件后,CodeAsst会打开PowerDesigner获取PDM文件中的数据模型信息。
需要安装PowerDesigner15.3及以上版本,CodeAsst会自动连接PowerDesigner获取用户已经打开的PDM文件。
CodeAsst自定义了自己的数据模型XML文件,用户可以自行编辑XML文件以定义自己的数据模型。在“选择表模型”的界面中,用户可以将已打开的数据模型导出为XML文件进行编辑。
点了相应按钮后,会弹出连接数据库的对话框,在输入JDBC的连接地址、用户名和密码后,点“连接”按钮获取数据库的用户列表。
在选中的用户名中选择一个,点确定后,CodeAsst会读取此用户下的所有表的属性结构信息,可能会花费几分钟时间完成相应操作。
在数据模型已打开的情况下,在“选择表模型”界面可以查看并选择需要生成代码的表模型。 同时,可以将数据模型导出为XML文件(后缀名为.model.xml)。
在代码模板已经确认,数据模型已经确认的情况下,可以打开“代码生成”界面。

如图,点击红圈内的按钮可以设置生成文件的目录,点击“生成文件”按钮可以生成文件。
非授权用户仅能生成3个文件。
fun.lFormat(String code):将输出参数为下划线分隔的字符串中的下划线去掉,第一个词的首字母小写,其余分隔词的首字母大写;
fun.uFormat(String code):将输出参数为下划线分隔的字符串中的下划线去掉,第一个词的首字母大写,其余分隔词的首字母大写;
fun.lowerFirst(String str):将字符串的首字母小写,其余字母保持不变
fun.upperFirst(String str):将字符串的首字母大写,其余字母保持不变
fun.lower(String str):将字符串改为小写
fun.upper(String str):将字符串改为大写
fun.toLangDataType(String dbdt, String lang):查找数据类型映射表,根据数据库的字段类型得到对应的语言的数据类型。
样例:
//表CODE,去下划线,首字母大写
${fun.uFormat($table.code)}
TPL_TYPE_TALBE类型的模板以table作为主变量获取选中的表的字段信息。
l 表名:table.name
l 表CODE:table.code
l 表列集合:table.columns
#foreach($col in $table.columns)
第${count}列
列名: ${col.name}
列CODE:${col.code} 格式化的列CODE:${fun.uFormat($col.code)},${fun.lFormat($col.code)}
列类型: ${col.type} 目标语言列类型:${fun.toLangDataType($col.type,"JAVA")}
#end
l 主键:table.primaryKey
#if ($table.primaryKey.size()>0) ##先判断是否有主键
//表的主键(即主键只有一列)
单主键:${table.primaryColumn.name},${table.primaryColumn.code},${fun.lFormat($table.primaryColumn.code)},${fun.uFormat($table.primaryColumn.code)}
//复合主键(即主键由多列组成)
#foreach ($col in $table.primaryKey)
列名: ${col.name}
列CODE:${col.code} 格式化的列CODE:${fun.uFormat($col.code)},${fun.lFormat($col.code)}
列类型: ${col.type} 目标语言列类型:${fun.toLangDataType($col.type,"JAVA")}
#end
#end
l 外键:table.refs
#if ($table.refs.size() > 0)
#foreach ($ref in $table.refs)
子表:CODE=${ref.childTable.code},名称=${ref.childTable.name} //ref.childTable得到子表
父表:CODE=${ref.parentTable.code},名称=${ref.parentTable.name} //ref.parentTable得到父表
子表的列:CODE=${ref.childColumn.code},名称=${ref.childColumn.name}
父表的列:CODE=${ref.parentColumn.code},名称=${ref.parentColumn.name}
#end
#end
l 模型名:model.name
l 模型中的表集合:model.tables
#foreach($table in $model.tables)
第${count}个表:表名:${table.name} 表CODE:${table.code}
#end
l 模型中已选择的表集合:model.selectedTables
#foreach($table in $model.selectedTables)
第${count}个表:表名:${table.name} 表CODE:${table.code}
#end
l 模型中的外键集合:model.refs
#if ($model.refs.size() > 0)
#foreach ($ref in $model.refs)
子表:CODE=${ref.childTable.code},名称=${ref.childTable.name} //ref.childTable得到子模型
父表:CODE=${ref.parentTable.code},名称=${ref.parentTable.name} //ref.parentTable得到父模型
子表的列:CODE=${ref.childColumn.code},名称=${ref.childColumn.name}
父表的列:CODE=${ref.parentColumn.code},名称=${ref.parentColumn.name}
#end
#end
模板内容可以直接在CodeAsst中进行编辑,也可以使用自己熟悉的文本编辑器编辑。

CodeAsst自带了一个数据类型映射文件default.typemap,用户可以根据自己需要进行新增和修改。

CodeAsst自定义了数据模型的XML语法,用户可以用PowerDesigner编辑数据模型后导出为XML文件,然后用文本编辑器看看文件格式。
-
支持PowerDesigner的哪几个版本:目前测试过PowerDesigner15.3和16.1。低于15.3的PowerDesigner版本本软件无法支持。如果有发现高于15.3的软件版本支持不了的,请和作者联系处理。
-
支持哪些数据库系统:理论上所有关系型数据库系统都可以支撑,目前测试过Oracle、MySQL、Sql Server、PostgreSQL四种数据库系统。如果有需要支持其它数据库系统,请和作者联系。
-
可以定制化开发么:当然可以,请和作者联系,根据定制化开发的工作量进行收费。
-
作者:杭州智予数信息技术有限公司









