diff --git a/.gitignore b/.gitignore index 0d2e705..3e753e7 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ tmp/* # Project runtime log logs/*.log -docs +docs/docs.go +docs/swagger.* INSTALL.lock \ No newline at end of file diff --git a/assets/logo.png b/assets/logo.png new file mode 100644 index 0000000..b594da7 Binary files /dev/null and b/assets/logo.png differ diff --git a/configs/config_dev.toml b/configs/config_dev.toml index f24e931..9a8360d 100644 --- a/configs/config_dev.toml +++ b/configs/config_dev.toml @@ -9,23 +9,23 @@ connmaxlifetime = 60 host = '127.0.0.1' maxidleconn = 60 maxopenconn = 1 -name = 'gin-template' +name = 'gin_template' pass = 'root' port = 3306 user = 'root' [database.mysql.read] -database = 'gin-template' +database = 'gin_template' host = '127.0.0.1' -name = 'gin-template' +name = 'gin_template' pass = 'root' port = 3306 user = 'root' [database.mysql.write] -database = 'gin-template' +database = 'gin_template' host = '127.0.0.1' -name = 'gin-template' +name = 'gin_template' pass = 'root' port = 3306 user = 'root' diff --git a/configs/constants.go b/configs/constants.go index f2ef100..18cf315 100644 --- a/configs/constants.go +++ b/configs/constants.go @@ -1,8 +1,9 @@ // Package configs -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:32 -// @description: 常量配置 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:32 +// @description: 常量配置 package configs import ( diff --git a/configs/database.go b/configs/database.go index f7fb211..af501b3 100644 --- a/configs/database.go +++ b/configs/database.go @@ -1,8 +1,9 @@ // Package configs -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:32 -// @description: 数据库配置 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:32 +// @description: 数据库配置 package configs type DataBase struct { diff --git a/configs/notify.go b/configs/notify.go index 29ee298..a00c429 100644 --- a/configs/notify.go +++ b/configs/notify.go @@ -1,8 +1,9 @@ // Package configs -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:33 -// @description: 报警配置 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:33 +// @description: 报警配置 package configs type Notify struct { diff --git a/configs/redis.go b/configs/redis.go index 1d9e85c..96f3686 100644 --- a/configs/redis.go +++ b/configs/redis.go @@ -1,8 +1,9 @@ // Package configs -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:33 -// @description: redis配置 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:33 +// @description: redis配置 package configs type Redis struct { diff --git a/docs/pdma/.back_gin-template/T20240711100019.pdma.json b/docs/pdma/.back_gin-template/T20240711100019.pdma.json new file mode 100644 index 0000000..30aa4d8 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711100019.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template","avatar":"data:image/png;base64,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","version":"4.9.3","createdTime":"2024-7-10 16:56:07","updatedTime":"2024-7-11 10:00:19","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"E4CA14E3-1919-4937-84A1-018CFB59C762","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.dbType}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTO_INCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN '+field.defKey+' '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN '+after.defKey);\n }else{\n changeDDL += (' CHANGE COLUMN '+before.defKey+' '+after.defKey);\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n changeDDL += (' DEFAULT ' + defaultValue);\n let comment = after.comment||'';\n changeDDL += (' COMMENT \\''+comment+'\\';');\n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' IDENTITY(1,1)' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ','('+field.defaultValue+')',' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.dbType)=='varchar'||it.func.lowerCase(field.dbType)=='char'||it.func.lowerCase(field.dbType)=='text'||it.func.lowerCase(field.dbType)=='date'||it.func.lowerCase(field.dbType)=='datetime' ? 'string':it.func.lowerCase(field.dbType)=='tinyint unsigned'||it.func.lowerCase(field.dbType)=='bit'||it.func.lowerCase(field.dbType)=='integer'||it.func.lowerCase(field.dbType)=='tinyint'||it.func.lowerCase(field.dbType)=='smallint'||it.func.lowerCase(field.dbType)=='mediumint' ? 'int':it.func.lowerCase(field.dbType)=='int unsigned' ? 'bigint':it.func.lowerCase(field.dbType)}}{{?field.len>0&&(it.func.lowerCase(field.dbType)=='decimal'||it.func.lowerCase(field.dbType)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false},{"refKey":"defName","hideInGraph":false},{"refKey":"primaryKey","hideInGraph":false},{"refKey":"notNull","hideInGraph":true},{"refKey":"autoIncrement","hideInGraph":true},{"refKey":"domain","hideInGraph":true},{"refKey":"type","hideInGraph":false},{"refKey":"len","hideInGraph":false},{"refKey":"scale","hideInGraph":false},{"refKey":"comment","hideInGraph":true},{"refKey":"refDict","hideInGraph":true},{"refKey":"defaultValue","hideInGraph":true},{"refKey":"isStandard","hideInGraph":false},{"refKey":"uiHint","hideInGraph":true},{"refKey":"extProps","hideInGraph":true,"enable":false}],"extAttrProps":{"attr1":{"editType":"","optionsData":"","optionsFetcher":""},"attr2":{"editType":"","optionsData":"","optionsFetcher":""},"attr3":{"editType":"","optionsData":"","optionsFetcher":""},"attr4":{"editType":"","optionsData":"","optionsFetcher":""},"attr5":{"editType":"","optionsData":"","optionsFetcher":""},"attr6":{"editType":"","optionsData":"","optionsFetcher":""},"attr7":{"editType":"","optionsData":"","optionsFetcher":""},"attr8":{"editType":"","optionsData":"","optionsFetcher":""},"attr9":{"editType":"","optionsData":"","optionsFetcher":""}},"modelType":"modalGroup"},"entities":[{"id":"D495A024-BF4F-4BFB-BD98-7929182D7641","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"username","defName":"用户名","comment":"","domain":"54611CCC-CA4B-42E1-9F32-4944C85B85A6","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"84AB6D6D-8F50-4EA3-B9B5-004B6763C639","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"password","defName":"密码","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"EC3B1362-0816-451A-B584-ED09D0F6C8C2","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"E0E6EB91-5AC6-4707-B193-FA3B393C07D7","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":true,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"D3862BDD-2DE9-413D-8EC5-CE5013AE69A6","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_used","defName":"是否启用","comment":"1:是 -1:否","domain":"","type":"BIT","len":"1","scale":"","primaryKey":false,"notNull":true,"autoIncrement":true,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"C660194F-E804-45E2-BA4B-CD032945EB3B","extProps":{},"baseType":""},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"7D2B4DC2-A009-4F12-AD17-C213E238C928","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"C3EDFB4C-629E-41BC-87F0-B344E650D522","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"9C393A0F-5BFE-45C4-9D88-5CCCF18EDE0D","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"5B6B1F7D-5AB3-484A-BE60-8A225850535C","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"F2B3BB14-3DBC-4ACF-B343-8250E05EF412","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"088BD806-EFE9-4F55-A2B6-790D898DAF6E","fieldDefKey":"84AB6D6D-8F50-4EA3-B9B5-004B6763C639"}],"id":"A2AB27A8-8D58-4A62-A529-21ECF22277DF"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88","refEntity":"A5DB4BF1-1267-4980-AB85-81AD952AB064","refField":"0BC18231-16F7-4367-BC6C-61DA0928A07E","myRows":"1","refRows":"n","innerType":""}],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"},"notes":{}},{"id":"A5DB4BF1-1267-4980-AB85-81AD952AB064","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"766E8ADD-2230-4D9C-8089-229FA186C28B","extProps":{},"baseType":""},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"0BC18231-16F7-4367-BC6C-61DA0928A07E","extProps":{},"baseType":""},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"A11CF9AF-6327-476C-8B31-6AFB5B6DE191","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"6DD9FA5C-9BEA-4BCB-83F7-1AA060C44B2D","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"0607036A-A9EB-48F8-AEAF-49DFFE4BA9CF","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"04BA8A26-6C3D-4A01-B91B-094CF9D6D111","fieldDefKey":"0BC18231-16F7-4367-BC6C-61DA0928A07E"}],"id":"CC765053-A701-45AC-89AE-714F6AE9E992"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"3BE9A249-898D-4C72-B2C5-195A1D18DFAF","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"4B7CC681-AF21-4BB6-9EA8-3F5E84034A60","extProps":{},"baseType":""},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"5B592A4E-5BF0-4E65-A1EA-4448F3E717FA","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"3B3F08B7-E9BE-4022-A44F-90D5B2759024","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"FD8338EE-6F24-4595-A368-D7BB68A2F307","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"C229BFA4-850F-4598-80BF-6762C1EF2DCB","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_used","defName":"是否启用","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"41137343-0B93-4C7B-BF72-782C704B3843","extProps":{},"baseType":""},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"D5923F55-821C-4187-9DC4-60EEF026023F","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"A7B3A731-7ED5-4524-B620-38DBC2A4C3D4","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"9B6CF910-A64A-41D3-9766-1EDBC1A68A92","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"3AAF0410-7C6C-4B88-8E0A-F93CA397F5BC","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"BD31597C-0ECD-4E4B-8222-259385689263","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"780A50D3-E6CB-471D-AB58-BED31C800C94","fieldDefKey":"5B592A4E-5BF0-4E65-A1EA-4448F3E717FA"}],"id":"688C1377-C127-4F13-88F1-32127311A6F6"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"73349C61-04FA-46CE-828F-BB4DA7673350","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"4991A5FB-2C70-4B76-A13A-6685574D92BB","extProps":{},"baseType":""},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"A12DC927-1095-4372-B738-1F4BEB2EA093","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"87DD0746-C2E8-4BD7-9586-1E2F45DC07D8","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"76551DBE-EE9A-4517-B07B-16D7F860DA9D","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"41360A95-2A02-4990-B019-37F5CD48A824","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"B5AE04D1-44C5-4BC0-AE27-6D0F8F781FC5","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"4F1CAFCB-DB14-4A4A-B4F0-A4546D42B638","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"A364C231-D8E9-43FB-8ED3-006638D7112A","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"FAA4FB0E-8DAE-4E25-B0D1-02934DAC8487","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"B2AE77CC-2B4B-4E86-8A73-BD43F972E28A","extProps":{},"baseType":""},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"E4C467AC-E1F4-4020-8F53-003861A145C1","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"spec","defName":"crontab","comment":"表达式","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"57963640-5D8E-4240-8C7A-DAF21DF39CB3","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"BB7A44EF-CE78-4F48-98A2-5EBD45499E65","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"protocol","defName":"执行方式","comment":"1:shell 2:http","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"EB466D10-BA39-4155-9D28-12CBAF20246C","extProps":{},"baseType":""},{"defKey":"http_method","defName":"http","comment":"请求方式 1:get 2:post","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"335837C7-7C5F-4169-956F-37365FA6D39C","extProps":{},"baseType":""},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","id":"DC846891-0383-436D-A9D8-E31D1C90CB45","extProps":{},"baseType":""},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","id":"0A11B343-06D4-42F3-B8F6-973D11BC0D9D","extProps":{},"baseType":""},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"","type":"INT","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","id":"5A3889C0-914C-4A03-820F-177BA0A91397","extProps":{},"baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"notify_status","defName":"执行结束是否通知","comment":"1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"6DA16C8C-93FD-4A22-84B0-5AE6C90901C1","extProps":{},"baseType":""},{"defKey":"notify_type","defName":"通知类型","comment":"1:邮件 2:webhook","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"CE086898-3117-4616-B124-CA70DB137727","extProps":{},"baseType":""},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用","comment":"分割)","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"DBA97EE6-B4F6-4FE5-9E9C-2B7082EE0CFF","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用","comment":"分割)","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"67B0B44C-DA6E-46D8-A152-1171CEE2BA82","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":true,"refDict":"","id":"0BC32F87-F5BE-4428-9C70-2DE011666B54","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_used","defName":"是否启用","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":true,"refDict":"","id":"022192AE-46F4-42BE-BD6D-0CCD4BD8A780","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":true,"refDict":"","id":"7ABAD7A2-43FA-4E93-B7AC-35F276336ABA","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":true,"refDict":"","id":"B3860357-BE0E-4D70-AB31-A91DFD45114E","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":true,"refDict":"","id":"D9ED0695-29FE-4636-83C1-1A4AFDB6E3D7","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":true,"refDict":"","id":"54B21A73-1508-40DF-ABFB-7B21B7B24464","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"F1405A0F-A737-4FA6-91FB-35D9038F5666","fieldDefKey":"E4C467AC-E1F4-4020-8F53-003861A145C1"}],"id":"844C196C-C0C5-4B80-8284-1F2F7534BC2D"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"46E48439-3B30-455E-A387-4D5D88F4E194","extProps":{},"baseType":""},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"150AF050-4A0B-452E-AB34-4D88B130B7CE","extProps":{},"baseType":""},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"9EC13DCD-0612-4B93-A485-1E4EBD6624D7","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"78A7B547-83AC-4F67-B467-8F755EF5B3CB","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"A80630A5-56A7-498A-846D-9B6A2C59ECB6","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"level","defName":"菜单类型","comment":"1:一级菜单 2:二级菜单","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"504E7EF1-A6F2-41C4-89D6-4121B7AF1AEA","extProps":{},"baseType":""},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"1B090ECB-736E-4C45-AE35-25DA6C56848C","extProps":{},"baseType":""},{"defKey":"is_used","defName":"是否启用","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"89A22CE0-78D3-4BEF-98B3-52C6CAC76C40","extProps":{},"baseType":""},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"D72A7E2A-10E1-4F06-BA5C-5D1FD3B4332F","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"8FFB68D4-311F-4028-B5AC-F21F26AF776A","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"BE90ECC8-D6AC-4B8E-B33F-06B24ED77E8A","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"DC900F9A-C8A0-476A-8C8C-355F80060CFA","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"DAAE6745-8466-4E70-95C7-27077195828F","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"46E48439-3B30-455E-A387-4D5D88F4E194","refEntity":"A5DB4BF1-1267-4980-AB85-81AD952AB064","refField":"A11CF9AF-6327-476C-8B31-6AFB5B6DE191","myRows":"1","refRows":"n","innerType":""},{"myField":"46E48439-3B30-455E-A387-4D5D88F4E194","refEntity":"7BF77877-C7B5-4113-BF1C-1C3EA5B19276","refField":"AABA14A9-CF60-4522-9FBF-5D0512F0514F","myRows":"1","refRows":"n","innerType":""}],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"7BF77877-C7B5-4113-BF1C-1C3EA5B19276","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"1B3E17F0-0866-423B-9B53-20106AEF8183","extProps":{},"baseType":""},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"AABA14A9-CF60-4522-9FBF-5D0512F0514F","extProps":{},"baseType":""},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"C3A39570-6405-4EDB-BF0A-7A80E8C2B02B","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"23369B59-FA95-40CD-A618-F1F528316D0D","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"882725DE-789F-4065-AFF2-0E2D01E0EF57","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"C38A0965-8F1F-4D8F-A47B-9D2FD4D0E6E6","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"12E1496C-4F79-4422-BB03-8BFB3B687C7D","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"F95CD234-1FE2-4ED4-A389-EB40E0B290FC","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"3C7641ED-0749-4A31-9D00-ADC719B68A8A","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"F00E1016-6208-448E-AFDF-452EA689C131","fieldDefKey":"AABA14A9-CF60-4522-9FBF-5D0512F0514F"}],"id":"84925129-24E2-4737-8218-2126D4674F7C"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}}],"views":[],"dicts":[{"defKey":"Gender","defName":"性别","intro":"","items":[{"defKey":"M","defName":"男","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"1","id":"3622D417-DA1A-408F-BEE1-11D328D534A0"},{"defKey":"F","defName":"女","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"2","id":"380A0790-64A7-481E-831C-32F7BEE1502B"},{"defKey":"U","defName":"未知","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"3","id":"FA239F4D-1276-40D9-B230-F66BD35C3C27"}],"id":"BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D"},{"defKey":"Political","defName":"政治面貌","intro":"","items":[{"defKey":"10","defName":"共青团员","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"61F3145A-7599-4CCB-B298-D5EE788107BE"},{"defKey":"20","defName":"中共党员","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"ED16D25A-AB2F-4FA0-BB48-2B9031FA28C4"},{"defKey":"30","defName":"民主党派","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"0FB7974A-AE11-438F-86E0-B163316F9272"},{"defKey":"40","defName":"群众","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"7D247234-7E97-45B1-8C56-4A17A370854A"},{"defKey":"90","defName":"未知","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"DA65D752-AF04-4A11-81D8-14A38692A64A"}],"id":"06EED564-BBA9-4747-8D73-AF809A330CB8"},{"defKey":"Marital","defName":"婚姻状况","intro":"婚姻状况的码表","items":[{"defKey":"UNMARRIED","defName":"未婚","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"1","id":"20EE81BC-74EE-47DA-A56F-9663B23F44BD"},{"defKey":"MARRIED","defName":"已婚","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"2","id":"4DCA10A8-417E-4A8D-BDF6-0A278C060ADC"},{"defKey":"WIDOWED","defName":"丧偶","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"3","id":"826062A7-057C-4892-B338-06459F5B808D"},{"defKey":"DIVORCE","defName":"离婚","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"4","id":"B23200B4-5E59-4F5E-A779-D981A040FA32"},{"defKey":"UNSPECIFIED","defName":"未说明","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"5","id":"A7928FE2-349A-4702-9682-2EF7205E077B"}],"id":"EA1587B7-3954-437A-BFE0-FCB0453BCABA"},{"defKey":"StudentStatus","defName":"学生状态","intro":"","items":[{"defKey":"Normal","defName":"正常","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"1","id":"E9CA1CC9-8851-4F6B-86BA-B9CF0E44EB73"},{"defKey":"Graduated","defName":"毕业","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"2","id":"DEC51D7C-99DF-430C-817D-0499862D3CCC"},{"defKey":"Studied","defName":"肄业","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"3","id":"8853D6B6-75D3-4479-9006-FC731CD85B20"},{"defKey":"Stop","defName":"休学","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"4","id":"C74BA8CF-1DC6-4C79-BAAC-F11EB9C6AF01"}],"id":"4642BC5F-02EE-4E17-A60C-CF22F86A0282"},{"defKey":"GBNation","defName":"民族","intro":"","items":[{"defKey":"01","defName":"汉族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"9224DF53-F7C0-447D-B8ED-0A39F799EE19"},{"defKey":"02","defName":"蒙古族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"D57818E3-9206-45BB-AE79-27C64A4AB80F"},{"defKey":"03","defName":"回族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"0A1A3CA9-6D68-4E15-8BD0-9A2FF428D804"},{"defKey":"04","defName":"藏族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"7CC6B6BE-47EA-460E-ACFA-C377468DEA11"},{"defKey":"05","defName":"维吾尔族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"A666D51F-D249-4FAC-B1F3-78C371836CB3"},{"defKey":"06","defName":"苗族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"A0C9E1BA-D87B-4695-ADFA-287FDA32BB5A"},{"defKey":"07","defName":"彝族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"149B5B9E-C1D1-4790-8CCF-0ED5F4B25172"},{"defKey":"08","defName":"壮族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"F9A3E65C-BF4D-4C6B-ADB7-8C9CF0487360"},{"defKey":"09","defName":"布依族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"14F17DE4-E96A-460B-98A6-F84EC8CF9885"},{"defKey":"10","defName":"朝鲜族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"8A81AB18-B1BF-4797-A6E5-DEDB2C6566B0"},{"defKey":"11","defName":"满族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"7D460947-FBD2-4E4D-8366-3B38DCAF09D1"}],"id":"115EDEFC-0323-410E-81AB-CCAB8879837A"},{"defKey":"GradeLevel","defName":"受教育程度","sort":"","intro":"","items":[],"id":"9E7C9788-B805-4C7D-8531-FD1D9DC79B05"}],"viewGroups":[],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"默认关系图","defName":"","relationType":"field","canvasData":{"cells":[{"id":"e8cb6304-cb0d-4fed-aaf9-e473f33a99c6","shape":"table","position":{"x":565,"y":137},"count":0,"originKey":"D495A024-BF4F-4BFB-BD98-7929182D7641","size":{"width":403,"height":284}},{"id":"4f4ff69e-5d18-40ba-8bb8-949ad780392a","shape":"table","position":{"x":57,"y":114},"count":0,"originKey":"3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17","size":{"width":436,"height":330}},{"id":"42f27e58-cc13-4900-a604-ac68d6c90330","shape":"erdRelation","source":{"cell":"4f4ff69e-5d18-40ba-8bb8-949ad780392a","port":"46E48439-3B30-455E-A387-4D5D88F4E194%out"},"target":{"cell":"1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2","port":"A11CF9AF-6327-476C-8B31-6AFB5B6DE191%in"},"relation":"1:n","vertices":[{"x":490,"y":712}],"fillColor":"#ACDAFC"},{"id":"7614ac8c-c76f-450d-975d-1f08331a8d2d","shape":"erdRelation","source":{"cell":"e8cb6304-cb0d-4fed-aaf9-e473f33a99c6","port":"230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88%in"},"target":{"cell":"1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2","port":"0BC18231-16F7-4367-BC6C-61DA0928A07E%in"},"relation":"1:n","fillColor":"#ACDAFC"},{"id":"4edb1b0e-9787-4ca6-9ccd-2580a9303e70","shape":"erdRelation","source":{"cell":"4f4ff69e-5d18-40ba-8bb8-949ad780392a","port":"46E48439-3B30-455E-A387-4D5D88F4E194%in"},"target":{"cell":"d50af898-e6a4-4421-b36e-4c29dfe262d2","port":"AABA14A9-CF60-4522-9FBF-5D0512F0514F%in"},"relation":"1:n","fillColor":"#ACDAFC"},{"id":"d50af898-e6a4-4421-b36e-4c29dfe262d2","shape":"table","position":{"x":85,"y":580},"count":0,"originKey":"7BF77877-C7B5-4113-BF1C-1C3EA5B19276","size":{"width":408,"height":238}},{"id":"2b66e414-0a1c-4d1c-94d5-8cb2ea245a82","shape":"table","position":{"x":38,"y":894},"count":0,"originKey":"3BE9A249-898D-4C72-B2C5-195A1D18DFAF","size":{"width":474,"height":284}},{"id":"1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2","shape":"table","position":{"x":565,"y":626},"count":0,"originKey":"A5DB4BF1-1267-4980-AB85-81AD952AB064","size":{"width":395,"height":146}},{"id":"7f253a86-275c-44fd-92f5-6482aa90dc87","shape":"table","position":{"x":1021,"y":534},"count":0,"originKey":"E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA","size":{"width":569,"height":330}},{"id":"e7f81bd2-f308-456c-89af-e6f7c0a9d655","shape":"table","position":{"x":559,"y":917},"count":0,"originKey":"73349C61-04FA-46CE-828F-BB4DA7673350","size":{"width":415,"height":238}}]},"id":"1B0E3852-8008-40BE-A2DD-5FCED9719445","comment":""}],"standardFields":[{"defKey":"personInfo","defName":"个人基本信息要素","fields":[{"defKey":"ID_CARD_NO","defName":"身份证号","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"A64A91C8-A41F-4113-92FB-7563D7EF054D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"MOBILE_PHONE","defName":"手机号","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"479DA2AB-1974-411A-A81E-92FB939E75EB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"GENDER","defName":"性别","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D","uiHint":"","id":"48473E29-6594-4912-AADE-C8AB44FCA3E9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"BIRTH","defName":"出生日期","comment":"","type":"DATETIME","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","refDict":"","uiHint":"","id":"2BD3D2EE-2411-49A6-983D-84B81057312F","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"AVATAR","defName":"头像","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"FDD67CEE-4B52-4BD1-A1A3-9C5EBC6037E6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"HEIGHT","defName":"身高","comment":"","type":"INT","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","refDict":"","uiHint":"","id":"CAAA0E79-41A1-4758-B481-D171168C4D68","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"WEIGHT","defName":"体重","comment":"","type":"INT","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","refDict":"","uiHint":"","id":"575482CE-64A6-4CB9-99DC-8E126D190AAA","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"NATION","defName":"名族","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"115EDEFC-0323-410E-81AB-CCAB8879837A","uiHint":"","id":"15B0D75D-0B97-4985-A816-D0EAFA90446B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"POLITICAL","defName":"政治面貌","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"06EED564-BBA9-4747-8D73-AF809A330CB8","uiHint":"","id":"F458E86D-84D6-45A1-9DD3-51E6C8170D7F","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"MARITAL","defName":"婚姻状况","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"EA1587B7-3954-437A-BFE0-FCB0453BCABA","uiHint":"","id":"7275E578-6893-4922-AC69-95B261BFBD61","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"DOMICILE_PLACE_PROVINCE","defName":"籍贯(省)","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"F04BF130-3EC1-4E02-9DED-3214CA88E352","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"DOMICILE_PLACE_CITY","defName":"籍贯(市)","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"","uiHint":"","id":"B97F5BC2-33DE-4857-9DB8-ECFD02C9040C","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"DOMICILE_PLACE_ADDRESS","defName":"户籍地址","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"812ADF1D-8C03-40CA-B030-E539838FB889","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"id":"F30202B9-4B5D-4CE7-87CE-B3890C84D3F2"}],"dbConn":[{"defKey":"E4CA14E3-1919-4937-84A1-018CFB59C762","defName":"mysql","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root","customer_driver":""}}],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711100728.pdma.json b/docs/pdma/.back_gin-template/T20240711100728.pdma.json new file mode 100644 index 0000000..e35a388 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711100728.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template","avatar":"data:image/png;base64,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","version":"4.9.3","createdTime":"2024-7-10 16:56:07","updatedTime":"2024-7-11 10:07:28","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"E4CA14E3-1919-4937-84A1-018CFB59C762","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.dbType}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTO_INCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN '+field.defKey+' '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN '+after.defKey);\n }else{\n changeDDL += (' CHANGE COLUMN '+before.defKey+' '+after.defKey);\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n changeDDL += (' DEFAULT ' + defaultValue);\n let comment = after.comment||'';\n changeDDL += (' COMMENT \\''+comment+'\\';');\n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' IDENTITY(1,1)' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ','('+field.defaultValue+')',' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.dbType)=='varchar'||it.func.lowerCase(field.dbType)=='char'||it.func.lowerCase(field.dbType)=='text'||it.func.lowerCase(field.dbType)=='date'||it.func.lowerCase(field.dbType)=='datetime' ? 'string':it.func.lowerCase(field.dbType)=='tinyint unsigned'||it.func.lowerCase(field.dbType)=='bit'||it.func.lowerCase(field.dbType)=='integer'||it.func.lowerCase(field.dbType)=='tinyint'||it.func.lowerCase(field.dbType)=='smallint'||it.func.lowerCase(field.dbType)=='mediumint' ? 'int':it.func.lowerCase(field.dbType)=='int unsigned' ? 'bigint':it.func.lowerCase(field.dbType)}}{{?field.len>0&&(it.func.lowerCase(field.dbType)=='decimal'||it.func.lowerCase(field.dbType)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false},{"refKey":"defName","hideInGraph":false},{"refKey":"primaryKey","hideInGraph":false},{"refKey":"notNull","hideInGraph":true},{"refKey":"autoIncrement","hideInGraph":true},{"refKey":"domain","hideInGraph":true},{"refKey":"type","hideInGraph":false},{"refKey":"len","hideInGraph":false},{"refKey":"scale","hideInGraph":false},{"refKey":"comment","hideInGraph":true},{"refKey":"refDict","hideInGraph":true},{"refKey":"defaultValue","hideInGraph":true},{"refKey":"isStandard","hideInGraph":false},{"refKey":"uiHint","hideInGraph":true},{"refKey":"extProps","hideInGraph":true,"enable":false}],"extAttrProps":{"attr1":{"editType":"","optionsData":"","optionsFetcher":""},"attr2":{"editType":"","optionsData":"","optionsFetcher":""},"attr3":{"editType":"","optionsData":"","optionsFetcher":""},"attr4":{"editType":"","optionsData":"","optionsFetcher":""},"attr5":{"editType":"","optionsData":"","optionsFetcher":""},"attr6":{"editType":"","optionsData":"","optionsFetcher":""},"attr7":{"editType":"","optionsData":"","optionsFetcher":""},"attr8":{"editType":"","optionsData":"","optionsFetcher":""},"attr9":{"editType":"","optionsData":"","optionsFetcher":""}},"modelType":"modalAll","themeMode":"themeDay"},"entities":[{"id":"A5DB4BF1-1267-4980-AB85-81AD952AB064","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"766E8ADD-2230-4D9C-8089-229FA186C28B","extProps":{},"baseType":""},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"0BC18231-16F7-4367-BC6C-61DA0928A07E","extProps":{},"baseType":""},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"A11CF9AF-6327-476C-8B31-6AFB5B6DE191","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"6DD9FA5C-9BEA-4BCB-83F7-1AA060C44B2D","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"0607036A-A9EB-48F8-AEAF-49DFFE4BA9CF","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"04BA8A26-6C3D-4A01-B91B-094CF9D6D111","fieldDefKey":"0BC18231-16F7-4367-BC6C-61DA0928A07E"}],"id":"CC765053-A701-45AC-89AE-714F6AE9E992"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"3BE9A249-898D-4C72-B2C5-195A1D18DFAF","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"4B7CC681-AF21-4BB6-9EA8-3F5E84034A60","extProps":{},"baseType":""},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"5B592A4E-5BF0-4E65-A1EA-4448F3E717FA","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"3B3F08B7-E9BE-4022-A44F-90D5B2759024","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"FD8338EE-6F24-4595-A368-D7BB68A2F307","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"C229BFA4-850F-4598-80BF-6762C1EF2DCB","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_used","defName":"是否启用","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"41137343-0B93-4C7B-BF72-782C704B3843","extProps":{},"baseType":""},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"D5923F55-821C-4187-9DC4-60EEF026023F","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"A7B3A731-7ED5-4524-B620-38DBC2A4C3D4","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"9B6CF910-A64A-41D3-9766-1EDBC1A68A92","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"3AAF0410-7C6C-4B88-8E0A-F93CA397F5BC","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"BD31597C-0ECD-4E4B-8222-259385689263","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"780A50D3-E6CB-471D-AB58-BED31C800C94","fieldDefKey":"5B592A4E-5BF0-4E65-A1EA-4448F3E717FA"}],"id":"688C1377-C127-4F13-88F1-32127311A6F6"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"73349C61-04FA-46CE-828F-BB4DA7673350","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"4991A5FB-2C70-4B76-A13A-6685574D92BB","extProps":{},"baseType":""},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"A12DC927-1095-4372-B738-1F4BEB2EA093","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"87DD0746-C2E8-4BD7-9586-1E2F45DC07D8","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"76551DBE-EE9A-4517-B07B-16D7F860DA9D","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"41360A95-2A02-4990-B019-37F5CD48A824","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"B5AE04D1-44C5-4BC0-AE27-6D0F8F781FC5","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"4F1CAFCB-DB14-4A4A-B4F0-A4546D42B638","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"A364C231-D8E9-43FB-8ED3-006638D7112A","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"FAA4FB0E-8DAE-4E25-B0D1-02934DAC8487","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"B2AE77CC-2B4B-4E86-8A73-BD43F972E28A","extProps":{},"baseType":""},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"E4C467AC-E1F4-4020-8F53-003861A145C1","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"spec","defName":"crontab","comment":"表达式","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"57963640-5D8E-4240-8C7A-DAF21DF39CB3","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"BB7A44EF-CE78-4F48-98A2-5EBD45499E65","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"protocol","defName":"执行方式","comment":"1:shell 2:http","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"EB466D10-BA39-4155-9D28-12CBAF20246C","extProps":{},"baseType":""},{"defKey":"http_method","defName":"http","comment":"请求方式 1:get 2:post","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"335837C7-7C5F-4169-956F-37365FA6D39C","extProps":{},"baseType":""},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","id":"DC846891-0383-436D-A9D8-E31D1C90CB45","extProps":{},"baseType":""},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","id":"0A11B343-06D4-42F3-B8F6-973D11BC0D9D","extProps":{},"baseType":""},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"","type":"INT","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","id":"5A3889C0-914C-4A03-820F-177BA0A91397","extProps":{},"baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"notify_status","defName":"执行结束是否通知","comment":"1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"6DA16C8C-93FD-4A22-84B0-5AE6C90901C1","extProps":{},"baseType":""},{"defKey":"notify_type","defName":"通知类型","comment":"1:邮件 2:webhook","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"CE086898-3117-4616-B124-CA70DB137727","extProps":{},"baseType":""},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用","comment":"分割)","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"DBA97EE6-B4F6-4FE5-9E9C-2B7082EE0CFF","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用","comment":"分割)","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"67B0B44C-DA6E-46D8-A152-1171CEE2BA82","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":true,"refDict":"","id":"0BC32F87-F5BE-4428-9C70-2DE011666B54","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_used","defName":"是否启用","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":true,"refDict":"","id":"022192AE-46F4-42BE-BD6D-0CCD4BD8A780","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":true,"refDict":"","id":"7ABAD7A2-43FA-4E93-B7AC-35F276336ABA","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":true,"refDict":"","id":"B3860357-BE0E-4D70-AB31-A91DFD45114E","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":true,"refDict":"","id":"D9ED0695-29FE-4636-83C1-1A4AFDB6E3D7","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":true,"refDict":"","id":"54B21A73-1508-40DF-ABFB-7B21B7B24464","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"F1405A0F-A737-4FA6-91FB-35D9038F5666","fieldDefKey":"E4C467AC-E1F4-4020-8F53-003861A145C1"}],"id":"844C196C-C0C5-4B80-8284-1F2F7534BC2D"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"46E48439-3B30-455E-A387-4D5D88F4E194","extProps":{},"baseType":""},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"150AF050-4A0B-452E-AB34-4D88B130B7CE","extProps":{},"baseType":""},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"VARCHAR","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"9EC13DCD-0612-4B93-A485-1E4EBD6624D7","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"78A7B547-83AC-4F67-B467-8F755EF5B3CB","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"A80630A5-56A7-498A-846D-9B6A2C59ECB6","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"level","defName":"菜单类型","comment":"1:一级菜单 2:二级菜单","domain":"","type":"TINYINT UNSIGNED","len":4,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"504E7EF1-A6F2-41C4-89D6-4121B7AF1AEA","extProps":{},"baseType":""},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"1B090ECB-736E-4C45-AE35-25DA6C56848C","extProps":{},"baseType":""},{"defKey":"is_used","defName":"是否启用","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","id":"89A22CE0-78D3-4BEF-98B3-52C6CAC76C40","extProps":{},"baseType":""},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"D72A7E2A-10E1-4F06-BA5C-5D1FD3B4332F","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"8FFB68D4-311F-4028-B5AC-F21F26AF776A","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"BE90ECC8-D6AC-4B8E-B33F-06B24ED77E8A","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"DC900F9A-C8A0-476A-8C8C-355F80060CFA","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"DAAE6745-8466-4E70-95C7-27077195828F","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"46E48439-3B30-455E-A387-4D5D88F4E194","refEntity":"A5DB4BF1-1267-4980-AB85-81AD952AB064","refField":"A11CF9AF-6327-476C-8B31-6AFB5B6DE191","myRows":"1","refRows":"n","innerType":""},{"myField":"46E48439-3B30-455E-A387-4D5D88F4E194","refEntity":"7BF77877-C7B5-4113-BF1C-1C3EA5B19276","refField":"AABA14A9-CF60-4522-9FBF-5D0512F0514F","myRows":"1","refRows":"n","innerType":""}],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}},{"id":"7BF77877-C7B5-4113-BF1C-1C3EA5B19276","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","id":"1B3E17F0-0866-423B-9B53-20106AEF8183","extProps":{},"baseType":""},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":11,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","id":"AABA14A9-CF60-4522-9FBF-5D0512F0514F","extProps":{},"baseType":""},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"C3A39570-6405-4EDB-BF0A-7A80E8C2B02B","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"23369B59-FA95-40CD-A618-F1F528316D0D","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"is_deleted","defName":"是否删除","comment":"1:是 -1:否","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","id":"882725DE-789F-4065-AFF2-0E2D01E0EF57","extProps":{},"baseType":""},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"C38A0965-8F1F-4D8F-A47B-9D2FD4D0E6E6","extProps":{},"baseType":""},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"12E1496C-4F79-4422-BB03-8BFB3B687C7D","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"'current_timestamp()'","hideInGraph":false,"refDict":"","id":"F95CD234-1FE2-4ED4-A389-EB40E0B290FC","extProps":{},"baseType":""},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","id":"3C7641ED-0749-4A31-9D00-ADC719B68A8A","extProps":{},"baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"F00E1016-6208-448E-AFDF-452EA689C131","fieldDefKey":"AABA14A9-CF60-4522-9FBF-5D0512F0514F"}],"id":"84925129-24E2-4737-8218-2126D4674F7C"}],"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[],"type":"P","sysProps":{"nameTemplate":"{defKey}[{defName}]"}}],"views":[],"dicts":[{"defKey":"Gender","defName":"性别","intro":"","items":[{"defKey":"M","defName":"男","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"1","id":"3622D417-DA1A-408F-BEE1-11D328D534A0"},{"defKey":"F","defName":"女","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"2","id":"380A0790-64A7-481E-831C-32F7BEE1502B"},{"defKey":"U","defName":"未知","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"3","id":"FA239F4D-1276-40D9-B230-F66BD35C3C27"}],"id":"BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D"},{"defKey":"Political","defName":"政治面貌","intro":"","items":[{"defKey":"10","defName":"共青团员","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"61F3145A-7599-4CCB-B298-D5EE788107BE"},{"defKey":"20","defName":"中共党员","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"ED16D25A-AB2F-4FA0-BB48-2B9031FA28C4"},{"defKey":"30","defName":"民主党派","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"0FB7974A-AE11-438F-86E0-B163316F9272"},{"defKey":"40","defName":"群众","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"7D247234-7E97-45B1-8C56-4A17A370854A"},{"defKey":"90","defName":"未知","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"DA65D752-AF04-4A11-81D8-14A38692A64A"}],"id":"06EED564-BBA9-4747-8D73-AF809A330CB8"},{"defKey":"Marital","defName":"婚姻状况","intro":"婚姻状况的码表","items":[{"defKey":"UNMARRIED","defName":"未婚","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"1","id":"20EE81BC-74EE-47DA-A56F-9663B23F44BD"},{"defKey":"MARRIED","defName":"已婚","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"2","id":"4DCA10A8-417E-4A8D-BDF6-0A278C060ADC"},{"defKey":"WIDOWED","defName":"丧偶","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"3","id":"826062A7-057C-4892-B338-06459F5B808D"},{"defKey":"DIVORCE","defName":"离婚","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"4","id":"B23200B4-5E59-4F5E-A779-D981A040FA32"},{"defKey":"UNSPECIFIED","defName":"未说明","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"5","id":"A7928FE2-349A-4702-9682-2EF7205E077B"}],"id":"EA1587B7-3954-437A-BFE0-FCB0453BCABA"},{"defKey":"StudentStatus","defName":"学生状态","intro":"","items":[{"defKey":"Normal","defName":"正常","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"1","id":"E9CA1CC9-8851-4F6B-86BA-B9CF0E44EB73"},{"defKey":"Graduated","defName":"毕业","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"2","id":"DEC51D7C-99DF-430C-817D-0499862D3CCC"},{"defKey":"Studied","defName":"肄业","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"3","id":"8853D6B6-75D3-4479-9006-FC731CD85B20"},{"defKey":"Stop","defName":"休学","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","sort":"4","id":"C74BA8CF-1DC6-4C79-BAAC-F11EB9C6AF01"}],"id":"4642BC5F-02EE-4E17-A60C-CF22F86A0282"},{"defKey":"GBNation","defName":"民族","intro":"","items":[{"defKey":"01","defName":"汉族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"9224DF53-F7C0-447D-B8ED-0A39F799EE19"},{"defKey":"02","defName":"蒙古族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"D57818E3-9206-45BB-AE79-27C64A4AB80F"},{"defKey":"03","defName":"回族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"0A1A3CA9-6D68-4E15-8BD0-9A2FF428D804"},{"defKey":"04","defName":"藏族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"7CC6B6BE-47EA-460E-ACFA-C377468DEA11"},{"defKey":"05","defName":"维吾尔族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"A666D51F-D249-4FAC-B1F3-78C371836CB3"},{"defKey":"06","defName":"苗族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"A0C9E1BA-D87B-4695-ADFA-287FDA32BB5A"},{"defKey":"07","defName":"彝族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"149B5B9E-C1D1-4790-8CCF-0ED5F4B25172"},{"defKey":"08","defName":"壮族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"F9A3E65C-BF4D-4C6B-ADB7-8C9CF0487360"},{"defKey":"09","defName":"布依族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"14F17DE4-E96A-460B-98A6-F84EC8CF9885"},{"defKey":"10","defName":"朝鲜族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"8A81AB18-B1BF-4797-A6E5-DEDB2C6566B0"},{"defKey":"11","defName":"满族","intro":"","parentKey":"","enabled":true,"attr1":"","attr2":"","attr3":"","id":"7D460947-FBD2-4E4D-8366-3B38DCAF09D1"}],"id":"115EDEFC-0323-410E-81AB-CCAB8879837A"},{"defKey":"GradeLevel","defName":"受教育程度","sort":"","intro":"","items":[],"id":"9E7C9788-B805-4C7D-8531-FD1D9DC79B05"}],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["A5DB4BF1-1267-4980-AB85-81AD952AB064","3BE9A249-898D-4C72-B2C5-195A1D18DFAF","73349C61-04FA-46CE-828F-BB4DA7673350","E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA","3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17","7BF77877-C7B5-4113-BF1C-1C3EA5B19276"],"refViews":[],"refDiagrams":["1B0E3852-8008-40BE-A2DD-5FCED9719445"],"refDicts":["BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D","06EED564-BBA9-4747-8D73-AF809A330CB8","EA1587B7-3954-437A-BFE0-FCB0453BCABA","4642BC5F-02EE-4E17-A60C-CF22F86A0282","115EDEFC-0323-410E-81AB-CCAB8879837A","9E7C9788-B805-4C7D-8531-FD1D9DC79B05"],"id":"93CA5783-2452-443B-901A-E7517244E4D0"}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"默认关系图","defName":"","relationType":"field","canvasData":{"cells":[{"id":"e8cb6304-cb0d-4fed-aaf9-e473f33a99c6","shape":"table","position":{"x":565,"y":137},"count":0,"originKey":"D495A024-BF4F-4BFB-BD98-7929182D7641","size":{"width":403,"height":284}},{"id":"4f4ff69e-5d18-40ba-8bb8-949ad780392a","shape":"table","position":{"x":57,"y":114},"count":0,"originKey":"3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17","size":{"width":436,"height":330}},{"id":"42f27e58-cc13-4900-a604-ac68d6c90330","shape":"erdRelation","source":{"cell":"4f4ff69e-5d18-40ba-8bb8-949ad780392a","port":"46E48439-3B30-455E-A387-4D5D88F4E194%out"},"target":{"cell":"1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2","port":"A11CF9AF-6327-476C-8B31-6AFB5B6DE191%in"},"relation":"1:n","vertices":[{"x":490,"y":712}],"fillColor":"#ACDAFC"},{"id":"7614ac8c-c76f-450d-975d-1f08331a8d2d","shape":"erdRelation","source":{"cell":"e8cb6304-cb0d-4fed-aaf9-e473f33a99c6","port":"230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88%in"},"target":{"cell":"1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2","port":"0BC18231-16F7-4367-BC6C-61DA0928A07E%in"},"relation":"1:n","fillColor":"#ACDAFC"},{"id":"4edb1b0e-9787-4ca6-9ccd-2580a9303e70","shape":"erdRelation","source":{"cell":"4f4ff69e-5d18-40ba-8bb8-949ad780392a","port":"46E48439-3B30-455E-A387-4D5D88F4E194%in"},"target":{"cell":"d50af898-e6a4-4421-b36e-4c29dfe262d2","port":"AABA14A9-CF60-4522-9FBF-5D0512F0514F%in"},"relation":"1:n","fillColor":"#ACDAFC"},{"id":"d50af898-e6a4-4421-b36e-4c29dfe262d2","shape":"table","position":{"x":85,"y":580},"count":0,"originKey":"7BF77877-C7B5-4113-BF1C-1C3EA5B19276","size":{"width":408,"height":238}},{"id":"2b66e414-0a1c-4d1c-94d5-8cb2ea245a82","shape":"table","position":{"x":38,"y":894},"count":0,"originKey":"3BE9A249-898D-4C72-B2C5-195A1D18DFAF","size":{"width":474,"height":284}},{"id":"1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2","shape":"table","position":{"x":565,"y":626},"count":0,"originKey":"A5DB4BF1-1267-4980-AB85-81AD952AB064","size":{"width":395,"height":146}},{"id":"7f253a86-275c-44fd-92f5-6482aa90dc87","shape":"table","position":{"x":1021,"y":534},"count":0,"originKey":"E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA","size":{"width":569,"height":330}},{"id":"e7f81bd2-f308-456c-89af-e6f7c0a9d655","shape":"table","position":{"x":559,"y":917},"count":0,"originKey":"73349C61-04FA-46CE-828F-BB4DA7673350","size":{"width":415,"height":238}}]},"id":"1B0E3852-8008-40BE-A2DD-5FCED9719445","comment":""}],"standardFields":[{"defKey":"personInfo","defName":"个人基本信息要素","fields":[{"defKey":"ID_CARD_NO","defName":"身份证号","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"A64A91C8-A41F-4113-92FB-7563D7EF054D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"MOBILE_PHONE","defName":"手机号","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"479DA2AB-1974-411A-A81E-92FB939E75EB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"GENDER","defName":"性别","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D","uiHint":"","id":"48473E29-6594-4912-AADE-C8AB44FCA3E9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"BIRTH","defName":"出生日期","comment":"","type":"DATETIME","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","refDict":"","uiHint":"","id":"2BD3D2EE-2411-49A6-983D-84B81057312F","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"AVATAR","defName":"头像","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"FDD67CEE-4B52-4BD1-A1A3-9C5EBC6037E6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"HEIGHT","defName":"身高","comment":"","type":"INT","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","refDict":"","uiHint":"","id":"CAAA0E79-41A1-4758-B481-D171168C4D68","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"WEIGHT","defName":"体重","comment":"","type":"INT","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","refDict":"","uiHint":"","id":"575482CE-64A6-4CB9-99DC-8E126D190AAA","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"NATION","defName":"名族","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"115EDEFC-0323-410E-81AB-CCAB8879837A","uiHint":"","id":"15B0D75D-0B97-4985-A816-D0EAFA90446B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"POLITICAL","defName":"政治面貌","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"06EED564-BBA9-4747-8D73-AF809A330CB8","uiHint":"","id":"F458E86D-84D6-45A1-9DD3-51E6C8170D7F","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"MARITAL","defName":"婚姻状况","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"EA1587B7-3954-437A-BFE0-FCB0453BCABA","uiHint":"","id":"7275E578-6893-4922-AC69-95B261BFBD61","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"DOMICILE_PLACE_PROVINCE","defName":"籍贯(省)","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"F04BF130-3EC1-4E02-9DED-3214CA88E352","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"DOMICILE_PLACE_CITY","defName":"籍贯(市)","comment":"","type":"VARCHAR","len":"32","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"73FD2BAD-2358-4336-B96D-45DC897BD792","refDict":"","uiHint":"","id":"B97F5BC2-33DE-4857-9DB8-ECFD02C9040C","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"DOMICILE_PLACE_ADDRESS","defName":"户籍地址","comment":"","type":"VARCHAR","len":"60","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":false,"domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","refDict":"","uiHint":"","id":"812ADF1D-8C03-40CA-B030-E539838FB889","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"}],"id":"F30202B9-4B5D-4CE7-87CE-B3890C84D3F2"}],"dbConn":[{"defKey":"E4CA14E3-1919-4937-84A1-018CFB59C762","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root","customer_driver":""}}],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711101116.pdma.json b/docs/pdma/.back_gin-template/T20240711101116.pdma.json new file mode 100644 index 0000000..957aa91 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711101116.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,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","version":"4.9.3","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:11:16","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[],"views":[],"dicts":[],"viewGroups":[],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711102009.pdma.json b/docs/pdma/.back_gin-template/T20240711102009.pdma.json new file mode 100644 index 0000000..2d87309 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711102009.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,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","version":"4.9.3","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:20:09","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalAll","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[],"views":[],"dicts":[],"viewGroups":[],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711103904.pdma.json b/docs/pdma/.back_gin-template/T20240711103904.pdma.json new file mode 100644 index 0000000..84aa153 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711103904.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4EAYAAAD4FuddAAABdWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokXWQvUvDUBTFT6tS0DqIDh0cMolD1NIKdnFoKxRFMFQFq1OafgltfCQpUnETVyn4H1jBWXCwiFRwcXAQRAcR3Zw6KbhoeN6XVNoi3sfl/Ticc7lcwBtQGSv2AijplpFMxKS11Lrke4OHnlOqZrKooiwK/v276/PR9d5PiFlNu3YQ2U9cl84ul3aeAlN//V3Vn8maGv3f1EGNGRbgkYmVbYsJ3iUeMWgp4qrgvMvHgtMunzuelWSc+JZY0gpqhrhJLKc79HwHl4plrbWD2N6f1VeXxRzqUcxhEyYYilBRgQQF4X/8044/ji1yV2BQLo8CLMpESRETssTz0KFhEjJxCEHqkLhz634PrfvJbW3vFZhtcM4v2tpCAzidoZPV29p4BBgaAG7qTDVUR+qh9uZywPsJMJgChu8os2HmwiF3e38M6Hvh/GMM8B0CdpXzryPO7RqFn4Er/QcXKWq8UwZBywAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAOKADAAQAAAABAAAAOAAAAAAun0ppAAAVG0lEQVR4Ae2cC3wTZbbAz8z0kYQKVURA+higII9ii6uC9+ptEGhaHrUNfSGPBgQRdQVZdF2UbWDrLuv1UfEBCEq6euVRSEpBaIpAXNe76K6SQmVdaWkoIKColcckKZ2ZPTPJl8K0adOSluqP+f34fZ2Z73n+c853zpkJAL+QQxTlhVAV24e/Fn0RZiqXRa6Tesr718+vkQQIkAMHRoyIiYEsMo2KW+JnxDwUDxWR8bNjDMNZcv3gQU890o5cv152sgQIACU4e1X89Ji8oTb7+fgHYwynkuxi/NyY2d/EVlDxD8XMGlJCpnkdJJFEJ5f+wFXc4AXnjJ8TM+t40r+SRpTEpogilmWxk0TRfhYBGmrzfmkg6U6Wf7uHI+DsdtkEZo4ceehQbS0UE3Dit6ACujw/fAU1nfoxylb/hbhN7A0mLDeJPcEUvp2aS12INonf4RTEcgsBefvtnn4OHfL0S8Zp90Q7uWGXB0gEeih1xK6YJTClVXAvi0ViDzCJ50AECgykrH9CXCN2++WBpDr5gQl4OB84r2YQTamIlUzhULv4FeKhyhf4NE4Bzt9AVHdsJ4IpbCU1j7oIBvdkca0YcdxA9YJ6oJIzEsTKd2vXf5Vunxm/IfpvkJ1QVDn1+L1QTHkk5fF1/XV+Da53WYBKWaAzYoiZMXIFHEMAUOoMz6fyqPNRxnrzlRqnbOfv3AdyEfaDIOsLxPfFyOMsRCJeIa1/wveVa2vfsdv8te8q17u8CfUJ6hLwQD08qsd6pgfdL8rofh01JxJsxET66gX4B2nnXiy+K0aArftzzE10VLQD8dEQMndfgN1c82pdFuA+USsJJ4RIiAqHBtA8+dpP0/jvhDMlrGYSzVO5IFciddpSUiw6Pdg79vO91M9PRv574bjZBOeBgbpFFaQv5TzI9a5SdlmAYyibJKOGQ7fEn4ldCPfg3rShdrXLDHEQBr2yDjsPCeHiphKtxkC7qOkAlBeI1Kilg/LWU7N0HZUJwFmE7uL/mQ1UGLjhUs7qhEuVb9ZudiceTBmxiwUYTebRUp/X8t7PZg8kIEd8W9n7WCH83X4kPjkmO+QYdRdEQbeN72h+pNOoVVOMbqO4UDwLwLOiAQobRcs4KBM8DhBupFZTfQAu/iBsEOdtAahGPfx+6tjEuyvfrt3RsJeAu73sUKoDYH9jD13zr58NQCK+JiC/jL8vRsv0hKEwCGKffYnqjXslMy8JJkBf6H4rCyy2RFMpzocz8O0pA4TjOb36Sao//ACDn783oa5yW+0S/sLnOz0a96sJPw9wRB7XtMRQod0PkL1+6D9jp8JI5QIqbo6fFTMncojdiam0vDtHVwzAXOisOx/BTEwuXn9OWd9fP8p6/s6NeAPX0WW3In/zDui6BGjKo7ozzpkw1V+DrKwJm7EeGrX2HcTJEMUsKZHNtNbL5s1yDYa0a62+v/sZ3+nMF/+KWu7nSH9Bd+bC7z3rvpoH1U/3HXtZmnBGRkoKxzW+HdAP0m3lfpdYpo/TbeZSf5OunMHVgpT6C1RQgdZTzlE69wdOz+rM3OSnEvXRuk3c2DtY0vZyOVzNuKS/Di2bBTdQt4ubMaREP0BXzj1cuy/bNNEk4qGP1+3knlreJN4KFGQWHjgek75KF8UVwN1tXdiU/eMruBIYRfpprb1fcIN1Fm5KQVJ2iXddrG4b9+Txffp++KA+OtRG+u3SIFsE119XzM2uzcssSa3jJXALU8CZJ4qZ9gkgYKkfqCvlpi1vkqLyJzCvwMOIYEipvw01YPEAA2pCMaf943rUeAu3YHeePgoF+Uh5jT5S9z6nLajR98fzsayDtCP9kZJcJ6U0D1xfE1OJD+QebnFBXqZjQqSwXlqXrs6ZhOsypTrkdQ5Di/P48SQZ5D1dFGSg4IRYXGAsCnaauF4/TGflZoo1+sKUSOe+y0DG6kq4GX+IJYIjJQGZGpcad+TXsg9JbsklArFwORmJ+lt1W7hJdTXZ2onpIh7kASEluY4CtXCGH/P1MQhSm2a/ojM8ISDTPhl3lhsMtyrvo4ks5nIL8n3gpHWsx/WRdXnX6Xtg+1wGUqGR5897thhJjspxAj1vV0MCzumETIulrEyjgWLUpGLJVIKAQ4eWW+hX6PGqPdEmYYGw23UvmHCKoejOG3wT04Aa01YOeJjKocYAS2tpCHcACKn8Ktc/CmzmU9apmp1Lx4CfAwFs5RZlLcR8igbqNrxCvUXPD+UZEOcKKy8JYINLOBP6skxNKJ7hdaqY/n3oANCK44Sll6p4LdyAiYGeObPMNdbJmpVbDX6GA/1gNI0PPR9LlzMLVPcucQglQp1bqvwWvq7ah+vgwIlrZH3tRZxBA5joV+nx4e+BAeXwifuJEwaUAgOndf82V1lTNMWH9+tTU+O4ryHTvGtXlXoQbJXaY+K8iUXy9av4o00AgwJOMQEU/5Ug070g72keJGrAZi47m8UlhsANG0RqHDUg5EPaIX4i1jb8TzPglOMRkBOpmBAELFrEIw0Cb0S4DfBjbpH5OD44O7Y4SDMfuM8Q3HQEZ0Jw0l1/4EhDUjaCvEsGuVCocKedsOF4LojQ/dlca83RbDhc1l6QAQFsFpy01zw+pE5Wfq58QasaRxbkr1SC1NJ14TbUyFx+p0tTYIOf8Il2ffURLvwShP6lhkqlbmbW0CYEd46fGQA45bgE5H8jyL8iyA/wAdDyJuiGmlQ5YySOooEewxPoT5gZqhnPAoLDXBsem/1onLJ/5XkHgWwxAG0WXF/UgIlDR6NBCoP68gNXDY4slJigQtEk2jBZoqVYTH6BLLWbBhlQ30LBGccyauY9tRvBJUK6IN0PxX3xctOFlwI6vO2wHwkbMJeYl9UOxoCmUIAeg0pQHwFuHWSgE6lIyoB/mzzzamIq8VZAh3cLQVP6D/d0NK2FdEJ4aZQW5aiCC9bf4pawiZs6LEUypZrBsEXSSOcRmCL1LXHwN0azAJsFN8gLTo0C62f9E/0ynaSyRmv97nH+RvR3PRLfxLEoSBOTqDZhFrtfw0rn9K0mGIgNuk17DU3bBM3GZQY+jJ/nZPKX0UDZwrA+PI0vZpdhS6LBeKnFg9ST2hXh3ltHlYSZMHcayT/mZJduM3+LJnTvciOCUkPYtJMN3Rtedo4x++Yl9822OELLN5UgjU1A7mwLyCsANguOaBzfweAKmUi1EQWZxx+UwfFwCqJzxpo/RHBL+DQiFfPX1lTNO8uNwpvCKfe7CLIOQTrwbmsg6717LQHnoExhOJ7wruBy1y+dZXZYszRFBb4Eg/m8dZzmnYYPMVVeg28pHuFn8l84F3pBYjv5YL1lewoCMr+JRl6SNXKwbgc3bVh6axopq2aL4ARMDrutG+g1dKrqSDQbdI0rZFgZ3Bz+384p+HbgO6gXV+VuMf9kndytN59FAm4Bb+G/GsuLuxMi3oNvicz0fTD+y/090M/QA8J1y0QhUkyv1+LdF/AbmHz0Duu8Nd/0apz9MnBfI7hq9AY3FJi8tTCMSI07/wX04i+gNYiAgV4B7teH6kzcxJBMDCxUEL1pOFPEjFav0ht5A293Gr2tHaSXdpRkj1xG3xVegF7rs8IB95MnpC2iHm7TVeADlqP58+FEfWpyH4/XWn5a8lp9KS9fOEA0ruPBeTRuDn9GBncRosGVuw7Dh2GanfxcAm7r6N0JmnT4lIgkY/H4igvT4ZYmIPtjQmDxUhu9gI4JH748SQbJelthSdupwjADPgSlAu0etXSk+ag1TfNCgS8OJOCKi3dV3XAHPkbew+sdjvaBDNOt5zJCBqBm3gK9Nt3HvMMMV6/RmzoM5DLhX+43T0petwCHkrchyImaskaQsgZKc9X3xSd57tCNWI0GxjoKNU4bvsqjcdKmi9volXEcWWGgZT26Ixj3MQ8zTjXuPXwR382ZtZXFb1zsUJqz1CxYn9fU83NIaqxkvvWE5jn4zF/3LYLMRJAHmCdU/7s8CXXQAUYEl8Zvd0U8V4Ru+2TNG88bSL/+wJH7pGwCMhpTg9khcbhX/gDHN01jfs241P+PGvkWr3bm4ZhhuOW0x7kiAyo18mnhc/fik1qMIt3gSi7CB/1BzQeHWUrfU/cel55wGgeLAH5Xb/o5mg1f1BeEV4Qj7nVBAOedEE3Cgr1ChDt5M4i3U/XiPTlvWHaUPdhtNjz+ADu+4pwKRm1z7E7o7mrUOLIef6VfkFJmZOmyfFzuBagSRqKpnKLZsMy3xwUKTjmuEmTGdsz1MtSt1CMYfqRt/oQeT58L/yKTFWxCpFurbN2OcwJyFt0rfBya1reFc+5dp6UHRISY1I9ozESg/8ejwcfOnQ0OYIGV3eZ2jNViEzs4RCPWoDDS6qM2UMfEbtTe0GzSJtTBJIQ60dFo40FMKQFJmpsPW3WaP+QvU4KbumbS57jn36w0laRda6U4vGGrsBx9Xu9BzcAIVR9qwish0FMFaE886yQVglVqKa0cVjWgjQyvl3hRcL6hkEabOkljquyDYu0G/ccWCc8IH7t0DgO9jZmrisPUl/cJuNp5CBeFO+r3go15knGrl0/2fDxEb/tS30P3LjdZpd0CZaCmwJYJmOwWQdvW8QjISZ/LgHwCJv2Q6xvm7fgVRcFZcj3Q0vuA3O8dZ2+GqHuFu0t9B4KjwVkayjzGCOq1k1iyzkD79VuPaN5HyEHSvBx+q6vPUfwKC03zbWPnozeepllTaaf0c5LXO4dDjnld+Sz1l7AJU0cW7qFBz+C0QoApP0VvxExEX9YkPMCvdVUFz6RivMeqTRg2GPgTzrxdNjR0NBzVv2Q+i2HD31w79B8kn7hwO4wxTyyPijgI+/wutINvKMHpR+De95g6ETM1PERYFjArmL7qFToDvwSdMWnvIwmJ9s5LCW4U/7arDME5cbxjOsp8zpqt2V8F+jmphRI3WgKnqoTNPpBfWzM0bx9ZgS4LZkGS1cJEfp3rhIMNtkbyj+KC89GpKWSi1EWpWnyy3DDEcl4fjnvyE6qVBBwB2V55tLddE3D9vBrX2eBCrwSXsTilHL3wXPO6XQslhfN5odJCpXhQAumKh2yfRvbDrP+4QVI80g2irDV0CZOriu3PBk0jvZkR5o9Mb9k7fZo/6pxXZhAP40dIn2WMtIRY52vsroUEJAHbXjCttWsC7kavxqGLJ2vca52kcWr0Tvoku3GLS9a8Wq0i4CwvliVjHLyRrOMKgORiiyBx/8TAXqR3Mw+p7u8PQQMpDe7AvVkK7G1oWh/zgMQ9WAZp/qZjQWYsTi113Qe4x+1KU30MezGs2sPNU8dDDwykIy2/6TRTGSA4SVzScUUqzXMJHUV8H9XEtJ5EN/zDI4DuK35cqaOEdH6j61iNI6imlUVw0l4imdY3mAHqNSkmDG56w92WA/jCdhWXqCokGkg0ksy5vWUTcKB7nUvH3JAad51Tlu0dCO4p2Tkhe1wbwZH1NquB5CYpr4lGKk0r0cibUCOYjATzIWuuZpVrEQFJwJI5t1Y2AafGVJlevRxTZf1gRMke5iWml9qYbJP3ak9gfuUL29YGUN5vdE484O7nX3WVHpWS5hh+JGeYT2OGZV11oj9TqeyOnDergeQmKQPWyDDUSMntDUb44fXmiHfn00g32gDeUoFu/PtctqqUgJNAumJhDJmzv7IJuJ74KUamugA1PQTokmofOOJVhqEmBiOj8hFzJbgwzKnehXtcO8GR9QUEkFRuESQFP8LZZLeQxP/FVV1j7DCQL3hMKzUQRX7WMll/o24Nl6GqlUCqjsE+fyCV4DJculdlcJg4BCg5wqxl4tXFySbywAQxHGge3FeYaFhSvaKtGkdYkDIgE0oqK0vJtEoTuDgDcoh3hF+H7eZy454BF+YIQ8rDEeQ81dj+RgS71vVhEOJIpWldxNc6F5QBnERNcWQcM7sxa1/qYglIcR/zBcQA5XNO4nB+kqkU4aLXVOLbEDSVROOCF8cRcCtkUxkGN8oaFyRwhMVVASSdYEkSAo3hhwSy0Avyn50IEvMiMsgqD0gyR/yg2LPHiYo9ruPAefY4YiqDDI6sK1gAff15EwKNIHvhHvNgnBEDdR7/EwJR1siBXo0MRmZHqZFP8Ied46zS6xcXjJn8KdqBgfAx/uQlAt8h3rTdxqxhBqnfT9Z2iMbNwZSX5JysROfkPI7PJ1Pm76QHqdp4taaSCFhZBhsg6b+pRg70gmy4DGRHmNZs5pT3ddUNzt/tNMi5w28oA5PFnJUyPvi6p6/3dU9wnJMKdE4kcPfyb7pKq+UX0vClbpb5jDVdU15t6ihwPkGTPzqobAqyOY0MJkjv12Z0P/po2GzQ4rrqpASBcNKTTMcc5pXfi7Z14SQcIOCG8S+5XkRw4dJbFvQqa/AN/9tH5cyJczzkSr6Bendj5qStw7VWv6M0UDluU5BRmKLTxY1GgQJEWv9Of4qZnZQBEDRnRzmDqz0n4KRwQNK4//KCu4ArcMhJ5lzNl9XQ0RqnXEabwghl4zacy5kdTL42Js1PYGbHWrUf8yxyzk/wZiTk8GNc8F5jtWGOzVf1B45o3DlMKFwDcGSynQWQjEdAbiJPqvmgJ1mLqauuBbI1cJeZSuntAAmjyEI7q+wsE+p3PQQkEQD+uqicWzDQhcHAeTiN4Udnm1YCLoA97lqCIwLtbA0k4/pKAo6AJK9POl0jleCG8IWurdUm9JkFuCX5p8udk64AjgjwmmsgmQgpCUgCVt8dvwgfHQfQC3OV0fg+cg8zWzVhABs0Z0cJ7k6M4/5UbYRzmExrwDhO/lL7qBzHdYZXSeQQaHnNNVA5UQKOgCSfEGDiiwNItmKgvFpKTaGzI6eq2v3NThvAEY3ryHBAKYdAz7scQDJxAtL3qcdp63RNcfUj+C5CzinKGQ8CEt36gEG2A9zlb8DJ/K6XbZQA0UjSTN8Lf82TNtCIyfPNXFp1UpZtgkP6Za4+XWfnarBk8Re/eZeV3utZdm+9ON1GLrkqXz8Uv+t8dsAzpF/lOOT69TJIElAKGAFu4eawkZistnCP782fYk9lLyG4LMdE/MansZxiSoX6ffJPofdw8/cm6XvjL26TWSOZlrJfcv162UESyHgDfz/3Ckwj3esNKfc5WfgMP70o5iaPScTf223kUp8C/PJ8KzdtcSJq7A7ugaTV6aXjC8/1Avzf1TyH/nXdSucemEHOr5edLAH96xP0CKDJf47Q2jSyssaNc/4W3xT+zI//ALNTIkUmqs58AAAAAElFTkSuQmCC","version":"4.9.2","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:39:04","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"1C609F89-B7C0-4244-A77E-6EC2A573080F","refEntity":"193C697E-973B-4E52-8852-0A86C684AD6A","refField":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","myRows":"1","refRows":"n","innerType":""},{"myField":"404FC9F3-8B46-4E98-B800-8E0146FC2679","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"51DB153D-15F1-4831-A48C-957D45847C68","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]}],"views":[],"dicts":[],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["193C697E-973B-4E52-8852-0A86C684AD6A","897CE7B5-936E-460A-AE58-874AEC9BFF89","2CA47871-19BF-46F1-8AE5-ED1766A1C355","2DCB09B1-0F66-43F3-A104-F127E9915B4F","2CF25297-0285-44B2-B6E3-07BFB70E424F","BF404C8C-5785-4566-95F7-16D011128ABA","E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3"],"refViews":[],"refDiagrams":["A153DE3A-11F3-482C-8BCA-28971FE903DD"],"refDicts":[],"id":"46FEECDE-C787-4EB4-A472-243EE2C92D87","refLogicEntities":["07285262-263F-4309-BED0-3A1A717BF255"]},{"defKey":"PAY","defName":"支付","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"CE6CF463-002B-431A-9334-010DF102DD5C"},{"defKey":"CRON","defName":"定时任务","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"6E6D7AD4-5955-4BF8-AFD0-9A0A90C23368"},{"defKey":"INFRA","defName":"基础设施","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"CBC5F9D7-EE19-4759-BF87-0379750D1025"}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"DEFAULT","defName":"默认关系图","relationType":"field","canvasData":{"cells":[{"id":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","shape":"group","position":{"x":-50.000000000018304,"y":-29.999999999970896},"label":"全部","note":"","size":{"width":2020,"height":1140},"children":["7d866926-c983-421d-b8ce-be13f3d8b8b2","5448f8cb-6bb5-42a9-86a5-878254bf6d6d","dbb3c433-599e-4dfa-9be9-04cac1cd8dac","6c1f583f-b6ae-4052-b3ae-e5050ad904f8","711699f0-9a7b-4c33-988e-2909a36a47a9","42bbb7e9-9045-4626-b331-0e6bbeace533","8ce91e7f-229e-4f61-99e5-a0380ddcab7b","16831da1-6ece-4182-996c-90c3e0112dcc","f651ca67-b6e0-4553-b5fd-308f985bb05b","f912963f-fa11-4a9f-9d04-3f92c3ff2d10"]},{"id":"dbb3c433-599e-4dfa-9be9-04cac1cd8dac","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"1C609F89-B7C0-4244-A77E-6EC2A573080F%in"},"target":{"cell":"7d866926-c983-421d-b8ce-be13f3d8b8b2","port":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","router":{"name":"manhattan"},"attrs":{"line":{"strokeDasharray":""}}},{"id":"f651ca67-b6e0-4553-b5fd-308f985bb05b","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"404FC9F3-8B46-4E98-B800-8E0146FC2679%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%out"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","router":{"name":"manhattan"},"attrs":{"line":{"strokeDasharray":""}}},{"id":"f912963f-fa11-4a9f-9d04-3f92c3ff2d10","shape":"erdRelation","source":{"cell":"711699f0-9a7b-4c33-988e-2909a36a47a9","port":"51DB153D-15F1-4831-A48C-957D45847C68%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","router":{"name":"manhattan"},"attrs":{"line":{"strokeDasharray":""}}},{"id":"16831da1-6ece-4182-996c-90c3e0112dcc","shape":"table","position":{"x":33.5,"y":779},"count":0,"originKey":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"711699f0-9a7b-4c33-988e-2909a36a47a9","shape":"table","position":{"x":33.5,"y":470},"count":0,"originKey":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","shape":"table","position":{"x":636.5,"y":470},"count":0,"originKey":"897CE7B5-936E-460A-AE58-874AEC9BFF89","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":377,"height":146}},{"id":"8ce91e7f-229e-4f61-99e5-a0380ddcab7b","shape":"table","position":{"x":579.5,"y":779},"count":0,"originKey":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":491,"height":284}},{"id":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","shape":"table","position":{"x":-16,"y":50},"count":0,"originKey":"BF404C8C-5785-4566-95F7-16D011128ABA","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":549,"height":330}},{"id":"7d866926-c983-421d-b8ce-be13f3d8b8b2","shape":"table","position":{"x":600,"y":50},"count":0,"originKey":"193C697E-973B-4E52-8852-0A86C684AD6A","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":284}},{"id":"42bbb7e9-9045-4626-b331-0e6bbeace533","shape":"table","position":{"x":1117,"y":50},"count":0,"originKey":"2CF25297-0285-44B2-B6E3-07BFB70E424F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":830,"height":468}}]},"id":"A153DE3A-11F3-482C-8BCA-28971FE903DD","comment":""}],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[{"id":"07285262-263F-4309-BED0-3A1A717BF255","defKey":"LOGIC_1","headers":[{"refKey":"defKey","newCode":"defKey","value":"属性代码","hideInGraph":false},{"refKey":"defName","newCode":"defName","value":"属性名称","hideInGraph":false},{"refKey":"primaryKey","newCode":"primaryKey","value":"主键","hideInGraph":false},{"refKey":"baseType","newCode":"baseType","value":"数据类型","hideInGraph":false}],"fields":[],"properties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""},"type":"L"}],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711104038.pdma.json b/docs/pdma/.back_gin-template/T20240711104038.pdma.json new file mode 100644 index 0000000..ce093a0 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711104038.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,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","version":"4.9.2","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:40:37","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"1C609F89-B7C0-4244-A77E-6EC2A573080F","refEntity":"193C697E-973B-4E52-8852-0A86C684AD6A","refField":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","myRows":"1","refRows":"n","innerType":""},{"myField":"404FC9F3-8B46-4E98-B800-8E0146FC2679","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"51DB153D-15F1-4831-A48C-957D45847C68","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]}],"views":[],"dicts":[],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["193C697E-973B-4E52-8852-0A86C684AD6A","897CE7B5-936E-460A-AE58-874AEC9BFF89","2CA47871-19BF-46F1-8AE5-ED1766A1C355","2DCB09B1-0F66-43F3-A104-F127E9915B4F","2CF25297-0285-44B2-B6E3-07BFB70E424F","BF404C8C-5785-4566-95F7-16D011128ABA","E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3"],"refViews":[],"refDiagrams":["A153DE3A-11F3-482C-8BCA-28971FE903DD"],"refDicts":[],"id":"46FEECDE-C787-4EB4-A472-243EE2C92D87","refLogicEntities":[]},{"defKey":"PAY","defName":"支付","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"CE6CF463-002B-431A-9334-010DF102DD5C","refLogicEntities":[]},{"defKey":"CRON","defName":"定时任务","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"6E6D7AD4-5955-4BF8-AFD0-9A0A90C23368","refLogicEntities":[]},{"defKey":"INFRA","defName":"基础设施","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"CBC5F9D7-EE19-4759-BF87-0379750D1025","refLogicEntities":[]}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"DEFAULT","defName":"默认关系图","relationType":"field","canvasData":{"cells":[{"id":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","shape":"group","position":{"x":-50.000000000018304,"y":-29.999999999970896},"label":"### 全部","note":"","size":{"width":2020,"height":1140},"children":["7d866926-c983-421d-b8ce-be13f3d8b8b2","5448f8cb-6bb5-42a9-86a5-878254bf6d6d","dbb3c433-599e-4dfa-9be9-04cac1cd8dac","6c1f583f-b6ae-4052-b3ae-e5050ad904f8","711699f0-9a7b-4c33-988e-2909a36a47a9","42bbb7e9-9045-4626-b331-0e6bbeace533","8ce91e7f-229e-4f61-99e5-a0380ddcab7b","16831da1-6ece-4182-996c-90c3e0112dcc","f651ca67-b6e0-4553-b5fd-308f985bb05b","f912963f-fa11-4a9f-9d04-3f92c3ff2d10"]},{"id":"dbb3c433-599e-4dfa-9be9-04cac1cd8dac","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"1C609F89-B7C0-4244-A77E-6EC2A573080F%in"},"target":{"cell":"7d866926-c983-421d-b8ce-be13f3d8b8b2","port":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f651ca67-b6e0-4553-b5fd-308f985bb05b","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"404FC9F3-8B46-4E98-B800-8E0146FC2679%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%out"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f912963f-fa11-4a9f-9d04-3f92c3ff2d10","shape":"erdRelation","source":{"cell":"711699f0-9a7b-4c33-988e-2909a36a47a9","port":"51DB153D-15F1-4831-A48C-957D45847C68%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"16831da1-6ece-4182-996c-90c3e0112dcc","shape":"table","position":{"x":33.5,"y":779},"count":0,"originKey":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"8ce91e7f-229e-4f61-99e5-a0380ddcab7b","shape":"table","position":{"x":579.5,"y":779},"count":0,"originKey":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":491,"height":284}},{"id":"711699f0-9a7b-4c33-988e-2909a36a47a9","shape":"table","position":{"x":33.5,"y":470},"count":0,"originKey":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","shape":"table","position":{"x":636.5,"y":470},"count":0,"originKey":"897CE7B5-936E-460A-AE58-874AEC9BFF89","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":377,"height":146}},{"id":"42bbb7e9-9045-4626-b331-0e6bbeace533","shape":"table","position":{"x":1117,"y":50},"count":0,"originKey":"2CF25297-0285-44B2-B6E3-07BFB70E424F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":830,"height":468}},{"id":"7d866926-c983-421d-b8ce-be13f3d8b8b2","shape":"table","position":{"x":600,"y":50},"count":0,"originKey":"193C697E-973B-4E52-8852-0A86C684AD6A","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":284}},{"id":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","shape":"table","position":{"x":-16,"y":50},"count":0,"originKey":"BF404C8C-5785-4566-95F7-16D011128ABA","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":549,"height":330}}]},"id":"A153DE3A-11F3-482C-8BCA-28971FE903DD","comment":""}],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711104158.pdma.json b/docs/pdma/.back_gin-template/T20240711104158.pdma.json new file mode 100644 index 0000000..f9b7d51 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711104158.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4EAYAAAD4FuddAAABdWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokXWQvUvDUBTFT6tS0DqIDh0cMolD1NIKdnFoKxRFMFQFq1OafgltfCQpUnETVyn4H1jBWXCwiFRwcXAQRAcR3Zw6KbhoeN6XVNoi3sfl/Ticc7lcwBtQGSv2AijplpFMxKS11Lrke4OHnlOqZrKooiwK/v276/PR9d5PiFlNu3YQ2U9cl84ul3aeAlN//V3Vn8maGv3f1EGNGRbgkYmVbYsJ3iUeMWgp4qrgvMvHgtMunzuelWSc+JZY0gpqhrhJLKc79HwHl4plrbWD2N6f1VeXxRzqUcxhEyYYilBRgQQF4X/8044/ji1yV2BQLo8CLMpESRETssTz0KFhEjJxCEHqkLhz634PrfvJbW3vFZhtcM4v2tpCAzidoZPV29p4BBgaAG7qTDVUR+qh9uZywPsJMJgChu8os2HmwiF3e38M6Hvh/GMM8B0CdpXzryPO7RqFn4Er/QcXKWq8UwZBywAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAOKADAAQAAAABAAAAOAAAAAAun0ppAAAVG0lEQVR4Ae2cC3wTZbbAz8z0kYQKVURA+higII9ii6uC9+ptEGhaHrUNfSGPBgQRdQVZdF2UbWDrLuv1UfEBCEq6euVRSEpBaIpAXNe76K6SQmVdaWkoIKColcckKZ2ZPTPJl8K0adOSluqP+f34fZ2Z73n+c853zpkJAL+QQxTlhVAV24e/Fn0RZiqXRa6Tesr718+vkQQIkAMHRoyIiYEsMo2KW+JnxDwUDxWR8bNjDMNZcv3gQU890o5cv152sgQIACU4e1X89Ji8oTb7+fgHYwynkuxi/NyY2d/EVlDxD8XMGlJCpnkdJJFEJ5f+wFXc4AXnjJ8TM+t40r+SRpTEpogilmWxk0TRfhYBGmrzfmkg6U6Wf7uHI+DsdtkEZo4ceehQbS0UE3Dit6ACujw/fAU1nfoxylb/hbhN7A0mLDeJPcEUvp2aS12INonf4RTEcgsBefvtnn4OHfL0S8Zp90Q7uWGXB0gEeih1xK6YJTClVXAvi0ViDzCJ50AECgykrH9CXCN2++WBpDr5gQl4OB84r2YQTamIlUzhULv4FeKhyhf4NE4Bzt9AVHdsJ4IpbCU1j7oIBvdkca0YcdxA9YJ6oJIzEsTKd2vXf5Vunxm/IfpvkJ1QVDn1+L1QTHkk5fF1/XV+Da53WYBKWaAzYoiZMXIFHEMAUOoMz6fyqPNRxnrzlRqnbOfv3AdyEfaDIOsLxPfFyOMsRCJeIa1/wveVa2vfsdv8te8q17u8CfUJ6hLwQD08qsd6pgfdL8rofh01JxJsxET66gX4B2nnXiy+K0aArftzzE10VLQD8dEQMndfgN1c82pdFuA+USsJJ4RIiAqHBtA8+dpP0/jvhDMlrGYSzVO5IFciddpSUiw6Pdg79vO91M9PRv574bjZBOeBgbpFFaQv5TzI9a5SdlmAYyibJKOGQ7fEn4ldCPfg3rShdrXLDHEQBr2yDjsPCeHiphKtxkC7qOkAlBeI1Kilg/LWU7N0HZUJwFmE7uL/mQ1UGLjhUs7qhEuVb9ZudiceTBmxiwUYTebRUp/X8t7PZg8kIEd8W9n7WCH83X4kPjkmO+QYdRdEQbeN72h+pNOoVVOMbqO4UDwLwLOiAQobRcs4KBM8DhBupFZTfQAu/iBsEOdtAahGPfx+6tjEuyvfrt3RsJeAu73sUKoDYH9jD13zr58NQCK+JiC/jL8vRsv0hKEwCGKffYnqjXslMy8JJkBf6H4rCyy2RFMpzocz8O0pA4TjOb36Sao//ACDn783oa5yW+0S/sLnOz0a96sJPw9wRB7XtMRQod0PkL1+6D9jp8JI5QIqbo6fFTMncojdiam0vDtHVwzAXOisOx/BTEwuXn9OWd9fP8p6/s6NeAPX0WW3In/zDui6BGjKo7ozzpkw1V+DrKwJm7EeGrX2HcTJEMUsKZHNtNbL5s1yDYa0a62+v/sZ3+nMF/+KWu7nSH9Bd+bC7z3rvpoH1U/3HXtZmnBGRkoKxzW+HdAP0m3lfpdYpo/TbeZSf5OunMHVgpT6C1RQgdZTzlE69wdOz+rM3OSnEvXRuk3c2DtY0vZyOVzNuKS/Di2bBTdQt4ubMaREP0BXzj1cuy/bNNEk4qGP1+3knlreJN4KFGQWHjgek75KF8UVwN1tXdiU/eMruBIYRfpprb1fcIN1Fm5KQVJ2iXddrG4b9+Txffp++KA+OtRG+u3SIFsE119XzM2uzcssSa3jJXALU8CZJ4qZ9gkgYKkfqCvlpi1vkqLyJzCvwMOIYEipvw01YPEAA2pCMaf943rUeAu3YHeePgoF+Uh5jT5S9z6nLajR98fzsayDtCP9kZJcJ6U0D1xfE1OJD+QebnFBXqZjQqSwXlqXrs6ZhOsypTrkdQ5Di/P48SQZ5D1dFGSg4IRYXGAsCnaauF4/TGflZoo1+sKUSOe+y0DG6kq4GX+IJYIjJQGZGpcad+TXsg9JbsklArFwORmJ+lt1W7hJdTXZ2onpIh7kASEluY4CtXCGH/P1MQhSm2a/ojM8ISDTPhl3lhsMtyrvo4ks5nIL8n3gpHWsx/WRdXnX6Xtg+1wGUqGR5897thhJjspxAj1vV0MCzumETIulrEyjgWLUpGLJVIKAQ4eWW+hX6PGqPdEmYYGw23UvmHCKoejOG3wT04Aa01YOeJjKocYAS2tpCHcACKn8Ktc/CmzmU9apmp1Lx4CfAwFs5RZlLcR8igbqNrxCvUXPD+UZEOcKKy8JYINLOBP6skxNKJ7hdaqY/n3oANCK44Sll6p4LdyAiYGeObPMNdbJmpVbDX6GA/1gNI0PPR9LlzMLVPcucQglQp1bqvwWvq7ah+vgwIlrZH3tRZxBA5joV+nx4e+BAeXwifuJEwaUAgOndf82V1lTNMWH9+tTU+O4ryHTvGtXlXoQbJXaY+K8iUXy9av4o00AgwJOMQEU/5Ug070g72keJGrAZi47m8UlhsANG0RqHDUg5EPaIX4i1jb8TzPglOMRkBOpmBAELFrEIw0Cb0S4DfBjbpH5OD44O7Y4SDMfuM8Q3HQEZ0Jw0l1/4EhDUjaCvEsGuVCocKedsOF4LojQ/dlca83RbDhc1l6QAQFsFpy01zw+pE5Wfq58QasaRxbkr1SC1NJ14TbUyFx+p0tTYIOf8Il2ffURLvwShP6lhkqlbmbW0CYEd46fGQA45bgE5H8jyL8iyA/wAdDyJuiGmlQ5YySOooEewxPoT5gZqhnPAoLDXBsem/1onLJ/5XkHgWwxAG0WXF/UgIlDR6NBCoP68gNXDY4slJigQtEk2jBZoqVYTH6BLLWbBhlQ30LBGccyauY9tRvBJUK6IN0PxX3xctOFlwI6vO2wHwkbMJeYl9UOxoCmUIAeg0pQHwFuHWSgE6lIyoB/mzzzamIq8VZAh3cLQVP6D/d0NK2FdEJ4aZQW5aiCC9bf4pawiZs6LEUypZrBsEXSSOcRmCL1LXHwN0azAJsFN8gLTo0C62f9E/0ynaSyRmv97nH+RvR3PRLfxLEoSBOTqDZhFrtfw0rn9K0mGIgNuk17DU3bBM3GZQY+jJ/nZPKX0UDZwrA+PI0vZpdhS6LBeKnFg9ST2hXh3ltHlYSZMHcayT/mZJduM3+LJnTvciOCUkPYtJMN3Rtedo4x++Yl9822OELLN5UgjU1A7mwLyCsANguOaBzfweAKmUi1EQWZxx+UwfFwCqJzxpo/RHBL+DQiFfPX1lTNO8uNwpvCKfe7CLIOQTrwbmsg6717LQHnoExhOJ7wruBy1y+dZXZYszRFBb4Eg/m8dZzmnYYPMVVeg28pHuFn8l84F3pBYjv5YL1lewoCMr+JRl6SNXKwbgc3bVh6axopq2aL4ARMDrutG+g1dKrqSDQbdI0rZFgZ3Bz+384p+HbgO6gXV+VuMf9kndytN59FAm4Bb+G/GsuLuxMi3oNvicz0fTD+y/090M/QA8J1y0QhUkyv1+LdF/AbmHz0Duu8Nd/0apz9MnBfI7hq9AY3FJi8tTCMSI07/wX04i+gNYiAgV4B7teH6kzcxJBMDCxUEL1pOFPEjFav0ht5A293Gr2tHaSXdpRkj1xG3xVegF7rs8IB95MnpC2iHm7TVeADlqP58+FEfWpyH4/XWn5a8lp9KS9fOEA0ruPBeTRuDn9GBncRosGVuw7Dh2GanfxcAm7r6N0JmnT4lIgkY/H4igvT4ZYmIPtjQmDxUhu9gI4JH748SQbJelthSdupwjADPgSlAu0etXSk+ag1TfNCgS8OJOCKi3dV3XAHPkbew+sdjvaBDNOt5zJCBqBm3gK9Nt3HvMMMV6/RmzoM5DLhX+43T0petwCHkrchyImaskaQsgZKc9X3xSd57tCNWI0GxjoKNU4bvsqjcdKmi9volXEcWWGgZT26Ixj3MQ8zTjXuPXwR382ZtZXFb1zsUJqz1CxYn9fU83NIaqxkvvWE5jn4zF/3LYLMRJAHmCdU/7s8CXXQAUYEl8Zvd0U8V4Ru+2TNG88bSL/+wJH7pGwCMhpTg9khcbhX/gDHN01jfs241P+PGvkWr3bm4ZhhuOW0x7kiAyo18mnhc/fik1qMIt3gSi7CB/1BzQeHWUrfU/cel55wGgeLAH5Xb/o5mg1f1BeEV4Qj7nVBAOedEE3Cgr1ChDt5M4i3U/XiPTlvWHaUPdhtNjz+ADu+4pwKRm1z7E7o7mrUOLIef6VfkFJmZOmyfFzuBagSRqKpnKLZsMy3xwUKTjmuEmTGdsz1MtSt1CMYfqRt/oQeT58L/yKTFWxCpFurbN2OcwJyFt0rfBya1reFc+5dp6UHRISY1I9ozESg/8ejwcfOnQ0OYIGV3eZ2jNViEzs4RCPWoDDS6qM2UMfEbtTe0GzSJtTBJIQ60dFo40FMKQFJmpsPW3WaP+QvU4KbumbS57jn36w0laRda6U4vGGrsBx9Xu9BzcAIVR9qwish0FMFaE886yQVglVqKa0cVjWgjQyvl3hRcL6hkEabOkljquyDYu0G/ccWCc8IH7t0DgO9jZmrisPUl/cJuNp5CBeFO+r3go15knGrl0/2fDxEb/tS30P3LjdZpd0CZaCmwJYJmOwWQdvW8QjISZ/LgHwCJv2Q6xvm7fgVRcFZcj3Q0vuA3O8dZ2+GqHuFu0t9B4KjwVkayjzGCOq1k1iyzkD79VuPaN5HyEHSvBx+q6vPUfwKC03zbWPnozeepllTaaf0c5LXO4dDjnld+Sz1l7AJU0cW7qFBz+C0QoApP0VvxExEX9YkPMCvdVUFz6RivMeqTRg2GPgTzrxdNjR0NBzVv2Q+i2HD31w79B8kn7hwO4wxTyyPijgI+/wutINvKMHpR+De95g6ETM1PERYFjArmL7qFToDvwSdMWnvIwmJ9s5LCW4U/7arDME5cbxjOsp8zpqt2V8F+jmphRI3WgKnqoTNPpBfWzM0bx9ZgS4LZkGS1cJEfp3rhIMNtkbyj+KC89GpKWSi1EWpWnyy3DDEcl4fjnvyE6qVBBwB2V55tLddE3D9vBrX2eBCrwSXsTilHL3wXPO6XQslhfN5odJCpXhQAumKh2yfRvbDrP+4QVI80g2irDV0CZOriu3PBk0jvZkR5o9Mb9k7fZo/6pxXZhAP40dIn2WMtIRY52vsroUEJAHbXjCttWsC7kavxqGLJ2vca52kcWr0Tvoku3GLS9a8Wq0i4CwvliVjHLyRrOMKgORiiyBx/8TAXqR3Mw+p7u8PQQMpDe7AvVkK7G1oWh/zgMQ9WAZp/qZjQWYsTi113Qe4x+1KU30MezGs2sPNU8dDDwykIy2/6TRTGSA4SVzScUUqzXMJHUV8H9XEtJ5EN/zDI4DuK35cqaOEdH6j61iNI6imlUVw0l4imdY3mAHqNSkmDG56w92WA/jCdhWXqCokGkg0ksy5vWUTcKB7nUvH3JAad51Tlu0dCO4p2Tkhe1wbwZH1NquB5CYpr4lGKk0r0cibUCOYjATzIWuuZpVrEQFJwJI5t1Y2AafGVJlevRxTZf1gRMke5iWml9qYbJP3ak9gfuUL29YGUN5vdE484O7nX3WVHpWS5hh+JGeYT2OGZV11oj9TqeyOnDergeQmKQPWyDDUSMntDUb44fXmiHfn00g32gDeUoFu/PtctqqUgJNAumJhDJmzv7IJuJ74KUamugA1PQTokmofOOJVhqEmBiOj8hFzJbgwzKnehXtcO8GR9QUEkFRuESQFP8LZZLeQxP/FVV1j7DCQL3hMKzUQRX7WMll/o24Nl6GqlUCqjsE+fyCV4DJculdlcJg4BCg5wqxl4tXFySbywAQxHGge3FeYaFhSvaKtGkdYkDIgE0oqK0vJtEoTuDgDcoh3hF+H7eZy454BF+YIQ8rDEeQ81dj+RgS71vVhEOJIpWldxNc6F5QBnERNcWQcM7sxa1/qYglIcR/zBcQA5XNO4nB+kqkU4aLXVOLbEDSVROOCF8cRcCtkUxkGN8oaFyRwhMVVASSdYEkSAo3hhwSy0Avyn50IEvMiMsgqD0gyR/yg2LPHiYo9ruPAefY4YiqDDI6sK1gAff15EwKNIHvhHvNgnBEDdR7/EwJR1siBXo0MRmZHqZFP8Ied46zS6xcXjJn8KdqBgfAx/uQlAt8h3rTdxqxhBqnfT9Z2iMbNwZSX5JysROfkPI7PJ1Pm76QHqdp4taaSCFhZBhsg6b+pRg70gmy4DGRHmNZs5pT3ddUNzt/tNMi5w28oA5PFnJUyPvi6p6/3dU9wnJMKdE4kcPfyb7pKq+UX0vClbpb5jDVdU15t6ihwPkGTPzqobAqyOY0MJkjv12Z0P/po2GzQ4rrqpASBcNKTTMcc5pXfi7Z14SQcIOCG8S+5XkRw4dJbFvQqa/AN/9tH5cyJczzkSr6Bendj5qStw7VWv6M0UDluU5BRmKLTxY1GgQJEWv9Of4qZnZQBEDRnRzmDqz0n4KRwQNK4//KCu4ArcMhJ5lzNl9XQ0RqnXEabwghl4zacy5kdTL42Js1PYGbHWrUf8yxyzk/wZiTk8GNc8F5jtWGOzVf1B45o3DlMKFwDcGSynQWQjEdAbiJPqvmgJ1mLqauuBbI1cJeZSuntAAmjyEI7q+wsE+p3PQQkEQD+uqicWzDQhcHAeTiN4Udnm1YCLoA97lqCIwLtbA0k4/pKAo6AJK9POl0jleCG8IWurdUm9JkFuCX5p8udk64AjgjwmmsgmQgpCUgCVt8dvwgfHQfQC3OV0fg+cg8zWzVhABs0Z0cJ7k6M4/5UbYRzmExrwDhO/lL7qBzHdYZXSeQQaHnNNVA5UQKOgCSfEGDiiwNItmKgvFpKTaGzI6eq2v3NThvAEY3ryHBAKYdAz7scQDJxAtL3qcdp63RNcfUj+C5CzinKGQ8CEt36gEG2A9zlb8DJ/K6XbZQA0UjSTN8Lf82TNtCIyfPNXFp1UpZtgkP6Za4+XWfnarBk8Re/eZeV3utZdm+9ON1GLrkqXz8Uv+t8dsAzpF/lOOT69TJIElAKGAFu4eawkZistnCP782fYk9lLyG4LMdE/MansZxiSoX6ffJPofdw8/cm6XvjL26TWSOZlrJfcv162UESyHgDfz/3Ckwj3esNKfc5WfgMP70o5iaPScTf223kUp8C/PJ8KzdtcSJq7A7ugaTV6aXjC8/1Avzf1TyH/nXdSucemEHOr5edLAH96xP0CKDJf47Q2jSyssaNc/4W3xT+zI//ALNTIkUmqs58AAAAAElFTkSuQmCC","version":"4.9.2","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:41:58","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"1C609F89-B7C0-4244-A77E-6EC2A573080F","refEntity":"193C697E-973B-4E52-8852-0A86C684AD6A","refField":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","myRows":"1","refRows":"n","innerType":""},{"myField":"404FC9F3-8B46-4E98-B800-8E0146FC2679","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"51DB153D-15F1-4831-A48C-957D45847C68","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]}],"views":[],"dicts":[],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["193C697E-973B-4E52-8852-0A86C684AD6A","897CE7B5-936E-460A-AE58-874AEC9BFF89","2CA47871-19BF-46F1-8AE5-ED1766A1C355","2DCB09B1-0F66-43F3-A104-F127E9915B4F","2CF25297-0285-44B2-B6E3-07BFB70E424F","BF404C8C-5785-4566-95F7-16D011128ABA","E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3"],"refViews":[],"refDiagrams":["A153DE3A-11F3-482C-8BCA-28971FE903DD"],"refDicts":[],"id":"46FEECDE-C787-4EB4-A472-243EE2C92D87","refLogicEntities":[]},{"defKey":"PAY","defName":"支付","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"CE6CF463-002B-431A-9334-010DF102DD5C","refLogicEntities":[]},{"defKey":"CRON","defName":"定时任务","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"6E6D7AD4-5955-4BF8-AFD0-9A0A90C23368","refLogicEntities":[]},{"defKey":"INFRA","defName":"基础设施","refEntities":[],"refViews":[],"refDiagrams":[],"refDicts":[],"id":"CBC5F9D7-EE19-4759-BF87-0379750D1025","refLogicEntities":[]}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"DEFAULT","defName":"默认关系图","relationType":"field","canvasData":{"cells":[{"id":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","shape":"group","position":{"x":-50.000000000018304,"y":-29.999999999970896},"label":"### 全部","note":"","size":{"width":2020,"height":1140},"children":["7d866926-c983-421d-b8ce-be13f3d8b8b2","5448f8cb-6bb5-42a9-86a5-878254bf6d6d","dbb3c433-599e-4dfa-9be9-04cac1cd8dac","6c1f583f-b6ae-4052-b3ae-e5050ad904f8","711699f0-9a7b-4c33-988e-2909a36a47a9","42bbb7e9-9045-4626-b331-0e6bbeace533","8ce91e7f-229e-4f61-99e5-a0380ddcab7b","16831da1-6ece-4182-996c-90c3e0112dcc","f651ca67-b6e0-4553-b5fd-308f985bb05b","f912963f-fa11-4a9f-9d04-3f92c3ff2d10"]},{"id":"dbb3c433-599e-4dfa-9be9-04cac1cd8dac","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"1C609F89-B7C0-4244-A77E-6EC2A573080F%in"},"target":{"cell":"7d866926-c983-421d-b8ce-be13f3d8b8b2","port":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f651ca67-b6e0-4553-b5fd-308f985bb05b","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"404FC9F3-8B46-4E98-B800-8E0146FC2679%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%out"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f912963f-fa11-4a9f-9d04-3f92c3ff2d10","shape":"erdRelation","source":{"cell":"711699f0-9a7b-4c33-988e-2909a36a47a9","port":"51DB153D-15F1-4831-A48C-957D45847C68%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"16831da1-6ece-4182-996c-90c3e0112dcc","shape":"table","position":{"x":33.5,"y":779},"count":0,"originKey":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"8ce91e7f-229e-4f61-99e5-a0380ddcab7b","shape":"table","position":{"x":579.5,"y":779},"count":0,"originKey":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":491,"height":284}},{"id":"711699f0-9a7b-4c33-988e-2909a36a47a9","shape":"table","position":{"x":33.5,"y":470},"count":0,"originKey":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","shape":"table","position":{"x":636.5,"y":470},"count":0,"originKey":"897CE7B5-936E-460A-AE58-874AEC9BFF89","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":377,"height":146}},{"id":"42bbb7e9-9045-4626-b331-0e6bbeace533","shape":"table","position":{"x":1117,"y":50},"count":0,"originKey":"2CF25297-0285-44B2-B6E3-07BFB70E424F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":830,"height":468}},{"id":"7d866926-c983-421d-b8ce-be13f3d8b8b2","shape":"table","position":{"x":600,"y":50},"count":0,"originKey":"193C697E-973B-4E52-8852-0A86C684AD6A","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":284}},{"id":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","shape":"table","position":{"x":-16,"y":50},"count":0,"originKey":"BF404C8C-5785-4566-95F7-16D011128ABA","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":549,"height":330}}]},"id":"A153DE3A-11F3-482C-8BCA-28971FE903DD","comment":""}],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711104907.pdma.json b/docs/pdma/.back_gin-template/T20240711104907.pdma.json new file mode 100644 index 0000000..5b16241 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711104907.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,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","version":"4.9.2","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:49:07","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"1C609F89-B7C0-4244-A77E-6EC2A573080F","refEntity":"193C697E-973B-4E52-8852-0A86C684AD6A","refField":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","myRows":"1","refRows":"n","innerType":""},{"myField":"404FC9F3-8B46-4E98-B800-8E0146FC2679","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"51DB153D-15F1-4831-A48C-957D45847C68","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]}],"views":[],"dicts":[],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["193C697E-973B-4E52-8852-0A86C684AD6A","897CE7B5-936E-460A-AE58-874AEC9BFF89","2CA47871-19BF-46F1-8AE5-ED1766A1C355","2DCB09B1-0F66-43F3-A104-F127E9915B4F","2CF25297-0285-44B2-B6E3-07BFB70E424F","BF404C8C-5785-4566-95F7-16D011128ABA","E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3"],"refViews":[],"refDiagrams":["A153DE3A-11F3-482C-8BCA-28971FE903DD"],"refDicts":[],"id":"46FEECDE-C787-4EB4-A472-243EE2C92D87","refLogicEntities":[]}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"DEFAULT","defName":"默认关系图","relationType":"field","canvasData":{"cells":[{"id":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","shape":"group","position":{"x":-50.000000000018304,"y":-29.999999999970896},"label":"### 全部","note":"","size":{"width":2020,"height":1140},"children":["7d866926-c983-421d-b8ce-be13f3d8b8b2","5448f8cb-6bb5-42a9-86a5-878254bf6d6d","dbb3c433-599e-4dfa-9be9-04cac1cd8dac","6c1f583f-b6ae-4052-b3ae-e5050ad904f8","711699f0-9a7b-4c33-988e-2909a36a47a9","42bbb7e9-9045-4626-b331-0e6bbeace533","8ce91e7f-229e-4f61-99e5-a0380ddcab7b","16831da1-6ece-4182-996c-90c3e0112dcc","f651ca67-b6e0-4553-b5fd-308f985bb05b","f912963f-fa11-4a9f-9d04-3f92c3ff2d10"]},{"id":"dbb3c433-599e-4dfa-9be9-04cac1cd8dac","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"1C609F89-B7C0-4244-A77E-6EC2A573080F%in"},"target":{"cell":"7d866926-c983-421d-b8ce-be13f3d8b8b2","port":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f651ca67-b6e0-4553-b5fd-308f985bb05b","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"404FC9F3-8B46-4E98-B800-8E0146FC2679%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%out"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f912963f-fa11-4a9f-9d04-3f92c3ff2d10","shape":"erdRelation","source":{"cell":"711699f0-9a7b-4c33-988e-2909a36a47a9","port":"51DB153D-15F1-4831-A48C-957D45847C68%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"16831da1-6ece-4182-996c-90c3e0112dcc","shape":"table","position":{"x":33.5,"y":779},"count":0,"originKey":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"8ce91e7f-229e-4f61-99e5-a0380ddcab7b","shape":"table","position":{"x":579.5,"y":779},"count":0,"originKey":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":491,"height":284}},{"id":"711699f0-9a7b-4c33-988e-2909a36a47a9","shape":"table","position":{"x":33.5,"y":470},"count":0,"originKey":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","shape":"table","position":{"x":636.5,"y":470},"count":0,"originKey":"897CE7B5-936E-460A-AE58-874AEC9BFF89","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":377,"height":146}},{"id":"42bbb7e9-9045-4626-b331-0e6bbeace533","shape":"table","position":{"x":1117,"y":50},"count":0,"originKey":"2CF25297-0285-44B2-B6E3-07BFB70E424F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":830,"height":468}},{"id":"7d866926-c983-421d-b8ce-be13f3d8b8b2","shape":"table","position":{"x":600,"y":50},"count":0,"originKey":"193C697E-973B-4E52-8852-0A86C684AD6A","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":284}},{"id":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","shape":"table","position":{"x":-16,"y":50},"count":0,"originKey":"BF404C8C-5785-4566-95F7-16D011128ABA","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":549,"height":330}}]},"id":"A153DE3A-11F3-482C-8BCA-28971FE903DD","comment":""}],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711104934.pdma.json b/docs/pdma/.back_gin-template/T20240711104934.pdma.json new file mode 100644 index 0000000..8696fcb --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711104934.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,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","version":"4.9.2","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:49:34","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"1C609F89-B7C0-4244-A77E-6EC2A573080F","refEntity":"193C697E-973B-4E52-8852-0A86C684AD6A","refField":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","myRows":"1","refRows":"n","innerType":""},{"myField":"404FC9F3-8B46-4E98-B800-8E0146FC2679","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"51DB153D-15F1-4831-A48C-957D45847C68","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]}],"views":[],"dicts":[],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["193C697E-973B-4E52-8852-0A86C684AD6A","897CE7B5-936E-460A-AE58-874AEC9BFF89","2CA47871-19BF-46F1-8AE5-ED1766A1C355","2DCB09B1-0F66-43F3-A104-F127E9915B4F","2CF25297-0285-44B2-B6E3-07BFB70E424F","BF404C8C-5785-4566-95F7-16D011128ABA","E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3"],"refViews":[],"refDiagrams":["A153DE3A-11F3-482C-8BCA-28971FE903DD"],"refDicts":[],"id":"46FEECDE-C787-4EB4-A472-243EE2C92D87","refLogicEntities":[]}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"DEFAULT","defName":"默认关系图","relationType":"field","canvasData":{"cells":[{"id":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","shape":"group","position":{"x":-50.000000000018304,"y":-29.999999999970896},"label":"### 全部","note":"","size":{"width":2020,"height":1140},"children":["7d866926-c983-421d-b8ce-be13f3d8b8b2","5448f8cb-6bb5-42a9-86a5-878254bf6d6d","dbb3c433-599e-4dfa-9be9-04cac1cd8dac","6c1f583f-b6ae-4052-b3ae-e5050ad904f8","711699f0-9a7b-4c33-988e-2909a36a47a9","42bbb7e9-9045-4626-b331-0e6bbeace533","8ce91e7f-229e-4f61-99e5-a0380ddcab7b","16831da1-6ece-4182-996c-90c3e0112dcc","f651ca67-b6e0-4553-b5fd-308f985bb05b","f912963f-fa11-4a9f-9d04-3f92c3ff2d10"]},{"id":"dbb3c433-599e-4dfa-9be9-04cac1cd8dac","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"1C609F89-B7C0-4244-A77E-6EC2A573080F%in"},"target":{"cell":"7d866926-c983-421d-b8ce-be13f3d8b8b2","port":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f651ca67-b6e0-4553-b5fd-308f985bb05b","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"404FC9F3-8B46-4E98-B800-8E0146FC2679%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%out"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f912963f-fa11-4a9f-9d04-3f92c3ff2d10","shape":"erdRelation","source":{"cell":"711699f0-9a7b-4c33-988e-2909a36a47a9","port":"51DB153D-15F1-4831-A48C-957D45847C68%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"16831da1-6ece-4182-996c-90c3e0112dcc","shape":"table","position":{"x":33.5,"y":779},"count":0,"originKey":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"8ce91e7f-229e-4f61-99e5-a0380ddcab7b","shape":"table","position":{"x":579.5,"y":779},"count":0,"originKey":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":491,"height":284}},{"id":"711699f0-9a7b-4c33-988e-2909a36a47a9","shape":"table","position":{"x":33.5,"y":470},"count":0,"originKey":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","shape":"table","position":{"x":636.5,"y":470},"count":0,"originKey":"897CE7B5-936E-460A-AE58-874AEC9BFF89","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":377,"height":146}},{"id":"42bbb7e9-9045-4626-b331-0e6bbeace533","shape":"table","position":{"x":1117,"y":50},"count":0,"originKey":"2CF25297-0285-44B2-B6E3-07BFB70E424F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":830,"height":468}},{"id":"7d866926-c983-421d-b8ce-be13f3d8b8b2","shape":"table","position":{"x":600,"y":50},"count":0,"originKey":"193C697E-973B-4E52-8852-0A86C684AD6A","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":284}},{"id":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","shape":"table","position":{"x":-16,"y":50},"count":0,"originKey":"BF404C8C-5785-4566-95F7-16D011128ABA","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":549,"height":330}}]},"id":"A153DE3A-11F3-482C-8BCA-28971FE903DD","comment":""}],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711110817.pdma.json b/docs/pdma/.back_gin-template/T20240711110817.pdma.json new file mode 100644 index 0000000..01993bf --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711110817.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,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","version":"4.9.2","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 11:08:17","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"1C609F89-B7C0-4244-A77E-6EC2A573080F","refEntity":"193C697E-973B-4E52-8852-0A86C684AD6A","refField":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","myRows":"1","refRows":"n","innerType":""},{"myField":"404FC9F3-8B46-4E98-B800-8E0146FC2679","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"51DB153D-15F1-4831-A48C-957D45847C68","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]}],"views":[],"dicts":[],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["193C697E-973B-4E52-8852-0A86C684AD6A","897CE7B5-936E-460A-AE58-874AEC9BFF89","2CA47871-19BF-46F1-8AE5-ED1766A1C355","2DCB09B1-0F66-43F3-A104-F127E9915B4F","2CF25297-0285-44B2-B6E3-07BFB70E424F","BF404C8C-5785-4566-95F7-16D011128ABA","E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3"],"refViews":[],"refDiagrams":["A153DE3A-11F3-482C-8BCA-28971FE903DD"],"refDicts":[],"id":"46FEECDE-C787-4EB4-A472-243EE2C92D87","refLogicEntities":[]}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"DEFAULT","defName":"默认关系图","relationType":"field","canvasData":{"cells":[{"id":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","shape":"group","position":{"x":-50.000000000018304,"y":-29.999999999970896},"label":"### 全部","note":"","size":{"width":2020,"height":1140},"children":["7d866926-c983-421d-b8ce-be13f3d8b8b2","5448f8cb-6bb5-42a9-86a5-878254bf6d6d","dbb3c433-599e-4dfa-9be9-04cac1cd8dac","6c1f583f-b6ae-4052-b3ae-e5050ad904f8","711699f0-9a7b-4c33-988e-2909a36a47a9","42bbb7e9-9045-4626-b331-0e6bbeace533","8ce91e7f-229e-4f61-99e5-a0380ddcab7b","16831da1-6ece-4182-996c-90c3e0112dcc","f651ca67-b6e0-4553-b5fd-308f985bb05b","f912963f-fa11-4a9f-9d04-3f92c3ff2d10"]},{"id":"dbb3c433-599e-4dfa-9be9-04cac1cd8dac","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"1C609F89-B7C0-4244-A77E-6EC2A573080F%in"},"target":{"cell":"7d866926-c983-421d-b8ce-be13f3d8b8b2","port":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f651ca67-b6e0-4553-b5fd-308f985bb05b","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"404FC9F3-8B46-4E98-B800-8E0146FC2679%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%out"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f912963f-fa11-4a9f-9d04-3f92c3ff2d10","shape":"erdRelation","source":{"cell":"711699f0-9a7b-4c33-988e-2909a36a47a9","port":"51DB153D-15F1-4831-A48C-957D45847C68%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"16831da1-6ece-4182-996c-90c3e0112dcc","shape":"table","position":{"x":33.5,"y":779},"count":0,"originKey":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"8ce91e7f-229e-4f61-99e5-a0380ddcab7b","shape":"table","position":{"x":579.5,"y":779},"count":0,"originKey":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":491,"height":284}},{"id":"711699f0-9a7b-4c33-988e-2909a36a47a9","shape":"table","position":{"x":33.5,"y":470},"count":0,"originKey":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","shape":"table","position":{"x":636.5,"y":470},"count":0,"originKey":"897CE7B5-936E-460A-AE58-874AEC9BFF89","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":377,"height":146}},{"id":"42bbb7e9-9045-4626-b331-0e6bbeace533","shape":"table","position":{"x":1117,"y":50},"count":0,"originKey":"2CF25297-0285-44B2-B6E3-07BFB70E424F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":830,"height":468}},{"id":"7d866926-c983-421d-b8ce-be13f3d8b8b2","shape":"table","position":{"x":600,"y":50},"count":0,"originKey":"193C697E-973B-4E52-8852-0A86C684AD6A","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":284}},{"id":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","shape":"table","position":{"x":-16,"y":50},"count":0,"originKey":"BF404C8C-5785-4566-95F7-16D011128ABA","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":549,"height":330}}]},"id":"A153DE3A-11F3-482C-8BCA-28971FE903DD","comment":""}],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin_template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/T20240711110819.pdma.json b/docs/pdma/.back_gin-template/T20240711110819.pdma.json new file mode 100644 index 0000000..4f26982 --- /dev/null +++ b/docs/pdma/.back_gin-template/T20240711110819.pdma.json @@ -0,0 +1 @@ +{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4EAYAAAD4FuddAAABdWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokXWQvUvDUBTFT6tS0DqIDh0cMolD1NIKdnFoKxRFMFQFq1OafgltfCQpUnETVyn4H1jBWXCwiFRwcXAQRAcR3Zw6KbhoeN6XVNoi3sfl/Ticc7lcwBtQGSv2AijplpFMxKS11Lrke4OHnlOqZrKooiwK/v276/PR9d5PiFlNu3YQ2U9cl84ul3aeAlN//V3Vn8maGv3f1EGNGRbgkYmVbYsJ3iUeMWgp4qrgvMvHgtMunzuelWSc+JZY0gpqhrhJLKc79HwHl4plrbWD2N6f1VeXxRzqUcxhEyYYilBRgQQF4X/8044/ji1yV2BQLo8CLMpESRETssTz0KFhEjJxCEHqkLhz634PrfvJbW3vFZhtcM4v2tpCAzidoZPV29p4BBgaAG7qTDVUR+qh9uZywPsJMJgChu8os2HmwiF3e38M6Hvh/GMM8B0CdpXzryPO7RqFn4Er/QcXKWq8UwZBywAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAOKADAAQAAAABAAAAOAAAAAAun0ppAAAVG0lEQVR4Ae2cC3wTZbbAz8z0kYQKVURA+higII9ii6uC9+ptEGhaHrUNfSGPBgQRdQVZdF2UbWDrLuv1UfEBCEq6euVRSEpBaIpAXNe76K6SQmVdaWkoIKColcckKZ2ZPTPJl8K0adOSluqP+f34fZ2Z73n+c853zpkJAL+QQxTlhVAV24e/Fn0RZiqXRa6Tesr718+vkQQIkAMHRoyIiYEsMo2KW+JnxDwUDxWR8bNjDMNZcv3gQU890o5cv152sgQIACU4e1X89Ji8oTb7+fgHYwynkuxi/NyY2d/EVlDxD8XMGlJCpnkdJJFEJ5f+wFXc4AXnjJ8TM+t40r+SRpTEpogilmWxk0TRfhYBGmrzfmkg6U6Wf7uHI+DsdtkEZo4ceehQbS0UE3Dit6ACujw/fAU1nfoxylb/hbhN7A0mLDeJPcEUvp2aS12INonf4RTEcgsBefvtnn4OHfL0S8Zp90Q7uWGXB0gEeih1xK6YJTClVXAvi0ViDzCJ50AECgykrH9CXCN2++WBpDr5gQl4OB84r2YQTamIlUzhULv4FeKhyhf4NE4Bzt9AVHdsJ4IpbCU1j7oIBvdkca0YcdxA9YJ6oJIzEsTKd2vXf5Vunxm/IfpvkJ1QVDn1+L1QTHkk5fF1/XV+Da53WYBKWaAzYoiZMXIFHEMAUOoMz6fyqPNRxnrzlRqnbOfv3AdyEfaDIOsLxPfFyOMsRCJeIa1/wveVa2vfsdv8te8q17u8CfUJ6hLwQD08qsd6pgfdL8rofh01JxJsxET66gX4B2nnXiy+K0aArftzzE10VLQD8dEQMndfgN1c82pdFuA+USsJJ4RIiAqHBtA8+dpP0/jvhDMlrGYSzVO5IFciddpSUiw6Pdg79vO91M9PRv574bjZBOeBgbpFFaQv5TzI9a5SdlmAYyibJKOGQ7fEn4ldCPfg3rShdrXLDHEQBr2yDjsPCeHiphKtxkC7qOkAlBeI1Kilg/LWU7N0HZUJwFmE7uL/mQ1UGLjhUs7qhEuVb9ZudiceTBmxiwUYTebRUp/X8t7PZg8kIEd8W9n7WCH83X4kPjkmO+QYdRdEQbeN72h+pNOoVVOMbqO4UDwLwLOiAQobRcs4KBM8DhBupFZTfQAu/iBsEOdtAahGPfx+6tjEuyvfrt3RsJeAu73sUKoDYH9jD13zr58NQCK+JiC/jL8vRsv0hKEwCGKffYnqjXslMy8JJkBf6H4rCyy2RFMpzocz8O0pA4TjOb36Sao//ACDn783oa5yW+0S/sLnOz0a96sJPw9wRB7XtMRQod0PkL1+6D9jp8JI5QIqbo6fFTMncojdiam0vDtHVwzAXOisOx/BTEwuXn9OWd9fP8p6/s6NeAPX0WW3In/zDui6BGjKo7ozzpkw1V+DrKwJm7EeGrX2HcTJEMUsKZHNtNbL5s1yDYa0a62+v/sZ3+nMF/+KWu7nSH9Bd+bC7z3rvpoH1U/3HXtZmnBGRkoKxzW+HdAP0m3lfpdYpo/TbeZSf5OunMHVgpT6C1RQgdZTzlE69wdOz+rM3OSnEvXRuk3c2DtY0vZyOVzNuKS/Di2bBTdQt4ubMaREP0BXzj1cuy/bNNEk4qGP1+3knlreJN4KFGQWHjgek75KF8UVwN1tXdiU/eMruBIYRfpprb1fcIN1Fm5KQVJ2iXddrG4b9+Txffp++KA+OtRG+u3SIFsE119XzM2uzcssSa3jJXALU8CZJ4qZ9gkgYKkfqCvlpi1vkqLyJzCvwMOIYEipvw01YPEAA2pCMaf943rUeAu3YHeePgoF+Uh5jT5S9z6nLajR98fzsayDtCP9kZJcJ6U0D1xfE1OJD+QebnFBXqZjQqSwXlqXrs6ZhOsypTrkdQ5Di/P48SQZ5D1dFGSg4IRYXGAsCnaauF4/TGflZoo1+sKUSOe+y0DG6kq4GX+IJYIjJQGZGpcad+TXsg9JbsklArFwORmJ+lt1W7hJdTXZ2onpIh7kASEluY4CtXCGH/P1MQhSm2a/ojM8ISDTPhl3lhsMtyrvo4ks5nIL8n3gpHWsx/WRdXnX6Xtg+1wGUqGR5897thhJjspxAj1vV0MCzumETIulrEyjgWLUpGLJVIKAQ4eWW+hX6PGqPdEmYYGw23UvmHCKoejOG3wT04Aa01YOeJjKocYAS2tpCHcACKn8Ktc/CmzmU9apmp1Lx4CfAwFs5RZlLcR8igbqNrxCvUXPD+UZEOcKKy8JYINLOBP6skxNKJ7hdaqY/n3oANCK44Sll6p4LdyAiYGeObPMNdbJmpVbDX6GA/1gNI0PPR9LlzMLVPcucQglQp1bqvwWvq7ah+vgwIlrZH3tRZxBA5joV+nx4e+BAeXwifuJEwaUAgOndf82V1lTNMWH9+tTU+O4ryHTvGtXlXoQbJXaY+K8iUXy9av4o00AgwJOMQEU/5Ug070g72keJGrAZi47m8UlhsANG0RqHDUg5EPaIX4i1jb8TzPglOMRkBOpmBAELFrEIw0Cb0S4DfBjbpH5OD44O7Y4SDMfuM8Q3HQEZ0Jw0l1/4EhDUjaCvEsGuVCocKedsOF4LojQ/dlca83RbDhc1l6QAQFsFpy01zw+pE5Wfq58QasaRxbkr1SC1NJ14TbUyFx+p0tTYIOf8Il2ffURLvwShP6lhkqlbmbW0CYEd46fGQA45bgE5H8jyL8iyA/wAdDyJuiGmlQ5YySOooEewxPoT5gZqhnPAoLDXBsem/1onLJ/5XkHgWwxAG0WXF/UgIlDR6NBCoP68gNXDY4slJigQtEk2jBZoqVYTH6BLLWbBhlQ30LBGccyauY9tRvBJUK6IN0PxX3xctOFlwI6vO2wHwkbMJeYl9UOxoCmUIAeg0pQHwFuHWSgE6lIyoB/mzzzamIq8VZAh3cLQVP6D/d0NK2FdEJ4aZQW5aiCC9bf4pawiZs6LEUypZrBsEXSSOcRmCL1LXHwN0azAJsFN8gLTo0C62f9E/0ynaSyRmv97nH+RvR3PRLfxLEoSBOTqDZhFrtfw0rn9K0mGIgNuk17DU3bBM3GZQY+jJ/nZPKX0UDZwrA+PI0vZpdhS6LBeKnFg9ST2hXh3ltHlYSZMHcayT/mZJduM3+LJnTvciOCUkPYtJMN3Rtedo4x++Yl9822OELLN5UgjU1A7mwLyCsANguOaBzfweAKmUi1EQWZxx+UwfFwCqJzxpo/RHBL+DQiFfPX1lTNO8uNwpvCKfe7CLIOQTrwbmsg6717LQHnoExhOJ7wruBy1y+dZXZYszRFBb4Eg/m8dZzmnYYPMVVeg28pHuFn8l84F3pBYjv5YL1lewoCMr+JRl6SNXKwbgc3bVh6axopq2aL4ARMDrutG+g1dKrqSDQbdI0rZFgZ3Bz+384p+HbgO6gXV+VuMf9kndytN59FAm4Bb+G/GsuLuxMi3oNvicz0fTD+y/090M/QA8J1y0QhUkyv1+LdF/AbmHz0Duu8Nd/0apz9MnBfI7hq9AY3FJi8tTCMSI07/wX04i+gNYiAgV4B7teH6kzcxJBMDCxUEL1pOFPEjFav0ht5A293Gr2tHaSXdpRkj1xG3xVegF7rs8IB95MnpC2iHm7TVeADlqP58+FEfWpyH4/XWn5a8lp9KS9fOEA0ruPBeTRuDn9GBncRosGVuw7Dh2GanfxcAm7r6N0JmnT4lIgkY/H4igvT4ZYmIPtjQmDxUhu9gI4JH748SQbJelthSdupwjADPgSlAu0etXSk+ag1TfNCgS8OJOCKi3dV3XAHPkbew+sdjvaBDNOt5zJCBqBm3gK9Nt3HvMMMV6/RmzoM5DLhX+43T0petwCHkrchyImaskaQsgZKc9X3xSd57tCNWI0GxjoKNU4bvsqjcdKmi9volXEcWWGgZT26Ixj3MQ8zTjXuPXwR382ZtZXFb1zsUJqz1CxYn9fU83NIaqxkvvWE5jn4zF/3LYLMRJAHmCdU/7s8CXXQAUYEl8Zvd0U8V4Ru+2TNG88bSL/+wJH7pGwCMhpTg9khcbhX/gDHN01jfs241P+PGvkWr3bm4ZhhuOW0x7kiAyo18mnhc/fik1qMIt3gSi7CB/1BzQeHWUrfU/cel55wGgeLAH5Xb/o5mg1f1BeEV4Qj7nVBAOedEE3Cgr1ChDt5M4i3U/XiPTlvWHaUPdhtNjz+ADu+4pwKRm1z7E7o7mrUOLIef6VfkFJmZOmyfFzuBagSRqKpnKLZsMy3xwUKTjmuEmTGdsz1MtSt1CMYfqRt/oQeT58L/yKTFWxCpFurbN2OcwJyFt0rfBya1reFc+5dp6UHRISY1I9ozESg/8ejwcfOnQ0OYIGV3eZ2jNViEzs4RCPWoDDS6qM2UMfEbtTe0GzSJtTBJIQ60dFo40FMKQFJmpsPW3WaP+QvU4KbumbS57jn36w0laRda6U4vGGrsBx9Xu9BzcAIVR9qwish0FMFaE886yQVglVqKa0cVjWgjQyvl3hRcL6hkEabOkljquyDYu0G/ccWCc8IH7t0DgO9jZmrisPUl/cJuNp5CBeFO+r3go15knGrl0/2fDxEb/tS30P3LjdZpd0CZaCmwJYJmOwWQdvW8QjISZ/LgHwCJv2Q6xvm7fgVRcFZcj3Q0vuA3O8dZ2+GqHuFu0t9B4KjwVkayjzGCOq1k1iyzkD79VuPaN5HyEHSvBx+q6vPUfwKC03zbWPnozeepllTaaf0c5LXO4dDjnld+Sz1l7AJU0cW7qFBz+C0QoApP0VvxExEX9YkPMCvdVUFz6RivMeqTRg2GPgTzrxdNjR0NBzVv2Q+i2HD31w79B8kn7hwO4wxTyyPijgI+/wutINvKMHpR+De95g6ETM1PERYFjArmL7qFToDvwSdMWnvIwmJ9s5LCW4U/7arDME5cbxjOsp8zpqt2V8F+jmphRI3WgKnqoTNPpBfWzM0bx9ZgS4LZkGS1cJEfp3rhIMNtkbyj+KC89GpKWSi1EWpWnyy3DDEcl4fjnvyE6qVBBwB2V55tLddE3D9vBrX2eBCrwSXsTilHL3wXPO6XQslhfN5odJCpXhQAumKh2yfRvbDrP+4QVI80g2irDV0CZOriu3PBk0jvZkR5o9Mb9k7fZo/6pxXZhAP40dIn2WMtIRY52vsroUEJAHbXjCttWsC7kavxqGLJ2vca52kcWr0Tvoku3GLS9a8Wq0i4CwvliVjHLyRrOMKgORiiyBx/8TAXqR3Mw+p7u8PQQMpDe7AvVkK7G1oWh/zgMQ9WAZp/qZjQWYsTi113Qe4x+1KU30MezGs2sPNU8dDDwykIy2/6TRTGSA4SVzScUUqzXMJHUV8H9XEtJ5EN/zDI4DuK35cqaOEdH6j61iNI6imlUVw0l4imdY3mAHqNSkmDG56w92WA/jCdhWXqCokGkg0ksy5vWUTcKB7nUvH3JAad51Tlu0dCO4p2Tkhe1wbwZH1NquB5CYpr4lGKk0r0cibUCOYjATzIWuuZpVrEQFJwJI5t1Y2AafGVJlevRxTZf1gRMke5iWml9qYbJP3ak9gfuUL29YGUN5vdE484O7nX3WVHpWS5hh+JGeYT2OGZV11oj9TqeyOnDergeQmKQPWyDDUSMntDUb44fXmiHfn00g32gDeUoFu/PtctqqUgJNAumJhDJmzv7IJuJ74KUamugA1PQTokmofOOJVhqEmBiOj8hFzJbgwzKnehXtcO8GR9QUEkFRuESQFP8LZZLeQxP/FVV1j7DCQL3hMKzUQRX7WMll/o24Nl6GqlUCqjsE+fyCV4DJculdlcJg4BCg5wqxl4tXFySbywAQxHGge3FeYaFhSvaKtGkdYkDIgE0oqK0vJtEoTuDgDcoh3hF+H7eZy454BF+YIQ8rDEeQ81dj+RgS71vVhEOJIpWldxNc6F5QBnERNcWQcM7sxa1/qYglIcR/zBcQA5XNO4nB+kqkU4aLXVOLbEDSVROOCF8cRcCtkUxkGN8oaFyRwhMVVASSdYEkSAo3hhwSy0Avyn50IEvMiMsgqD0gyR/yg2LPHiYo9ruPAefY4YiqDDI6sK1gAff15EwKNIHvhHvNgnBEDdR7/EwJR1siBXo0MRmZHqZFP8Ied46zS6xcXjJn8KdqBgfAx/uQlAt8h3rTdxqxhBqnfT9Z2iMbNwZSX5JysROfkPI7PJ1Pm76QHqdp4taaSCFhZBhsg6b+pRg70gmy4DGRHmNZs5pT3ddUNzt/tNMi5w28oA5PFnJUyPvi6p6/3dU9wnJMKdE4kcPfyb7pKq+UX0vClbpb5jDVdU15t6ihwPkGTPzqobAqyOY0MJkjv12Z0P/po2GzQ4rrqpASBcNKTTMcc5pXfi7Z14SQcIOCG8S+5XkRw4dJbFvQqa/AN/9tH5cyJczzkSr6Bendj5qStw7VWv6M0UDluU5BRmKLTxY1GgQJEWv9Of4qZnZQBEDRnRzmDqz0n4KRwQNK4//KCu4ArcMhJ5lzNl9XQ0RqnXEabwghl4zacy5kdTL42Js1PYGbHWrUf8yxyzk/wZiTk8GNc8F5jtWGOzVf1B45o3DlMKFwDcGSynQWQjEdAbiJPqvmgJ1mLqauuBbI1cJeZSuntAAmjyEI7q+wsE+p3PQQkEQD+uqicWzDQhcHAeTiN4Udnm1YCLoA97lqCIwLtbA0k4/pKAo6AJK9POl0jleCG8IWurdUm9JkFuCX5p8udk64AjgjwmmsgmQgpCUgCVt8dvwgfHQfQC3OV0fg+cg8zWzVhABs0Z0cJ7k6M4/5UbYRzmExrwDhO/lL7qBzHdYZXSeQQaHnNNVA5UQKOgCSfEGDiiwNItmKgvFpKTaGzI6eq2v3NThvAEY3ryHBAKYdAz7scQDJxAtL3qcdp63RNcfUj+C5CzinKGQ8CEt36gEG2A9zlb8DJ/K6XbZQA0UjSTN8Lf82TNtCIyfPNXFp1UpZtgkP6Za4+XWfnarBk8Re/eZeV3utZdm+9ON1GLrkqXz8Uv+t8dsAzpF/lOOT69TJIElAKGAFu4eawkZistnCP782fYk9lLyG4LMdE/MansZxiSoX6ffJPofdw8/cm6XvjL26TWSOZlrJfcv162UESyHgDfz/3Ckwj3esNKfc5WfgMP70o5iaPScTf223kUp8C/PJ8KzdtcSJq7A7ugaTV6aXjC8/1Avzf1TyH/nXdSucemEHOr5edLAH96xP0CKDJf47Q2jSyssaNc/4W3xT+zI//ALNTIkUmqs58AAAAAElFTkSuQmCC","version":"4.9.2","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 11:08:19","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalGroup","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"1C609F89-B7C0-4244-A77E-6EC2A573080F","refEntity":"193C697E-973B-4E52-8852-0A86C684AD6A","refField":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","myRows":"1","refRows":"n","innerType":""},{"myField":"404FC9F3-8B46-4E98-B800-8E0146FC2679","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[{"myField":"51DB153D-15F1-4831-A48C-957D45847C68","refEntity":"BF404C8C-5785-4566-95F7-16D011128ABA","refField":"8939C037-837D-44D8-AC58-9A4C502F81DC","myRows":"1","refRows":"n","innerType":""}]}],"views":[],"dicts":[],"viewGroups":[{"defKey":"SYSTEM","defName":"系统表","refEntities":["193C697E-973B-4E52-8852-0A86C684AD6A","897CE7B5-936E-460A-AE58-874AEC9BFF89","2CA47871-19BF-46F1-8AE5-ED1766A1C355","2DCB09B1-0F66-43F3-A104-F127E9915B4F","2CF25297-0285-44B2-B6E3-07BFB70E424F","BF404C8C-5785-4566-95F7-16D011128ABA","E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3"],"refViews":[],"refDiagrams":["A153DE3A-11F3-482C-8BCA-28971FE903DD"],"refDicts":[],"id":"46FEECDE-C787-4EB4-A472-243EE2C92D87","refLogicEntities":[]}],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[{"defKey":"DEFAULT","defName":"默认关系图","relationType":"field","canvasData":{"cells":[{"id":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","shape":"group","position":{"x":-50.000000000018304,"y":-29.999999999970896},"label":"### 全部","note":"","size":{"width":2020,"height":1140},"children":["7d866926-c983-421d-b8ce-be13f3d8b8b2","5448f8cb-6bb5-42a9-86a5-878254bf6d6d","dbb3c433-599e-4dfa-9be9-04cac1cd8dac","6c1f583f-b6ae-4052-b3ae-e5050ad904f8","711699f0-9a7b-4c33-988e-2909a36a47a9","42bbb7e9-9045-4626-b331-0e6bbeace533","8ce91e7f-229e-4f61-99e5-a0380ddcab7b","16831da1-6ece-4182-996c-90c3e0112dcc","f651ca67-b6e0-4553-b5fd-308f985bb05b","f912963f-fa11-4a9f-9d04-3f92c3ff2d10"]},{"id":"dbb3c433-599e-4dfa-9be9-04cac1cd8dac","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"1C609F89-B7C0-4244-A77E-6EC2A573080F%in"},"target":{"cell":"7d866926-c983-421d-b8ce-be13f3d8b8b2","port":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f651ca67-b6e0-4553-b5fd-308f985bb05b","shape":"erdRelation","source":{"cell":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","port":"404FC9F3-8B46-4E98-B800-8E0146FC2679%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%out"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"f912963f-fa11-4a9f-9d04-3f92c3ff2d10","shape":"erdRelation","source":{"cell":"711699f0-9a7b-4c33-988e-2909a36a47a9","port":"51DB153D-15F1-4831-A48C-957D45847C68%in"},"target":{"cell":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","port":"8939C037-837D-44D8-AC58-9A4C502F81DC%in"},"relation":"1:n","fillColor":"#ACDAFC","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","attrs":{"line":{"strokeDasharray":""}}},{"id":"16831da1-6ece-4182-996c-90c3e0112dcc","shape":"table","position":{"x":33.5,"y":779},"count":0,"originKey":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"8ce91e7f-229e-4f61-99e5-a0380ddcab7b","shape":"table","position":{"x":579.5,"y":779},"count":0,"originKey":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":491,"height":284}},{"id":"711699f0-9a7b-4c33-988e-2909a36a47a9","shape":"table","position":{"x":33.5,"y":470},"count":0,"originKey":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":238}},{"id":"5448f8cb-6bb5-42a9-86a5-878254bf6d6d","shape":"table","position":{"x":636.5,"y":470},"count":0,"originKey":"897CE7B5-936E-460A-AE58-874AEC9BFF89","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":377,"height":146}},{"id":"42bbb7e9-9045-4626-b331-0e6bbeace533","shape":"table","position":{"x":1117,"y":50},"count":0,"originKey":"2CF25297-0285-44B2-B6E3-07BFB70E424F","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":830,"height":468}},{"id":"7d866926-c983-421d-b8ce-be13f3d8b8b2","shape":"table","position":{"x":600,"y":50},"count":0,"originKey":"193C697E-973B-4E52-8852-0A86C684AD6A","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":450,"height":284}},{"id":"6c1f583f-b6ae-4052-b3ae-e5050ad904f8","shape":"table","position":{"x":-16,"y":50},"count":0,"originKey":"BF404C8C-5785-4566-95F7-16D011128ABA","parent":"b18b5d0d-9dd8-4805-b2e5-0dcd21866775","type":"P","size":{"width":549,"height":330}}]},"id":"A153DE3A-11F3-482C-8BCA-28971FE903DD","comment":""}],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin_template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/gin-template-backup-2024711093901.pdma.json b/docs/pdma/.back_gin-template/gin-template-backup-2024711093901.pdma.json new file mode 100644 index 0000000..4c85bbc --- /dev/null +++ b/docs/pdma/.back_gin-template/gin-template-backup-2024711093901.pdma.json @@ -0,0 +1,3356 @@ +{ + "name": "gin-template", + "describe": "gin-template", + "avatar": "data:image/png;base64,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", + "version": "4.1.3", + "createdTime": "2024-7-10 16:56:07", + "updatedTime": "2024-7-10 16:59:38", + "dbConns": [], + "profile": { + "default": { + "db": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "dbConn": "E4CA14E3-1919-4937-84A1-018CFB59C762", + "entityInitFields": [ + { + "defKey": "TENANT_ID", + "defName": "租户号", + "comment": "", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "refDict": "", + "uiHint": "", + "id": "ADB3AD14-6603-43E2-8261-114E32442B5B" + }, + { + "defKey": "REVISION", + "defName": "乐观锁", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "92BF430E-01FA-4AEF-944F-25A142632654" + }, + { + "defKey": "CREATED_BY", + "defName": "创建人", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "C8BE2C7A-8251-4ADD-BB4F-411C5754DA62" + }, + { + "defKey": "CREATED_TIME", + "defName": "创建时间", + "comment": "", + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "4E471FD6-3E73-4A90-B660-51598A482409" + }, + { + "defKey": "UPDATED_BY", + "defName": "更新人", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "0DC24AA9-4CD0-45D8-95CF-FA546BE343AB" + }, + { + "defKey": "UPDATED_TIME", + "defName": "更新时间", + "comment": "", + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "09F64AC4-4DEE-428F-AF64-4C103884E1AC" + } + ], + "entityInitProperties": { + "partitioned by": "(date string)", + "row format delimited": "", + "fields terminated by ','": "", + "collection items terminated by '-'": "", + "map keys terminated by ':'": "", + "store as textfile;": "" + } + }, + "javaHome": "", + "sql": { + "delimiter": "" + }, + "dataTypeSupports": [ + { + "defKey": "MYSQL", + "id": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E" + }, + { + "defKey": "ORACLE", + "id": "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542" + }, + { + "defKey": "SQLServer", + "id": "BFC87171-C74F-494A-B7C2-76B9C55FACC9" + }, + { + "defKey": "PostgreSQL", + "id": "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022" + }, + { + "defKey": "DB2", + "id": "89504F5D-94BF-4C9E-8B2E-44F37305FED5" + }, + { + "defKey": "DM", + "id": "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307" + }, + { + "defKey": "GaussDB", + "id": "592C7013-143D-4E7B-AF64-0D7BF1E28230" + }, + { + "defKey": "Kingbase", + "id": "77BD85E5-9D0D-4096-8427-CBA306FC9C6A" + }, + { + "defKey": "MaxCompute", + "id": "11D1FB71-A587-4217-89BA-611B8A1F83E0" + }, + { + "defKey": "SQLite", + "id": "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1" + }, + { + "defKey": "JAVA", + "id": "797A1496-D649-4261-89B4-544132EC3F36" + }, + { + "defKey": "JavaMybatis", + "id": "895CFD1D-4273-4D32-A2C4-CAC70200AB5B" + }, + { + "defKey": "JavaMybatisPlus", + "id": "A2EE7B4A-CE62-4290-B00C-B26C1BF18073" + }, + { + "defKey": "C#", + "id": "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30" + }, + { + "defKey": "Hive", + "id": "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2" + }, + { + "defKey": "Golang", + "id": "B91D99E0-9B7C-416C-8737-B760957DAF09" + } + ], + "codeTemplates": [ + { + "type": "appCode", + "applyFor": "797A1496-D649-4261-89B4-544132EC3F36", + " JpaBean": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "type": "appCode", + "applyFor": "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30", + "Default": "using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}", + "SqlSugar": "using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}" + }, + { + "applyFor": "895CFD1D-4273-4D32-A2C4-CAC70200AB5B", + "type": "appCode", + "Controller": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}", + "Service": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "ServiceImpl": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}", + "Mapper": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "Mapper.xml": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n", + "Entity": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "applyFor": "A2EE7B4A-CE62-4290-B00C-B26C1BF18073", + "type": "appCode", + "Controller": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}", + "Service": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "ServiceImpl": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}", + "Mapper": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}", + "Mapper.xml": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n", + "Entity": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "applyFor": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "type": "dbDDL", + "createTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.dbType}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTO_INCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN '+field.defKey+' '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN '+after.defKey);\n }else{\n changeDDL += (' CHANGE COLUMN '+before.defKey+' '+after.defKey);\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n changeDDL += (' DEFAULT ' + defaultValue);\n let comment = after.comment||'';\n changeDDL += (' COMMENT \\''+comment+'\\';');\n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542", + "type": "dbDDL", + "createTable": "CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "BFC87171-C74F-494A-B7C2-76B9C55FACC9", + "type": "dbDDL", + "createTable": "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' IDENTITY(1,1)' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022", + "type": "dbDDL", + "createTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "type": "dbDDL", + "applyFor": "89504F5D-94BF-4C9E-8B2E-44F37305FED5", + "createTable": "CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ','('+field.defaultValue+')',' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.dbType)=='varchar'||it.func.lowerCase(field.dbType)=='char'||it.func.lowerCase(field.dbType)=='text'||it.func.lowerCase(field.dbType)=='date'||it.func.lowerCase(field.dbType)=='datetime' ? 'string':it.func.lowerCase(field.dbType)=='tinyint unsigned'||it.func.lowerCase(field.dbType)=='bit'||it.func.lowerCase(field.dbType)=='integer'||it.func.lowerCase(field.dbType)=='tinyint'||it.func.lowerCase(field.dbType)=='smallint'||it.func.lowerCase(field.dbType)=='mediumint' ? 'int':it.func.lowerCase(field.dbType)=='int unsigned' ? 'bigint':it.func.lowerCase(field.dbType)}}{{?field.len>0&&(it.func.lowerCase(field.dbType)=='decimal'||it.func.lowerCase(field.dbType)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;", + "createView": "", + "deleteTable": "", + "createIndex": "", + "deleteIndex": "", + "message": "", + "update": "" + }, + { + "applyFor": "B91D99E0-9B7C-416C-8737-B760957DAF09", + "type": "appCode", + "content": "{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}" + } + ], + "generatorDoc": { + "docTemplate": "" + }, + "relationFieldSize": "15", + "uiHint": [ + { + "defKey": "Input", + "defName": "普通输入框", + "id": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "Select", + "defName": "下拉输入框", + "id": "FB111359-2B73-4443-926C-08A98E446448" + }, + { + "defKey": "CheckBox", + "defName": "复选框", + "id": "0CB8A6C9-1115-4FC0-B51E-5C028065082F" + }, + { + "defKey": "RadioBox", + "defName": "单选框", + "id": "5C04987A-260F-4B7C-A5D5-22A181AAE9CA" + }, + { + "defKey": "Double", + "defName": "小数输入", + "id": "8D5BAFE4-E15C-4707-A047-8EE59C58E70F" + }, + { + "defKey": "Integer", + "defName": "整数输入", + "id": "9999AF2A-A44E-415C-A2DC-D7C613BD0073" + }, + { + "defKey": "Money", + "defName": "金额输入", + "id": "2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E" + }, + { + "defKey": "Date", + "defName": "日期输入", + "id": "E4D94E14-F695-487F-AFC2-4D888009B7DA" + }, + { + "defKey": "DataYearMonth", + "defName": "年月输入", + "id": "936927E3-DD2D-4096-87FD-074CDE278D59" + }, + { + "defKey": "Text", + "defName": "长文本输入", + "id": "D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963" + }, + { + "defKey": "RichText", + "defName": "富文本输入", + "id": "C134EB1F-4CFF-49E0-882F-2C6FB275CB20" + } + ], + "headers": [ + { + "refKey": "defKey", + "hideInGraph": false + }, + { + "refKey": "defName", + "hideInGraph": false + }, + { + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "refKey": "notNull", + "hideInGraph": true + }, + { + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "refKey": "domain", + "hideInGraph": true + }, + { + "refKey": "type", + "hideInGraph": false + }, + { + "refKey": "len", + "hideInGraph": false + }, + { + "refKey": "scale", + "hideInGraph": false + }, + { + "refKey": "comment", + "hideInGraph": true + }, + { + "refKey": "refDict", + "hideInGraph": true + }, + { + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "refKey": "isStandard", + "hideInGraph": false + }, + { + "refKey": "uiHint", + "hideInGraph": true + }, + { + "refKey": "extProps", + "hideInGraph": true + } + ] + }, + "entities": [ + { + "id": "D495A024-BF4F-4BFB-BD98-7929182D7641", + "defKey": "admin", + "defName": "管理员表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88", + "extProps": {} + }, + { + "defKey": "username", + "defName": "用户名", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "84AB6D6D-8F50-4EA3-B9B5-004B6763C639", + "extProps": {} + }, + { + "defKey": "password", + "defName": "密码", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "EC3B1362-0816-451A-B584-ED09D0F6C8C2", + "extProps": {} + }, + { + "defKey": "nickname", + "defName": "昵称", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "E0E6EB91-5AC6-4707-B193-FA3B393C07D7", + "extProps": {} + }, + { + "defKey": "mobile", + "defName": "手机号", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 20, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "D3862BDD-2DE9-413D-8EC5-CE5013AE69A6", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "C660194F-E804-45E2-BA4B-CD032945EB3B", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "7D2B4DC2-A009-4F12-AD17-C213E238C928", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "C3EDFB4C-629E-41BC-87F0-B344E650D522", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "9C393A0F-5BFE-45C4-9D88-5CCCF18EDE0D", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "5B6B1F7D-5AB3-484A-BE60-8A225850535C", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "F2B3BB14-3DBC-4ACF-B343-8250E05EF412", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "unique_username", + "unique": true, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "088BD806-EFE9-4F55-A2B6-790D898DAF6E", + "fieldDefKey": "84AB6D6D-8F50-4EA3-B9B5-004B6763C639" + } + ], + "id": "A2AB27A8-8D58-4A62-A529-21ECF22277DF" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "A5DB4BF1-1267-4980-AB85-81AD952AB064", + "defKey": "admin_menu", + "defName": "管理员菜单栏表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "766E8ADD-2230-4D9C-8089-229FA186C28B", + "extProps": {} + }, + { + "defKey": "admin_id", + "defName": "管理员ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "0BC18231-16F7-4367-BC6C-61DA0928A07E", + "extProps": {} + }, + { + "defKey": "menu_id", + "defName": "菜单栏ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "A11CF9AF-6327-476C-8B31-6AFB5B6DE191", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "6DD9FA5C-9BEA-4BCB-83F7-1AA060C44B2D", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "0607036A-A9EB-48F8-AEAF-49DFFE4BA9CF", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "idx_admin_id", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "04BA8A26-6C3D-4A01-B91B-094CF9D6D111", + "fieldDefKey": "0BC18231-16F7-4367-BC6C-61DA0928A07E" + } + ], + "id": "CC765053-A701-45AC-89AE-714F6AE9E992" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "3BE9A249-898D-4C72-B2C5-195A1D18DFAF", + "defKey": "authorized", + "defName": "已授权的调用方表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "4B7CC681-AF21-4BB6-9EA8-3F5E84034A60", + "extProps": {} + }, + { + "defKey": "business_key", + "defName": "调用方key", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "5B592A4E-5BF0-4E65-A1EA-4448F3E717FA", + "extProps": {} + }, + { + "defKey": "business_secret", + "defName": "调用方secret", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "3B3F08B7-E9BE-4022-A44F-90D5B2759024", + "extProps": {} + }, + { + "defKey": "business_developer", + "defName": "调用方对接人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "FD8338EE-6F24-4595-A368-D7BB68A2F307", + "extProps": {} + }, + { + "defKey": "remark", + "defName": "备注", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "C229BFA4-850F-4598-80BF-6762C1EF2DCB", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "41137343-0B93-4C7B-BF72-782C704B3843", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "D5923F55-821C-4187-9DC4-60EEF026023F", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "A7B3A731-7ED5-4524-B620-38DBC2A4C3D4", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "9B6CF910-A64A-41D3-9766-1EDBC1A68A92", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "3AAF0410-7C6C-4B88-8E0A-F93CA397F5BC", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "BD31597C-0ECD-4E4B-8222-259385689263", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "unique_business_key", + "unique": true, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "780A50D3-E6CB-471D-AB58-BED31C800C94", + "fieldDefKey": "5B592A4E-5BF0-4E65-A1EA-4448F3E717FA" + } + ], + "id": "688C1377-C127-4F13-88F1-32127311A6F6" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "73349C61-04FA-46CE-828F-BB4DA7673350", + "defKey": "authorized_api", + "defName": "已授权接口地址表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "4991A5FB-2C70-4B76-A13A-6685574D92BB", + "extProps": {} + }, + { + "defKey": "business_key", + "defName": "调用方key", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "A12DC927-1095-4372-B738-1F4BEB2EA093", + "extProps": {} + }, + { + "defKey": "method", + "defName": "请求方式", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 30, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "87DD0746-C2E8-4BD7-9586-1E2F45DC07D8", + "extProps": {} + }, + { + "defKey": "api", + "defName": "请求地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "76551DBE-EE9A-4517-B07B-16D7F860DA9D", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "41360A95-2A02-4990-B019-37F5CD48A824", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "B5AE04D1-44C5-4BC0-AE27-6D0F8F781FC5", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "4F1CAFCB-DB14-4A4A-B4F0-A4546D42B638", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "A364C231-D8E9-43FB-8ED3-006638D7112A", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "FAA4FB0E-8DAE-4E25-B0D1-02934DAC8487", + "extProps": {} + } + ], + "indexes": [], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA", + "defKey": "cron_task", + "defName": "后台任务表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "B2AE77CC-2B4B-4E86-8A73-BD43F972E28A", + "extProps": {} + }, + { + "defKey": "name", + "defName": "任务名称", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 64, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "E4C467AC-E1F4-4020-8F53-003861A145C1", + "extProps": {} + }, + { + "defKey": "spec", + "defName": "crontab", + "comment": "表达式", + "domain": "", + "type": "VARCHAR", + "len": 64, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "57963640-5D8E-4240-8C7A-DAF21DF39CB3", + "extProps": {} + }, + { + "defKey": "command", + "defName": "执行命令", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "BB7A44EF-CE78-4F48-98A2-5EBD45499E65", + "extProps": {} + }, + { + "defKey": "protocol", + "defName": "执行方式", + "comment": "1:shell 2:http", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "EB466D10-BA39-4155-9D28-12CBAF20246C", + "extProps": {} + }, + { + "defKey": "http_method", + "defName": "http", + "comment": "请求方式 1:get 2:post", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "335837C7-7C5F-4169-956F-37365FA6D39C", + "extProps": {} + }, + { + "defKey": "timeout", + "defName": "超时时间(单位:秒)", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "60", + "hideInGraph": false, + "refDict": "", + "id": "DC846891-0383-436D-A9D8-E31D1C90CB45", + "extProps": {} + }, + { + "defKey": "retry_times", + "defName": "重试次数", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "3", + "hideInGraph": false, + "refDict": "", + "id": "0A11B343-06D4-42F3-B8F6-973D11BC0D9D", + "extProps": {} + }, + { + "defKey": "retry_interval", + "defName": "重试间隔(单位:秒)", + "comment": "", + "domain": "", + "type": "INT", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "60", + "hideInGraph": false, + "refDict": "", + "id": "5A3889C0-914C-4A03-820F-177BA0A91397", + "extProps": {} + }, + { + "defKey": "notify_status", + "defName": "执行结束是否通知", + "comment": "1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "6DA16C8C-93FD-4A22-84B0-5AE6C90901C1", + "extProps": {} + }, + { + "defKey": "notify_type", + "defName": "通知类型", + "comment": "1:邮件 2:webhook", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "CE086898-3117-4616-B124-CA70DB137727", + "extProps": {} + }, + { + "defKey": "notify_receiver_email", + "defName": "通知者邮箱地址(多个用", + "comment": "分割)", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "DBA97EE6-B4F6-4FE5-9E9C-2B7082EE0CFF", + "extProps": {} + }, + { + "defKey": "notify_keyword", + "defName": "通知匹配关键字(多个用", + "comment": "分割)", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "67B0B44C-DA6E-46D8-A152-1171CEE2BA82", + "extProps": {} + }, + { + "defKey": "remark", + "defName": "备注", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": true, + "refDict": "", + "id": "0BC32F87-F5BE-4428-9C70-2DE011666B54", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": true, + "refDict": "", + "id": "022192AE-46F4-42BE-BD6D-0CCD4BD8A780", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": true, + "refDict": "", + "id": "7ABAD7A2-43FA-4E93-B7AC-35F276336ABA", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": true, + "refDict": "", + "id": "B3860357-BE0E-4D70-AB31-A91DFD45114E", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": true, + "refDict": "", + "id": "D9ED0695-29FE-4636-83C1-1A4AFDB6E3D7", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": true, + "refDict": "", + "id": "54B21A73-1508-40DF-ABFB-7B21B7B24464", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "idx_name", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "F1405A0F-A737-4FA6-91FB-35D9038F5666", + "fieldDefKey": "E4C467AC-E1F4-4020-8F53-003861A145C1" + } + ], + "id": "844C196C-C0C5-4B80-8284-1F2F7534BC2D" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17", + "defKey": "menu", + "defName": "左侧菜单栏表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "46E48439-3B30-455E-A387-4D5D88F4E194", + "extProps": {} + }, + { + "defKey": "pid", + "defName": "父类ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "150AF050-4A0B-452E-AB34-4D88B130B7CE", + "extProps": {} + }, + { + "defKey": "name", + "defName": "菜单名称", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "9EC13DCD-0612-4B93-A485-1E4EBD6624D7", + "extProps": {} + }, + { + "defKey": "link", + "defName": "链接地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "78A7B547-83AC-4F67-B467-8F755EF5B3CB", + "extProps": {} + }, + { + "defKey": "icon", + "defName": "图标", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "A80630A5-56A7-498A-846D-9B6A2C59ECB6", + "extProps": {} + }, + { + "defKey": "level", + "defName": "菜单类型", + "comment": "1:一级菜单 2:二级菜单", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "504E7EF1-A6F2-41C4-89D6-4121B7AF1AEA", + "extProps": {} + }, + { + "defKey": "sort", + "defName": "排序", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "1B090ECB-736E-4C45-AE35-25DA6C56848C", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "89A22CE0-78D3-4BEF-98B3-52C6CAC76C40", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "D72A7E2A-10E1-4F06-BA5C-5D1FD3B4332F", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "8FFB68D4-311F-4028-B5AC-F21F26AF776A", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "BE90ECC8-D6AC-4B8E-B33F-06B24ED77E8A", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "DC900F9A-C8A0-476A-8C8C-355F80060CFA", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "DAAE6745-8466-4E70-95C7-27077195828F", + "extProps": {} + } + ], + "indexes": [], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "7BF77877-C7B5-4113-BF1C-1C3EA5B19276", + "defKey": "menu_action", + "defName": "功能权限表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "1B3E17F0-0866-423B-9B53-20106AEF8183", + "extProps": {} + }, + { + "defKey": "menu_id", + "defName": "菜单栏ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "AABA14A9-CF60-4522-9FBF-5D0512F0514F", + "extProps": {} + }, + { + "defKey": "method", + "defName": "请求方式", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 30, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "C3A39570-6405-4EDB-BF0A-7A80E8C2B02B", + "extProps": {} + }, + { + "defKey": "api", + "defName": "请求地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "23369B59-FA95-40CD-A618-F1F528316D0D", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "882725DE-789F-4065-AFF2-0E2D01E0EF57", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "C38A0965-8F1F-4D8F-A47B-9D2FD4D0E6E6", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "12E1496C-4F79-4422-BB03-8BFB3B687C7D", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "F95CD234-1FE2-4ED4-A389-EB40E0B290FC", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "3C7641ED-0749-4A31-9D00-ADC719B68A8A", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "idx_menu_id", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "F00E1016-6208-448E-AFDF-452EA689C131", + "fieldDefKey": "AABA14A9-CF60-4522-9FBF-5D0512F0514F" + } + ], + "id": "84925129-24E2-4737-8218-2126D4674F7C" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + } + ], + "views": [], + "dicts": [ + { + "defKey": "Gender", + "defName": "性别", + "intro": "", + "items": [ + { + "defKey": "M", + "defName": "男", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "1", + "id": "3622D417-DA1A-408F-BEE1-11D328D534A0" + }, + { + "defKey": "F", + "defName": "女", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "2", + "id": "380A0790-64A7-481E-831C-32F7BEE1502B" + }, + { + "defKey": "U", + "defName": "未知", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "3", + "id": "FA239F4D-1276-40D9-B230-F66BD35C3C27" + } + ], + "id": "BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D" + }, + { + "defKey": "Political", + "defName": "政治面貌", + "intro": "", + "items": [ + { + "defKey": "10", + "defName": "共青团员", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "61F3145A-7599-4CCB-B298-D5EE788107BE" + }, + { + "defKey": "20", + "defName": "中共党员", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "ED16D25A-AB2F-4FA0-BB48-2B9031FA28C4" + }, + { + "defKey": "30", + "defName": "民主党派", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "0FB7974A-AE11-438F-86E0-B163316F9272" + }, + { + "defKey": "40", + "defName": "群众", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "7D247234-7E97-45B1-8C56-4A17A370854A" + }, + { + "defKey": "90", + "defName": "未知", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "DA65D752-AF04-4A11-81D8-14A38692A64A" + } + ], + "id": "06EED564-BBA9-4747-8D73-AF809A330CB8" + }, + { + "defKey": "Marital", + "defName": "婚姻状况", + "intro": "婚姻状况的码表", + "items": [ + { + "defKey": "UNMARRIED", + "defName": "未婚", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "1", + "id": "20EE81BC-74EE-47DA-A56F-9663B23F44BD" + }, + { + "defKey": "MARRIED", + "defName": "已婚", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "2", + "id": "4DCA10A8-417E-4A8D-BDF6-0A278C060ADC" + }, + { + "defKey": "WIDOWED", + "defName": "丧偶", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "3", + "id": "826062A7-057C-4892-B338-06459F5B808D" + }, + { + "defKey": "DIVORCE", + "defName": "离婚", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "4", + "id": "B23200B4-5E59-4F5E-A779-D981A040FA32" + }, + { + "defKey": "UNSPECIFIED", + "defName": "未说明", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "5", + "id": "A7928FE2-349A-4702-9682-2EF7205E077B" + } + ], + "id": "EA1587B7-3954-437A-BFE0-FCB0453BCABA" + }, + { + "defKey": "StudentStatus", + "defName": "学生状态", + "intro": "", + "items": [ + { + "defKey": "Normal", + "defName": "正常", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "1", + "id": "E9CA1CC9-8851-4F6B-86BA-B9CF0E44EB73" + }, + { + "defKey": "Graduated", + "defName": "毕业", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "2", + "id": "DEC51D7C-99DF-430C-817D-0499862D3CCC" + }, + { + "defKey": "Studied", + "defName": "肄业", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "3", + "id": "8853D6B6-75D3-4479-9006-FC731CD85B20" + }, + { + "defKey": "Stop", + "defName": "休学", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "4", + "id": "C74BA8CF-1DC6-4C79-BAAC-F11EB9C6AF01" + } + ], + "id": "4642BC5F-02EE-4E17-A60C-CF22F86A0282" + }, + { + "defKey": "GBNation", + "defName": "民族", + "intro": "", + "items": [ + { + "defKey": "01", + "defName": "汉族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "9224DF53-F7C0-447D-B8ED-0A39F799EE19" + }, + { + "defKey": "02", + "defName": "蒙古族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "D57818E3-9206-45BB-AE79-27C64A4AB80F" + }, + { + "defKey": "03", + "defName": "回族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "0A1A3CA9-6D68-4E15-8BD0-9A2FF428D804" + }, + { + "defKey": "04", + "defName": "藏族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "7CC6B6BE-47EA-460E-ACFA-C377468DEA11" + }, + { + "defKey": "05", + "defName": "维吾尔族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "A666D51F-D249-4FAC-B1F3-78C371836CB3" + }, + { + "defKey": "06", + "defName": "苗族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "A0C9E1BA-D87B-4695-ADFA-287FDA32BB5A" + }, + { + "defKey": "07", + "defName": "彝族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "149B5B9E-C1D1-4790-8CCF-0ED5F4B25172" + }, + { + "defKey": "08", + "defName": "壮族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "F9A3E65C-BF4D-4C6B-ADB7-8C9CF0487360" + }, + { + "defKey": "09", + "defName": "布依族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "14F17DE4-E96A-460B-98A6-F84EC8CF9885" + }, + { + "defKey": "10", + "defName": "朝鲜族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "8A81AB18-B1BF-4797-A6E5-DEDB2C6566B0" + }, + { + "defKey": "11", + "defName": "满族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "7D460947-FBD2-4E4D-8366-3B38DCAF09D1" + } + ], + "id": "115EDEFC-0323-410E-81AB-CCAB8879837A" + }, + { + "defKey": "GradeLevel", + "defName": "受教育程度", + "sort": "", + "intro": "", + "items": [], + "id": "9E7C9788-B805-4C7D-8531-FD1D9DC79B05" + } + ], + "viewGroups": [], + "dataTypeMapping": { + "referURL": "", + "mappings": [ + { + "defKey": "string", + "id": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "defName": "字串", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "VARCHAR", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "VARCHAR2", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "VARCHAR", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "VARCHAR", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "VARCHAR", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "VARCHAR2", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "VARCHAR", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "VARCHAR", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "STRING", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "TEXT", + "797A1496-D649-4261-89B4-544132EC3F36": "String", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "String", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "String", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "string", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "string", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "string" + }, + { + "defKey": "double", + "id": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "defName": "小数", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "DECIMAL", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "DECIMAL", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "DECIMAL", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "NUMERIC", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "DECIMAL", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "DECIMAL", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "NUMERIC", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "NUMERIC", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "DOUBLE", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "REAL", + "797A1496-D649-4261-89B4-544132EC3F36": "Double", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Double", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Double", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "decimal", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "double", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*float64" + }, + { + "defKey": "int", + "id": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "defName": "整数", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "INT", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "INT", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "INT", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "INTEGER", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "INT", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "INTEGER", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "INTEGER", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "INT4", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "INT", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "INTEGER", + "797A1496-D649-4261-89B4-544132EC3F36": "Integer", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Integer", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Integer", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "float", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "int", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*int" + }, + { + "defKey": "date", + "id": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "defName": "日期", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "DATETIME", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "DATE", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "DATETIME", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "TIMESTAMP", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "DATE", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "DATE", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "DATE", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "DATE", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "DATETIME", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "NUMERIC", + "797A1496-D649-4261-89B4-544132EC3F36": "Date", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Date", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Date", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "DateTime", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "timestamp", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*time.Time" + }, + { + "defKey": "bytes", + "id": "D516E75B-90F5-4741-B9B3-A186A263F04C", + "defName": "二进制", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "BLOB", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "BLOB", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "VARBINARY", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "BYTEA", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "BLOB", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "BLOB", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "BYTEA", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "BYTEA", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "BINARY", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "NONE", + "797A1496-D649-4261-89B4-544132EC3F36": "byte[]", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "byte[]", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "byte[]", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "binary", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "binary", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "[]byte" + }, + { + "defKey": "largeText", + "id": "B17BDED3-085F-40E1-9019-3B79CF2BF075", + "defName": "大文本", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "TEXT", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "CLOB", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "TEXT", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "TEXT", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "CLOB", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "CLOB", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "TEXT", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "TEXT", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "STRING", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "TEXT", + "797A1496-D649-4261-89B4-544132EC3F36": "String", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "String", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "String", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "string", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "string", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "string" + } + ] + }, + "domains": [ + { + "defKey": "DefaultString", + "defName": "默认字串", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 255, + "scale": "", + "uiHint": "", + "id": "9092C4E0-1A54-4859-ABBB-5B62DBC27573" + }, + { + "defKey": "IdOrKey", + "defName": "主键标识", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 32, + "scale": "", + "uiHint": "", + "id": "16120F75-6AA7-4483-868D-F07F511BB081" + }, + { + "defKey": "Name", + "defName": "名称", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 90, + "scale": "", + "uiHint": "", + "id": "54611CCC-CA4B-42E1-9F32-4944C85B85A6" + }, + { + "defKey": "Int", + "defName": "整数", + "applyFor": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "len": "", + "scale": "", + "uiHint": "", + "id": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E" + }, + { + "defKey": "Double", + "defName": "小数", + "applyFor": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "len": 24, + "scale": 6, + "uiHint": "", + "id": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4" + }, + { + "defKey": "Money", + "defName": "金额", + "applyFor": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "len": 24, + "scale": 6, + "uiHint": "", + "id": "C3B1681B-99F9-4818-9E80-DE1652A51D85" + }, + { + "defKey": "DateTime", + "defName": "日期时间", + "applyFor": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "len": "", + "scale": "", + "uiHint": "", + "id": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC" + }, + { + "defKey": "YesNo", + "defName": "是否", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "1", + "scale": "", + "uiHint": "", + "id": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF" + }, + { + "defKey": "Dict", + "defName": "数据字典", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "32", + "scale": "", + "uiHint": "", + "id": "73FD2BAD-2358-4336-B96D-45DC897BD792" + }, + { + "defKey": "DescText", + "defName": "描述文本", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "900", + "scale": "", + "uiHint": "", + "id": "3E948CEC-3070-472C-AF92-F3CA11EC9D15" + } + ], + "diagrams": [ + { + "defKey": "默认关系图", + "defName": "", + "relationType": "field", + "canvasData": {}, + "id": "1B0E3852-8008-40BE-A2DD-5FCED9719445" + } + ], + "standardFields": [ + { + "defKey": "personInfo", + "defName": "个人基本信息要素", + "fields": [ + { + "defKey": "ID_CARD_NO", + "defName": "身份证号", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "A64A91C8-A41F-4113-92FB-7563D7EF054D" + }, + { + "defKey": "MOBILE_PHONE", + "defName": "手机号", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "479DA2AB-1974-411A-A81E-92FB939E75EB" + }, + { + "defKey": "GENDER", + "defName": "性别", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D", + "uiHint": "", + "id": "48473E29-6594-4912-AADE-C8AB44FCA3E9" + }, + { + "defKey": "BIRTH", + "defName": "出生日期", + "comment": "", + "type": "DATETIME", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "refDict": "", + "uiHint": "", + "id": "2BD3D2EE-2411-49A6-983D-84B81057312F" + }, + { + "defKey": "AVATAR", + "defName": "头像", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "FDD67CEE-4B52-4BD1-A1A3-9C5EBC6037E6" + }, + { + "defKey": "HEIGHT", + "defName": "身高", + "comment": "", + "type": "INT", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", + "refDict": "", + "uiHint": "", + "id": "CAAA0E79-41A1-4758-B481-D171168C4D68" + }, + { + "defKey": "WEIGHT", + "defName": "体重", + "comment": "", + "type": "INT", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", + "refDict": "", + "uiHint": "", + "id": "575482CE-64A6-4CB9-99DC-8E126D190AAA" + }, + { + "defKey": "NATION", + "defName": "名族", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "115EDEFC-0323-410E-81AB-CCAB8879837A", + "uiHint": "", + "id": "15B0D75D-0B97-4985-A816-D0EAFA90446B" + }, + { + "defKey": "POLITICAL", + "defName": "政治面貌", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "06EED564-BBA9-4747-8D73-AF809A330CB8", + "uiHint": "", + "id": "F458E86D-84D6-45A1-9DD3-51E6C8170D7F" + }, + { + "defKey": "MARITAL", + "defName": "婚姻状况", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "EA1587B7-3954-437A-BFE0-FCB0453BCABA", + "uiHint": "", + "id": "7275E578-6893-4922-AC69-95B261BFBD61" + }, + { + "defKey": "DOMICILE_PLACE_PROVINCE", + "defName": "籍贯(省)", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "F04BF130-3EC1-4E02-9DED-3214CA88E352" + }, + { + "defKey": "DOMICILE_PLACE_CITY", + "defName": "籍贯(市)", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "", + "uiHint": "", + "id": "B97F5BC2-33DE-4857-9DB8-ECFD02C9040C" + }, + { + "defKey": "DOMICILE_PLACE_ADDRESS", + "defName": "户籍地址", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "812ADF1D-8C03-40CA-B030-E539838FB889" + } + ], + "id": "F30202B9-4B5D-4CE7-87CE-B3890C84D3F2" + } + ], + "dbConn": [ + { + "defKey": "E4CA14E3-1919-4937-84A1-018CFB59C762", + "defName": "mysql", + "type": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "properties": { + "driver_class_name": "com.mysql.cj.jdbc.Driver", + "url": "jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC", + "password": "root", + "username": "root", + "customer_driver": "" + } + } + ] +} \ No newline at end of file diff --git a/docs/pdma/.back_gin-template/gin-template-backup-2024711093939.pdma.json b/docs/pdma/.back_gin-template/gin-template-backup-2024711093939.pdma.json new file mode 100644 index 0000000..d578cf9 --- /dev/null +++ b/docs/pdma/.back_gin-template/gin-template-backup-2024711093939.pdma.json @@ -0,0 +1,3512 @@ +{ + "name": "gin-template", + "describe": "gin-template", + "avatar": "data:image/png;base64,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", + "version": "4.1.3", + "createdTime": "2024-7-10 16:56:07", + "updatedTime": "2024-7-11 09:39:39", + "dbConns": [], + "profile": { + "default": { + "db": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "dbConn": "E4CA14E3-1919-4937-84A1-018CFB59C762", + "entityInitFields": [ + { + "defKey": "TENANT_ID", + "defName": "租户号", + "comment": "", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "refDict": "", + "uiHint": "", + "id": "ADB3AD14-6603-43E2-8261-114E32442B5B" + }, + { + "defKey": "REVISION", + "defName": "乐观锁", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "92BF430E-01FA-4AEF-944F-25A142632654" + }, + { + "defKey": "CREATED_BY", + "defName": "创建人", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "C8BE2C7A-8251-4ADD-BB4F-411C5754DA62" + }, + { + "defKey": "CREATED_TIME", + "defName": "创建时间", + "comment": "", + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "4E471FD6-3E73-4A90-B660-51598A482409" + }, + { + "defKey": "UPDATED_BY", + "defName": "更新人", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "0DC24AA9-4CD0-45D8-95CF-FA546BE343AB" + }, + { + "defKey": "UPDATED_TIME", + "defName": "更新时间", + "comment": "", + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "09F64AC4-4DEE-428F-AF64-4C103884E1AC" + } + ], + "entityInitProperties": { + "partitioned by": "(date string)", + "row format delimited": "", + "fields terminated by ','": "", + "collection items terminated by '-'": "", + "map keys terminated by ':'": "", + "store as textfile;": "" + } + }, + "javaHome": "", + "sql": { + "delimiter": "" + }, + "dataTypeSupports": [ + { + "defKey": "MYSQL", + "id": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E" + }, + { + "defKey": "ORACLE", + "id": "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542" + }, + { + "defKey": "SQLServer", + "id": "BFC87171-C74F-494A-B7C2-76B9C55FACC9" + }, + { + "defKey": "PostgreSQL", + "id": "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022" + }, + { + "defKey": "DB2", + "id": "89504F5D-94BF-4C9E-8B2E-44F37305FED5" + }, + { + "defKey": "DM", + "id": "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307" + }, + { + "defKey": "GaussDB", + "id": "592C7013-143D-4E7B-AF64-0D7BF1E28230" + }, + { + "defKey": "Kingbase", + "id": "77BD85E5-9D0D-4096-8427-CBA306FC9C6A" + }, + { + "defKey": "MaxCompute", + "id": "11D1FB71-A587-4217-89BA-611B8A1F83E0" + }, + { + "defKey": "SQLite", + "id": "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1" + }, + { + "defKey": "JAVA", + "id": "797A1496-D649-4261-89B4-544132EC3F36" + }, + { + "defKey": "JavaMybatis", + "id": "895CFD1D-4273-4D32-A2C4-CAC70200AB5B" + }, + { + "defKey": "JavaMybatisPlus", + "id": "A2EE7B4A-CE62-4290-B00C-B26C1BF18073" + }, + { + "defKey": "C#", + "id": "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30" + }, + { + "defKey": "Hive", + "id": "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2" + }, + { + "defKey": "Golang", + "id": "B91D99E0-9B7C-416C-8737-B760957DAF09" + } + ], + "codeTemplates": [ + { + "type": "appCode", + "applyFor": "797A1496-D649-4261-89B4-544132EC3F36", + " JpaBean": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "type": "appCode", + "applyFor": "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30", + "Default": "using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}", + "SqlSugar": "using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}" + }, + { + "applyFor": "895CFD1D-4273-4D32-A2C4-CAC70200AB5B", + "type": "appCode", + "Controller": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}", + "Service": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "ServiceImpl": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}", + "Mapper": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "Mapper.xml": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n", + "Entity": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "applyFor": "A2EE7B4A-CE62-4290-B00C-B26C1BF18073", + "type": "appCode", + "Controller": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}", + "Service": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "ServiceImpl": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}", + "Mapper": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}", + "Mapper.xml": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n", + "Entity": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "applyFor": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "type": "dbDDL", + "createTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.dbType}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTO_INCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN '+field.defKey+' '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN '+after.defKey);\n }else{\n changeDDL += (' CHANGE COLUMN '+before.defKey+' '+after.defKey);\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n changeDDL += (' DEFAULT ' + defaultValue);\n let comment = after.comment||'';\n changeDDL += (' COMMENT \\''+comment+'\\';');\n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542", + "type": "dbDDL", + "createTable": "CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "BFC87171-C74F-494A-B7C2-76B9C55FACC9", + "type": "dbDDL", + "createTable": "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' IDENTITY(1,1)' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022", + "type": "dbDDL", + "createTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "type": "dbDDL", + "applyFor": "89504F5D-94BF-4C9E-8B2E-44F37305FED5", + "createTable": "CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ','('+field.defaultValue+')',' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.dbType)=='varchar'||it.func.lowerCase(field.dbType)=='char'||it.func.lowerCase(field.dbType)=='text'||it.func.lowerCase(field.dbType)=='date'||it.func.lowerCase(field.dbType)=='datetime' ? 'string':it.func.lowerCase(field.dbType)=='tinyint unsigned'||it.func.lowerCase(field.dbType)=='bit'||it.func.lowerCase(field.dbType)=='integer'||it.func.lowerCase(field.dbType)=='tinyint'||it.func.lowerCase(field.dbType)=='smallint'||it.func.lowerCase(field.dbType)=='mediumint' ? 'int':it.func.lowerCase(field.dbType)=='int unsigned' ? 'bigint':it.func.lowerCase(field.dbType)}}{{?field.len>0&&(it.func.lowerCase(field.dbType)=='decimal'||it.func.lowerCase(field.dbType)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;", + "createView": "", + "deleteTable": "", + "createIndex": "", + "deleteIndex": "", + "message": "", + "update": "" + }, + { + "applyFor": "B91D99E0-9B7C-416C-8737-B760957DAF09", + "type": "appCode", + "content": "{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}" + } + ], + "generatorDoc": { + "docTemplate": "" + }, + "relationFieldSize": "15", + "uiHint": [ + { + "defKey": "Input", + "defName": "普通输入框", + "id": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "Select", + "defName": "下拉输入框", + "id": "FB111359-2B73-4443-926C-08A98E446448" + }, + { + "defKey": "CheckBox", + "defName": "复选框", + "id": "0CB8A6C9-1115-4FC0-B51E-5C028065082F" + }, + { + "defKey": "RadioBox", + "defName": "单选框", + "id": "5C04987A-260F-4B7C-A5D5-22A181AAE9CA" + }, + { + "defKey": "Double", + "defName": "小数输入", + "id": "8D5BAFE4-E15C-4707-A047-8EE59C58E70F" + }, + { + "defKey": "Integer", + "defName": "整数输入", + "id": "9999AF2A-A44E-415C-A2DC-D7C613BD0073" + }, + { + "defKey": "Money", + "defName": "金额输入", + "id": "2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E" + }, + { + "defKey": "Date", + "defName": "日期输入", + "id": "E4D94E14-F695-487F-AFC2-4D888009B7DA" + }, + { + "defKey": "DataYearMonth", + "defName": "年月输入", + "id": "936927E3-DD2D-4096-87FD-074CDE278D59" + }, + { + "defKey": "Text", + "defName": "长文本输入", + "id": "D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963" + }, + { + "defKey": "RichText", + "defName": "富文本输入", + "id": "C134EB1F-4CFF-49E0-882F-2C6FB275CB20" + } + ], + "headers": [ + { + "refKey": "defKey", + "hideInGraph": false + }, + { + "refKey": "defName", + "hideInGraph": false + }, + { + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "refKey": "notNull", + "hideInGraph": true + }, + { + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "refKey": "domain", + "hideInGraph": true + }, + { + "refKey": "type", + "hideInGraph": false + }, + { + "refKey": "len", + "hideInGraph": false + }, + { + "refKey": "scale", + "hideInGraph": false + }, + { + "refKey": "comment", + "hideInGraph": true + }, + { + "refKey": "refDict", + "hideInGraph": true + }, + { + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "refKey": "isStandard", + "hideInGraph": false + }, + { + "refKey": "uiHint", + "hideInGraph": true + }, + { + "refKey": "extProps", + "hideInGraph": true + } + ] + }, + "entities": [ + { + "id": "D495A024-BF4F-4BFB-BD98-7929182D7641", + "defKey": "admin", + "defName": "管理员表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88", + "extProps": {} + }, + { + "defKey": "username", + "defName": "用户名", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "84AB6D6D-8F50-4EA3-B9B5-004B6763C639", + "extProps": {} + }, + { + "defKey": "password", + "defName": "密码", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "EC3B1362-0816-451A-B584-ED09D0F6C8C2", + "extProps": {} + }, + { + "defKey": "nickname", + "defName": "昵称", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "E0E6EB91-5AC6-4707-B193-FA3B393C07D7", + "extProps": {} + }, + { + "defKey": "mobile", + "defName": "手机号", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 20, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "D3862BDD-2DE9-413D-8EC5-CE5013AE69A6", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "C660194F-E804-45E2-BA4B-CD032945EB3B", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "7D2B4DC2-A009-4F12-AD17-C213E238C928", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "C3EDFB4C-629E-41BC-87F0-B344E650D522", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "9C393A0F-5BFE-45C4-9D88-5CCCF18EDE0D", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "5B6B1F7D-5AB3-484A-BE60-8A225850535C", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "F2B3BB14-3DBC-4ACF-B343-8250E05EF412", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "unique_username", + "unique": true, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "088BD806-EFE9-4F55-A2B6-790D898DAF6E", + "fieldDefKey": "84AB6D6D-8F50-4EA3-B9B5-004B6763C639" + } + ], + "id": "A2AB27A8-8D58-4A62-A529-21ECF22277DF" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "A5DB4BF1-1267-4980-AB85-81AD952AB064", + "defKey": "admin_menu", + "defName": "管理员菜单栏表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "766E8ADD-2230-4D9C-8089-229FA186C28B", + "extProps": {} + }, + { + "defKey": "admin_id", + "defName": "管理员ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "0BC18231-16F7-4367-BC6C-61DA0928A07E", + "extProps": {} + }, + { + "defKey": "menu_id", + "defName": "菜单栏ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "A11CF9AF-6327-476C-8B31-6AFB5B6DE191", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "6DD9FA5C-9BEA-4BCB-83F7-1AA060C44B2D", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "0607036A-A9EB-48F8-AEAF-49DFFE4BA9CF", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "idx_admin_id", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "04BA8A26-6C3D-4A01-B91B-094CF9D6D111", + "fieldDefKey": "0BC18231-16F7-4367-BC6C-61DA0928A07E" + } + ], + "id": "CC765053-A701-45AC-89AE-714F6AE9E992" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [ + { + "myField": "A11CF9AF-6327-476C-8B31-6AFB5B6DE191", + "refEntity": "3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17", + "refField": "46E48439-3B30-455E-A387-4D5D88F4E194", + "myRows": "n", + "refRows": "1", + "innerType": "" + }, + { + "myField": "0BC18231-16F7-4367-BC6C-61DA0928A07E", + "refEntity": "D495A024-BF4F-4BFB-BD98-7929182D7641", + "refField": "230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88", + "myRows": "n", + "refRows": "1", + "innerType": "" + } + ] + }, + { + "id": "3BE9A249-898D-4C72-B2C5-195A1D18DFAF", + "defKey": "authorized", + "defName": "已授权的调用方表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "4B7CC681-AF21-4BB6-9EA8-3F5E84034A60", + "extProps": {} + }, + { + "defKey": "business_key", + "defName": "调用方key", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "5B592A4E-5BF0-4E65-A1EA-4448F3E717FA", + "extProps": {} + }, + { + "defKey": "business_secret", + "defName": "调用方secret", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "3B3F08B7-E9BE-4022-A44F-90D5B2759024", + "extProps": {} + }, + { + "defKey": "business_developer", + "defName": "调用方对接人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "FD8338EE-6F24-4595-A368-D7BB68A2F307", + "extProps": {} + }, + { + "defKey": "remark", + "defName": "备注", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "C229BFA4-850F-4598-80BF-6762C1EF2DCB", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "41137343-0B93-4C7B-BF72-782C704B3843", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "D5923F55-821C-4187-9DC4-60EEF026023F", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "A7B3A731-7ED5-4524-B620-38DBC2A4C3D4", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "9B6CF910-A64A-41D3-9766-1EDBC1A68A92", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "3AAF0410-7C6C-4B88-8E0A-F93CA397F5BC", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "BD31597C-0ECD-4E4B-8222-259385689263", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "unique_business_key", + "unique": true, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "780A50D3-E6CB-471D-AB58-BED31C800C94", + "fieldDefKey": "5B592A4E-5BF0-4E65-A1EA-4448F3E717FA" + } + ], + "id": "688C1377-C127-4F13-88F1-32127311A6F6" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "73349C61-04FA-46CE-828F-BB4DA7673350", + "defKey": "authorized_api", + "defName": "已授权接口地址表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "4991A5FB-2C70-4B76-A13A-6685574D92BB", + "extProps": {} + }, + { + "defKey": "business_key", + "defName": "调用方key", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "A12DC927-1095-4372-B738-1F4BEB2EA093", + "extProps": {} + }, + { + "defKey": "method", + "defName": "请求方式", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 30, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "87DD0746-C2E8-4BD7-9586-1E2F45DC07D8", + "extProps": {} + }, + { + "defKey": "api", + "defName": "请求地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "76551DBE-EE9A-4517-B07B-16D7F860DA9D", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "41360A95-2A02-4990-B019-37F5CD48A824", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "B5AE04D1-44C5-4BC0-AE27-6D0F8F781FC5", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "4F1CAFCB-DB14-4A4A-B4F0-A4546D42B638", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "A364C231-D8E9-43FB-8ED3-006638D7112A", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "FAA4FB0E-8DAE-4E25-B0D1-02934DAC8487", + "extProps": {} + } + ], + "indexes": [], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA", + "defKey": "cron_task", + "defName": "后台任务表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "B2AE77CC-2B4B-4E86-8A73-BD43F972E28A", + "extProps": {} + }, + { + "defKey": "name", + "defName": "任务名称", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 64, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "E4C467AC-E1F4-4020-8F53-003861A145C1", + "extProps": {} + }, + { + "defKey": "spec", + "defName": "crontab", + "comment": "表达式", + "domain": "", + "type": "VARCHAR", + "len": 64, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "57963640-5D8E-4240-8C7A-DAF21DF39CB3", + "extProps": {} + }, + { + "defKey": "command", + "defName": "执行命令", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "BB7A44EF-CE78-4F48-98A2-5EBD45499E65", + "extProps": {} + }, + { + "defKey": "protocol", + "defName": "执行方式", + "comment": "1:shell 2:http", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "EB466D10-BA39-4155-9D28-12CBAF20246C", + "extProps": {} + }, + { + "defKey": "http_method", + "defName": "http", + "comment": "请求方式 1:get 2:post", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "335837C7-7C5F-4169-956F-37365FA6D39C", + "extProps": {} + }, + { + "defKey": "timeout", + "defName": "超时时间(单位:秒)", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "60", + "hideInGraph": false, + "refDict": "", + "id": "DC846891-0383-436D-A9D8-E31D1C90CB45", + "extProps": {} + }, + { + "defKey": "retry_times", + "defName": "重试次数", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "3", + "hideInGraph": false, + "refDict": "", + "id": "0A11B343-06D4-42F3-B8F6-973D11BC0D9D", + "extProps": {} + }, + { + "defKey": "retry_interval", + "defName": "重试间隔(单位:秒)", + "comment": "", + "domain": "", + "type": "INT", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "60", + "hideInGraph": false, + "refDict": "", + "id": "5A3889C0-914C-4A03-820F-177BA0A91397", + "extProps": {} + }, + { + "defKey": "notify_status", + "defName": "执行结束是否通知", + "comment": "1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "6DA16C8C-93FD-4A22-84B0-5AE6C90901C1", + "extProps": {} + }, + { + "defKey": "notify_type", + "defName": "通知类型", + "comment": "1:邮件 2:webhook", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "CE086898-3117-4616-B124-CA70DB137727", + "extProps": {} + }, + { + "defKey": "notify_receiver_email", + "defName": "通知者邮箱地址(多个用", + "comment": "分割)", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "DBA97EE6-B4F6-4FE5-9E9C-2B7082EE0CFF", + "extProps": {} + }, + { + "defKey": "notify_keyword", + "defName": "通知匹配关键字(多个用", + "comment": "分割)", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "67B0B44C-DA6E-46D8-A152-1171CEE2BA82", + "extProps": {} + }, + { + "defKey": "remark", + "defName": "备注", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": true, + "refDict": "", + "id": "0BC32F87-F5BE-4428-9C70-2DE011666B54", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": true, + "refDict": "", + "id": "022192AE-46F4-42BE-BD6D-0CCD4BD8A780", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": true, + "refDict": "", + "id": "7ABAD7A2-43FA-4E93-B7AC-35F276336ABA", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": true, + "refDict": "", + "id": "B3860357-BE0E-4D70-AB31-A91DFD45114E", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": true, + "refDict": "", + "id": "D9ED0695-29FE-4636-83C1-1A4AFDB6E3D7", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": true, + "refDict": "", + "id": "54B21A73-1508-40DF-ABFB-7B21B7B24464", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "idx_name", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "F1405A0F-A737-4FA6-91FB-35D9038F5666", + "fieldDefKey": "E4C467AC-E1F4-4020-8F53-003861A145C1" + } + ], + "id": "844C196C-C0C5-4B80-8284-1F2F7534BC2D" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17", + "defKey": "menu", + "defName": "左侧菜单栏表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "46E48439-3B30-455E-A387-4D5D88F4E194", + "extProps": {} + }, + { + "defKey": "pid", + "defName": "父类ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "150AF050-4A0B-452E-AB34-4D88B130B7CE", + "extProps": {} + }, + { + "defKey": "name", + "defName": "菜单名称", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "VARCHAR", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "9EC13DCD-0612-4B93-A485-1E4EBD6624D7", + "extProps": {} + }, + { + "defKey": "link", + "defName": "链接地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "78A7B547-83AC-4F67-B467-8F755EF5B3CB", + "extProps": {} + }, + { + "defKey": "icon", + "defName": "图标", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "A80630A5-56A7-498A-846D-9B6A2C59ECB6", + "extProps": {} + }, + { + "defKey": "level", + "defName": "菜单类型", + "comment": "1:一级菜单 2:二级菜单", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": 4, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "504E7EF1-A6F2-41C4-89D6-4121B7AF1AEA", + "extProps": {} + }, + { + "defKey": "sort", + "defName": "排序", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "1B090ECB-736E-4C45-AE35-25DA6C56848C", + "extProps": {} + }, + { + "defKey": "is_used", + "defName": "是否启用", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "id": "89A22CE0-78D3-4BEF-98B3-52C6CAC76C40", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "D72A7E2A-10E1-4F06-BA5C-5D1FD3B4332F", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "8FFB68D4-311F-4028-B5AC-F21F26AF776A", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "BE90ECC8-D6AC-4B8E-B33F-06B24ED77E8A", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "DC900F9A-C8A0-476A-8C8C-355F80060CFA", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "DAAE6745-8466-4E70-95C7-27077195828F", + "extProps": {} + } + ], + "indexes": [], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "7BF77877-C7B5-4113-BF1C-1C3EA5B19276", + "defKey": "menu_action", + "defName": "功能权限表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "id": "1B3E17F0-0866-423B-9B53-20106AEF8183", + "extProps": {} + }, + { + "defKey": "menu_id", + "defName": "菜单栏ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": 11, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "id": "AABA14A9-CF60-4522-9FBF-5D0512F0514F", + "extProps": {} + }, + { + "defKey": "method", + "defName": "请求方式", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 30, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "C3A39570-6405-4EDB-BF0A-7A80E8C2B02B", + "extProps": {} + }, + { + "defKey": "api", + "defName": "请求地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "23369B59-FA95-40CD-A618-F1F528316D0D", + "extProps": {} + }, + { + "defKey": "is_deleted", + "defName": "是否删除", + "comment": "1:是 -1:否", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "id": "882725DE-789F-4065-AFF2-0E2D01E0EF57", + "extProps": {} + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "C38A0965-8F1F-4D8F-A47B-9D2FD4D0E6E6", + "extProps": {} + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "12E1496C-4F79-4422-BB03-8BFB3B687C7D", + "extProps": {} + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "'current_timestamp()'", + "hideInGraph": false, + "refDict": "", + "id": "F95CD234-1FE2-4ED4-A389-EB40E0B290FC", + "extProps": {} + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "id": "3C7641ED-0749-4A31-9D00-ADC719B68A8A", + "extProps": {} + } + ], + "indexes": [ + { + "defKey": "idx_menu_id", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "F00E1016-6208-448E-AFDF-452EA689C131", + "fieldDefKey": "AABA14A9-CF60-4522-9FBF-5D0512F0514F" + } + ], + "id": "84925129-24E2-4737-8218-2126D4674F7C" + } + ], + "nameTemplate": "{defKey}[{defName}]", + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [ + { + "myField": "AABA14A9-CF60-4522-9FBF-5D0512F0514F", + "refEntity": "3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17", + "refField": "46E48439-3B30-455E-A387-4D5D88F4E194", + "myRows": "n", + "refRows": "1", + "innerType": "" + } + ] + } + ], + "views": [], + "dicts": [ + { + "defKey": "Gender", + "defName": "性别", + "intro": "", + "items": [ + { + "defKey": "M", + "defName": "男", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "1", + "id": "3622D417-DA1A-408F-BEE1-11D328D534A0" + }, + { + "defKey": "F", + "defName": "女", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "2", + "id": "380A0790-64A7-481E-831C-32F7BEE1502B" + }, + { + "defKey": "U", + "defName": "未知", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "3", + "id": "FA239F4D-1276-40D9-B230-F66BD35C3C27" + } + ], + "id": "BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D" + }, + { + "defKey": "Political", + "defName": "政治面貌", + "intro": "", + "items": [ + { + "defKey": "10", + "defName": "共青团员", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "61F3145A-7599-4CCB-B298-D5EE788107BE" + }, + { + "defKey": "20", + "defName": "中共党员", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "ED16D25A-AB2F-4FA0-BB48-2B9031FA28C4" + }, + { + "defKey": "30", + "defName": "民主党派", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "0FB7974A-AE11-438F-86E0-B163316F9272" + }, + { + "defKey": "40", + "defName": "群众", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "7D247234-7E97-45B1-8C56-4A17A370854A" + }, + { + "defKey": "90", + "defName": "未知", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "DA65D752-AF04-4A11-81D8-14A38692A64A" + } + ], + "id": "06EED564-BBA9-4747-8D73-AF809A330CB8" + }, + { + "defKey": "Marital", + "defName": "婚姻状况", + "intro": "婚姻状况的码表", + "items": [ + { + "defKey": "UNMARRIED", + "defName": "未婚", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "1", + "id": "20EE81BC-74EE-47DA-A56F-9663B23F44BD" + }, + { + "defKey": "MARRIED", + "defName": "已婚", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "2", + "id": "4DCA10A8-417E-4A8D-BDF6-0A278C060ADC" + }, + { + "defKey": "WIDOWED", + "defName": "丧偶", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "3", + "id": "826062A7-057C-4892-B338-06459F5B808D" + }, + { + "defKey": "DIVORCE", + "defName": "离婚", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "4", + "id": "B23200B4-5E59-4F5E-A779-D981A040FA32" + }, + { + "defKey": "UNSPECIFIED", + "defName": "未说明", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "5", + "id": "A7928FE2-349A-4702-9682-2EF7205E077B" + } + ], + "id": "EA1587B7-3954-437A-BFE0-FCB0453BCABA" + }, + { + "defKey": "StudentStatus", + "defName": "学生状态", + "intro": "", + "items": [ + { + "defKey": "Normal", + "defName": "正常", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "1", + "id": "E9CA1CC9-8851-4F6B-86BA-B9CF0E44EB73" + }, + { + "defKey": "Graduated", + "defName": "毕业", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "2", + "id": "DEC51D7C-99DF-430C-817D-0499862D3CCC" + }, + { + "defKey": "Studied", + "defName": "肄业", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "3", + "id": "8853D6B6-75D3-4479-9006-FC731CD85B20" + }, + { + "defKey": "Stop", + "defName": "休学", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "sort": "4", + "id": "C74BA8CF-1DC6-4C79-BAAC-F11EB9C6AF01" + } + ], + "id": "4642BC5F-02EE-4E17-A60C-CF22F86A0282" + }, + { + "defKey": "GBNation", + "defName": "民族", + "intro": "", + "items": [ + { + "defKey": "01", + "defName": "汉族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "9224DF53-F7C0-447D-B8ED-0A39F799EE19" + }, + { + "defKey": "02", + "defName": "蒙古族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "D57818E3-9206-45BB-AE79-27C64A4AB80F" + }, + { + "defKey": "03", + "defName": "回族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "0A1A3CA9-6D68-4E15-8BD0-9A2FF428D804" + }, + { + "defKey": "04", + "defName": "藏族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "7CC6B6BE-47EA-460E-ACFA-C377468DEA11" + }, + { + "defKey": "05", + "defName": "维吾尔族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "A666D51F-D249-4FAC-B1F3-78C371836CB3" + }, + { + "defKey": "06", + "defName": "苗族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "A0C9E1BA-D87B-4695-ADFA-287FDA32BB5A" + }, + { + "defKey": "07", + "defName": "彝族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "149B5B9E-C1D1-4790-8CCF-0ED5F4B25172" + }, + { + "defKey": "08", + "defName": "壮族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "F9A3E65C-BF4D-4C6B-ADB7-8C9CF0487360" + }, + { + "defKey": "09", + "defName": "布依族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "14F17DE4-E96A-460B-98A6-F84EC8CF9885" + }, + { + "defKey": "10", + "defName": "朝鲜族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "8A81AB18-B1BF-4797-A6E5-DEDB2C6566B0" + }, + { + "defKey": "11", + "defName": "满族", + "intro": "", + "parentKey": "", + "enabled": true, + "attr1": "", + "attr2": "", + "attr3": "", + "id": "7D460947-FBD2-4E4D-8366-3B38DCAF09D1" + } + ], + "id": "115EDEFC-0323-410E-81AB-CCAB8879837A" + }, + { + "defKey": "GradeLevel", + "defName": "受教育程度", + "sort": "", + "intro": "", + "items": [], + "id": "9E7C9788-B805-4C7D-8531-FD1D9DC79B05" + } + ], + "viewGroups": [], + "dataTypeMapping": { + "referURL": "", + "mappings": [ + { + "defKey": "string", + "id": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "defName": "字串", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "VARCHAR", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "VARCHAR2", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "VARCHAR", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "VARCHAR", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "VARCHAR", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "VARCHAR2", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "VARCHAR", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "VARCHAR", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "STRING", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "TEXT", + "797A1496-D649-4261-89B4-544132EC3F36": "String", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "String", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "String", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "string", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "string", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "string" + }, + { + "defKey": "double", + "id": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "defName": "小数", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "DECIMAL", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "DECIMAL", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "DECIMAL", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "NUMERIC", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "DECIMAL", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "DECIMAL", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "NUMERIC", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "NUMERIC", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "DOUBLE", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "REAL", + "797A1496-D649-4261-89B4-544132EC3F36": "Double", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Double", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Double", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "decimal", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "double", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*float64" + }, + { + "defKey": "int", + "id": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "defName": "整数", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "INT", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "INT", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "INT", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "INTEGER", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "INT", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "INTEGER", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "INTEGER", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "INT4", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "INT", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "INTEGER", + "797A1496-D649-4261-89B4-544132EC3F36": "Integer", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Integer", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Integer", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "float", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "int", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*int" + }, + { + "defKey": "date", + "id": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "defName": "日期", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "DATETIME", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "DATE", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "DATETIME", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "TIMESTAMP", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "DATE", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "DATE", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "DATE", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "DATE", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "DATETIME", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "NUMERIC", + "797A1496-D649-4261-89B4-544132EC3F36": "Date", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Date", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Date", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "DateTime", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "timestamp", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*time.Time" + }, + { + "defKey": "bytes", + "id": "D516E75B-90F5-4741-B9B3-A186A263F04C", + "defName": "二进制", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "BLOB", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "BLOB", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "VARBINARY", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "BYTEA", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "BLOB", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "BLOB", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "BYTEA", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "BYTEA", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "BINARY", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "NONE", + "797A1496-D649-4261-89B4-544132EC3F36": "byte[]", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "byte[]", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "byte[]", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "binary", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "binary", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "[]byte" + }, + { + "defKey": "largeText", + "id": "B17BDED3-085F-40E1-9019-3B79CF2BF075", + "defName": "大文本", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "TEXT", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "CLOB", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "TEXT", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "TEXT", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "CLOB", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "CLOB", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "TEXT", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "TEXT", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "STRING", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "TEXT", + "797A1496-D649-4261-89B4-544132EC3F36": "String", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "String", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "String", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "string", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "string", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "string" + } + ] + }, + "domains": [ + { + "defKey": "DefaultString", + "defName": "默认字串", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 255, + "scale": "", + "uiHint": "", + "id": "9092C4E0-1A54-4859-ABBB-5B62DBC27573" + }, + { + "defKey": "IdOrKey", + "defName": "主键标识", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 32, + "scale": "", + "uiHint": "", + "id": "16120F75-6AA7-4483-868D-F07F511BB081" + }, + { + "defKey": "Name", + "defName": "名称", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 90, + "scale": "", + "uiHint": "", + "id": "54611CCC-CA4B-42E1-9F32-4944C85B85A6" + }, + { + "defKey": "Int", + "defName": "整数", + "applyFor": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "len": "", + "scale": "", + "uiHint": "", + "id": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E" + }, + { + "defKey": "Double", + "defName": "小数", + "applyFor": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "len": 24, + "scale": 6, + "uiHint": "", + "id": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4" + }, + { + "defKey": "Money", + "defName": "金额", + "applyFor": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "len": 24, + "scale": 6, + "uiHint": "", + "id": "C3B1681B-99F9-4818-9E80-DE1652A51D85" + }, + { + "defKey": "DateTime", + "defName": "日期时间", + "applyFor": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "len": "", + "scale": "", + "uiHint": "", + "id": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC" + }, + { + "defKey": "YesNo", + "defName": "是否", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "1", + "scale": "", + "uiHint": "", + "id": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF" + }, + { + "defKey": "Dict", + "defName": "数据字典", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "32", + "scale": "", + "uiHint": "", + "id": "73FD2BAD-2358-4336-B96D-45DC897BD792" + }, + { + "defKey": "DescText", + "defName": "描述文本", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "900", + "scale": "", + "uiHint": "", + "id": "3E948CEC-3070-472C-AF92-F3CA11EC9D15" + } + ], + "diagrams": [ + { + "defKey": "默认关系图", + "defName": "", + "relationType": "field", + "canvasData": { + "cells": [ + { + "id": "42f27e58-cc13-4900-a604-ac68d6c90330", + "shape": "erdRelation", + "source": { + "cell": "4f4ff69e-5d18-40ba-8bb8-949ad780392a", + "port": "46E48439-3B30-455E-A387-4D5D88F4E194%out" + }, + "target": { + "cell": "1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2", + "port": "A11CF9AF-6327-476C-8B31-6AFB5B6DE191%in" + }, + "relation": "1:n", + "vertices": [ + { + "x": 490, + "y": 712 + } + ], + "fillColor": "#ACDAFC", + "router": { + "name": "manhattan" + } + }, + { + "id": "7614ac8c-c76f-450d-975d-1f08331a8d2d", + "shape": "erdRelation", + "source": { + "cell": "e8cb6304-cb0d-4fed-aaf9-e473f33a99c6", + "port": "230EFD9B-BE8E-4AD9-A8DF-C91E3A0CAC88%in" + }, + "target": { + "cell": "1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2", + "port": "0BC18231-16F7-4367-BC6C-61DA0928A07E%in" + }, + "relation": "1:n", + "fillColor": "#ACDAFC", + "router": { + "name": "manhattan" + } + }, + { + "id": "e8cb6304-cb0d-4fed-aaf9-e473f33a99c6", + "shape": "table", + "position": { + "x": 565, + "y": 137 + }, + "count": 0, + "originKey": "D495A024-BF4F-4BFB-BD98-7929182D7641" + }, + { + "id": "7f253a86-275c-44fd-92f5-6482aa90dc87", + "shape": "table", + "position": { + "x": 1021, + "y": 534 + }, + "count": 0, + "originKey": "E29F4ABC-C1AD-48D3-ABAB-7E126CA76BEA" + }, + { + "id": "1e8ff3e5-ea95-40f7-83ce-cb6a1e6b3cd2", + "shape": "table", + "position": { + "x": 565, + "y": 626 + }, + "count": 0, + "originKey": "A5DB4BF1-1267-4980-AB85-81AD952AB064" + }, + { + "id": "e7f81bd2-f308-456c-89af-e6f7c0a9d655", + "shape": "table", + "position": { + "x": 555, + "y": 917 + }, + "count": 0, + "originKey": "73349C61-04FA-46CE-828F-BB4DA7673350" + }, + { + "id": "2b66e414-0a1c-4d1c-94d5-8cb2ea245a82", + "shape": "table", + "position": { + "x": 80, + "y": 894 + }, + "count": 0, + "originKey": "3BE9A249-898D-4C72-B2C5-195A1D18DFAF" + }, + { + "id": "4edb1b0e-9787-4ca6-9ccd-2580a9303e70", + "shape": "erdRelation", + "source": { + "cell": "4f4ff69e-5d18-40ba-8bb8-949ad780392a", + "port": "46E48439-3B30-455E-A387-4D5D88F4E194%in" + }, + "target": { + "cell": "d50af898-e6a4-4421-b36e-4c29dfe262d2", + "port": "AABA14A9-CF60-4522-9FBF-5D0512F0514F%in" + }, + "relation": "1:n", + "fillColor": "#ACDAFC", + "router": { + "name": "manhattan" + } + }, + { + "id": "4f4ff69e-5d18-40ba-8bb8-949ad780392a", + "shape": "table", + "position": { + "x": 57, + "y": 114 + }, + "count": 0, + "originKey": "3B9A3880-4E6D-4C8C-9DDE-4E91EB56EE17" + }, + { + "id": "d50af898-e6a4-4421-b36e-4c29dfe262d2", + "shape": "table", + "position": { + "x": 85, + "y": 580 + }, + "count": 0, + "originKey": "7BF77877-C7B5-4113-BF1C-1C3EA5B19276" + } + ] + }, + "id": "1B0E3852-8008-40BE-A2DD-5FCED9719445" + } + ], + "standardFields": [ + { + "defKey": "personInfo", + "defName": "个人基本信息要素", + "fields": [ + { + "defKey": "ID_CARD_NO", + "defName": "身份证号", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "A64A91C8-A41F-4113-92FB-7563D7EF054D" + }, + { + "defKey": "MOBILE_PHONE", + "defName": "手机号", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "479DA2AB-1974-411A-A81E-92FB939E75EB" + }, + { + "defKey": "GENDER", + "defName": "性别", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "BF9E20E0-80D3-486D-BD58-5FADCF3E4A1D", + "uiHint": "", + "id": "48473E29-6594-4912-AADE-C8AB44FCA3E9" + }, + { + "defKey": "BIRTH", + "defName": "出生日期", + "comment": "", + "type": "DATETIME", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "refDict": "", + "uiHint": "", + "id": "2BD3D2EE-2411-49A6-983D-84B81057312F" + }, + { + "defKey": "AVATAR", + "defName": "头像", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "FDD67CEE-4B52-4BD1-A1A3-9C5EBC6037E6" + }, + { + "defKey": "HEIGHT", + "defName": "身高", + "comment": "", + "type": "INT", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", + "refDict": "", + "uiHint": "", + "id": "CAAA0E79-41A1-4758-B481-D171168C4D68" + }, + { + "defKey": "WEIGHT", + "defName": "体重", + "comment": "", + "type": "INT", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", + "refDict": "", + "uiHint": "", + "id": "575482CE-64A6-4CB9-99DC-8E126D190AAA" + }, + { + "defKey": "NATION", + "defName": "名族", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "115EDEFC-0323-410E-81AB-CCAB8879837A", + "uiHint": "", + "id": "15B0D75D-0B97-4985-A816-D0EAFA90446B" + }, + { + "defKey": "POLITICAL", + "defName": "政治面貌", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "06EED564-BBA9-4747-8D73-AF809A330CB8", + "uiHint": "", + "id": "F458E86D-84D6-45A1-9DD3-51E6C8170D7F" + }, + { + "defKey": "MARITAL", + "defName": "婚姻状况", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "EA1587B7-3954-437A-BFE0-FCB0453BCABA", + "uiHint": "", + "id": "7275E578-6893-4922-AC69-95B261BFBD61" + }, + { + "defKey": "DOMICILE_PLACE_PROVINCE", + "defName": "籍贯(省)", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "F04BF130-3EC1-4E02-9DED-3214CA88E352" + }, + { + "defKey": "DOMICILE_PLACE_CITY", + "defName": "籍贯(市)", + "comment": "", + "type": "VARCHAR", + "len": "32", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "73FD2BAD-2358-4336-B96D-45DC897BD792", + "refDict": "", + "uiHint": "", + "id": "B97F5BC2-33DE-4857-9DB8-ECFD02C9040C" + }, + { + "defKey": "DOMICILE_PLACE_ADDRESS", + "defName": "户籍地址", + "comment": "", + "type": "VARCHAR", + "len": "60", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": false, + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "refDict": "", + "uiHint": "", + "id": "812ADF1D-8C03-40CA-B030-E539838FB889" + } + ], + "id": "F30202B9-4B5D-4CE7-87CE-B3890C84D3F2" + } + ], + "dbConn": [ + { + "defKey": "E4CA14E3-1919-4937-84A1-018CFB59C762", + "defName": "mysql", + "type": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "properties": { + "driver_class_name": "com.mysql.cj.jdbc.Driver", + "url": "jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC", + "password": "root", + "username": "root", + "customer_driver": "" + } + } + ] +} \ No newline at end of file diff --git a/docs/pdma/.version_gin-template/v1.0.0.json b/docs/pdma/.version_gin-template/v1.0.0.json new file mode 100644 index 0000000..ef49d91 --- /dev/null +++ b/docs/pdma/.version_gin-template/v1.0.0.json @@ -0,0 +1 @@ +{"name":"v1.0.0","desc":"初始化","date":1720664501344,"data":{"name":"gin-template","describe":"gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。","avatar":"data:image/png;base64,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","version":"4.9.3","createdTime":"2024-7-11 10:10:48","updatedTime":"2024-7-11 10:20:09","dbConns":[],"profile":{"default":{"db":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","dbConn":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","entityInitFields":[{"defKey":"TENANT_ID","defName":"租户号","comment":"","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"domain":"16120F75-6AA7-4483-868D-F07F511BB081","refDict":"","uiHint":"","id":"ADB3AD14-6603-43E2-8261-114E32442B5B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"REVISION","defName":"乐观锁","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"92BF430E-01FA-4AEF-944F-25A142632654","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811"},{"defKey":"CREATED_BY","defName":"创建人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"C8BE2C7A-8251-4ADD-BB4F-411C5754DA62","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"CREATED_TIME","defName":"创建时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"4E471FD6-3E73-4A90-B660-51598A482409","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"},{"defKey":"UPDATED_BY","defName":"更新人","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":32,"scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"0DC24AA9-4CD0-45D8-95CF-FA546BE343AB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64"},{"defKey":"UPDATED_TIME","defName":"更新时间","comment":"","domain":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC","type":"","len":"","scale":"","primaryKey":false,"notNull":false,"autoIncrement":false,"defaultValue":"","hideInGraph":true,"refDict":"","uiHint":"","id":"09F64AC4-4DEE-428F-AF64-4C103884E1AC","baseType":"89D69E81-EA34-42EE-9FA2-93B8BD27E098"}],"entityInitProperties":{"partitioned by":"(date string)","row format delimited":"","fields terminated by ','":"","collection items terminated by '-'":"","map keys terminated by ':'":"","store as textfile;":""}},"javaHome":"","sql":{"delimiter":""},"dataTypeSupports":[{"defKey":"MYSQL","id":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E"},{"defKey":"ORACLE","id":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542"},{"defKey":"SQLServer","id":"BFC87171-C74F-494A-B7C2-76B9C55FACC9"},{"defKey":"PostgreSQL","id":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022"},{"defKey":"DB2","id":"89504F5D-94BF-4C9E-8B2E-44F37305FED5"},{"defKey":"DM","id":"0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307"},{"defKey":"GaussDB","id":"592C7013-143D-4E7B-AF64-0D7BF1E28230"},{"defKey":"Kingbase","id":"77BD85E5-9D0D-4096-8427-CBA306FC9C6A"},{"defKey":"GBase","id":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A"},{"defKey":"MaxCompute","id":"11D1FB71-A587-4217-89BA-611B8A1F83E0"},{"defKey":"SQLite","id":"B363BE0B-F852-49B8-9B2E-F6D2174DEAC1"},{"defKey":"Hive","id":"81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2"},{"defKey":"JAVA","id":"797A1496-D649-4261-89B4-544132EC3F36"},{"defKey":"JavaMybatis","id":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B"},{"defKey":"JavaMybatisPlus","id":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073"},{"defKey":"C#","id":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30"},{"defKey":"Golang","id":"B91D99E0-9B7C-416C-8737-B760957DAF09"},{"defKey":"Rust","id":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB"},{"defKey":"Doris","id":"483F9346-C99E-4014-A1D2-A554606BD8A3"},{"defKey":"HighGo","id":"ABF5836C-0B7C-4007-A41C-F869325E5842"}],"codeTemplates":[{"type":"appCode","applyFor":"797A1496-D649-4261-89B4-544132EC3F36"," JpaBean":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"type":"appCode","applyFor":"F3AC2415-E86B-40C6-9FEB-F4B7937D2C30","Default":"using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}","SqlSugar":"using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}"},{"applyFor":"895CFD1D-4273-4D32-A2C4-CAC70200AB5B","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"A2EE7B4A-CE62-4290-B00C-B26C1BF18073","type":"appCode","Controller":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}","Service":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}","ServiceImpl":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}","Mapper":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}","Mapper.xml":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n","Entity":"{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}"},{"applyFor":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"A4E23CB7-BB01-4BD1-9F71-F73F3E15A542","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"BFC87171-C74F-494A-B7C2-76B9C55FACC9","type":"dbDDL","createTable":"IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"type":"dbDDL","applyFor":"89504F5D-94BF-4C9E-8B2E-44F37305FED5","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;","createView":"","deleteTable":"","createIndex":"","deleteIndex":"","message":"","update":""},{"applyFor":"B91D99E0-9B7C-416C-8737-B760957DAF09","type":"appCode","content":"{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}"},{"applyFor":"BDF457FD-9F98-4AC3-A705-7587B00A3BAB","type":"appCode","struct":"use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n"},{"applyFor":"56F4B55B-F0B8-4049-9E6B-50B95C1D793A","type":"dbDDL","createTable":"CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"483F9346-C99E-4014-A1D2-A554606BD8A3","type":"dbDDL","createTable":"{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n","createView":"","deleteTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};","createIndex":"","deleteIndex":"","message":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"},{"applyFor":"ABF5836C-0B7C-4007-A41C-F869325E5842","type":"dbDDL","createTable":"DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}","update":"{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}"}],"generatorDoc":{"docTemplate":""},"relationFieldSize":"15","uiHint":[{"defKey":"Input","defName":"普通输入框","id":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"Select","defName":"下拉输入框","id":"FB111359-2B73-4443-926C-08A98E446448"},{"defKey":"CheckBox","defName":"复选框","id":"0CB8A6C9-1115-4FC0-B51E-5C028065082F"},{"defKey":"RadioBox","defName":"单选框","id":"5C04987A-260F-4B7C-A5D5-22A181AAE9CA"},{"defKey":"Double","defName":"小数输入","id":"8D5BAFE4-E15C-4707-A047-8EE59C58E70F"},{"defKey":"Integer","defName":"整数输入","id":"9999AF2A-A44E-415C-A2DC-D7C613BD0073"},{"defKey":"Money","defName":"金额输入","id":"2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E"},{"defKey":"Date","defName":"日期输入","id":"E4D94E14-F695-487F-AFC2-4D888009B7DA"},{"defKey":"DataYearMonth","defName":"年月输入","id":"936927E3-DD2D-4096-87FD-074CDE278D59"},{"defKey":"Text","defName":"长文本输入","id":"D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963"},{"defKey":"RichText","defName":"富文本输入","id":"C134EB1F-4CFF-49E0-882F-2C6FB275CB20"}],"headers":[{"refKey":"defKey","hideInGraph":false,"value":"字段代码","freeze":false},{"refKey":"defName","hideInGraph":false,"value":"显示名称","freeze":false},{"refKey":"primaryKey","hideInGraph":false,"value":"主键","freeze":false},{"refKey":"notNull","hideInGraph":true,"value":"不为空","freeze":false},{"refKey":"autoIncrement","hideInGraph":true,"value":"自增","freeze":false},{"refKey":"domain","hideInGraph":true,"value":"数据域","freeze":false},{"refKey":"type","hideInGraph":false,"value":"数据类型","freeze":false},{"refKey":"len","hideInGraph":false,"value":"长度","freeze":false},{"refKey":"scale","hideInGraph":false,"value":"小数位数","freeze":false},{"refKey":"comment","hideInGraph":true,"value":"说明","freeze":false},{"refKey":"refDict","hideInGraph":true,"value":"数据字典","freeze":false},{"refKey":"defaultValue","hideInGraph":true,"value":"默认值","freeze":false},{"refKey":"isStandard","hideInGraph":false,"value":"标准字段","enable":false,"freeze":false},{"refKey":"uiHint","hideInGraph":true,"value":"UI建议","enable":true,"freeze":false},{"refKey":"extProps","hideInGraph":true,"value":"拓展属性","enable":true,"freeze":false},{"refKey":"attr1","value":"属性1","hideInGraph":true,"enable":true,"freeze":false},{"refKey":"attr2","value":"属性2","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr3","value":"属性3","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr4","value":"属性4","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr5","value":"属性5","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr6","value":"属性6","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr7","value":"属性7","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr8","value":"属性8","hideInGraph":true,"enable":false,"freeze":false},{"refKey":"attr9","value":"属性9","hideInGraph":true,"enable":false,"freeze":false}],"modelType":"modalAll","recentColors":["#d148d1","#ce4bce","#831b83","#dd31dd","#da2fda","#e988e9","#000000","#DDE5FF"],"DDLToggleCase":"L"},"entities":[{"id":"193C697E-973B-4E52-8852-0A86C684AD6A","defKey":"admin","defName":"管理员表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"username","defName":"用户名","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E579F9-7C1C-477D-AF90-34B21417D9B9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"password","defName":"密码","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D3064E2C-4B93-40B7-B14C-8FEEB664C3C6","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"nickname","defName":"昵称","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2974CEA6-E9E5-43A1-9A6E-B59465C35796","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"mobile","defName":"手机号","comment":"","domain":"","type":"VARCHAR","len":20,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B7092DD-8945-4CC0-AF71-988EDF88BB7A","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"72EC27CE-39E2-4AE1-8E5A-592D1155D69A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"67FE84DA-B1B4-44DA-91F6-1BD980A56AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"17604E40-EA79-48EB-90DB-8AA54F4A05A7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"B98CE637-9419-4051-95F7-61E0CC1B8FF9","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"41B3C588-6EA3-40F7-A746-265EE30322F0","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C3630D4B-AC46-4275-93E8-94E9A2B7EB76","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_username","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"2116495B-D1E6-45C3-91A5-1D4736E990F4","fieldDefKey":"85E579F9-7C1C-477D-AF90-34B21417D9B9"}],"id":"69C6A4EE-EBD7-4323-9490-733B7A18E73D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"897CE7B5-936E-460A-AE58-874AEC9BFF89","defKey":"admin_menu","defName":"管理员菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E48C0CD9-5EA9-4F58-9BA1-A949B054487F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"admin_id","defName":"管理员ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1C609F89-B7C0-4244-A77E-6EC2A573080F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"404FC9F3-8B46-4E98-B800-8E0146FC2679","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2F919972-AF0A-4C59-8542-F57D3DB1A1D8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_admin_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"CECD0983-1833-4C5A-BAF2-E36F58CE5DA9","fieldDefKey":"1C609F89-B7C0-4244-A77E-6EC2A573080F"}],"id":"127F930D-0BE1-430E-8E55-00E3B9510F7E"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CA47871-19BF-46F1-8AE5-ED1766A1C355","defKey":"authorized","defName":"已授权的调用方表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4C492AD3-2205-4028-8B31-E1A8644A5ADE","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6A76AA85-F887-4EF6-B490-990F9F9E83E4","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_secret","defName":"调用方secret","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5EB60A8A-4DAB-452E-9E90-8D0DADBF4469","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_developer","defName":"调用方对接人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E03F2482-A0BE-48B0-8BB2-6974C5392363","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A645499B-4AD9-47E0-8C67-8A4BFA6A19BD","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9E473B46-56EF-47F6-B689-7914EB4369BC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4E39F134-34D3-4EB7-987F-B7F53E050BAD","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F1FCA0C4-872D-488B-9DFF-087906BEA993","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"1624CC68-0C6F-40FB-A579-CB40B530C032","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"53EC7EF5-64D7-4246-89A0-3067F46D8F02","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"85E6ADAE-DD1C-42BC-918C-537B8E9256D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"unique_business_key","unique":true,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"21AF7032-8965-4DD0-87C8-50AE5423022E","fieldDefKey":"6A76AA85-F887-4EF6-B490-990F9F9E83E4"}],"id":"E845C43A-0CB7-4075-B875-55A93122EF7C"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2DCB09B1-0F66-43F3-A104-F127E9915B4F","defKey":"authorized_api","defName":"已授权接口地址表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8485ECDA-5E56-46F6-B6FB-177A3F191BC2","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"business_key","defName":"调用方key","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"33F4E0CC-BED4-45BA-90C3-D9529363A094","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6F8E6594-E610-4E46-B654-2C06551B24CA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D1FE90C1-4A86-4064-8E8C-F3ED4E74550D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"910CF4A7-A362-4DFF-8275-FFFE70DDE542","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EDB798C0-536A-4BE1-A674-CA16D3D18304","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F46CED15-9094-455C-BE56-2E5CBF1D5AAC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"838E0312-3E72-4BDA-AF36-C235737E42C1","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"2CF25297-0285-44B2-B6E3-07BFB70E424F","defKey":"cron_task","defName":"后台任务表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"EA97BA36-3876-4034-B42B-E04D236370E5","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"任务名称","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"382C1FB2-158A-457E-BE1C-401A194E944E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"spec","defName":"crontab 表达式","comment":"","domain":"","type":"VARCHAR","len":64,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AD56C5F2-C3C0-4733-A65F-6568D894A9B8","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"command","defName":"执行命令","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"protocol","defName":"执行方式 1:shell 2:http","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FB29048B-55D4-47B5-8746-9CB4DB947A9E","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"http_method","defName":"http 请求方式 1:get 2:post","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"timeout","defName":"超时时间(单位:秒)","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"C88F7F03-CFDA-4BBE-8589-727DED064A08","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_times","defName":"重试次数","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"3","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E2571234-25B6-4C15-AF89-EFC8F604CD7D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"retry_interval","defName":"重试间隔(单位:秒)","comment":"","domain":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"60","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6671558D-00ED-40F7-9819-A9FD8DCD81E3","baseType":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_status","defName":"执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FA27FC21-6348-4CCB-B909-B31E6586328F","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_type","defName":"通知类型 1:邮件 2:webhook","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"DB97BE30-A975-44FA-9BC2-E98C72B5FC3B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_receiver_email","defName":"通知者邮箱地址(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"D9CF2FCB-C455-487D-9F7C-9054F5C12027","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"notify_keyword","defName":"通知匹配关键字(多个用,分割)","comment":"","domain":"9092C4E0-1A54-4859-ABBB-5B62DBC27573","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F368298E-82B2-49A0-9020-D81886AB4716","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"remark","defName":"备注","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"56458939-D891-4EC2-A849-3C538A25D1DF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"4B080726-DD2D-409D-84C4-3D35A02BD620","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"AEE9F9A2-25C1-40A4-B24F-612AF099F2ED","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"6E4ADE39-994E-4082-A2AC-48B7C37DB5FB","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"442A0E10-1280-49F2-8356-EFF07998DEBF","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_name","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"1A00D7F5-BE55-42DD-8960-A127677706CA","fieldDefKey":"382C1FB2-158A-457E-BE1C-401A194E944E"}],"id":"0A740F5C-48A6-4A01-B721-4C793189C77D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"BF404C8C-5785-4566-95F7-16D011128ABA","defKey":"menu","defName":"左侧菜单栏表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8939C037-837D-44D8-AC58-9A4C502F81DC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"pid","defName":"父类ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5E2830F1-D5F3-4CE0-8262-293BF6ECF72C","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"name","defName":"菜单名称","comment":"","domain":"16120F75-6AA7-4483-868D-F07F511BB081","type":"","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"link","defName":"链接地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"icon","defName":"图标","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"2AE736BF-02CD-4E36-8B2D-3802075AC154","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"level","defName":"菜单类型 1:一级菜单 2:二级菜单","comment":"","domain":"","type":"TINYINT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"608A8A6A-7567-453E-B53C-47CF95FEFFE4","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"sort","defName":"排序","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"786DBC1E-A86C-4931-9A08-156CAEB7D45A","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_used","defName":"是否启用 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7BA3EAC9-1171-4888-949D-02C557538E8B","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"E3AF3148-D375-4242-99F1-BDFD1939B480","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"A6A11CB1-EE3A-49A5-8540-56E34936BE68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"58C5CA6A-20AD-48CF-88A1-B5DC38977AFA","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]},{"id":"E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3","defKey":"menu_action","defName":"功能权限表","comment":"","properties":{},"fields":[{"defKey":"id","defName":"主键","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":true,"notNull":true,"autoIncrement":true,"defaultValue":"","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5630A333-D76D-49CD-BAF0-A428FBE960C8","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"menu_id","defName":"菜单栏ID","comment":"","domain":"","type":"INT UNSIGNED","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"0","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"51DB153D-15F1-4831-A48C-957D45847C68","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"method","defName":"请求方式","comment":"","domain":"","type":"VARCHAR","len":30,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"api","defName":"请求地址","comment":"","domain":"","type":"VARCHAR","len":100,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"FF3F1EB0-51E9-4924-B862-1E79F909819B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"is_deleted","defName":"是否删除 1:是 -1:否","comment":"","domain":"","type":"BIT","len":1,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"-1","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"62708389-0031-477C-BD24-C256C9404FE9","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_at","defName":"创建时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8EED6806-65C6-4D53-A4E4-9C4979C9CFA7","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"created_user","defName":"创建人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"8F30AAAC-F44C-4B91-B33F-10C3C58DA51E","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_at","defName":"更新时间","comment":"","domain":"","type":"TIMESTAMP","len":"","scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"current_timestamp()","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"F69801C9-9A6C-47C0-8AF1-DE505BAB90D1","baseType":"","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"},{"defKey":"updated_user","defName":"更新人","comment":"","domain":"","type":"VARCHAR","len":60,"scale":"","primaryKey":false,"notNull":true,"autoIncrement":false,"defaultValue":"''","hideInGraph":false,"refDict":"","attr1":"","attr2":"","attr3":"","attr4":"","attr5":"","attr6":"","attr7":"","attr8":"","attr9":"","id":"565868A5-EA4A-43F3-A878-AF18B0A8B54B","baseType":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","extProps":{},"uiHint":"642D2E0A-8846-4549-BE56-8C0473F26EDE"}],"indexes":[{"defKey":"idx_menu_id","unique":false,"defName":null,"comment":"","fields":[{"ascOrDesc":"A","id":"35219CFE-4C14-46F7-9D39-A656220F231A","fieldDefKey":"51DB153D-15F1-4831-A48C-957D45847C68"}],"id":"F0432F19-362D-4167-87A1-F5D6DBC30B1D"}],"sysProps":{"nameTemplate":"{defKey}[{defName}]"},"headers":[{"freeze":false,"refKey":"hideInGraph","hideInGraph":true},{"freeze":true,"refKey":"defKey","hideInGraph":false},{"freeze":true,"refKey":"defName","hideInGraph":false},{"freeze":false,"refKey":"primaryKey","hideInGraph":false},{"freeze":false,"refKey":"notNull","hideInGraph":true},{"freeze":false,"refKey":"autoIncrement","hideInGraph":true},{"freeze":false,"refKey":"domain","hideInGraph":true},{"freeze":false,"refKey":"type","hideInGraph":false},{"freeze":false,"refKey":"len","hideInGraph":false},{"freeze":false,"refKey":"scale","hideInGraph":false},{"freeze":false,"refKey":"comment","hideInGraph":true},{"freeze":false,"refKey":"refDict","hideInGraph":true},{"freeze":false,"refKey":"defaultValue","hideInGraph":true},{"freeze":false,"refKey":"isStandard","hideInGraph":false},{"freeze":false,"refKey":"uiHint","hideInGraph":true},{"freeze":false,"refKey":"extProps","hideInGraph":true}],"correlations":[]}],"views":[],"dicts":[],"viewGroups":[],"dataTypeMapping":{"referURL":"","mappings":[{"defKey":"string","id":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","defName":"字串","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"VARCHAR","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"VARCHAR2","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARCHAR","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"VARCHAR","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"VARCHAR","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"VARCHAR2","592C7013-143D-4E7B-AF64-0D7BF1E28230":"VARCHAR","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"VARCHAR","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"VARCHAR","483F9346-C99E-4014-A1D2-A554606BD8A3":"VARCHAR","ABF5836C-0B7C-4007-A41C-F869325E5842":"VARCHAR"},{"defKey":"double","id":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","defName":"小数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DECIMAL","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DECIMAL","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DECIMAL","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"NUMERIC","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DECIMAL","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DECIMAL","592C7013-143D-4E7B-AF64-0D7BF1E28230":"NUMERIC","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"NUMERIC","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DOUBLE","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"REAL","797A1496-D649-4261-89B4-544132EC3F36":"Double","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Double","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Double","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"decimal","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"double","B91D99E0-9B7C-416C-8737-B760957DAF09":"*float64","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"f64","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DECIMAL","483F9346-C99E-4014-A1D2-A554606BD8A3":"DECIMAL","ABF5836C-0B7C-4007-A41C-F869325E5842":"NUMERIC"},{"defKey":"int","id":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","defName":"整数","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"INT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"INT","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"INT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"INTEGER","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"INT","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"INTEGER","592C7013-143D-4E7B-AF64-0D7BF1E28230":"INTEGER","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"INT4","11D1FB71-A587-4217-89BA-611B8A1F83E0":"INT","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"INTEGER","797A1496-D649-4261-89B4-544132EC3F36":"Integer","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Integer","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Integer","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"float","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"int","B91D99E0-9B7C-416C-8737-B760957DAF09":"*int","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"i32","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"INTEGER","483F9346-C99E-4014-A1D2-A554606BD8A3":"INT","ABF5836C-0B7C-4007-A41C-F869325E5842":"INTEGER"},{"defKey":"date","id":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","defName":"日期","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"DATETIME","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"DATE","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"DATETIME","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TIMESTAMP","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"DATE","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"DATE","592C7013-143D-4E7B-AF64-0D7BF1E28230":"DATE","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"DATE","11D1FB71-A587-4217-89BA-611B8A1F83E0":"DATETIME","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NUMERIC","797A1496-D649-4261-89B4-544132EC3F36":"Date","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"Date","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"Date","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"DateTime","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"timestamp","B91D99E0-9B7C-416C-8737-B760957DAF09":"*time.Time","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"DateTime","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"DATE","483F9346-C99E-4014-A1D2-A554606BD8A3":"DATETIME","ABF5836C-0B7C-4007-A41C-F869325E5842":"DATE"},{"defKey":"bytes","id":"D516E75B-90F5-4741-B9B3-A186A263F04C","defName":"二进制","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"BLOB","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"BLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"VARBINARY","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"BYTEA","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"BLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"BLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"BYTEA","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"BYTEA","11D1FB71-A587-4217-89BA-611B8A1F83E0":"BINARY","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"NONE","797A1496-D649-4261-89B4-544132EC3F36":"byte[]","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"byte[]","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"byte[]","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"binary","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"binary","B91D99E0-9B7C-416C-8737-B760957DAF09":"[]byte","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"BYTE","ABF5836C-0B7C-4007-A41C-F869325E5842":"BYTEA"},{"defKey":"largeText","id":"B17BDED3-085F-40E1-9019-3B79CF2BF075","defName":"大文本","29D1CE08-4C35-4D2D-AAA9-23D93305B52E":"TEXT","A4E23CB7-BB01-4BD1-9F71-F73F3E15A542":"CLOB","BFC87171-C74F-494A-B7C2-76B9C55FACC9":"TEXT","DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022":"TEXT","89504F5D-94BF-4C9E-8B2E-44F37305FED5":"CLOB","0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307":"CLOB","592C7013-143D-4E7B-AF64-0D7BF1E28230":"TEXT","77BD85E5-9D0D-4096-8427-CBA306FC9C6A":"TEXT","11D1FB71-A587-4217-89BA-611B8A1F83E0":"STRING","B363BE0B-F852-49B8-9B2E-F6D2174DEAC1":"TEXT","797A1496-D649-4261-89B4-544132EC3F36":"String","895CFD1D-4273-4D32-A2C4-CAC70200AB5B":"String","A2EE7B4A-CE62-4290-B00C-B26C1BF18073":"String","F3AC2415-E86B-40C6-9FEB-F4B7937D2C30":"string","81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2":"string","B91D99E0-9B7C-416C-8737-B760957DAF09":"string","BDF457FD-9F98-4AC3-A705-7587B00A3BAB":"String","56F4B55B-F0B8-4049-9E6B-50B95C1D793A":"TEXT","483F9346-C99E-4014-A1D2-A554606BD8A3":"STRING","ABF5836C-0B7C-4007-A41C-F869325E5842":"TEXT"}]},"domains":[{"defKey":"DefaultString","defName":"默认字串","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":255,"scale":"","uiHint":"","id":"9092C4E0-1A54-4859-ABBB-5B62DBC27573"},{"defKey":"IdOrKey","defName":"主键标识","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":32,"scale":"","uiHint":"","id":"16120F75-6AA7-4483-868D-F07F511BB081"},{"defKey":"Name","defName":"名称","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":90,"scale":"","uiHint":"","id":"54611CCC-CA4B-42E1-9F32-4944C85B85A6"},{"defKey":"Int","defName":"整数","applyFor":"1D764C4A-6F9F-421E-B11A-6F3E23B51811","len":"","scale":"","uiHint":"","id":"6BC8F04B-6CFA-4995-98D3-318F5CDD774E"},{"defKey":"Double","defName":"小数","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"FF4459C5-6B45-4DBF-8FC0-E06239BC05B4"},{"defKey":"Money","defName":"金额","applyFor":"1A0BDC09-0792-4174-9E8E-80BE8DF44B8E","len":24,"scale":6,"uiHint":"","id":"C3B1681B-99F9-4818-9E80-DE1652A51D85"},{"defKey":"DateTime","defName":"日期时间","applyFor":"89D69E81-EA34-42EE-9FA2-93B8BD27E098","len":"","scale":"","uiHint":"","id":"7CFFA0D3-6A93-4DDC-BC10-DF21211064DC"},{"defKey":"YesNo","defName":"是否","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"1","scale":"","uiHint":"","id":"6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF"},{"defKey":"Dict","defName":"数据字典","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"32","scale":"","uiHint":"","id":"73FD2BAD-2358-4336-B96D-45DC897BD792"},{"defKey":"DescText","defName":"描述文本","applyFor":"FC9790A7-36B8-4A48-8F9A-BC1042BCFE64","len":"900","scale":"","uiHint":"","id":"3E948CEC-3070-472C-AF92-F3CA11EC9D15"}],"diagrams":[],"standardFields":[],"dbConn":[{"defKey":"DE04FF37-5C6C-427C-80DD-5E459EF9117A","defName":"MYSQL","type":"29D1CE08-4C35-4D2D-AAA9-23D93305B52E","properties":{"driver_class_name":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://127.0.0.1:3306/gin-template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC","password":"root","username":"root"}}],"logicEntities":[],"namingRules":[{"id":"63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B","defName":"属性代码不能超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"668CBEE6-E0B7-4ACE-B72E-63942963B191","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length <= 32","enable":true},{"id":"11BD987F-82E7-418E-A752-FDD84F1582A2","defName":"长度不能超过32位","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length <= 32","enable":true},{"id":"29D0A8D9-ABE2-451F-8A39-52FAB02E62B9","defName":"索引名-长度不超过32个字符","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return (data.index.defName||\"\").length <= 32","enable":true},{"id":"B425A96F-6A31-4DBD-8743-A00DE28FB50F","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;","enable":true},{"id":"EF9E44D0-691A-4352-A079-CFF300107531","defName":"索引名-全小写","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"index","programCode":"return !/[A-Z]+/.test(data.index.defKey);","enable":true},{"id":"972EB2FB-4428-429D-8B0A-F082A8C7A94D","defName":"名称不能为空","intro":"","controlIntensity":"F","applyObjectType":"L","applyFieldType":"entity","programCode":"return data.logicEntity.defName","enable":true},{"id":"EEAEB9C5-BB6C-4E92-949B-D27928690D85","defName":"名称长度不超过32","intro":"","controlIntensity":"S","applyObjectType":"L","applyFieldType":"entity","programCode":"return (data.logicEntity.defName||\"\").length <=32","enable":true},{"id":"24E3F7E5-730D-4378-B72D-195D6B940352","defName":"不能使用保留字","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;","enable":true},{"id":"039BF435-DC77-4DA4-81C7-7F8076BF22BB","defName":"表名-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/[A-Z]+/.test(data.entity.defKey);","enable":true},{"id":"CBEB0E30-19C6-427D-A8BF-61FF10E27A0B","defName":"表名-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return !/\\s+/.test(data.entity.defKey);","enable":true},{"id":"1168C7C2-8E8E-4FB7-B639-B3DE839C395A","defName":"表名-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"entity","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);","enable":true},{"id":"D373637C-D3A6-4621-B656-6841A5444A76","defName":"表必须有comment注释","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0","enable":true},{"id":"2BAB122B-8811-40BB-89F3-CDC24B5862D3","defName":"主键命名为 id,类型为 int 或 bigint,且为自增","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"entity","programCode":"let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;","enable":true},{"id":"BEC54F19-52D5-4882-BCE1-4439785F8001","defName":"不能使用保留字","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;","enable":true},{"id":"082E186D-7B02-4F1C-9ECE-378AB98C4845","defName":"字段-全小写","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"return !/[A-Z]+/.test(data.field.defKey);","enable":true},{"id":"F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A","defName":"字段-不允许空格","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return !/\\s+/.test(data.field.defKey);","enable":true},{"id":"21AFEAC8-96D7-467F-8320-A33887FC0C5D","defName":"字段-英文及下划线","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);","enable":true},{"id":"2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6","defName":"字段-必需有comment注释","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0","enable":true},{"id":"5E181E43-0D72-498F-8178-4C1CDBC89A16","defName":"字段-不能与表名相同","intro":"","controlIntensity":"F","applyObjectType":"P","applyFieldType":"field","programCode":"return data.field.defKey != data.entity.defKey;","enable":true},{"id":"DE8F8598-5D53-4727-A837-7816C2AF99D9","defName":"外键-字段必须具有表名及其主键","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;","enable":true},{"id":"2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1","defName":"索引名-英文及下划线","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);","enable":true},{"id":"023450B3-AAE2-4DC1-AE63-2196DD82823D","defName":"索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"index","programCode":"if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}","enable":true},{"id":"1C563E17-262B-4EB6-87F0-203CAC667CF0","defName":"不允许存在blob、text等大字段","intro":"","controlIntensity":"S","applyObjectType":"P","applyFieldType":"field","programCode":"if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;","enable":true}]}} \ No newline at end of file diff --git a/docs/pdma/gin-template.pdma.json b/docs/pdma/gin-template.pdma.json new file mode 100644 index 0000000..ba728bd --- /dev/null +++ b/docs/pdma/gin-template.pdma.json @@ -0,0 +1,4324 @@ +{ + "name": "gin-template", + "describe": "gin-template 是基于 Gin 进行模块化设计的 API 框架,封装了大部分常用的功能,致力于进行快速的业务研发。", + "avatar": "data:image/png;base64,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", + "version": "4.9.2", + "createdTime": "2024-7-11 10:10:48", + "updatedTime": "2024-7-11 11:08:19", + "dbConns": [], + "profile": { + "default": { + "db": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "dbConn": "DE04FF37-5C6C-427C-80DD-5E459EF9117A", + "entityInitFields": [ + { + "defKey": "TENANT_ID", + "defName": "租户号", + "comment": "", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "refDict": "", + "uiHint": "", + "id": "ADB3AD14-6603-43E2-8261-114E32442B5B", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64" + }, + { + "defKey": "REVISION", + "defName": "乐观锁", + "comment": "", + "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "92BF430E-01FA-4AEF-944F-25A142632654", + "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811" + }, + { + "defKey": "CREATED_BY", + "defName": "创建人", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "C8BE2C7A-8251-4ADD-BB4F-411C5754DA62", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64" + }, + { + "defKey": "CREATED_TIME", + "defName": "创建时间", + "comment": "", + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "4E471FD6-3E73-4A90-B660-51598A482409", + "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098" + }, + { + "defKey": "UPDATED_BY", + "defName": "更新人", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": 32, + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "0DC24AA9-4CD0-45D8-95CF-FA546BE343AB", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64" + }, + { + "defKey": "UPDATED_TIME", + "defName": "更新时间", + "comment": "", + "domain": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": false, + "autoIncrement": false, + "defaultValue": "", + "hideInGraph": true, + "refDict": "", + "uiHint": "", + "id": "09F64AC4-4DEE-428F-AF64-4C103884E1AC", + "baseType": "89D69E81-EA34-42EE-9FA2-93B8BD27E098" + } + ], + "entityInitProperties": { + "partitioned by": "(date string)", + "row format delimited": "", + "fields terminated by ','": "", + "collection items terminated by '-'": "", + "map keys terminated by ':'": "", + "store as textfile;": "" + } + }, + "javaHome": "", + "sql": { + "delimiter": "" + }, + "dataTypeSupports": [ + { + "defKey": "MYSQL", + "id": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E" + }, + { + "defKey": "ORACLE", + "id": "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542" + }, + { + "defKey": "SQLServer", + "id": "BFC87171-C74F-494A-B7C2-76B9C55FACC9" + }, + { + "defKey": "PostgreSQL", + "id": "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022" + }, + { + "defKey": "DB2", + "id": "89504F5D-94BF-4C9E-8B2E-44F37305FED5" + }, + { + "defKey": "DM", + "id": "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307" + }, + { + "defKey": "GaussDB", + "id": "592C7013-143D-4E7B-AF64-0D7BF1E28230" + }, + { + "defKey": "Kingbase", + "id": "77BD85E5-9D0D-4096-8427-CBA306FC9C6A" + }, + { + "defKey": "GBase", + "id": "56F4B55B-F0B8-4049-9E6B-50B95C1D793A" + }, + { + "defKey": "MaxCompute", + "id": "11D1FB71-A587-4217-89BA-611B8A1F83E0" + }, + { + "defKey": "SQLite", + "id": "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1" + }, + { + "defKey": "Hive", + "id": "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2" + }, + { + "defKey": "JAVA", + "id": "797A1496-D649-4261-89B4-544132EC3F36" + }, + { + "defKey": "JavaMybatis", + "id": "895CFD1D-4273-4D32-A2C4-CAC70200AB5B" + }, + { + "defKey": "JavaMybatisPlus", + "id": "A2EE7B4A-CE62-4290-B00C-B26C1BF18073" + }, + { + "defKey": "C#", + "id": "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30" + }, + { + "defKey": "Golang", + "id": "B91D99E0-9B7C-416C-8737-B760957DAF09" + }, + { + "defKey": "Rust", + "id": "BDF457FD-9F98-4AC3-A705-7587B00A3BAB" + }, + { + "defKey": "Doris", + "id": "483F9346-C99E-4014-A1D2-A554606BD8A3" + }, + { + "defKey": "HighGo", + "id": "ABF5836C-0B7C-4007-A41C-F869325E5842" + } + ], + "codeTemplates": [ + { + "type": "appCode", + "applyFor": "797A1496-D649-4261-89B4-544132EC3F36", + " JpaBean": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport javax.persistence.*;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@Table(name=\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n {{? field.primaryKey }}\n @Id\n @GeneratedValue\n {{?}}\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "type": "appCode", + "applyFor": "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30", + "Default": "using System;\nusing System.Collections.Generic;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n}}\n/*\n * @author : http://www.chiner.com.cn\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace PDManer.Application\n{\n public partial class {{=it.func.camel(it.entity.defKey,true) }}\n {\n \n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n public {{=field.type}} {{=it.func.camel(field.defKey,true)}} { get; set; }\n $blankline\n {{~}}\n \n }\n}", + "SqlSugar": "using System;\nusing System.Collections.Generic;\nusing SqlSugar;\n\n$blankline\n{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n var sqlSugartable='[SugarTable(\"{{=it.entity.defKey}}\", TableDescription = \"{{=it.func.join(it.entity.defName,it.entity.comment,';')}}\")]';\n}}\n/*\n * @author : xkdong@163.com\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n * @desc : {{=it.func.join(it.entity.defName,it.entity.comment,'-')}}\n */\nnamespace Model.DBModel\n{\n /// \n /// {{=it.func.join(it.entity.defName,it.entity.comment,';')}}\n /// \n {{=sqlSugartable}}\n public class {{=it.entity.defKey}}\n {\n {{~it.entity.fields:field:index}}\n /// \n /// {{=it.func.join(field.defName,field.comment,';')}}\n /// \n {{? field.primaryKey }}\n [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]\n {{?}}\n public {{=field.type}} {{=it.func.camel(field.defKey,true)}}{ get; set; }\n $blankline\n {{~}}\n }\n}" + }, + { + "applyFor": "895CFD1D-4273-4D32-A2C4-CAC70200AB5B", + "type": "appCode", + "Controller": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n return ResponseEntity.ok({{=serviceVarName}}.paginQuery({{=beanVarName}}, pageRequest));\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}", + "Service": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "ServiceImpl": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.data.domain.Page;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.queryById({{=pkVarName}});\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n long total = {{=mapperName}}.count({{=beanVarName}});\n return new PageImpl<>({{=mapperName}}.queryAllByLimit({{=beanVarName}}, pageRequest), pageRequest, total);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.update({{=beanVarName}});\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}", + "Mapper": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\nimport java.util.List;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport org.springframework.data.domain.Pageable;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper{\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n \n /** \n * 分页查询指定行数据\n *\n * @param {{=beanVarName}} 查询条件\n * @param pageable 分页对象\n * @return 对象列表\n */\n List<{{=beanClass}}> queryAllByLimit({{=beanClass}} {{=beanVarName}}, @Param(\"pageable\") Pageable pageable);\n\n /** \n * 统计总行数\n *\n * @param {{=beanVarName}} 查询条件\n * @return 总行数\n */\n long count({{=beanClass}} {{=beanVarName}});\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int insert({{=beanClass}} {{=beanVarName}});\n\n /** \n * 批量新增数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 批量新增或按主键更新数据\n *\n * @param entities List<{{=beanClass}}> 实例对象列表\n * @return 影响行数\n */\n int insertOrUpdateBatch(@Param(\"entities\") List<{{=beanClass}}> entities);\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 影响行数\n */\n int update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 影响行数\n */\n int deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "Mapper.xml": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n\n \n {{~it.entity.fields:field:index}}\n \n {{~}}\n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values ({{=it.entity.fields.map(function(e,i){return '#{'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n \n $blankline\n \n \n insert into {{=it.entity.defKey}}({{=it.entity.fields.map(function(e,i){return e.defKey}).join(',')}})\n values\n \n ({{=it.entity.fields.map(function(e,i){return '#{entity.'+it.func.camel(e.defKey,false)+'}'}).join(',')}})\n \n on duplicate key update\n {{=it.entity.fields.map(function(e,i){return e.defKey + '=values('+e.defKey+')'}).join(',\\n\\t\\t')}}\n \n $blankline\n \n \n update {{=it.entity.defKey}}\n \n {{~it.entity.fields:field:index}}\n \n {{=field.defKey}} = #{{{=it.func.camel(field.defKey,false)}}},\n \n {{~}}\n \n where {{=pkField}} = #{{{=pkVarName}}}\n \n $blankline\n \n \n delete from {{=it.entity.defKey}} where {{=pkField}} = #{{{=pkVarName}}}\n \n\n\n", + "Entity": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "applyFor": "A2EE7B4A-CE62-4290-B00C-B26C1BF18073", + "type": "appCode", + "Controller": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.controller;\n$blankline\nimport java.util.List;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiOperation;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.data.domain.PageImpl;\nimport org.springframework.data.domain.PageRequest;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.*;\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.service.{{=serviceClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表控制层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Api(tags = \"{{=it.entity.defName}}对象功能接口\")\n@RestController\n@RequestMapping(\"/{{=it.func.camel(it.entity.defKey,false)}}\")\npublic class {{=beanClass}}Controller{\n @Autowired\n private {{=serviceClass}} {{=serviceVarName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n @ApiOperation(\"通过ID查询单条数据\")\n @GetMapping(\"{{{=it.func.camel(pkVarName,false)}}}\")\n public ResponseEntity<{{=beanClass}}> queryById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.queryById({{=pkVarName}}));\n }\n $blankline\n /** \n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param pageRequest 分页对象\n * @return 查询结果\n */\n @ApiOperation(\"分页查询\")\n @GetMapping\n public ResponseEntity> paginQuery({{=beanClass}} {{=beanVarName}}, PageRequest pageRequest){\n //1.分页参数\n long current = pageRequest.getPageNumber();\n long size = pageRequest.getPageSize();\n\n //2.分页查询\n /*把Mybatis的分页对象做封装转换,MP的分页对象上有一些SQL敏感信息,还是通过spring的分页模型来封装数据吧*/\n com.baomidou.mybatisplus.extension.plugins.pagination.Page<{{=beanClass}}> pageResult = {{=serviceVarName}}.paginQuery({{=beanVarName}}, current,size);\n\n //3. 分页结果组装\n List<{{=beanClass}}> dataList = pageResult.getRecords();\n long total = pageResult.getTotal();\n PageImpl<{{=beanClass}}> retPage = new PageImpl<{{=beanClass}}>(dataList,pageRequest,total);\n return ResponseEntity.ok(retPage);\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"新增数据\")\n @PostMapping\n public ResponseEntity<{{=beanClass}}> add({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.insert({{=beanVarName}}));\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n @ApiOperation(\"更新数据\")\n @PutMapping\n public ResponseEntity<{{=beanClass}}> edit({{=beanClass}} {{=beanVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.update({{=beanVarName}}));\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n @ApiOperation(\"通过主键删除数据\")\n @DeleteMapping\n public ResponseEntity deleteById({{=pkDataType}} {{=pkVarName}}){\n return ResponseEntity.ok({{=serviceVarName}}.deleteById({{=pkVarName}}));\n }\n}", + "Service": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.service;\n$blankline\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务接口\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\npublic interface {{=serviceClass}}{\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}});\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size);\n\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} insert({{=beanClass}} {{=beanVarName}});\n\n \n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n {{=beanClass}} update({{=beanClass}} {{=beanVarName}});\n\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n boolean deleteById({{=pkDataType}} {{=pkVarName}});\n}", + "ServiceImpl": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkVarNameU = \"UndefinedId\";\n var pkFieldKey = \"UNDEFINED\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkFieldKey = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkVarNameU = it.func.camel(field.defKey,true);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n var mapperName = beanVarName+'Mapper';\n \n}}package {{=pkgName}}.service.impl;\n$blankline\nimport cn.hutool.core.util.StrUtil;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimport com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;\n\nimport {{=pkgName}}.entity.{{=beanClass}};\nimport {{=pkgName}}.mapper.{{=beanClass}}Mapper;\nimport {{=pkgName}}.service.{{=serviceClass}};\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表服务实现类\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Service\npublic class {{=serviceClass}}Impl implements {{=serviceClass}}{\n @Autowired\n private {{=beanClass}}Mapper {{=mapperName}};\n $blankline\n /** \n * 通过ID查询单条数据 \n *\n * @param {{=pkVarName}} 主键\n * @return 实例对象\n */\n public {{=beanClass}} queryById({{=pkDataType}} {{=pkVarName}}){\n return {{=mapperName}}.selectById({{=pkVarName}});\n }\n $blankline\n /**\n * 分页查询\n *\n * @param {{=beanVarName}} 筛选条件\n * @param current 当前页码\n * @param size 每页大小\n * @return\n */\n public Page<{{=beanClass}}> paginQuery({{=beanClass}} {{=beanVarName}}, long current, long size){\n //1. 构建动态查询条件\n LambdaQueryWrapper<{{=beanClass}}> queryWrapper = new LambdaQueryWrapper<>();\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n queryWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n\n //2. 执行分页查询\n Page<{{=beanClass}}> pagin = new Page<>(current , size , true);\n IPage<{{=beanClass}}> selectResult = {{=mapperName}}.selectByPage(pagin , queryWrapper);\n pagin.setPages(selectResult.getPages());\n pagin.setTotal(selectResult.getTotal());\n pagin.setRecords(selectResult.getRecords());\n\n //3. 返回结果\n return pagin;\n }\n $blankline\n /** \n * 新增数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} insert({{=beanClass}} {{=beanVarName}}){\n {{=mapperName}}.insert({{=beanVarName}});\n return {{=beanVarName}};\n }\n $blankline\n /** \n * 更新数据\n *\n * @param {{=beanVarName}} 实例对象\n * @return 实例对象\n */\n public {{=beanClass}} update({{=beanClass}} {{=beanVarName}}){\n //1. 根据条件动态更新\n LambdaUpdateChainWrapper<{{=beanClass}}> chainWrapper = new LambdaUpdateChainWrapper<{{=beanClass}}>({{=mapperName}});\n {{~it.entity.fields.filter(function(e){return e[\"type\"]===\"String\"&&e.defKey !== pkFieldKey}):field:index}}\n if(StrUtil.isNotBlank({{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}())){\n chainWrapper.eq({{=beanClass}}::get{{=it.func.camel(field.defKey,true)}}, {{=beanVarName}}.get{{=it.func.camel(field.defKey,true)}}());\n }\n {{~}}\n //2. 设置主键,并更新\n chainWrapper.set({{=beanClass}}::get{{=pkVarNameU}}, {{=beanVarName}}.get{{=pkVarNameU}}());\n boolean ret = chainWrapper.update();\n //3. 更新成功了,查询最最对象返回\n if(ret){\n return queryById({{=beanVarName}}.get{{=pkVarNameU}}());\n }else{\n return {{=beanVarName}};\n }\n }\n $blankline\n /** \n * 通过主键删除数据\n *\n * @param {{=pkVarName}} 主键\n * @return 是否成功\n */\n public boolean deleteById({{=pkDataType}} {{=pkVarName}}){\n int total = {{=mapperName}}.deleteById({{=pkVarName}});\n return total > 0;\n }\n}", + "Mapper": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.mapper;\n$blankline\n\nimport com.baomidou.mybatisplus.core.conditions.Wrapper;\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.core.metadata.IPage;\nimport com.baomidou.mybatisplus.core.toolkit.Constants;\nimport org.apache.ibatis.annotations.Mapper;\nimport org.apache.ibatis.annotations.Param;\nimport {{=pkgName}}.entity.{{=beanClass}};\n$blankline\n\n /**\n * {{=it.entity.defName}};({{=it.entity.defKey}})表数据库访问层\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@Mapper\npublic interface {{=beanClass}}Mapper extends BaseMapper<{{=beanClass}}>{\n /** \n * 分页查询指定行数据\n *\n * @param page 分页参数\n * @param wrapper 动态查询条件\n * @return 分页对象列表\n */\n IPage<{{=beanClass}}> selectByPage(IPage<{{=beanClass}}> page , @Param(Constants.WRAPPER) Wrapper<{{=beanClass}}> wrapper);\n}", + "Mapper.xml": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n var pkField = \"UNDEFINED_ID\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkField = field.defKey;\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}\n\n$blankline\n\n\n \n\n\n", + "Entity": "{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n var serviceClass = beanClass+'Service';\n var serviceVarName= beanVarName+'Service';\n \n}}package {{=pkgName}}.entity;\n$blankline\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport java.io.Serializable;\nimport java.util.Date;\n$blankline\n\n /**\n * {{=it.entity.defName}};{{=it.entity.comment}}\n * @author : http://www.chiner.pro\n * @date : {{=fullYear}}-{{=month}}-{{=days}}\n */\n@ApiModel(value = \"{{=it.entity.defName}}\",description = \"{{=it.entity.comment}}\")\n@TableName(\"{{=it.entity.defKey}}\")\npublic class {{=beanClass}} implements Serializable,Cloneable{\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n @ApiModelProperty(name = \"{{=field.defName}}\",notes = \"{{=field.comment}}\")\n {{? field.primaryKey }}\n @TableId\n {{?}}\n private {{=field.type}} {{=it.func.camel(field.defKey,false)}} ;\n{{~}}\n$blankline\n\n{{~it.entity.fields:field:index}}\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public {{=field.type}} get{{=it.func.camel(field.defKey,true)}}(){\n return this.{{=it.func.camel(field.defKey,false)}};\n }\n /** {{=it.func.join(field.defName,field.comment,';')}} */\n public void set{{=it.func.camel(field.defKey,true)}}({{=field.type}} {{= it.func.camel(field.defKey,false) }}){\n this.{{=it.func.camel(field.defKey,false)}}={{=it.func.camel(field.defKey,false)}};\n }\n{{~}}\n}" + }, + { + "applyFor": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "type": "dbDDL", + "createTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{?field.autoIncrement}}INT AUTO_INCREMENT{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{?}} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542", + "type": "dbDDL", + "createTable": "CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}NUMBER(11) generated by default as IDENTITY, {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "BFC87171-C74F-494A-B7C2-76B9C55FACC9", + "type": "dbDDL", + "createTable": "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{{=it.entity.defKey}}]') AND type in (N'U')) DROP TABLE [dbo].[{{=it.entity.defKey}}];\n\nCREATE TABLE [dbo].[{{=it.entity.defKey}}](\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}INT IDENTITY(1,1) {{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`EXEC sp_rename '${before.defKey}','${after.defKey}'`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `IF ((SELECT COUNT(*) FROM ::fn_listextendedproperty('MS_Description','SCHEMA', 'dbo','TABLE', '${after.defKey}', NULL, NULL)) > 0)\n \\n\\tEXEC sp_updateextendedproperty 'MS_Description', '${commentText}','SCHEMA', 'dbo','TABLE', '${after.defKey}'\n \\nELSE\n \\n\\tEXEC sp_addextendedproperty 'MS_Description', '${commentText}', 'SCHEMA', 'dbo','TABLE', '${after.defKey}'\n `;\n ret.push(myText);\n /*ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');*/\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD [${field.defKey}] ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `EXEC sp_addextendedproperty 'MS_Description', N'${commentText}','SCHEMA', N'dbo','TABLE', N'${entity.data.baseInfo.defKey}','COLUMN', N'${field.defKey}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN [${field.defKey}]`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE [dbo].[${entity.data.baseInfo.defKey}]`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' ALTER COLUMN ['+after.defKey+']');\n }else{\n let renameText = `EXEC sp_rename '[dbo].[${entity.data.baseInfo.defKey}].[${before.defKey}]','${after.defKey}','COLUMN';`;\n ret.push(renameText);\n continue;\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022", + "type": "dbDDL", + "createTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "type": "dbDDL", + "applyFor": "89504F5D-94BF-4C9E-8B2E-44F37305FED5", + "createTable": "CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{?field.autoIncrement}}DECIMAL(17) GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}{{?}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? ' AUTO_INCREMENT' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} {{= field.autoIncrement ? 'AUTOINCREMENT' : '' }} {{= field.defaultValue ? it.func.join('DEFAULT',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }} --{{=it.func.join(field.defName,field.comment,';')}}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i0只有为decimal类型或double类型时才保留长度和小数的位数*/\n{{~it.entity.fields:field:index}}\n {{=it.func.lowerCase(field.defKey)}} {{=it.func.lowerCase(field.type)=='varchar'||it.func.lowerCase(field.type)=='char'||it.func.lowerCase(field.type)=='text'||it.func.lowerCase(field.type)=='date'||it.func.lowerCase(field.type)=='datetime' ? 'string':it.func.lowerCase(field.type)=='tinyint unsigned'||it.func.lowerCase(field.type)=='bit'||it.func.lowerCase(field.type)=='integer'||it.func.lowerCase(field.type)=='tinyint'||it.func.lowerCase(field.type)=='smallint'||it.func.lowerCase(field.type)=='mediumint' ? 'int':it.func.lowerCase(field.type)=='int unsigned' ? 'bigint':it.func.lowerCase(field.type)}}{{?field.len>0&&(it.func.lowerCase(field.type)=='decimal'||it.func.lowerCase(field.type)=='double')}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{=')'}}{{?}}{{?}} comment '{{=it.func.join(field.defName,field.comment,'')}}' {{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n{{?}}\n)\n{{\n let partitionedBy = it.entity.properties['partitioned by'];\n partitionedBy = partitionedBy?partitionedBy:'请在扩展属性中配置[partitioned by]属性';\n}}\ncomment '{{=it.func.join(it.entity.defName,';') }}'\n/**是否分区表,分区字段名和字段注释自定义*/\n[partitioned by {{=partitionedBy}}]\n/**文件存储格式自定义*/\n[stored as orc]\n/**hdfs上的地址自定义*/\n[location xxx]\n;", + "createView": "", + "deleteTable": "", + "createIndex": "", + "deleteIndex": "", + "message": "", + "update": "" + }, + { + "applyFor": "B91D99E0-9B7C-416C-8737-B760957DAF09", + "type": "appCode", + "content": "{{\n var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1<10?\"0\"+today.getMonth():today.getMonth();\n var days=today.getDate()<10?\"0\"+today.getDate():today.getDate();\n var hours = today.getHours()<10?\"0\"+today.getHours():today.getHours(); \n\tvar minutes = today.getMinutes()<10?\"0\"+today.getMinutes():today.getMinutes(); \n\tvar seconds = today.getSeconds()<10?\"0\"+today.getSeconds():today.getSeconds(); \n}}\n// Package models {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\n// author : http://www.liyang.love\n// date : {{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n// desc : {{=it.func.join(it.entity.defName,it.entity.comment,',')}}\npackage models\n\n$blankline\n\n// {{=it.func.camel(it.entity.defKey,true) }} {{=it.func.join(it.entity.defName,it.entity.comment,',')}}。\n// 说明:{{=it.entity.comment}}\n// 表名:{{=it.entity.defKey}}\n// group: {{=it.func.camel(it.entity.defKey,true) }}\n// obsolete:\n// appliesto:go 1.8+;\n// namespace:hongmouer.his.models.{{=it.func.camel(it.entity.defKey,true) }}\n// assembly: hongmouer.his.models.go\n// class:HongMouer.HIS.Models.{{=it.func.camel(it.entity.defKey,true) }}\n// version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\ntype {{=it.func.camel(it.entity.defKey,true) }} struct {\n {{~it.entity.fields:field:index}}\n {{=formatGoLang(it.func.camel(field.defKey,true),null,field,it.entity.fields,null,1)}} {{=formatGoLang(field.type,\"type\",field,it.entity.fields,10,3)}} `gorm:\"column:{{=field.primaryKey?\"primaryKey;\":\"\"}}{{=field.defKey}}\" json:\"{{=it.func.camel(field.defKey,true)}}\"` {{=formatGoLang(\"gorm:column:\"+field.defKey+\" json:\"+it.func.camel(field.defKey,true),null,field,it.entity.fields,null,2)}} //type:{{=formatGoLang(field.type,\"type\",field,it.entity.fields,null,3)}} comment:{{=formatGoLang(it.func.join(field.defName,field.comment,';'),\"defName\",field,it.entity.fields,null,4)}} version:{{=fullYear}}-{{=month}}-{{=days}} {{=hours}}:{{=minutes}}\n {{~}}\n}\n\n\n$blankline\n// TableName 表名:{{=it.entity.defKey}},{{=it.entity.defName}}。\n// 说明:{{=it.entity.comment}}\nfunc (ZentaoUserInfo) TableName() string {\n\treturn \"{{=it.entity.defKey}}\"\n}\n\n{{\n\nfunction formatGoLang(str, fieldName, field, fileds, emptLength, isFiled) {\n var maxLength = 0;\n\n if (isFiled == 1) {\n for (var i = 0; i < fileds.length; i++) {\n if (getBlength(it.func.camel(fileds[i].defKey, true)) > maxLength) {\n maxLength = getBlength(it.func.camel(fileds[i].defKey, true)) + 2;\n }\n }\n } else if (isFiled == 2) {\n for (var i = 0; i < fileds.length; i++) {\n var newStr = \"gorm:column:\" + fileds[i].defKey + \" json:\" + it.func.camel(fileds[i].defKey, true);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 2;\n }\n }\n var empt = \"\";\n var strLength = getBlength(str);\n if (field.primaryKey) {\n strLength += getBlength(\"primaryKey;\");\n }\n for (var j = 0; j < maxLength - strLength; j++) {\n empt += ' ';\n }\n return empt;\n } else if (isFiled == 3) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = eval(\"fileds[\" + i + \"].\" + fieldName);\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n } else if (isFiled == 4) {\n /*获取某个字段的最大长度*/\n for (var i = 0; i < fileds.length; i++) {\n var newStr = fileds[i].comment + \";\" + fileds[i].defName;\n if (getBlength(newStr) > maxLength) {\n maxLength = getBlength(newStr) + 1;\n }\n }\n }\n else {\n maxLength = emptLength;\n }\n\n var strLength = getBlength(str);\n for (var j = 0; j < maxLength - strLength; j++) {\n str += ' ';\n }\n return str;\n}\n\nfunction getBlength(str) {\n var n = 0;\n for (var i = str.length; i--;) {\n n += str.charCodeAt(i) > 255 ? 2 : 1;\n }\n return n;\n} \n\n}}" + }, + { + "applyFor": "BDF457FD-9F98-4AC3-A705-7587B00A3BAB", + "type": "appCode", + "struct": "use chrono::{DateTime, Local};\nuse serde::{Deserialize, Serialize};\n$blankline\n/// {{=it.entity.defName}}\n#[derive(Serialize, Deserialize, Debug, Clone)]\n{{ var today=new Date();\n var fullYear=today.getFullYear();\n var month=today.getMonth() + 1;\n var days=today.getDate();\n \n var pkVarName = \"undefinedId\";\n var pkDataType = \"String\";\n it.entity.fields.forEach(function(field){\n if(field.primaryKey){\n pkVarName = it.func.camel(field.defKey,false);\n pkDataType = field[\"type\"];\n return;\n }\n });\n \n var pkgName = it.entity.env.base.nameSpace;\n var beanClass = it.entity.env.base.codeRoot;\n var beanVarName = beanClass.charAt(0).toLowerCase()+beanClass.slice(1);\n \n}}\npub struct {{=beanClass}} {\n {{~it.entity.fields:field:index}}\n {{\n let fieldDateType = field.type;\n if(!field.notNull){\n fieldDateType = 'Option<'+fieldDateType+'>';\n }\n }}/// {{=field.defName}}\n pub {{=it.func.camel(field.defKey,false)}}: {{=fieldDateType}},\n {{~}}\n}\n" + }, + { + "applyFor": "56F4B55B-F0B8-4049-9E6B-50B95C1D793A", + "type": "dbDDL", + "createTable": "CREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.autoIncrement ? '' : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* -------------------------------------------------- */\n创建表:\n{{~ createEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* -------------------------------------------------- */\n删除表:\n{{~ dropEntities:entity}}\n {{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* -------------------------------------------------- */\n修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n {{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n {{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n {{?}}{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}\n {{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('\\n\\t建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('\\n\\t解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}\n{{=indexChanged?'\\n\\t更改了索引':''}}\n{{=changed?'\\n\\t更改了属性':''}}\n{{=relaArray.length>0?relaArray.join(''):''}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD (${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n ddlItem += ')';\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n changeDDL += ('MODIFY ('+after.defKey+'');\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n \n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n changeDDL += ')';\n ret.push(`${firstDDL} ${changeDDL};`);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "483F9346-C99E-4014-A1D2-A554606BD8A3", + "type": "dbDDL", + "createTable": "{{let dorisDistributedBy = it.entity.properties['dorisDistributedBy'];\n dorisDistributedBy = dorisDistributedBy?dorisDistributedBy:'请在表的扩展属性中配置[dorisDistributedBy]属性';\n}}CREATE TABLE IF NOT EXISTS {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n `{{=field.defKey}}` {{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}} {{= field.notNull ? 'NOT NULL' : '' }} COMMENT '{{=it.func.join(field.defName,field.comment,';')}}' {{= index < it.entity.fields.length-1 ? ',' : '' }}\n{{~}}\n) COMMENT '{{=it.func.join(it.entity.defName,it.entity.comment,';') }}'\n{{=dorisDistributedBy}} ;\n$blankline\n", + "createView": "", + "deleteTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};", + "createIndex": "", + "deleteIndex": "", + "message": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChanged(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('代码:'+(before.defKey||'NULL')+'->'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}\n", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push('ALTER TABLE '+before.defKey+' RENAME TO '+after.defKey);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n ret.push('ALTER TABLE '+after.defKey+' COMMENT \\''+commentText+'\\'');\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldAdded) { \n let ddlItem = 'ADD COLUMN `'+field.defKey+'` '+field.dbType;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n }\n if(field.autoIncrement){\n ddlItem += ' AUTO_INCREMENT';\n }\n if(field.defaultValue){\n ddlItem += (' DEFAULT ' + field.defaultValue);\n }\n ddlItem += (' COMMENT \\''+field.defName+';'+field.comment+'\\'');\n \n if(field.index>0 && field.afterFieldKey){\n ddlItem += (' AFTER '+field.afterFieldKey);\n }\n ret.push(ddlItem);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldRemoved) { \n ret.push('DROP '+field.defKey);\n }\n return firstDDL+'\\n'+ret.join(',\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = 'ALTER TABLE '+entity.data.baseInfo.defKey;\n for (let field of fieldModified) { \n let changeDDL = '';\n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey === after.defKey){\n changeDDL += (' MODIFY COLUMN `'+after.defKey+'`');\n }else{\n changeDDL += (' CHANGE COLUMN `'+before.defKey+'` `'+after.defKey+'`');\n }\n changeDDL += (' '+after.dbType);\n if(after.len>0){\n changeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n changeDDL += (','+after.scale);\n }\n changeDDL += ')';\n }\n if(after.notNull){\n changeDDL += ' NOT NULL';\n }\n let defaultValue = '';\n if(after.defaultValue != null && after.defaultValue.length>0){\n defaultValue = (after.defaultValue);\n }else{\n defaultValue = 'NULL';\n }\n if(defaultValue != 'NULL'){\n changeDDL += (' DEFAULT ' + defaultValue);\n }\n\n let comment = after.defName;\n if(after.comment){\n comment = comment + ';' + (after.comment||'');\n }\n if(comment){\n changeDDL += (' COMMENT \\''+comment+'\\';');\n }\n \n ret.push(firstDDL+' '+changeDDL);\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + }, + { + "applyFor": "ABF5836C-0B7C-4007-A41C-F869325E5842", + "type": "dbDDL", + "createTable": "DROP TABLE IF EXISTS {{=it.entity.defKey}};\nCREATE TABLE {{=it.entity.defKey}}(\n{{ pkList = [] ; }}\n{{~it.entity.fields:field:index}}\n {{? field.primaryKey }}{{ pkList.push(field.defKey) }}{{?}}\n {{=field.defKey}} {{? field.autoIncrement}}SERIAL{{??}}{{=field.type}}{{?field.len>0}}{{='('}}{{=field.len}}{{?field.scale>0}}{{=','}}{{=field.scale}}{{?}}{{=')'}}{{?}}{{?}}{{= field.notNull ? ' NOT NULL' : '' }}{{= field.defaultValue ? it.func.join(' DEFAULT ',field.defaultValue,' ') : '' }}{{= index < it.entity.fields.length-1 ? ',' : ( pkList.length>0 ? ',' :'' ) }}\n{{~}}\n{{? pkList.length >0 }}\n PRIMARY KEY ({{~pkList:pkName:i}}{{= pkName }}{{= i'+(after.defKey||'NULL'));\n }\n if(before.defName !== after.defName){\n ret.push('显示名称:'+(before.defName||'NULL')+'->'+(after.defName||'NULL'));\n }\n if(before.comment !== after.comment){\n ret.push('说明:'+(before.comment||'NULL')+'->'+(after.comment||'NULL'));\n }\n if(ret.length>0){\n return ' 基本信息:\\n\\t'+ret.join('\\n\\t');\n }\n return '';\n };\n \n function buildAddedDesc(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n \n for (let field of fieldAdded) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildRemovedDesc(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n \n for (let field of fieldRemoved) { \n let row = [];\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n \n function buildModifiedDesc(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n for (let field1 of fieldModified) { \n let row = [];\n let field = field1.before;\n row.push(field.defKey+'['+field.defName+']');\n ret.push(row.join(\"\"))\n }\n return ret;\n };\n}}\n\n\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=entity.data.defKey}}[{{=entity.data.defName}}]\n{{~}}\n{{?}}\n\n{{? modifyEntities && modifyEntities.length > 0}}\n/* --------------- 修改表 --------------- */\n{{~ modifyEntities:entity}}\n{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]{{let changeText=baseChanged(entity.data.baseChanged);}}\n{{=baseChanged(entity.data.baseChanged)}}\n {{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n 修改字段:\n {{='\\t'}}{{=buildModifiedDesc(entity).join('\\n\\t')}}{{?}}{{\n /*计算是否调整了属性*/\n let propAdded = entity.data.propAdded || [];\n let propRemoved = entity.data.propRemoved || [];\n let propModified = entity.data.propModified || [];\n let changed = propAdded.length>0 || propRemoved.length>0 || propModified.length>0;\n /*计算关联是否调整*/\n let refEntityAdd = entity.data.refEntityAdd || [];\n let refEntityRemoved = entity.data.refEntityRemoved || [];\n let relaArray = [];\n for (let rela of refEntityAdd) {\n relaArray.push('建立关联:'+rela.defKey+'['+rela.defName+']');\n }\n for (let rela of refEntityRemoved) {\n relaArray.push('解除关联:'+rela.defKey+'['+rela.defName+']');\n }\n /*索引是否修改过*/\n let indexChanged = entity.data.indexChanged;\n }}{{=indexChanged?'\\n\\t更改了索引':''}}{{=changed?'\\n\\t更改了属性':''}}{{=relaArray.length>0?('\\n\\t'+relaArray.join('\\n\\t')):''}}\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n 添加字段:\n{{='\\t'}}{{=buildAddedDesc(entity).join('\\n\\t')}}\n{{?}}{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n 删除字段:\n{{='\\t'}}{{=buildRemovedDesc(entity).join('\\n\\t')}}\n{{?}}\n{{~}}\n{{?}}", + "update": "{{\n let createEntities = it.changes.filter(function(row){return (row.opt==='add'&&row['type']==='entity');});\n let dropEntities = it.changes.filter(function(row){return (row.opt==='delete'&&row['type']==='entity');});\n let modifyEntities = it.changes.filter(function(row){return (row.opt==='update'&&row['type']==='entity');});\n \n function baseChangedDDL(beforeAfter){\n if(beforeAfter == null){\n return '';\n }\n let ret = [];\n let before = beforeAfter.before || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n let after = beforeAfter.after || {\"defKey\":\"\",\"defName\":\"\",\"comment\":\"\"};\n if(before.defKey !== after.defKey){\n ret.push(`ALTER TABLE ${before.defKey} RENAME TO ${after.defKey}`);\n }\n let commentText = '';\n let commentChanged = false;\n if(before.defName !== after.defName){\n commentText = after.defName;\n commentChanged = true;\n }\n if(before.comment !== after.comment){\n commentChanged = true;\n if(commentText){\n commentText = (commentText+ ';'+after.comment)\n }else{\n commentText = after.comment\n }\n }\n if(commentChanged){\n let myText = `COMMENT ON TABLE ${after.defKey} IS '${commentText}'`;\n ret.push(myText);\n }\n let baseText = '-- 基本信息:\\n';\n return baseText+ret.join(';\\n')+';';\n };\n \n function buildAddedDDL(entity){\n let ret = [];\n let fieldAdded = entity.data.fieldAdded||[];\n if(fieldAdded.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldAdded) { \n let ddlItem = `ADD COLUMN ${field.defKey} ${field.dbType}`;\n /*处理数据类型长度*/\n if(field.len>0){\n ddlItem += ('('+field.len);\n if(parseInt(field.scale)>0){\n ddlItem += (','+field.scale);\n }\n ddlItem += ')';\n }\n if(field.notNull){\n ddlItem += ' NOT NULL';\n } \n let defaultValue = field.defaultValue;\n defaultValue = (defaultValue==null)?\"\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n ddlItem += (' DEFAULT ' + defaultValue);\n }\n\n ret.push(`${firstDDL} ${ddlItem}`);\n \n /*处理字段注释*/\n let fieldComments = [];\n if(field.defName != null &&field.defName.length>0){\n fieldComments.push(field.defName);\n }\n if(field.comment != null &&field.comment.length>0){\n fieldComments.push(field.comment);\n }\n let commentText = fieldComments.join(';');\n if(commentText != null && commentText.length > 0){\n let commentDDL = `COMMENT ON COLUMN ${entity.data.baseInfo.defKey}.${field.defKey} IS '${commentText}'`;\n ret.push(commentDDL);\n }\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildRemovedDDL(entity){\n let ret = [];\n let fieldRemoved = entity.data.fieldRemoved||[];\n if(fieldRemoved.length == 0){\n return '';\n }\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldRemoved) { \n ret.push(`${firstDDL} DROP COLUMN ${field.defKey}`);\n }\n return '\\n'+ret.join(';\\n');\n };\n \n function buildModifiedDDL(entity){\n let ret = [];\n let fieldModified = entity.data.fieldModified||[];\n \n let firstDDL = `ALTER TABLE ${entity.data.baseInfo.defKey}`;\n for (let field of fieldModified) { \n let before = field.before || {};\n let after = field.after || {};\n if(before.defKey !== after.defKey){\n let renameText = `ALTER TABLE ${entity.data.baseInfo.defKey} RENAME COLUMN ${before.defKey} TO ${after.defKey};`;\n ret.push(renameText);\n }\n /*如果没有变化,则不生成变更语句*/\n if(before.dbType === after.dbType \n && before['len'] === after['len'] \n && before.scale === after.scale\n && before.primaryKey === after.primaryKey\n && before.notNull === after.notNull\n && before.autoIncrement === after.autoIncrement\n && before.defaultValue === after.defaultValue){\n continue;\n }\n if(before.dbType !== after.dbType || before.len !== after.len || before.scale !== after.scale){\n let dbTypeDDL = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${after.defKey} TYPE ${before.dbType}`;\n if(after.len>0){\n dbTypeDDL += ('('+after.len);\n if(parseInt(after.scale)>0){\n dbTypeDDL += (','+after.scale);\n }\n dbTypeDDL += ')';\n }\n ret.push(dbTypeDDL+';');\n }\n \n if(before.defaultValue !== after.defaultValue){\n let defaultDDL = '';\n let defaultValue = after.defaultValue;\n defaultValue = (defaultValue==null)?\"NULL\":(\"\"+defaultValue);\n if(defaultValue.length>0){\n defaultDDL += ('SET DEFAULT ' + defaultValue);\n }\n let defaultTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${defaultDDL};`;\n ret.push(defaultTpl);\n }\n \n if(before.notNull !== after.notNull){\n let notNullDDL= 'SET NULL';\n if(after.notNull){\n let notNullDDL= 'SET NOT NULL';\n }\n let notNullTpl = `ALTER TABLE ${entity.data.baseInfo.defKey} ALTER COLUMN ${notNullDDL};`;\n ret.push(notNullTpl);\n }\n }\n return ret;\n };\n}}\n{{? createEntities && createEntities.length > 0}}\n/* --------------- 创建表 --------------- */\n{{~ createEntities:entity}}\n{{=it.func.createDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? dropEntities && dropEntities.length > 0}}\n/* --------------- 删除表 --------------- */\n{{~ dropEntities:entity}}\n{{=it.func.dropDDL(entity.data,entity['type'])}}\n{{~}}\n{{?}}\n\n\n{{? modifyEntities && modifyEntities.length > 0}}\n{{~ modifyEntities:entity}}\n/* --------------- 修改表 --------------- */\n-- 修改表:{{=entity.data.baseInfo.defKey}}[{{=entity.data.baseInfo.defName}}]\n{{=baseChangedDDL(entity.data.baseChanged)}}\n{{? entity.data.fieldModified && entity.data.fieldModified.length > 0}}\n-- 修改字段:\n{{=buildModifiedDDL(entity).join('\\n')}}\n{{?}}{{\n/*索引是否修改过*/\nlet indexChanged = entity.data.indexChanged;\n}}\n{{? indexChanged }}\n-- 索引重建\n{{=it.func.indexRebuildDDL(entity.data.baseInfo,entity.data.newIndexes,entity.data.fullFields,entity['type'])}}\n{{?}}\n\n{{? entity.data.fieldAdded && entity.data.fieldAdded.length > 0}}\n-- 添加字段:\n{{=buildAddedDDL(entity)}};\n{{?}}\n\n{{? entity.data.fieldRemoved && entity.data.fieldRemoved.length > 0}}\n-- 删除字段:\n{{=buildRemovedDDL(entity)}};\n{{?}}\n{{~}}\n{{?}}" + } + ], + "generatorDoc": { + "docTemplate": "" + }, + "relationFieldSize": "15", + "uiHint": [ + { + "defKey": "Input", + "defName": "普通输入框", + "id": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "Select", + "defName": "下拉输入框", + "id": "FB111359-2B73-4443-926C-08A98E446448" + }, + { + "defKey": "CheckBox", + "defName": "复选框", + "id": "0CB8A6C9-1115-4FC0-B51E-5C028065082F" + }, + { + "defKey": "RadioBox", + "defName": "单选框", + "id": "5C04987A-260F-4B7C-A5D5-22A181AAE9CA" + }, + { + "defKey": "Double", + "defName": "小数输入", + "id": "8D5BAFE4-E15C-4707-A047-8EE59C58E70F" + }, + { + "defKey": "Integer", + "defName": "整数输入", + "id": "9999AF2A-A44E-415C-A2DC-D7C613BD0073" + }, + { + "defKey": "Money", + "defName": "金额输入", + "id": "2B0C3D0C-7BAF-4B36-81AD-9362B5E5DC2E" + }, + { + "defKey": "Date", + "defName": "日期输入", + "id": "E4D94E14-F695-487F-AFC2-4D888009B7DA" + }, + { + "defKey": "DataYearMonth", + "defName": "年月输入", + "id": "936927E3-DD2D-4096-87FD-074CDE278D59" + }, + { + "defKey": "Text", + "defName": "长文本输入", + "id": "D89DD4F1-ADAC-4469-BF8D-B3FF41AE7963" + }, + { + "defKey": "RichText", + "defName": "富文本输入", + "id": "C134EB1F-4CFF-49E0-882F-2C6FB275CB20" + } + ], + "headers": [ + { + "refKey": "defKey", + "hideInGraph": false, + "value": "字段代码", + "freeze": false + }, + { + "refKey": "defName", + "hideInGraph": false, + "value": "显示名称", + "freeze": false + }, + { + "refKey": "primaryKey", + "hideInGraph": false, + "value": "主键", + "freeze": false + }, + { + "refKey": "notNull", + "hideInGraph": true, + "value": "不为空", + "freeze": false + }, + { + "refKey": "autoIncrement", + "hideInGraph": true, + "value": "自增", + "freeze": false + }, + { + "refKey": "domain", + "hideInGraph": true, + "value": "数据域", + "freeze": false + }, + { + "refKey": "type", + "hideInGraph": false, + "value": "数据类型", + "freeze": false + }, + { + "refKey": "len", + "hideInGraph": false, + "value": "长度", + "freeze": false + }, + { + "refKey": "scale", + "hideInGraph": false, + "value": "小数位数", + "freeze": false + }, + { + "refKey": "comment", + "hideInGraph": true, + "value": "说明", + "freeze": false + }, + { + "refKey": "refDict", + "hideInGraph": true, + "value": "数据字典", + "freeze": false + }, + { + "refKey": "defaultValue", + "hideInGraph": true, + "value": "默认值", + "freeze": false + }, + { + "refKey": "isStandard", + "hideInGraph": false, + "value": "标准字段", + "enable": false, + "freeze": false + }, + { + "refKey": "uiHint", + "hideInGraph": true, + "value": "UI建议", + "enable": true, + "freeze": false + }, + { + "refKey": "extProps", + "hideInGraph": true, + "value": "拓展属性", + "enable": true, + "freeze": false + }, + { + "refKey": "attr1", + "value": "属性1", + "hideInGraph": true, + "enable": true, + "freeze": false + }, + { + "refKey": "attr2", + "value": "属性2", + "hideInGraph": true, + "enable": false, + "freeze": false + }, + { + "refKey": "attr3", + "value": "属性3", + "hideInGraph": true, + "enable": false, + "freeze": false + }, + { + "refKey": "attr4", + "value": "属性4", + "hideInGraph": true, + "enable": false, + "freeze": false + }, + { + "refKey": "attr5", + "value": "属性5", + "hideInGraph": true, + "enable": false, + "freeze": false + }, + { + "refKey": "attr6", + "value": "属性6", + "hideInGraph": true, + "enable": false, + "freeze": false + }, + { + "refKey": "attr7", + "value": "属性7", + "hideInGraph": true, + "enable": false, + "freeze": false + }, + { + "refKey": "attr8", + "value": "属性8", + "hideInGraph": true, + "enable": false, + "freeze": false + }, + { + "refKey": "attr9", + "value": "属性9", + "hideInGraph": true, + "enable": false, + "freeze": false + } + ], + "modelType": "modalGroup", + "recentColors": [ + "#d148d1", + "#ce4bce", + "#831b83", + "#dd31dd", + "#da2fda", + "#e988e9", + "#000000", + "#DDE5FF" + ], + "DDLToggleCase": "L" + }, + "entities": [ + { + "id": "193C697E-973B-4E52-8852-0A86C684AD6A", + "defKey": "admin", + "defName": "管理员表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "username", + "defName": "用户名", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "85E579F9-7C1C-477D-AF90-34B21417D9B9", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "password", + "defName": "密码", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "D3064E2C-4B93-40B7-B14C-8FEEB664C3C6", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "nickname", + "defName": "昵称", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "2974CEA6-E9E5-43A1-9A6E-B59465C35796", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "mobile", + "defName": "手机号", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 20, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "4B7092DD-8945-4CC0-AF71-988EDF88BB7A", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_used", + "defName": "是否启用 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "72EC27CE-39E2-4AE1-8E5A-592D1155D69A", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_deleted", + "defName": "是否删除 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "67FE84DA-B1B4-44DA-91F6-1BD980A56AAC", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "17604E40-EA79-48EB-90DB-8AA54F4A05A7", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "B98CE637-9419-4051-95F7-61E0CC1B8FF9", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "41B3C588-6EA3-40F7-A746-265EE30322F0", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "C3630D4B-AC46-4275-93E8-94E9A2B7EB76", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + } + ], + "indexes": [ + { + "defKey": "unique_username", + "unique": true, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "2116495B-D1E6-45C3-91A5-1D4736E990F4", + "fieldDefKey": "85E579F9-7C1C-477D-AF90-34B21417D9B9" + } + ], + "id": "69C6A4EE-EBD7-4323-9490-733B7A18E73D" + } + ], + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "897CE7B5-936E-460A-AE58-874AEC9BFF89", + "defKey": "admin_menu", + "defName": "管理员菜单栏表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "E48C0CD9-5EA9-4F58-9BA1-A949B054487F", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "admin_id", + "defName": "管理员ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "1C609F89-B7C0-4244-A77E-6EC2A573080F", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "menu_id", + "defName": "菜单栏ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "404FC9F3-8B46-4E98-B800-8E0146FC2679", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "2F919972-AF0A-4C59-8542-F57D3DB1A1D8", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "9CBF08E2-FB2A-4AD0-BE92-7DF685FD3493", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + } + ], + "indexes": [ + { + "defKey": "idx_admin_id", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "CECD0983-1833-4C5A-BAF2-E36F58CE5DA9", + "fieldDefKey": "1C609F89-B7C0-4244-A77E-6EC2A573080F" + } + ], + "id": "127F930D-0BE1-430E-8E55-00E3B9510F7E" + } + ], + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [ + { + "myField": "1C609F89-B7C0-4244-A77E-6EC2A573080F", + "refEntity": "193C697E-973B-4E52-8852-0A86C684AD6A", + "refField": "6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C", + "myRows": "1", + "refRows": "n", + "innerType": "" + }, + { + "myField": "404FC9F3-8B46-4E98-B800-8E0146FC2679", + "refEntity": "BF404C8C-5785-4566-95F7-16D011128ABA", + "refField": "8939C037-837D-44D8-AC58-9A4C502F81DC", + "myRows": "1", + "refRows": "n", + "innerType": "" + } + ] + }, + { + "id": "2CA47871-19BF-46F1-8AE5-ED1766A1C355", + "defKey": "authorized", + "defName": "已授权的调用方表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "4C492AD3-2205-4028-8B31-E1A8644A5ADE", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "business_key", + "defName": "调用方key", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "6A76AA85-F887-4EF6-B490-990F9F9E83E4", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "business_secret", + "defName": "调用方secret", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "5EB60A8A-4DAB-452E-9E90-8D0DADBF4469", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "business_developer", + "defName": "调用方对接人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "E03F2482-A0BE-48B0-8BB2-6974C5392363", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "remark", + "defName": "备注", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "A645499B-4AD9-47E0-8C67-8A4BFA6A19BD", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_used", + "defName": "是否启用 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "9E473B46-56EF-47F6-B689-7914EB4369BC", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_deleted", + "defName": "是否删除 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "4E39F134-34D3-4EB7-987F-B7F53E050BAD", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "F1FCA0C4-872D-488B-9DFF-087906BEA993", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "1624CC68-0C6F-40FB-A579-CB40B530C032", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "53EC7EF5-64D7-4246-89A0-3067F46D8F02", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "85E6ADAE-DD1C-42BC-918C-537B8E9256D0", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + } + ], + "indexes": [ + { + "defKey": "unique_business_key", + "unique": true, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "21AF7032-8965-4DD0-87C8-50AE5423022E", + "fieldDefKey": "6A76AA85-F887-4EF6-B490-990F9F9E83E4" + } + ], + "id": "E845C43A-0CB7-4075-B875-55A93122EF7C" + } + ], + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "2DCB09B1-0F66-43F3-A104-F127E9915B4F", + "defKey": "authorized_api", + "defName": "已授权接口地址表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "8485ECDA-5E56-46F6-B6FB-177A3F191BC2", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "business_key", + "defName": "调用方key", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "33F4E0CC-BED4-45BA-90C3-D9529363A094", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "method", + "defName": "请求方式", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 30, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "6D24ED61-4E86-42A0-B5BB-B2B228CAFDB1", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "api", + "defName": "请求地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "6F8E6594-E610-4E46-B654-2C06551B24CA", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_deleted", + "defName": "是否删除 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "D1FE90C1-4A86-4064-8E8C-F3ED4E74550D", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "910CF4A7-A362-4DFF-8275-FFFE70DDE542", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "EDB798C0-536A-4BE1-A674-CA16D3D18304", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "F46CED15-9094-455C-BE56-2E5CBF1D5AAC", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "838E0312-3E72-4BDA-AF36-C235737E42C1", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + } + ], + "indexes": [], + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "2CF25297-0285-44B2-B6E3-07BFB70E424F", + "defKey": "cron_task", + "defName": "后台任务表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "EA97BA36-3876-4034-B42B-E04D236370E5", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "name", + "defName": "任务名称", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 64, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "382C1FB2-158A-457E-BE1C-401A194E944E", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "spec", + "defName": "crontab 表达式", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 64, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "AD56C5F2-C3C0-4733-A65F-6568D894A9B8", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "command", + "defName": "执行命令", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "8A7E5BCC-3D11-441F-8D59-323FD3B6D3D0", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "protocol", + "defName": "执行方式 1:shell 2:http", + "comment": "", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "FB29048B-55D4-47B5-8746-9CB4DB947A9E", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "http_method", + "defName": "http 请求方式 1:get 2:post", + "comment": "", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "9C174CB4-2ED3-4D7F-8BA1-7D4AAE0C1A23", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "timeout", + "defName": "超时时间(单位:秒)", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "60", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "C88F7F03-CFDA-4BBE-8589-727DED064A08", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "retry_times", + "defName": "重试次数", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "3", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "E2571234-25B6-4C15-AF89-EFC8F604CD7D", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "retry_interval", + "defName": "重试间隔(单位:秒)", + "comment": "", + "domain": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "60", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "6671558D-00ED-40F7-9819-A9FD8DCD81E3", + "baseType": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "notify_status", + "defName": "执行结束是否通知 1:不通知 2:失败通知 3:结束通知 4:结果关键字匹配通知", + "comment": "", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "FA27FC21-6348-4CCB-B909-B31E6586328F", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "notify_type", + "defName": "通知类型 1:邮件 2:webhook", + "comment": "", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "DB97BE30-A975-44FA-9BC2-E98C72B5FC3B", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "notify_receiver_email", + "defName": "通知者邮箱地址(多个用,分割)", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "D9CF2FCB-C455-487D-9F7C-9054F5C12027", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "notify_keyword", + "defName": "通知匹配关键字(多个用,分割)", + "comment": "", + "domain": "9092C4E0-1A54-4859-ABBB-5B62DBC27573", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "F368298E-82B2-49A0-9020-D81886AB4716", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "remark", + "defName": "备注", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "56458939-D891-4EC2-A849-3C538A25D1DF", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_used", + "defName": "是否启用 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "4B080726-DD2D-409D-84C4-3D35A02BD620", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "AEE9F9A2-25C1-40A4-B24F-612AF099F2ED", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "6E4ADE39-994E-4082-A2AC-48B7C37DB5FB", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "728511CD-C424-4C8E-B7D6-A0C9D2CEFE0D", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "442A0E10-1280-49F2-8356-EFF07998DEBF", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + } + ], + "indexes": [ + { + "defKey": "idx_name", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "1A00D7F5-BE55-42DD-8960-A127677706CA", + "fieldDefKey": "382C1FB2-158A-457E-BE1C-401A194E944E" + } + ], + "id": "0A740F5C-48A6-4A01-B721-4C793189C77D" + } + ], + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "BF404C8C-5785-4566-95F7-16D011128ABA", + "defKey": "menu", + "defName": "左侧菜单栏表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "8939C037-837D-44D8-AC58-9A4C502F81DC", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "pid", + "defName": "父类ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "5E2830F1-D5F3-4CE0-8262-293BF6ECF72C", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "name", + "defName": "菜单名称", + "comment": "", + "domain": "16120F75-6AA7-4483-868D-F07F511BB081", + "type": "", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "FD7CAB2F-0D82-41C1-9D7E-02C7F3BB2F75", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "link", + "defName": "链接地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "0A772A2B-AD30-48EA-9D78-D45B8B1C7A2E", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "icon", + "defName": "图标", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "2AE736BF-02CD-4E36-8B2D-3802075AC154", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "level", + "defName": "菜单类型 1:一级菜单 2:二级菜单", + "comment": "", + "domain": "", + "type": "TINYINT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "608A8A6A-7567-453E-B53C-47CF95FEFFE4", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "sort", + "defName": "排序", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "786DBC1E-A86C-4931-9A08-156CAEB7D45A", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_used", + "defName": "是否启用 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "7BA3EAC9-1171-4888-949D-02C557538E8B", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_deleted", + "defName": "是否删除 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "E3AF3148-D375-4242-99F1-BDFD1939B480", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "A6A11CB1-EE3A-49A5-8540-56E34936BE68", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "7EEE5C4E-4DB2-4A9D-8ECE-54CAA18AC18D", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "25AFD31B-069F-4CF3-9FF0-0E2F6C9D84CC", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "58C5CA6A-20AD-48CF-88A1-B5DC38977AFA", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + } + ], + "indexes": [], + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [] + }, + { + "id": "E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3", + "defKey": "menu_action", + "defName": "功能权限表", + "comment": "", + "properties": {}, + "fields": [ + { + "defKey": "id", + "defName": "主键", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": true, + "notNull": true, + "autoIncrement": true, + "defaultValue": "", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "5630A333-D76D-49CD-BAF0-A428FBE960C8", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "menu_id", + "defName": "菜单栏ID", + "comment": "", + "domain": "", + "type": "INT UNSIGNED", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "0", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "51DB153D-15F1-4831-A48C-957D45847C68", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "method", + "defName": "请求方式", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 30, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "5BE99E54-DA1E-4DF2-97DB-39A7EB5B1AD2", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "api", + "defName": "请求地址", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 100, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "FF3F1EB0-51E9-4924-B862-1E79F909819B", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "is_deleted", + "defName": "是否删除 1:是 -1:否", + "comment": "", + "domain": "", + "type": "BIT", + "len": 1, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "-1", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "62708389-0031-477C-BD24-C256C9404FE9", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_at", + "defName": "创建时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "8EED6806-65C6-4D53-A4E4-9C4979C9CFA7", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "created_user", + "defName": "创建人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "8F30AAAC-F44C-4B91-B33F-10C3C58DA51E", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_at", + "defName": "更新时间", + "comment": "", + "domain": "", + "type": "TIMESTAMP", + "len": "", + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "current_timestamp()", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "F69801C9-9A6C-47C0-8AF1-DE505BAB90D1", + "baseType": "", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + }, + { + "defKey": "updated_user", + "defName": "更新人", + "comment": "", + "domain": "", + "type": "VARCHAR", + "len": 60, + "scale": "", + "primaryKey": false, + "notNull": true, + "autoIncrement": false, + "defaultValue": "''", + "hideInGraph": false, + "refDict": "", + "attr1": "", + "attr2": "", + "attr3": "", + "attr4": "", + "attr5": "", + "attr6": "", + "attr7": "", + "attr8": "", + "attr9": "", + "id": "565868A5-EA4A-43F3-A878-AF18B0A8B54B", + "baseType": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "extProps": {}, + "uiHint": "642D2E0A-8846-4549-BE56-8C0473F26EDE" + } + ], + "indexes": [ + { + "defKey": "idx_menu_id", + "unique": false, + "defName": null, + "comment": "", + "fields": [ + { + "ascOrDesc": "A", + "id": "35219CFE-4C14-46F7-9D39-A656220F231A", + "fieldDefKey": "51DB153D-15F1-4831-A48C-957D45847C68" + } + ], + "id": "F0432F19-362D-4167-87A1-F5D6DBC30B1D" + } + ], + "sysProps": { + "nameTemplate": "{defKey}[{defName}]" + }, + "headers": [ + { + "freeze": false, + "refKey": "hideInGraph", + "hideInGraph": true + }, + { + "freeze": true, + "refKey": "defKey", + "hideInGraph": false + }, + { + "freeze": true, + "refKey": "defName", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "primaryKey", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "notNull", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "autoIncrement", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "domain", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "type", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "len", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "scale", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "comment", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "refDict", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "defaultValue", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "isStandard", + "hideInGraph": false + }, + { + "freeze": false, + "refKey": "uiHint", + "hideInGraph": true + }, + { + "freeze": false, + "refKey": "extProps", + "hideInGraph": true + } + ], + "correlations": [ + { + "myField": "51DB153D-15F1-4831-A48C-957D45847C68", + "refEntity": "BF404C8C-5785-4566-95F7-16D011128ABA", + "refField": "8939C037-837D-44D8-AC58-9A4C502F81DC", + "myRows": "1", + "refRows": "n", + "innerType": "" + } + ] + } + ], + "views": [], + "dicts": [], + "viewGroups": [ + { + "defKey": "SYSTEM", + "defName": "系统表", + "refEntities": [ + "193C697E-973B-4E52-8852-0A86C684AD6A", + "897CE7B5-936E-460A-AE58-874AEC9BFF89", + "2CA47871-19BF-46F1-8AE5-ED1766A1C355", + "2DCB09B1-0F66-43F3-A104-F127E9915B4F", + "2CF25297-0285-44B2-B6E3-07BFB70E424F", + "BF404C8C-5785-4566-95F7-16D011128ABA", + "E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3" + ], + "refViews": [], + "refDiagrams": [ + "A153DE3A-11F3-482C-8BCA-28971FE903DD" + ], + "refDicts": [], + "id": "46FEECDE-C787-4EB4-A472-243EE2C92D87", + "refLogicEntities": [] + } + ], + "dataTypeMapping": { + "referURL": "", + "mappings": [ + { + "defKey": "string", + "id": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "defName": "字串", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "VARCHAR", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "VARCHAR2", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "VARCHAR", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "VARCHAR", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "VARCHAR", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "VARCHAR2", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "VARCHAR", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "VARCHAR", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "STRING", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "TEXT", + "797A1496-D649-4261-89B4-544132EC3F36": "String", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "String", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "String", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "string", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "string", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "string", + "BDF457FD-9F98-4AC3-A705-7587B00A3BAB": "String", + "56F4B55B-F0B8-4049-9E6B-50B95C1D793A": "VARCHAR", + "483F9346-C99E-4014-A1D2-A554606BD8A3": "VARCHAR", + "ABF5836C-0B7C-4007-A41C-F869325E5842": "VARCHAR" + }, + { + "defKey": "double", + "id": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "defName": "小数", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "DECIMAL", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "DECIMAL", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "DECIMAL", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "NUMERIC", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "DECIMAL", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "DECIMAL", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "NUMERIC", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "NUMERIC", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "DOUBLE", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "REAL", + "797A1496-D649-4261-89B4-544132EC3F36": "Double", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Double", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Double", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "decimal", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "double", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*float64", + "BDF457FD-9F98-4AC3-A705-7587B00A3BAB": "f64", + "56F4B55B-F0B8-4049-9E6B-50B95C1D793A": "DECIMAL", + "483F9346-C99E-4014-A1D2-A554606BD8A3": "DECIMAL", + "ABF5836C-0B7C-4007-A41C-F869325E5842": "NUMERIC" + }, + { + "defKey": "int", + "id": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "defName": "整数", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "INT", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "INT", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "INT", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "INTEGER", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "INT", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "INTEGER", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "INTEGER", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "INT4", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "INT", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "INTEGER", + "797A1496-D649-4261-89B4-544132EC3F36": "Integer", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Integer", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Integer", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "float", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "int", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*int", + "BDF457FD-9F98-4AC3-A705-7587B00A3BAB": "i32", + "56F4B55B-F0B8-4049-9E6B-50B95C1D793A": "INTEGER", + "483F9346-C99E-4014-A1D2-A554606BD8A3": "INT", + "ABF5836C-0B7C-4007-A41C-F869325E5842": "INTEGER" + }, + { + "defKey": "date", + "id": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "defName": "日期", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "DATETIME", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "DATE", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "DATETIME", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "TIMESTAMP", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "DATE", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "DATE", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "DATE", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "DATE", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "DATETIME", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "NUMERIC", + "797A1496-D649-4261-89B4-544132EC3F36": "Date", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "Date", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "Date", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "DateTime", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "timestamp", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "*time.Time", + "BDF457FD-9F98-4AC3-A705-7587B00A3BAB": "DateTime", + "56F4B55B-F0B8-4049-9E6B-50B95C1D793A": "DATE", + "483F9346-C99E-4014-A1D2-A554606BD8A3": "DATETIME", + "ABF5836C-0B7C-4007-A41C-F869325E5842": "DATE" + }, + { + "defKey": "bytes", + "id": "D516E75B-90F5-4741-B9B3-A186A263F04C", + "defName": "二进制", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "BLOB", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "BLOB", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "VARBINARY", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "BYTEA", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "BLOB", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "BLOB", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "BYTEA", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "BYTEA", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "BINARY", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "NONE", + "797A1496-D649-4261-89B4-544132EC3F36": "byte[]", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "byte[]", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "byte[]", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "binary", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "binary", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "[]byte", + "56F4B55B-F0B8-4049-9E6B-50B95C1D793A": "BYTE", + "ABF5836C-0B7C-4007-A41C-F869325E5842": "BYTEA" + }, + { + "defKey": "largeText", + "id": "B17BDED3-085F-40E1-9019-3B79CF2BF075", + "defName": "大文本", + "29D1CE08-4C35-4D2D-AAA9-23D93305B52E": "TEXT", + "A4E23CB7-BB01-4BD1-9F71-F73F3E15A542": "CLOB", + "BFC87171-C74F-494A-B7C2-76B9C55FACC9": "TEXT", + "DFBEC1DD-AA84-456E-BBF3-C95DD0DB2022": "TEXT", + "89504F5D-94BF-4C9E-8B2E-44F37305FED5": "CLOB", + "0BBCABA5-B8E4-41B0-B8E4-8F5EA6029307": "CLOB", + "592C7013-143D-4E7B-AF64-0D7BF1E28230": "TEXT", + "77BD85E5-9D0D-4096-8427-CBA306FC9C6A": "TEXT", + "11D1FB71-A587-4217-89BA-611B8A1F83E0": "STRING", + "B363BE0B-F852-49B8-9B2E-F6D2174DEAC1": "TEXT", + "797A1496-D649-4261-89B4-544132EC3F36": "String", + "895CFD1D-4273-4D32-A2C4-CAC70200AB5B": "String", + "A2EE7B4A-CE62-4290-B00C-B26C1BF18073": "String", + "F3AC2415-E86B-40C6-9FEB-F4B7937D2C30": "string", + "81CCA482-3F4D-4EAC-8CF9-F5E7BC098AD2": "string", + "B91D99E0-9B7C-416C-8737-B760957DAF09": "string", + "BDF457FD-9F98-4AC3-A705-7587B00A3BAB": "String", + "56F4B55B-F0B8-4049-9E6B-50B95C1D793A": "TEXT", + "483F9346-C99E-4014-A1D2-A554606BD8A3": "STRING", + "ABF5836C-0B7C-4007-A41C-F869325E5842": "TEXT" + } + ] + }, + "domains": [ + { + "defKey": "DefaultString", + "defName": "默认字串", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 255, + "scale": "", + "uiHint": "", + "id": "9092C4E0-1A54-4859-ABBB-5B62DBC27573" + }, + { + "defKey": "IdOrKey", + "defName": "主键标识", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 32, + "scale": "", + "uiHint": "", + "id": "16120F75-6AA7-4483-868D-F07F511BB081" + }, + { + "defKey": "Name", + "defName": "名称", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": 90, + "scale": "", + "uiHint": "", + "id": "54611CCC-CA4B-42E1-9F32-4944C85B85A6" + }, + { + "defKey": "Int", + "defName": "整数", + "applyFor": "1D764C4A-6F9F-421E-B11A-6F3E23B51811", + "len": "", + "scale": "", + "uiHint": "", + "id": "6BC8F04B-6CFA-4995-98D3-318F5CDD774E" + }, + { + "defKey": "Double", + "defName": "小数", + "applyFor": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "len": 24, + "scale": 6, + "uiHint": "", + "id": "FF4459C5-6B45-4DBF-8FC0-E06239BC05B4" + }, + { + "defKey": "Money", + "defName": "金额", + "applyFor": "1A0BDC09-0792-4174-9E8E-80BE8DF44B8E", + "len": 24, + "scale": 6, + "uiHint": "", + "id": "C3B1681B-99F9-4818-9E80-DE1652A51D85" + }, + { + "defKey": "DateTime", + "defName": "日期时间", + "applyFor": "89D69E81-EA34-42EE-9FA2-93B8BD27E098", + "len": "", + "scale": "", + "uiHint": "", + "id": "7CFFA0D3-6A93-4DDC-BC10-DF21211064DC" + }, + { + "defKey": "YesNo", + "defName": "是否", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "1", + "scale": "", + "uiHint": "", + "id": "6F7C1C5C-D159-41E6-BF9D-54DEEFA79AFF" + }, + { + "defKey": "Dict", + "defName": "数据字典", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "32", + "scale": "", + "uiHint": "", + "id": "73FD2BAD-2358-4336-B96D-45DC897BD792" + }, + { + "defKey": "DescText", + "defName": "描述文本", + "applyFor": "FC9790A7-36B8-4A48-8F9A-BC1042BCFE64", + "len": "900", + "scale": "", + "uiHint": "", + "id": "3E948CEC-3070-472C-AF92-F3CA11EC9D15" + } + ], + "diagrams": [ + { + "defKey": "DEFAULT", + "defName": "默认关系图", + "relationType": "field", + "canvasData": { + "cells": [ + { + "id": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "shape": "group", + "position": { + "x": -50.000000000018304, + "y": -29.999999999970896 + }, + "label": "### 全部", + "note": "", + "size": { + "width": 2020, + "height": 1140 + }, + "children": [ + "7d866926-c983-421d-b8ce-be13f3d8b8b2", + "5448f8cb-6bb5-42a9-86a5-878254bf6d6d", + "dbb3c433-599e-4dfa-9be9-04cac1cd8dac", + "6c1f583f-b6ae-4052-b3ae-e5050ad904f8", + "711699f0-9a7b-4c33-988e-2909a36a47a9", + "42bbb7e9-9045-4626-b331-0e6bbeace533", + "8ce91e7f-229e-4f61-99e5-a0380ddcab7b", + "16831da1-6ece-4182-996c-90c3e0112dcc", + "f651ca67-b6e0-4553-b5fd-308f985bb05b", + "f912963f-fa11-4a9f-9d04-3f92c3ff2d10" + ] + }, + { + "id": "dbb3c433-599e-4dfa-9be9-04cac1cd8dac", + "shape": "erdRelation", + "source": { + "cell": "5448f8cb-6bb5-42a9-86a5-878254bf6d6d", + "port": "1C609F89-B7C0-4244-A77E-6EC2A573080F%in" + }, + "target": { + "cell": "7d866926-c983-421d-b8ce-be13f3d8b8b2", + "port": "6A039BC3-9D88-4E61-BB82-39EC3AC0AE6C%in" + }, + "relation": "1:n", + "fillColor": "#ACDAFC", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "attrs": { + "line": { + "strokeDasharray": "" + } + } + }, + { + "id": "f651ca67-b6e0-4553-b5fd-308f985bb05b", + "shape": "erdRelation", + "source": { + "cell": "5448f8cb-6bb5-42a9-86a5-878254bf6d6d", + "port": "404FC9F3-8B46-4E98-B800-8E0146FC2679%in" + }, + "target": { + "cell": "6c1f583f-b6ae-4052-b3ae-e5050ad904f8", + "port": "8939C037-837D-44D8-AC58-9A4C502F81DC%out" + }, + "relation": "1:n", + "fillColor": "#ACDAFC", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "attrs": { + "line": { + "strokeDasharray": "" + } + } + }, + { + "id": "f912963f-fa11-4a9f-9d04-3f92c3ff2d10", + "shape": "erdRelation", + "source": { + "cell": "711699f0-9a7b-4c33-988e-2909a36a47a9", + "port": "51DB153D-15F1-4831-A48C-957D45847C68%in" + }, + "target": { + "cell": "6c1f583f-b6ae-4052-b3ae-e5050ad904f8", + "port": "8939C037-837D-44D8-AC58-9A4C502F81DC%in" + }, + "relation": "1:n", + "fillColor": "#ACDAFC", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "attrs": { + "line": { + "strokeDasharray": "" + } + } + }, + { + "id": "16831da1-6ece-4182-996c-90c3e0112dcc", + "shape": "table", + "position": { + "x": 33.5, + "y": 779 + }, + "count": 0, + "originKey": "2DCB09B1-0F66-43F3-A104-F127E9915B4F", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "type": "P", + "size": { + "width": 450, + "height": 238 + } + }, + { + "id": "8ce91e7f-229e-4f61-99e5-a0380ddcab7b", + "shape": "table", + "position": { + "x": 579.5, + "y": 779 + }, + "count": 0, + "originKey": "2CA47871-19BF-46F1-8AE5-ED1766A1C355", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "type": "P", + "size": { + "width": 491, + "height": 284 + } + }, + { + "id": "711699f0-9a7b-4c33-988e-2909a36a47a9", + "shape": "table", + "position": { + "x": 33.5, + "y": 470 + }, + "count": 0, + "originKey": "E635C31E-3C3D-42D2-A91B-E6B6FBB6DFA3", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "type": "P", + "size": { + "width": 450, + "height": 238 + } + }, + { + "id": "5448f8cb-6bb5-42a9-86a5-878254bf6d6d", + "shape": "table", + "position": { + "x": 636.5, + "y": 470 + }, + "count": 0, + "originKey": "897CE7B5-936E-460A-AE58-874AEC9BFF89", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "type": "P", + "size": { + "width": 377, + "height": 146 + } + }, + { + "id": "42bbb7e9-9045-4626-b331-0e6bbeace533", + "shape": "table", + "position": { + "x": 1117, + "y": 50 + }, + "count": 0, + "originKey": "2CF25297-0285-44B2-B6E3-07BFB70E424F", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "type": "P", + "size": { + "width": 830, + "height": 468 + } + }, + { + "id": "7d866926-c983-421d-b8ce-be13f3d8b8b2", + "shape": "table", + "position": { + "x": 600, + "y": 50 + }, + "count": 0, + "originKey": "193C697E-973B-4E52-8852-0A86C684AD6A", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "type": "P", + "size": { + "width": 450, + "height": 284 + } + }, + { + "id": "6c1f583f-b6ae-4052-b3ae-e5050ad904f8", + "shape": "table", + "position": { + "x": -16, + "y": 50 + }, + "count": 0, + "originKey": "BF404C8C-5785-4566-95F7-16D011128ABA", + "parent": "b18b5d0d-9dd8-4805-b2e5-0dcd21866775", + "type": "P", + "size": { + "width": 549, + "height": 330 + } + } + ] + }, + "id": "A153DE3A-11F3-482C-8BCA-28971FE903DD", + "comment": "" + } + ], + "standardFields": [], + "dbConn": [ + { + "defKey": "DE04FF37-5C6C-427C-80DD-5E459EF9117A", + "defName": "MYSQL", + "type": "29D1CE08-4C35-4D2D-AAA9-23D93305B52E", + "properties": { + "driver_class_name": "com.mysql.cj.jdbc.Driver", + "url": "jdbc:mysql://127.0.0.1:3306/gin_template?characterEncoding=UTF-8&useSSL=false&useUnicode=true&serverTimezone=UTC", + "password": "root", + "username": "root" + } + } + ], + "logicEntities": [], + "namingRules": [ + { + "id": "63F1DC0E-6A76-4B75-B3DA-4B00657B4E1B", + "defName": "属性代码不能超过32", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "L", + "applyFieldType": "field", + "programCode": "return (data.field.defName||\"\").length <= 32", + "enable": true + }, + { + "id": "668CBEE6-E0B7-4ACE-B72E-63942963B191", + "defName": "长度不能超过32位", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "entity", + "programCode": "return (data.entity.defName||\"\").length <= 32", + "enable": true + }, + { + "id": "11BD987F-82E7-418E-A752-FDD84F1582A2", + "defName": "长度不能超过32位", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "return (data.field.defName||\"\").length <= 32", + "enable": true + }, + { + "id": "29D0A8D9-ABE2-451F-8A39-52FAB02E62B9", + "defName": "索引名-长度不超过32个字符", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "index", + "programCode": "return (data.index.defName||\"\").length <= 32", + "enable": true + }, + { + "id": "B425A96F-6A31-4DBD-8743-A00DE28FB50F", + "defName": "不能使用保留字", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "index", + "programCode": "let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.index.defKey.toLowerCase())<0;", + "enable": true + }, + { + "id": "EF9E44D0-691A-4352-A079-CFF300107531", + "defName": "索引名-全小写", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "index", + "programCode": "return !/[A-Z]+/.test(data.index.defKey);", + "enable": true + }, + { + "id": "972EB2FB-4428-429D-8B0A-F082A8C7A94D", + "defName": "名称不能为空", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "L", + "applyFieldType": "entity", + "programCode": "return data.logicEntity.defName", + "enable": true + }, + { + "id": "EEAEB9C5-BB6C-4E92-949B-D27928690D85", + "defName": "名称长度不超过32", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "L", + "applyFieldType": "entity", + "programCode": "return (data.logicEntity.defName||\"\").length <=32", + "enable": true + }, + { + "id": "24E3F7E5-730D-4378-B72D-195D6B940352", + "defName": "不能使用保留字", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "entity", + "programCode": "let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.entity.defKey.toLowerCase())<0;", + "enable": true + }, + { + "id": "039BF435-DC77-4DA4-81C7-7F8076BF22BB", + "defName": "表名-全小写", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "entity", + "programCode": "return !/[A-Z]+/.test(data.entity.defKey);", + "enable": true + }, + { + "id": "CBEB0E30-19C6-427D-A8BF-61FF10E27A0B", + "defName": "表名-不允许空格", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "entity", + "programCode": "return !/\\s+/.test(data.entity.defKey);", + "enable": true + }, + { + "id": "1168C7C2-8E8E-4FB7-B639-B3DE839C395A", + "defName": "表名-英文及下划线", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "entity", + "programCode": "return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.entity.defKey);", + "enable": true + }, + { + "id": "D373637C-D3A6-4621-B656-6841A5444A76", + "defName": "表必须有comment注释", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "entity", + "programCode": "return (data.entity.defName||\"\").length > 0 || (data.entity.comment||\"\").length > 0", + "enable": true + }, + { + "id": "2BAB122B-8811-40BB-89F3-CDC24B5862D3", + "defName": "主键命名为 id,类型为 int 或 bigint,且为自增", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "entity", + "programCode": "let fields = data.entity.fields;\nfor(let i=0;i=0){\n count ++;\n }\n}\nreturn count==2;", + "enable": true + }, + { + "id": "BEC54F19-52D5-4882-BCE1-4439785F8001", + "defName": "不能使用保留字", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "let sysWords = \"action,add,aggregate,all,alter,after,and,as,asc,avg,avg_row_length,auto_increment,between,bigint,bit,binary,blob,bool,both,by,cascade,case,char,character,change,check,checksum,column,columns,comment,constraint,create,cross,current_date,current_time,current_timestamp,data,database,databases,date,datetime,day,day_hour,day_minute,day_second,dayofmonth,dayofweek,dayofyear,dec,decimal,default,delayed,delay_key_write,delete,desc,describe,distinct,distinctrow,double,drop,end,else,escape,escaped,enclosed,enum,explain,exists,fields,file,first,float,float4,float8,flush,foreign,from,for,full,function,global,grant,grants,group,having,heap,high_priority,hour,hour_minute,hour_second,hosts,identified,ignore,in,index,infile,inner,insert,insert_id,int,integer,interval,int1,int2,int3,int4,int8,into,if,is,isam,join,key,keys,kill,last_insert_id,leading,left,length,like,lines,limit,load,local,lock,logs,long,longblob,longtext,low_priority,max,max_rows,match,mediumblob,mediumtext,mediumint,middleint,min_rows,minute,minute_second,modify,month,monthname,myisam,natural,numeric,no,not,null,on,optimize,option,optionally,or,order,outer,outfile,pack_keys,partial,password,precision,primary,procedure,process,processlist,privileges,read,real,references,reload,regexp,rename,replace,restrict,returns,revoke,rlike,row,rows,second,select,set,show,shutdown,smallint,soname,sql_big_tables,sql_big_selects,sql_low_priority_updates,sql_log_off,sql_log_update,sql_select_limit,sql_small_result,sql_big_result,sql_warnings,straight_join,starting,status,string,table,tables,temporary,terminated,text,then,time,timestamp,tinyblob,tinytext,tinyint,trailing,to,type,use,using,unique,unlock,unsigned,update,usage,values,varchar,variables,varying,varbinary,with,write,when,where,year,year_month,zerofill\".split(\",\");\nreturn sysWords.indexOf(data.field.defKey.toLowerCase())<0;", + "enable": true + }, + { + "id": "082E186D-7B02-4F1C-9ECE-378AB98C4845", + "defName": "字段-全小写", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "return !/[A-Z]+/.test(data.field.defKey);", + "enable": true + }, + { + "id": "F3CE5C67-23B6-4E7B-BA91-D5F0BCBC9E6A", + "defName": "字段-不允许空格", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "return !/\\s+/.test(data.field.defKey);", + "enable": true + }, + { + "id": "21AFEAC8-96D7-467F-8320-A33887FC0C5D", + "defName": "字段-英文及下划线", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.field.defKey);", + "enable": true + }, + { + "id": "2BBDE47B-6926-4E1A-AE57-D4F6E5399EE6", + "defName": "字段-必需有comment注释", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "return (data.field.defName||\"\").length > 0 || (data.field.comment||\"\").length > 0", + "enable": true + }, + { + "id": "5E181E43-0D72-498F-8178-4C1CDBC89A16", + "defName": "字段-不能与表名相同", + "intro": "", + "controlIntensity": "F", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "return data.field.defKey != data.entity.defKey;", + "enable": true + }, + { + "id": "DE8F8598-5D53-4727-A837-7816C2AF99D9", + "defName": "外键-字段必须具有表名及其主键", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "let relas = data.entity.correlations;\nfor(let i=0;i=0 || data.field.defName.lastIndexOf(\"时间\")>=0 ){\n if(data.field.dbType.toLowerCase().indexOf(\"date\")>=0){\n return true;\n }else{\n return false;\n }\n};\nreturn true;", + "enable": true + }, + { + "id": "2E7FDA44-989A-4C5B-A0C5-12B1E40E57B1", + "defName": "索引名-英文及下划线", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "index", + "programCode": "return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(data.index.defKey);", + "enable": true + }, + { + "id": "023450B3-AAE2-4DC1-AE63-2196DD82823D", + "defName": "索引名-主键的名称以pk_开头,唯一键以uk_开头,普通索引以 ix_开头", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "index", + "programCode": "if(data.index.unique){\n return data.index.defKey.indexOf(\"uk_\")==0;\n}else{\n return data.index.defKey.indexOf(\"ix_\")==0;\n}", + "enable": true + }, + { + "id": "1C563E17-262B-4EB6-87F0-203CAC667CF0", + "defName": "不允许存在blob、text等大字段", + "intro": "", + "controlIntensity": "S", + "applyObjectType": "P", + "applyFieldType": "field", + "programCode": "if(\"blob,text\".indexOf(data.field.dbType.toLowerCase())>=0){\n return false;\n}\nreturn true;", + "enable": true + } + ] +} \ No newline at end of file diff --git a/go.mod b/go.mod index ee5dd87..9688886 100644 --- a/go.mod +++ b/go.mod @@ -11,21 +11,24 @@ require ( github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 github.com/go-playground/validator/v10 v10.22.0 + github.com/gorilla/websocket v1.5.3 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.19.1 github.com/redis/go-redis/v9 v9.5.3 github.com/robfig/cron/v3 v3.0.1 github.com/rs/cors/wrapper/gin v0.0.0-20240515105523-1562b1715b35 + github.com/shirou/gopsutil/v4 v4.24.6 github.com/spf13/cast v1.6.0 github.com/spf13/viper v1.19.0 github.com/sqids/sqids-go v0.4.1 github.com/swaggo/files v1.0.1 github.com/swaggo/gin-swagger v1.6.0 + github.com/swaggo/swag v1.16.3 go.uber.org/multierr v1.10.0 go.uber.org/zap v1.27.0 golang.org/x/text v0.16.0 golang.org/x/time v0.5.0 - golang.org/x/tools v0.22.0 + golang.org/x/tools v0.23.0 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df gopkg.in/natefinch/lumberjack.v2 v2.2.1 gorm.io/driver/mysql v1.5.7 @@ -55,7 +58,6 @@ require ( github.com/goccy/go-json v0.10.3 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect - github.com/gorilla/websocket v1.5.3 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect @@ -83,25 +85,23 @@ require ( github.com/rs/cors v1.11.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/shirou/gopsutil/v4 v4.24.6 // indirect github.com/shoenig/go-m1cpu v0.1.6 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.6.0 // indirect - github.com/swaggo/swag v1.16.3 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect golang.org/x/arch v0.8.0 // indirect - golang.org/x/crypto v0.24.0 // indirect + golang.org/x/crypto v0.25.0 // indirect golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.26.0 // indirect + golang.org/x/mod v0.19.0 // indirect + golang.org/x/net v0.27.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect + golang.org/x/sys v0.22.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 41cf8e0..99c0edd 100644 --- a/go.sum +++ b/go.sum @@ -199,6 +199,8 @@ github.com/shirou/gopsutil/v4 v4.24.6 h1:9qqCSYF2pgOU+t+NgJtp7Co5+5mHF/HyKBUckyS github.com/shirou/gopsutil/v4 v4.24.6/go.mod h1:aoebb2vxetJ/yIDZISmduFvVNPHqXQ9SEJwRXxkf0RA= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= @@ -260,16 +262,14 @@ golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 h1:yixxcjnhBmY0nkL253HFVIm0JsFHwrHdT3Yh6szTnfY= golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8/go.mod h1:jj3sYF3dwk5D+ghuXyeI3r5MFf+NT2An6/9dOA95KSI= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -281,8 +281,8 @@ golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -303,8 +303,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -326,8 +326,8 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= diff --git a/internal/alert/alert.go b/internal/alert/alert.go index d0379cc..3c0a58e 100644 --- a/internal/alert/alert.go +++ b/internal/alert/alert.go @@ -1,8 +1,9 @@ // Package alert -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 22:40 -// @description: 告警通知 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 22:40 +// @description: 告警通知 package alert import ( diff --git a/internal/api/admin/func_create.go b/internal/api/admin/func_create.go new file mode 100755 index 0000000..56e2db3 --- /dev/null +++ b/internal/api/admin/func_create.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type createRequest struct{} + +type createResponse struct{} + +// Create 新增管理员 +// +// @Summary 新增管理员 +// @Description 新增管理员 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body createRequest true "请求信息" +// @Success 200 {object} createResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin [post] +func (h *handler) Create() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_createadminmenu.go b/internal/api/admin/func_createadminmenu.go new file mode 100755 index 0000000..59b9e0d --- /dev/null +++ b/internal/api/admin/func_createadminmenu.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type createAdminMenuRequest struct{} + +type createAdminMenuResponse struct{} + +// CreateAdminMenu 提交菜单授权 +// +// @Summary 提交菜单授权 +// @Description 提交菜单授权 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body createAdminMenuRequest true "请求信息" +// @Success 200 {object} createAdminMenuResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/menu [post] +func (h *handler) CreateAdminMenu() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_delete.go b/internal/api/admin/func_delete.go new file mode 100755 index 0000000..3fc3dc0 --- /dev/null +++ b/internal/api/admin/func_delete.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type deleteRequest struct{} + +type deleteResponse struct{} + +// Delete 删除管理员 +// +// @Summary 删除管理员 +// @Description 删除管理员 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body deleteRequest true "请求信息" +// @Success 200 {object} deleteResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/{id} [delete] +func (h *handler) Delete() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_detail.go b/internal/api/admin/func_detail.go new file mode 100755 index 0000000..baabe2c --- /dev/null +++ b/internal/api/admin/func_detail.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type detailRequest struct{} + +type detailResponse struct{} + +// Detail 个人信息 +// +// @Summary 个人信息 +// @Description 个人信息 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body detailRequest true "请求信息" +// @Success 200 {object} detailResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/info [get] +func (h *handler) Detail() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_list.go b/internal/api/admin/func_list.go new file mode 100755 index 0000000..bc30c0b --- /dev/null +++ b/internal/api/admin/func_list.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type listRequest struct{} + +type listResponse struct{} + +// List 管理员列表 +// +// @Summary 管理员列表 +// @Description 管理员列表 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body listRequest true "请求信息" +// @Success 200 {object} listResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin [get] +func (h *handler) List() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_listadminmenu.go b/internal/api/admin/func_listadminmenu.go new file mode 100755 index 0000000..cb71b1a --- /dev/null +++ b/internal/api/admin/func_listadminmenu.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type listAdminMenuRequest struct{} + +type listAdminMenuResponse struct{} + +// ListAdminMenu 菜单授权列表 +// +// @Summary 菜单授权列表 +// @Description 菜单授权列表 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body listAdminMenuRequest true "请求信息" +// @Success 200 {object} listAdminMenuResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/menu/{id} [get] +func (h *handler) ListAdminMenu() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_login.go b/internal/api/admin/func_login.go new file mode 100755 index 0000000..983b1ac --- /dev/null +++ b/internal/api/admin/func_login.go @@ -0,0 +1,154 @@ +package admin + +import ( + "encoding/json" + "fmt" + "github.com/LLiuHuan/gin-template/configs" + "github.com/LLiuHuan/gin-template/internal/code" + "github.com/LLiuHuan/gin-template/internal/pkg/core" + "github.com/LLiuHuan/gin-template/internal/pkg/password" + "github.com/LLiuHuan/gin-template/internal/pkg/validation" + "github.com/LLiuHuan/gin-template/internal/proposal" + "github.com/LLiuHuan/gin-template/internal/repository/redis" + "github.com/LLiuHuan/gin-template/internal/services/admin" + "github.com/LLiuHuan/gin-template/pkg/errors" + "net/http" +) + +type loginRequest struct { + Username string `form:"username" json:"username" binding:"required"` // 用户名 + Password string `form:"password" json:"password" binding:"min=4,max=16,required"` // 密码 +} + +type loginResponse struct { + Token string `json:"token"` // 用户身份标识 + RefreshToken string `json:"refreshToken"` // 刷新token +} + +// Login 管理员登录 +// +// @Summary 管理员登录 +// @Description 管理员登录 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body loginRequest true "请求信息" +// @Success 200 {object} loginResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/login [post] +// +// @Security LoginToken +func (h *handler) Login() core.HandlerFunc { + return func(ctx core.Context) { + req := new(loginRequest) + res := new(loginResponse) + if err := ctx.ShouldBindJSON(req); err != nil { + fmt.Println(err) + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.ParamBindError, + code.Text(code.ParamBindError)). + WithError(validation.ErrorE(err)), + ) + return + } + + searchOneData := new(admin.SearchOneData) + searchOneData.Username = req.Username + searchOneData.Password = password.GeneratePassword(req.Password) + searchOneData.IsUsed = 1 + + info, err := h.adminService.Detail(ctx, searchOneData) + if err != nil { + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.AdminLoginError, + code.Text(code.AdminLoginError)).WithError(err), + ) + return + } + + if info == nil { + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.AdminLoginError, + code.Text(code.AdminLoginError)).WithError(errors.New("未查询出符合条件的用户")), + ) + return + } + + token := password.GenerateLoginToken(info.Id) + + // 用户信息 + sessionUserInfo := &proposal.SessionUserInfo{ + UserID: info.Id, + UserName: info.Username, + } + + // 将用户信息记录到 Redis 中 + err = h.cache.Set(configs.RedisKeyPrefixLoginUser+token, string(sessionUserInfo.Marshal()), configs.LoginSessionTTL, redis.WithTrace(ctx.Trace())) + if err != nil { + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.AdminLoginError, + code.Text(code.AdminLoginError)).WithError(err), + ) + return + } + + searchMenuData := new(admin.SearchMyMenuData) + searchMenuData.AdminId = info.Id + menu, err := h.adminService.MyMenu(ctx, searchMenuData) + if err != nil { + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.AdminLoginError, + code.Text(code.AdminLoginError)).WithError(err), + ) + return + } + + // 菜单栏信息 + menuJsonInfo, _ := json.Marshal(menu) + + // 将菜单栏信息记录到 Redis 中 + err = h.cache.Set(configs.RedisKeyPrefixLoginUser+token+":menu", string(menuJsonInfo), configs.LoginSessionTTL, redis.WithTrace(ctx.Trace())) + if err != nil { + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.AdminLoginError, + code.Text(code.AdminLoginError)).WithError(err), + ) + return + } + + searchActionData := new(admin.SearchMyActionData) + searchActionData.AdminId = info.Id + action, err := h.adminService.MyAction(ctx, searchActionData) + if err != nil { + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.AdminLoginError, + code.Text(code.AdminLoginError)).WithError(err), + ) + return + } + + // 可访问接口信息 + actionJsonInfo, _ := json.Marshal(action) + + // 将可访问接口信息记录到 Redis 中 + err = h.cache.Set(configs.RedisKeyPrefixLoginUser+token+":action", string(actionJsonInfo), configs.LoginSessionTTL, redis.WithTrace(ctx.Trace())) + if err != nil { + ctx.AbortWithError(core.Error( + http.StatusBadRequest, + code.AdminLoginError, + code.Text(code.AdminLoginError)).WithError(err), + ) + return + } + + res.Token = token + ctx.Payload(res) + } +} diff --git a/internal/api/admin/func_logout.go b/internal/api/admin/func_logout.go new file mode 100755 index 0000000..2e45cc2 --- /dev/null +++ b/internal/api/admin/func_logout.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type logoutRequest struct{} + +type logoutResponse struct{} + +// Logout 管理员登出 +// +// @Summary 管理员登出 +// @Description 管理员登出 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body logoutRequest true "请求信息" +// @Success 200 {object} logoutResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/logout [post] +func (h *handler) Logout() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_modifypassword.go b/internal/api/admin/func_modifypassword.go new file mode 100755 index 0000000..2cdf0ca --- /dev/null +++ b/internal/api/admin/func_modifypassword.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type modifyPasswordRequest struct{} + +type modifyPasswordResponse struct{} + +// ModifyPassword 修改密码 +// +// @Summary 修改密码 +// @Description 修改密码 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body modifyPasswordRequest true "请求信息" +// @Success 200 {object} modifyPasswordResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/modify_password [patch] +func (h *handler) ModifyPassword() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_modifypersonalinfo.go b/internal/api/admin/func_modifypersonalinfo.go new file mode 100755 index 0000000..4f72690 --- /dev/null +++ b/internal/api/admin/func_modifypersonalinfo.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type modifyPersonalInfoRequest struct{} + +type modifyPersonalInfoResponse struct{} + +// ModifyPersonalInfo 修改个人信息 +// +// @Summary 修改个人信息 +// @Description 修改个人信息 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body modifyPersonalInfoRequest true "请求信息" +// @Success 200 {object} modifyPersonalInfoResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/modify_personal_info [patch] +func (h *handler) ModifyPersonalInfo() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_offline.go b/internal/api/admin/func_offline.go new file mode 100755 index 0000000..3358c66 --- /dev/null +++ b/internal/api/admin/func_offline.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type offlineRequest struct{} + +type offlineResponse struct{} + +// Offline 下线管理员 +// +// @Summary 下线管理员 +// @Description 下线管理员 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body offlineRequest true "请求信息" +// @Success 200 {object} offlineResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/offline [patch] +func (h *handler) Offline() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_resetpassword.go b/internal/api/admin/func_resetpassword.go new file mode 100755 index 0000000..509a680 --- /dev/null +++ b/internal/api/admin/func_resetpassword.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type resetPasswordRequest struct{} + +type resetPasswordResponse struct{} + +// ResetPassword 重置密码 +// +// @Summary 重置密码 +// @Description 重置密码 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body resetPasswordRequest true "请求信息" +// @Success 200 {object} resetPasswordResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/reset_password/{id} [patch] +func (h *handler) ResetPassword() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/func_updateused.go b/internal/api/admin/func_updateused.go new file mode 100755 index 0000000..245d131 --- /dev/null +++ b/internal/api/admin/func_updateused.go @@ -0,0 +1,26 @@ +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type updateUsedRequest struct{} + +type updateUsedResponse struct{} + +// UpdateUsed 更新管理员为启用/禁用 +// +// @Summary 更新管理员为启用/禁用 +// @Description 更新管理员为启用/禁用 +// @Tags API.admin +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body updateUsedRequest true "请求信息" +// @Success 200 {object} updateUsedResponse +// @Failure 400 {object} code.Failure +// @Router /api/admin/used [patch] +func (h *handler) UpdateUsed() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/admin/handler.go b/internal/api/admin/handler.go new file mode 100644 index 0000000..54c8c48 --- /dev/null +++ b/internal/api/admin/handler.go @@ -0,0 +1,105 @@ +// Package admin +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-09 09:47 +package admin + +import ( + "github.com/LLiuHuan/gin-template/configs" + "github.com/LLiuHuan/gin-template/internal/pkg/core" + "github.com/LLiuHuan/gin-template/internal/repository/database" + "github.com/LLiuHuan/gin-template/internal/repository/redis" + "github.com/LLiuHuan/gin-template/internal/services/admin" + "github.com/LLiuHuan/gin-template/pkg/hash" + + "go.uber.org/zap" +) + +var _ Handler = (*handler)(nil) + +type Handler interface { + i() + + // Login 管理员登录 + // @Tags API.admin + // @Router /api/v1/login [post] + Login() core.HandlerFunc + + // Logout 管理员登出 + // @Tags API.admin + // @Router /api/v1/admin/logout [post] + Logout() core.HandlerFunc + + // ModifyPassword 修改密码 + // @Tags API.admin + // @Router /api/v1/admin/modify_password [patch] + ModifyPassword() core.HandlerFunc + + // Detail 个人信息 + // @Tags API.admin + // @Router /api/v1/admin/info [get] + Detail() core.HandlerFunc + + // ModifyPersonalInfo 修改个人信息 + // @Tags API.admin + // @Router /api/v1/admin/modify_personal_info [patch] + ModifyPersonalInfo() core.HandlerFunc + + // Create 新增管理员 + // @Tags API.admin + // @Router /api/v1/admin [post] + Create() core.HandlerFunc + + // List 管理员列表 + // @Tags API.admin + // @Router /api/v1/admin [get] + List() core.HandlerFunc + + // Delete 删除管理员 + // @Tags API.admin + // @Router /api/v1/admin/{id} [delete] + Delete() core.HandlerFunc + + // Offline 下线管理员 + // @Tags API.admin + // @Router /api/v1/admin/offline [patch] + Offline() core.HandlerFunc + + // UpdateUsed 更新管理员为启用/禁用 + // @Tags API.admin + // @Router /api/v1/admin/used [patch] + UpdateUsed() core.HandlerFunc + + // ResetPassword 重置密码 + // @Tags API.admin + // @Router /api/v1/admin/reset_password/{id} [patch] + ResetPassword() core.HandlerFunc + + // CreateAdminMenu 提交菜单授权 + // @Tags API.admin + // @Router /api/v1/admin/menu [post] + CreateAdminMenu() core.HandlerFunc + + // ListAdminMenu 菜单授权列表 + // @Tags API.admin + // @Router /api/v1/admin/menu/{id} [get] + ListAdminMenu() core.HandlerFunc +} + +type handler struct { + logger *zap.Logger + cache redis.Repo + hashids hash.Hash + adminService admin.Service +} + +func New(logger *zap.Logger, db database.Repo, cache redis.Repo) Handler { + return &handler{ + logger: logger, + cache: cache, + hashids: hash.New(configs.Get().HashIds.Alphabet, configs.Get().HashIds.MinLength, configs.Get().HashIds.BlockList), + adminService: admin.New(db, cache), + } +} + +func (h *handler) i() {} diff --git a/internal/api/cron/func_create.go b/internal/api/cron/func_create.go index 0e631f9..eb142ac 100755 --- a/internal/api/cron/func_create.go +++ b/internal/api/cron/func_create.go @@ -31,15 +31,16 @@ type createResponse struct { } // Create 创建任务 -// @Summary 创建任务 -// @Description 创建任务 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body createRequest true "请求信息" -// @Success 200 {object} createResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron [post] +// +// @Summary 创建任务 +// @Description 创建任务 +// @Tags API.cron +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body createRequest true "请求信息" +// @Success 200 {object} createResponse +// @Failure 400 {object} code.Failure +// @Router /api/cron [post] func (h *handler) Create() core.HandlerFunc { return func(ctx core.Context) { req := new(createRequest) diff --git a/internal/api/cron/func_detail.go b/internal/api/cron/func_detail.go index 3c30d33..5e44ff2 100755 --- a/internal/api/cron/func_detail.go +++ b/internal/api/cron/func_detail.go @@ -33,15 +33,16 @@ type detailResponse struct { } // Detail 获取单条任务详情 -// @Summary 获取单条任务详情 -// @Description 获取单条任务详情 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body detailRequest true "请求信息" -// @Success 200 {object} detailResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/{id} [get] +// +// @Summary 获取单条任务详情 +// @Description 获取单条任务详情 +// @Tags API.cron +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body detailRequest true "请求信息" +// @Success 200 {object} detailResponse +// @Failure 400 {object} code.Failure +// @Router /api/cron/{id} [get] func (h *handler) Detail() core.HandlerFunc { return func(ctx core.Context) { req := new(detailRequest) diff --git a/internal/api/cron/func_execute.go b/internal/api/cron/func_execute.go index 8fb252a..888ff6f 100755 --- a/internal/api/cron/func_execute.go +++ b/internal/api/cron/func_execute.go @@ -19,15 +19,16 @@ type executeResponse struct { } // Execute 手动执行任务 -// @Summary 手动执行任务 -// @Description 手动执行任务 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body executeRequest true "请求信息" -// @Success 200 {object} executeResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/exec/{id} [patch] +// +// @Summary 手动执行任务 +// @Description 手动执行任务 +// @Tags API.cron +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body executeRequest true "请求信息" +// @Success 200 {object} executeResponse +// @Failure 400 {object} code.Failure +// @Router /api/cron/exec/{id} [patch] func (h *handler) Execute() core.HandlerFunc { return func(ctx core.Context) { req := new(executeRequest) diff --git a/internal/api/cron/func_list.go b/internal/api/cron/func_list.go index cdc3e42..92944a0 100755 --- a/internal/api/cron/func_list.go +++ b/internal/api/cron/func_list.go @@ -54,15 +54,16 @@ type listResponse struct { } // List 任务列表 -// @Summary 任务列表 -// @Description 任务列表 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body listRequest true "请求信息" -// @Success 200 {object} listResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron [get] +// +// @Summary 任务列表 +// @Description 任务列表 +// @Tags API.cron +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body listRequest true "请求信息" +// @Success 200 {object} listResponse +// @Failure 400 {object} code.Failure +// @Router /api/cron [get] func (h *handler) List() core.HandlerFunc { return func(ctx core.Context) { req := new(listRequest) diff --git a/internal/api/cron/func_modify.go b/internal/api/cron/func_modify.go index 011d646..1b78319 100755 --- a/internal/api/cron/func_modify.go +++ b/internal/api/cron/func_modify.go @@ -28,19 +28,20 @@ type modifyRequest struct { } type modifyResponse struct { - Id int32 `json:"id"` // 主键ID + Id int `json:"id"` // 主键ID } // Modify 编辑任务 -// @Summary 编辑任务 -// @Description 编辑任务 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body modifyRequest true "请求信息" -// @Success 200 {object} modifyResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/{id} [post] +// +// @Summary 编辑任务 +// @Description 编辑任务 +// @Tags API.cron +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body modifyRequest true "请求信息" +// @Success 200 {object} modifyResponse +// @Failure 400 {object} code.Failure +// @Router /api/cron/{id} [post] func (h *handler) Modify() core.HandlerFunc { return func(ctx core.Context) { req := new(modifyRequest) @@ -64,7 +65,7 @@ func (h *handler) Modify() core.HandlerFunc { return } - id := int32(ids[0]) + id := int(ids[0]) modifyData := new(cron.ModifyCronTaskData) modifyData.Name = req.Name diff --git a/internal/api/cron/func_updateused.go b/internal/api/cron/func_updateused.go index fa01978..bf8d0ed 100755 --- a/internal/api/cron/func_updateused.go +++ b/internal/api/cron/func_updateused.go @@ -18,15 +18,16 @@ type updateUsedResponse struct { } // UpdateUsed 更新任务为启用/禁用 -// @Summary 更新任务为启用/禁用 -// @Description 更新任务为启用/禁用 -// @Tags API.cron -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body updateUsedRequest true "请求信息" -// @Success 200 {object} updateUsedResponse -// @Failure 400 {object} code.Failure -// @Router /api/cron/used [patch] +// +// @Summary 更新任务为启用/禁用 +// @Description 更新任务为启用/禁用 +// @Tags API.cron +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body updateUsedRequest true "请求信息" +// @Success 200 {object} updateUsedResponse +// @Failure 400 {object} code.Failure +// @Router /api/cron/used [patch] func (h *handler) UpdateUsed() core.HandlerFunc { return func(ctx core.Context) { req := new(updateUsedRequest) diff --git a/internal/api/helper/func_md5.go b/internal/api/helper/func_md5.go index 050dbef..af5abf5 100755 --- a/internal/api/helper/func_md5.go +++ b/internal/api/helper/func_md5.go @@ -20,15 +20,16 @@ type md5Response struct { } // Md5 加密 -// @Summary 加密 -// @Description 加密 -// @Tags Helper -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body md5Request true "请求信息" -// @Success 200 {object} md5Response -// @Failure 400 {object} code.Failure -// @Router /helper/md5/{str} [get] +// +// @Summary 加密 +// @Description 加密 +// @Tags Helper +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body md5Request true "请求信息" +// @Success 200 {object} md5Response +// @Failure 400 {object} code.Failure +// @Router /helper/md5/{str} [get] func (h *handler) Md5() core.HandlerFunc { return func(ctx core.Context) { req := new(md5Request) diff --git a/internal/api/helper/func_sign.go b/internal/api/helper/func_sign.go index b6daef9..6962675 100755 --- a/internal/api/helper/func_sign.go +++ b/internal/api/helper/func_sign.go @@ -25,15 +25,16 @@ type signResponse struct { } // Sign 签名 -// @Summary 签名 -// @Description 签名 -// @Tags Helper -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body signRequest true "请求信息" -// @Success 200 {object} signResponse -// @Failure 400 {object} code.Failure -// @Router /helper/sign [post] +// +// @Summary 签名 +// @Description 签名 +// @Tags Helper +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body signRequest true "请求信息" +// @Success 200 {object} signResponse +// @Failure 400 {object} code.Failure +// @Router /helper/sign [post] func (h *handler) Sign() core.HandlerFunc { return func(ctx core.Context) { req := new(signRequest) diff --git a/internal/api/tool/func_clearcache.go b/internal/api/tool/func_clearcache.go new file mode 100755 index 0000000..c00a50e --- /dev/null +++ b/internal/api/tool/func_clearcache.go @@ -0,0 +1,26 @@ +package tool + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type clearCacheRequest struct{} + +type clearCacheResponse struct{} + +// ClearCache 清空缓存 +// +// @Summary 清空缓存 +// @Description 清空缓存 +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body clearCacheRequest true "请求信息" +// @Success 200 {object} clearCacheResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/cache/clear [patch] +func (h *handler) ClearCache() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/tool/func_dbs.go b/internal/api/tool/func_dbs.go new file mode 100755 index 0000000..5376965 --- /dev/null +++ b/internal/api/tool/func_dbs.go @@ -0,0 +1,26 @@ +package tool + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type dbsRequest struct{} + +type dbsResponse struct{} + +// Dbs 查询 DB +// +// @Summary 查询 DB +// @Description 查询 DB +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body dbsRequest true "请求信息" +// @Success 200 {object} dbsResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/data/dbs [get] +func (h *handler) Dbs() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/tool/func_hashidsdecode.go b/internal/api/tool/func_hashidsdecode.go new file mode 100755 index 0000000..85ad377 --- /dev/null +++ b/internal/api/tool/func_hashidsdecode.go @@ -0,0 +1,26 @@ +package tool + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type hashIdsDecodeRequest struct{} + +type hashIdsDecodeResponse struct{} + +// HashIdsDecode HashIds 解密 +// +// @Summary HashIds 解密 +// @Description HashIds 解密 +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body hashIdsDecodeRequest true "请求信息" +// @Success 200 {object} hashIdsDecodeResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/hashids/decode/{id} [get] +func (h *handler) HashIdsDecode() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/tool/func_hashidsencode.go b/internal/api/tool/func_hashidsencode.go new file mode 100755 index 0000000..2c814bf --- /dev/null +++ b/internal/api/tool/func_hashidsencode.go @@ -0,0 +1,26 @@ +package tool + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type hashIdsEncodeRequest struct{} + +type hashIdsEncodeResponse struct{} + +// HashIdsEncode HashIds 加密 +// +// @Summary HashIds 加密 +// @Description HashIds 加密 +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body hashIdsEncodeRequest true "请求信息" +// @Success 200 {object} hashIdsEncodeResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/hashids/encode/{id} [get] +func (h *handler) HashIdsEncode() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/tool/func_projectinfo.go b/internal/api/tool/func_projectinfo.go new file mode 100755 index 0000000..7eb959a --- /dev/null +++ b/internal/api/tool/func_projectinfo.go @@ -0,0 +1,123 @@ +package tool + +import ( + "fmt" + "os" + "runtime" + "strconv" + "strings" + "time" + + "github.com/LLiuHuan/gin-template/configs" + "github.com/LLiuHuan/gin-template/internal/pkg/core" + "github.com/LLiuHuan/gin-template/pkg/currency" + "github.com/LLiuHuan/gin-template/pkg/env" + + "github.com/shirou/gopsutil/v4/cpu" + "github.com/shirou/gopsutil/v4/disk" + "github.com/shirou/gopsutil/v4/host" + "github.com/shirou/gopsutil/v4/mem" + "github.com/spf13/cast" +) + +type projectInfoRequest struct{} + +type projectInfoResponse struct { + MemTotal string // 内存总量 + MemUsed string // 内存使用量 + MemUsedPercent float64 // 内存使用率 + + DiskTotal string // 磁盘总量 + DiskUsed string // 磁盘使用量 + DiskUsedPercent float64 // 磁盘使用率 + + HostOS string // 操作系统 + HostName string // 主机名 + + CpuName string // CPU 名称 + CpuCores int32 // CPU 核数 + CpuUsedPercent float64 // CPU 使用率 + + GoPath string // GoPath + GoVersion string // Go 版本 + Goroutine int // Goroutine 数量 + ProjectPath string // 项目路径 + Env string // 运行环境 + Host string // 主机地址 + GoOS string // GoOS + GoArch string // GoArch + + ProjectVersion string // 项目版本 + DatabaseVersion string // 数据库版本 + RedisVersion string // Redis 版本 +} + +// ProjectInfo 项目基础信息 +// +// @Summary 项目基础信息 +// @Description 项目基础信息 +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body projectInfoRequest true "请求信息" +// @Success 200 {object} projectInfoResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/project/info [get] +func (h *handler) ProjectInfo() core.HandlerFunc { + type mysqlVersion struct { + Ver string + } + + databaseVer := new(mysqlVersion) + if h.db != nil { + h.db.GetDB().Raw("SELECT version() as ver").Scan(databaseVer) + } + + redisVer := "" + if h.cache != nil { + redisVer = h.cache.Version() + } + return func(ctx core.Context) { + memInfo, _ := mem.VirtualMemory() + diskInfo, _ := disk.Usage("/") + hostInfo, _ := host.Info() + cpuInfo, _ := cpu.Info() + cpuPercent, _ := cpu.Percent(time.Microsecond, false) + + obj := new(projectInfoResponse) + obj.MemTotal = currency.FormatFileSize(cast.ToInt64(memInfo.Total)) + obj.MemUsed = currency.FormatFileSize(cast.ToInt64(memInfo.Used)) + obj.MemUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", memInfo.UsedPercent), 64) + + obj.DiskTotal = currency.FormatFileSize(cast.ToInt64(diskInfo.Total)) + obj.DiskUsed = currency.FormatFileSize(cast.ToInt64(diskInfo.Used)) + obj.DiskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", diskInfo.UsedPercent), 64) + + obj.HostOS = fmt.Sprintf("%s(%s) %s", hostInfo.Platform, hostInfo.PlatformFamily, hostInfo.PlatformVersion) + obj.HostName = hostInfo.Hostname + + if len(cpuInfo) > 0 { + obj.CpuName = cpuInfo[0].ModelName + obj.CpuCores = cpuInfo[0].Cores + } + + if len(cpuPercent) > 0 { + obj.CpuUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", cpuPercent[0]), 64) + } + + obj.GoPath = runtime.GOROOT() + obj.GoVersion = runtime.Version() + obj.Goroutine = runtime.NumGoroutine() + dir, _ := os.Getwd() + obj.ProjectPath = strings.Replace(dir, "\\", "/", -1) + obj.Host = ctx.Host() + obj.Env = env.Active().Value() + obj.GoOS = runtime.GOOS + obj.GoArch = runtime.GOARCH + obj.ProjectVersion = configs.ProjectVersion + obj.DatabaseVersion = databaseVer.Ver + obj.RedisVersion = redisVer + + ctx.Payload(obj) + } +} diff --git a/internal/api/tool/func_searchcache.go b/internal/api/tool/func_searchcache.go new file mode 100755 index 0000000..197ebf9 --- /dev/null +++ b/internal/api/tool/func_searchcache.go @@ -0,0 +1,26 @@ +package tool + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type searchCacheRequest struct{} + +type searchCacheResponse struct{} + +// SearchCache 查询缓存 +// +// @Summary 查询缓存 +// @Description 查询缓存 +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body searchCacheRequest true "请求信息" +// @Success 200 {object} searchCacheResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/cache/search [post] +func (h *handler) SearchCache() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/tool/func_searchmysql.go b/internal/api/tool/func_searchmysql.go new file mode 100755 index 0000000..a25ff2d --- /dev/null +++ b/internal/api/tool/func_searchmysql.go @@ -0,0 +1,26 @@ +package tool + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type searchMySQLRequest struct{} + +type searchMySQLResponse struct{} + +// SearchMySQL 执行 SQL 语句 +// +// @Summary 执行 SQL 语句 +// @Description 执行 SQL 语句 +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body searchMySQLRequest true "请求信息" +// @Success 200 {object} searchMySQLResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/data/mysql [post] +func (h *handler) SearchMySQL() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/api/tool/func_tables.go b/internal/api/tool/func_tables.go new file mode 100755 index 0000000..d0cb966 --- /dev/null +++ b/internal/api/tool/func_tables.go @@ -0,0 +1,26 @@ +package tool + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" +) + +type tablesRequest struct{} + +type tablesResponse struct{} + +// Tables 查询 Table +// +// @Summary 查询 Table +// @Description 查询 Table +// @Tags API.tool +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body tablesRequest true "请求信息" +// @Success 200 {object} tablesResponse +// @Failure 400 {object} code.Failure +// @Router /api/v1/tool/data/tables [post] +func (h *handler) Tables() core.HandlerFunc { + return func(ctx core.Context) { + + } +} diff --git a/internal/code/en-us.go b/internal/code/en-us.go index 7e15616..1752817 100644 --- a/internal/code/en-us.go +++ b/internal/code/en-us.go @@ -1,8 +1,9 @@ // Package code -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 22:43 -// @description: 英文错误码 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 22:43 +// @description: 英文错误码 package code var enUSText = map[int]string{ diff --git a/internal/code/zh-cn.go b/internal/code/zh-cn.go index b0e6b50..feecb66 100644 --- a/internal/code/zh-cn.go +++ b/internal/code/zh-cn.go @@ -1,8 +1,9 @@ // Package code -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 22:43 -// @description: 中文错误码 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 22:43 +// @description: 中文错误码 package code var zhCNText = map[int]string{ diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 985339c..7a61f4d 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -1,8 +1,9 @@ // Package metrics -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 22:45 -// @description: 指标 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 22:45 +// @description: 指标 package metrics import ( diff --git a/internal/pkg/core/middleware_cors.go b/internal/pkg/core/middleware_cors.go index 547dde6..17f96ab 100644 --- a/internal/pkg/core/middleware_cors.go +++ b/internal/pkg/core/middleware_cors.go @@ -1,8 +1,9 @@ // Package core -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 17:28 -// @description: 跨域请求处理 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 17:28 +// @description: 跨域请求处理 package core import ( diff --git a/internal/pkg/core/middleware_recover.go b/internal/pkg/core/middleware_recover.go index 2ecfad6..6fb922f 100644 --- a/internal/pkg/core/middleware_recover.go +++ b/internal/pkg/core/middleware_recover.go @@ -1,8 +1,9 @@ // Package core -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 17:31 -// @description: 恢复panic +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 17:31 +// @description: 恢复panic package core import ( diff --git a/internal/pkg/core/middleware_trace.go b/internal/pkg/core/middleware_trace.go index 21436d4..71331a3 100644 --- a/internal/pkg/core/middleware_trace.go +++ b/internal/pkg/core/middleware_trace.go @@ -1,8 +1,9 @@ // Package core -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 17:34 -// @description: 链路追踪 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 17:34 +// @description: 链路追踪 package core import ( diff --git a/internal/pkg/core/mux.go b/internal/pkg/core/mux.go index 4d42aad..7a00794 100644 --- a/internal/pkg/core/mux.go +++ b/internal/pkg/core/mux.go @@ -1,8 +1,9 @@ // Package core -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 14:36 -// @description: 多路复用器 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 14:36 +// @description: 多路复用器 package core import ( diff --git a/internal/pkg/core/router.go b/internal/pkg/core/router.go index 116867a..fd56d9c 100644 --- a/internal/pkg/core/router.go +++ b/internal/pkg/core/router.go @@ -14,6 +14,7 @@ import ( "github.com/LLiuHuan/gin-template/pkg/env" "github.com/LLiuHuan/gin-template/pkg/errors" + _ "github.com/LLiuHuan/gin-template/docs" "github.com/gin-contrib/pprof" "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus/promhttp" diff --git a/internal/pkg/password/password.go b/internal/pkg/password/password.go index 006ab54..4e8e6e0 100644 --- a/internal/pkg/password/password.go +++ b/internal/pkg/password/password.go @@ -27,7 +27,6 @@ func GeneratePassword(str string) (password string) { h := hmac.New(sha256.New, []byte(saltPassword)) h.Write(mByte) password = hex.EncodeToString(h.Sum(nil)) - return } @@ -41,7 +40,7 @@ func ResetPassword() (password string) { return } -func GenerateLoginToken(id int32) (token string) { +func GenerateLoginToken(id int) (token string) { m := md5.New() m.Write([]byte(fmt.Sprintf("%d%s", id, saltPassword))) token = hex.EncodeToString(m.Sum(nil)) diff --git a/internal/pkg/validation/validation.go b/internal/pkg/validation/validation.go index ee1f7a3..2bf8d12 100644 --- a/internal/pkg/validation/validation.go +++ b/internal/pkg/validation/validation.go @@ -5,6 +5,7 @@ package validation import ( + "errors" "fmt" "github.com/LLiuHuan/gin-template/configs" @@ -22,7 +23,6 @@ var trans ut.Translator func init() { lang := configs.Get().Project.Local - fmt.Println(lang, lang == configs.ZhCN) if lang == configs.ZhCN { trans, _ = ut.New(zh.New()).GetTranslator("zh") if err := zhTranslation.RegisterDefaultTranslations(binding.Validator.Engine().(*validator.Validate), trans); err != nil { @@ -38,13 +38,22 @@ func init() { } } -func Error(err error) (message string) { - if validationErrors, ok := err.(validator.ValidationErrors); !ok { +func validationError(err error) string { + var message string + var validationErrors validator.ValidationErrors + if !errors.As(err, &validationErrors) { return err.Error() - } else { - for _, e := range validationErrors { - message += e.Translate(trans) + ";" - } + } + for _, e := range validationErrors { + message += e.Translate(trans) + ";" } return message } + +func ErrorE(err error) error { + return errors.New(validationError(err)) +} + +func Error(err error) (message string) { + return validationError(err) +} diff --git a/internal/proposal/alter.go b/internal/proposal/alter.go index 619194e..3755514 100644 --- a/internal/proposal/alter.go +++ b/internal/proposal/alter.go @@ -1,8 +1,9 @@ // Package proposal -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:40 -// @description: 告警信息 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:40 +// @description: 告警信息 package proposal import ( diff --git a/internal/proposal/metrics.go b/internal/proposal/metrics.go index 361b4fb..4286c69 100644 --- a/internal/proposal/metrics.go +++ b/internal/proposal/metrics.go @@ -1,8 +1,9 @@ // Package proposal -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:41 -// @description: 指标信息 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:41 +// @description: 指标信息 package proposal import "encoding/json" diff --git a/internal/proposal/session.go b/internal/proposal/session.go index 978e79e..0e52039 100644 --- a/internal/proposal/session.go +++ b/internal/proposal/session.go @@ -1,8 +1,9 @@ // Package proposal -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:41 -// @description: 用户会话信息 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:41 +// @description: 用户会话信息 package proposal import "encoding/json" diff --git a/internal/repository/database/database.go b/internal/repository/database/database.go index d8cc60b..5baeaa0 100644 --- a/internal/repository/database/database.go +++ b/internal/repository/database/database.go @@ -6,6 +6,7 @@ package database import ( "fmt" + "gorm.io/gorm/schema" "strings" "time" @@ -110,6 +111,9 @@ func getDBDriver(mode string, isOpenReadDB int) (*gorm.DB, error) { gormDB, err := gorm.Open(dialector, &gorm.Config{ SkipDefaultTransaction: true, PrepareStmt: true, + NamingStrategy: schema.NamingStrategy{ + SingularTable: true, + }, }) if err != nil { return nil, err @@ -183,7 +187,7 @@ func getDsn(sqlType string, readWrite string) string { if Charset == "" { Charset = "utf8mb4" } - return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=false&loc=Local", User, Pass, Host, Port, DataBase, Charset) + return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local", User, Pass, Host, Port, DataBase, Charset) case "sqlserver", "mssql": return fmt.Sprintf("server=%s;port=%d;database=%s;user id=%s;password=%s;encrypt=disable", Host, Port, DataBase, User, Pass) case "postgresql", "postgre", "postgres": diff --git a/internal/repository/database/plugin.go b/internal/repository/database/plugin.go index e08d044..075bc70 100644 --- a/internal/repository/database/plugin.go +++ b/internal/repository/database/plugin.go @@ -1,7 +1,8 @@ // Package database -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 10:19 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 10:19 package database import ( @@ -231,8 +232,9 @@ func structHasSpecialField(fieldName string, anyStructPtr interface{}) (bool, st } // getColumnNameFromGormTag 从 gorm 标签中获取字段名 -// @defaultColumn 如果没有 gorm:column 标签为字段重命名,则使用默认字段名 -// @TagValue 字段中含有的gorm:"column:created_at" 标签值,可能的格式:1. column:created_at 、2. default:null; column:created_at 、3. column:created_at; default:null +// +// @defaultColumn 如果没有 gorm:column 标签为字段重命名,则使用默认字段名 +// @TagValue 字段中含有的gorm:"column:created_at" 标签值,可能的格式:1. column:created_at 、2. default:null; column:created_at 、3. column:created_at; default:null func getColumnNameFromGormTag(defaultColumn, TagValue string) (str string) { pos1 := strings.Index(TagValue, "column:") if pos1 == -1 { diff --git a/internal/router/interceptor/check_login.go b/internal/router/interceptor/check_login.go index b96520a..45fb3a9 100644 --- a/internal/router/interceptor/check_login.go +++ b/internal/router/interceptor/check_login.go @@ -1,8 +1,9 @@ // Package interceptor -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 15:00 -// @description: 登录拦截器 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 15:00 +// @description: 登录拦截器 package interceptor import ( diff --git a/internal/router/interceptor/check_rbac.go b/internal/router/interceptor/check_rbac.go index 2271f30..a920a0c 100644 --- a/internal/router/interceptor/check_rbac.go +++ b/internal/router/interceptor/check_rbac.go @@ -1,8 +1,9 @@ // Package interceptor -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 15:00 -// @description: 校验用户权限 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 15:00 +// @description: 校验用户权限 package interceptor import ( diff --git a/internal/router/interceptor/check_signature.go b/internal/router/interceptor/check_signature.go index f62d678..fe033b5 100644 --- a/internal/router/interceptor/check_signature.go +++ b/internal/router/interceptor/check_signature.go @@ -1,8 +1,9 @@ // Package interceptor -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 15:00 -// @description: 校验签名 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-03 15:00 +// @description: 校验签名 package interceptor import ( diff --git a/internal/router/router_api_v1.go b/internal/router/router_api_v1.go index 73f1e92..afb6357 100644 --- a/internal/router/router_api_v1.go +++ b/internal/router/router_api_v1.go @@ -5,6 +5,7 @@ package router import ( + "github.com/LLiuHuan/gin-template/internal/api/admin" "github.com/LLiuHuan/gin-template/internal/api/helper" "github.com/LLiuHuan/gin-template/internal/api/tool" "github.com/LLiuHuan/gin-template/internal/pkg/core" @@ -14,6 +15,7 @@ func setApiV1Router(r *resource) { // helper helperHandler := helper.New(r.logger, r.db, r.cache) toolHandler := tool.New(r.logger, r.db, r.cache) + adminHandler := admin.New(r.logger, r.db, r.cache) apiRouter := r.mux.Group("/api/v1") { @@ -41,16 +43,12 @@ func setApiV1Router(r *resource) { // } //} } + // 需要签名验证,无需登录验证,无需 RBAC 权限验证 + login := r.mux.Group("/api/v1", r.interceptors.CheckSignature()) + { + login.POST("/login", adminHandler.Login()) + } - //// admin - //adminHandler := admin.New(r.logger, r.db, r.cache) - // - //// 需要签名验证,无需登录验证,无需 RBAC 权限验证 - //login := r.mux.Group("/api", r.interceptors.CheckSignature()) - //{ - // login.POST("/login", adminHandler.Login()) - //} - // //// 需要签名验证、登录验证,无需 RBAC 权限验证 //notRBAC := r.mux.Group("/api", core.WrapAuthHandler(r.interceptors.CheckLogin), r.interceptors.CheckSignature()) //{ diff --git a/internal/services/admin/service.go b/internal/services/admin/service.go new file mode 100644 index 0000000..6c340c7 --- /dev/null +++ b/internal/services/admin/service.go @@ -0,0 +1,47 @@ +// Package admin +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-09 09:47 +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" + "github.com/LLiuHuan/gin-template/internal/repository/database" + "github.com/LLiuHuan/gin-template/internal/repository/database/admin" + "github.com/LLiuHuan/gin-template/internal/repository/redis" +) + +var _ Service = (*service)(nil) + +type Service interface { + i() + + //Create(ctx core.Context, adminData *CreateAdminData) (id int32, err error) + //PageList(ctx core.Context, searchData *SearchData) (listData []*admin.Admin, err error) + //PageListCount(ctx core.Context, searchData *SearchData) (total int64, err error) + //UpdateUsed(ctx core.Context, id int32, used int32) (err error) + //Delete(ctx core.Context, id int32) (err error) + Detail(ctx core.Context, searchOneData *SearchOneData) (info *admin.Admin, err error) + //ResetPassword(ctx core.Context, id int32) (err error) + //ModifyPassword(ctx core.Context, id int32, newPassword string) (err error) + //ModifyPersonalInfo(ctx core.Context, id int32, modifyData *ModifyData) (err error) + + //CreateMenu(ctx core.Context, menuData *CreateMenuData) (err error) + //ListMenu(ctx core.Context, searchData *SearchListMenuData) (menuData []ListMenuData, err error) + MyMenu(ctx core.Context, searchData *SearchMyMenuData) (menuData []ListMyMenuData, err error) + MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []MyActionData, err error) +} + +type service struct { + db database.Repo + cache redis.Repo +} + +func New(db database.Repo, cache redis.Repo) Service { + return &service{ + db: db, + cache: cache, + } +} + +func (s *service) i() {} diff --git a/internal/services/admin/service_detail.go b/internal/services/admin/service_detail.go new file mode 100644 index 0000000..b34c217 --- /dev/null +++ b/internal/services/admin/service_detail.go @@ -0,0 +1,57 @@ +// Package admin +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-09 10:03 +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" + "github.com/LLiuHuan/gin-template/internal/repository/database" + "github.com/LLiuHuan/gin-template/internal/repository/database/admin" +) + +type SearchOneData struct { + Id int // 用户ID + Username string // 用户名 + Nickname string // 昵称 + Mobile string // 手机号 + Password string // 密码 + IsUsed int32 // 是否启用 1:是 -1:否 +} + +func (s *service) Detail(ctx core.Context, searchOneData *SearchOneData) (info *admin.Admin, err error) { + + qb := admin.NewQueryBuilder() + qb.WhereIsDeleted(database.EqualPredicate, -1) + + if searchOneData.Id != 0 { + qb.WhereId(database.EqualPredicate, searchOneData.Id) + } + + if searchOneData.Username != "" { + qb.WhereUsername(database.EqualPredicate, searchOneData.Username) + } + + if searchOneData.Nickname != "" { + qb.WhereNickname(database.EqualPredicate, searchOneData.Nickname) + } + + if searchOneData.Mobile != "" { + qb.WhereMobile(database.EqualPredicate, searchOneData.Mobile) + } + + if searchOneData.Password != "" { + qb.WherePassword(database.EqualPredicate, searchOneData.Password) + } + + if searchOneData.IsUsed != 0 { + qb.WhereIsUsed(database.EqualPredicate, searchOneData.IsUsed) + } + + info, err = qb.QueryOne(s.db.GetDB().WithContext(ctx.RequestContext())) + if err != nil { + return nil, err + } + + return +} diff --git a/internal/services/admin/service_myaction.go b/internal/services/admin/service_myaction.go new file mode 100644 index 0000000..94d6997 --- /dev/null +++ b/internal/services/admin/service_myaction.go @@ -0,0 +1,73 @@ +// Package admin +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-09 10:00 +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" + "github.com/LLiuHuan/gin-template/internal/repository/database" + "github.com/LLiuHuan/gin-template/internal/repository/database/admin_menu" + "github.com/LLiuHuan/gin-template/internal/repository/database/menu_action" +) + +type SearchMyActionData struct { + AdminId int `json:"admin_id"` // 管理员ID +} + +type MyActionData struct { + Id int // 主键 + MenuId int // 菜单栏ID + Method string // 请求方式 + Api string // 请求地址 +} + +func (s *service) MyAction(ctx core.Context, searchData *SearchMyActionData) (actionData []MyActionData, err error) { + adminMenuQb := admin_menu.NewQueryBuilder() + if searchData.AdminId != 0 { + adminMenuQb.WhereAdminId(database.EqualPredicate, searchData.AdminId) + } + + adminMenuListData, err := adminMenuQb. + OrderById(false). + QueryAll(s.db.GetDB().WithContext(ctx.RequestContext())) + if err != nil { + return nil, err + } + + if len(adminMenuListData) <= 0 { + return + } + + var menuIds []int + for _, v := range adminMenuListData { + menuIds = append(menuIds, v.MenuId) + } + + actionQb := menu_action.NewQueryBuilder() + actionQb.WhereIsDeleted(database.EqualPredicate, -1) + actionQb.WhereMenuIdIn(menuIds) + actionListData, err := actionQb.QueryAll(s.db.GetDB().WithContext(ctx.RequestContext())) + if err != nil { + return nil, err + } + + if len(actionListData) <= 0 { + return + } + + actionData = make([]MyActionData, len(actionListData)) + + for k, v := range actionListData { + data := MyActionData{ + Id: v.Id, + MenuId: v.MenuId, + Method: v.Method, + Api: v.Api, + } + + actionData[k] = data + } + + return +} diff --git a/internal/services/admin/service_mycation.go b/internal/services/admin/service_mycation.go deleted file mode 100644 index 0c7b3ef..0000000 --- a/internal/services/admin/service_mycation.go +++ /dev/null @@ -1,16 +0,0 @@ -// Package admin -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-03 15:02 -package admin - -type SearchMyActionData struct { - AdminId int `json:"admin_id"` // 管理员ID -} - -type MyActionData struct { - Id int // 主键 - MenuId int // 菜单栏ID - Method string // 请求方式 - Api string // 请求地址 -} diff --git a/internal/services/admin/service_mymenu.go b/internal/services/admin/service_mymenu.go new file mode 100644 index 0000000..bc13ce7 --- /dev/null +++ b/internal/services/admin/service_mymenu.go @@ -0,0 +1,73 @@ +// Package admin +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-09 15:07 +package admin + +import ( + "github.com/LLiuHuan/gin-template/internal/pkg/core" + "github.com/LLiuHuan/gin-template/internal/repository/database" + "github.com/LLiuHuan/gin-template/internal/repository/database/admin_menu" + "github.com/LLiuHuan/gin-template/internal/repository/database/menu" +) + +type SearchMyMenuData struct { + AdminId int `json:"admin_id"` // 管理员ID +} + +type ListMyMenuData struct { + Id int `json:"id"` // ID + Pid int `json:"pid"` // 父类ID + Name string `json:"name"` // 菜单名称 + Link string `json:"link"` // 链接地址 + Icon string `json:"icon"` // 图标 +} + +func (s *service) MyMenu(ctx core.Context, searchData *SearchMyMenuData) (menuData []ListMyMenuData, err error) { + adminMenuQb := admin_menu.NewQueryBuilder() + if searchData.AdminId != 0 { + adminMenuQb.WhereAdminId(database.EqualPredicate, searchData.AdminId) + } + + adminMenuListData, err := adminMenuQb. + OrderById(false). + QueryAll(s.db.GetDB().WithContext(ctx.RequestContext())) + if err != nil { + return nil, err + } + + if len(adminMenuListData) <= 0 { + return + } + + menuQb := menu.NewQueryBuilder() + menuQb.WhereIsDeleted(database.EqualPredicate, -1) + menuListData, err := menuQb. + OrderBySort(true). + QueryAll(s.db.GetDB().WithContext(ctx.RequestContext())) + if err != nil { + return nil, err + } + + if len(menuListData) <= 0 { + return + } + + for _, menuAllV := range menuListData { + for _, v := range adminMenuListData { + if menuAllV.Id == v.MenuId { + data := ListMyMenuData{ + Id: menuAllV.Id, + Pid: menuAllV.Pid, + Name: menuAllV.Name, + Link: menuAllV.Link, + Icon: menuAllV.Icon, + } + + menuData = append(menuData, data) + } + } + } + + return +} diff --git a/internal/websocket/install/func_install.go b/internal/websocket/install/func_install.go index d1001eb..3fe4145 100755 --- a/internal/websocket/install/func_install.go +++ b/internal/websocket/install/func_install.go @@ -40,15 +40,16 @@ type installRequest struct { type installResponse struct{} // Install 安装 -// @Summary 安装 -// @Description 安装 -// @Tags API.install -// @Accept application/x-www-form-urlencoded -// @Produce json -// @Param Request body installRequest true "请求信息" -// @Success 200 {object} installResponse -// @Failure 400 {object} code.Failure -// @Router /v1/api/install [post] +// +// @Summary 安装 +// @Description 安装 +// @Tags API.install +// @Accept application/x-www-form-urlencoded +// @Produce json +// @Param Request body installRequest true "请求信息" +// @Success 200 {object} installResponse +// @Failure 400 {object} code.Failure +// @Router /v1/api/install [post] func (h *handler) Install() core.HandlerFunc { installTableList := map[string]map[string]string{ "authorized": { diff --git a/main.go b/main.go index fbac932..223089d 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,8 @@ // Package gin_template -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 18:07 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 18:07 package main import ( @@ -25,20 +26,20 @@ func init() { } -// @title swagger 接口文档 -// @version 2.0 -// @description +// @title swagger 接口文档 +// @version 2.0 +// @description -// @contact.name -// @contact.url -// @contact.email +// @contact.name +// @contact.url +// @contact.email -// @license.name MIT -// @license.url https://github.com/LLiuHuan/gin-template/blob/master/LICENSE +// @license.name MIT +// @license.url https://github.com/LLiuHuan/gin-template/blob/master/LICENSE -// @securityDefinitions.apikey LoginToken -// @in header -// @name token +// @securityDefinitions.apikey LoginToken +// @in header +// @name token func main() { accessLogger, err := logger.NewJSONLogger( logger.WithDisableConsole(), diff --git a/pkg/browser/browser.go b/pkg/browser/browser.go index aa6e28a..99768e1 100644 --- a/pkg/browser/browser.go +++ b/pkg/browser/browser.go @@ -1,8 +1,9 @@ // Package browser -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:53 -// @description: 使用浏览器打开指定的 URL +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:53 +// @description: 使用浏览器打开指定的 URL package browser import ( diff --git a/pkg/color/string_darwin.go b/pkg/color/string_darwin.go index a55c4e8..2ddd28b 100644 --- a/pkg/color/string_darwin.go +++ b/pkg/color/string_darwin.go @@ -1,10 +1,11 @@ //go:build darwin // Package color -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:54 -// @description: Darwin颜色 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:54 +// @description: Darwin颜色 package color import ( diff --git a/pkg/color/string_linux.go b/pkg/color/string_linux.go index 76f84c2..ca894ed 100644 --- a/pkg/color/string_linux.go +++ b/pkg/color/string_linux.go @@ -1,10 +1,11 @@ //go:build linux // Package color -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:54 -// @description: Linux颜色 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:54 +// @description: Linux颜色 package color import ( diff --git a/pkg/color/string_windows.go b/pkg/color/string_windows.go index 2c48def..59f8989 100644 --- a/pkg/color/string_windows.go +++ b/pkg/color/string_windows.go @@ -1,10 +1,11 @@ //go:build windows // Package color -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:55 -// @description: Windows颜色 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:55 +// @description: Windows颜色 package color import ( diff --git a/pkg/currency/currency.go b/pkg/currency/currency.go index b1d81a6..8f48819 100644 --- a/pkg/currency/currency.go +++ b/pkg/currency/currency.go @@ -6,74 +6,171 @@ package currency import ( "fmt" + "math" "strconv" "strings" ) -// FormatFileSize 字节的单位转换 保留两位小数 -func FormatFileSize(fileSize int64) (size string) { - if fileSize < 1<<10 { - //return strconv.FormatInt(fileSize, 10) + "B" - return fmt.Sprintf("%.2f B", float64(fileSize)/float64(1)) - } else if fileSize < 1<<20 { - return fmt.Sprintf("%.2f KB", float64(fileSize)/float64(1<<10)) - } else if fileSize < 1<<30 { - return fmt.Sprintf("%.2f MB", float64(fileSize)/float64(1<<20)) - } else if fileSize < 1<<40 { - return fmt.Sprintf("%.2f GB", float64(fileSize)/float64(1<<30)) - } else if fileSize < 1<<50 { - return fmt.Sprintf("%.2f TB", float64(fileSize)/float64(1<<40)) - } else if fileSize < 1<<60 { - return fmt.Sprintf("%.2f EB", float64(fileSize)/float64(1<<50)) - } else { //if fileSize < (1000 * 1000 * 1000 * 1000 * 1000 * 1000) - return fmt.Sprintf("%.2f ZB", float64(fileSize)/float64(1<<60)) +// FormatFileSize 字节的单位转换 保留两位小数, 基数是1024 +func FormatFileSize(fileSize int64) string { + units := []struct { + threshold int64 + format string + }{ + {1 << 10, "%.2f B"}, + {1 << 20, "%.2f KB"}, + {1 << 30, "%.2f MB"}, + {1 << 40, "%.2f GB"}, + {1 << 50, "%.2f TB"}, + {1 << 60, "%.2f EB"}, + {math.MaxInt64, "%.2f ZB"}, } + + var unit string + var value float64 + + for _, u := range units { + if fileSize < u.threshold { + unit = u.format + value = float64(fileSize) / float64(u.threshold>>10) + break + } + } + + return strings.ReplaceAll(fmt.Sprintf(unit, value), ".00", "") } // ReversalFileSize 字节的单位转换 保留两位小数 + func ReversalFileSize(fileSize string) (size float64) { - if strings.HasSuffix(fileSize, "KB") { - float, err := strconv.ParseFloat(strings.Replace(fileSize, "KB", "", -1), 64) - if err != nil { - return 0 + units := []struct { + suffix string + multiplier float64 + }{ + {"KB", float64(1 << 10)}, + {"MB", float64(1 << 20)}, + {"GB", float64(1 << 30)}, + {"TB", float64(1 << 40)}, + {"EB", float64(1 << 50)}, + {"ZB", float64(1 << 60)}, + {"B", float64(1)}, + } + + for _, unit := range units { + if strings.HasSuffix(fileSize, unit.suffix) { + value, err := strconv.ParseFloat(strings.TrimSpace(strings.TrimSuffix(fileSize, unit.suffix)), 64) + if err != nil { + return 0 + } + size = value * unit.multiplier + break } - size = float * float64(1<<10) - } else if strings.HasSuffix(fileSize, "MB") { - float, err := strconv.ParseFloat(strings.Replace(fileSize, "MB", "", -1), 64) - if err != nil { - return 0 - } - size = float * float64(1<<20) - } else if strings.HasSuffix(fileSize, "GB") { - float, err := strconv.ParseFloat(strings.Replace(fileSize, "GB", "", -1), 64) - if err != nil { - return 0 - } - size = float * float64(1<<30) - } else if strings.HasSuffix(fileSize, "TB") { - float, err := strconv.ParseFloat(strings.Replace(fileSize, "TB", "", -1), 64) - if err != nil { - return 0 - } - size = float * float64(1<<40) - } else if strings.HasSuffix(fileSize, "EB") { - float, err := strconv.ParseFloat(strings.Replace(fileSize, "EB", "", -1), 64) - if err != nil { - return 0 - } - size = float * float64(1<<50) - } else if strings.HasSuffix(fileSize, "ZB") { - float, err := strconv.ParseFloat(strings.Replace(fileSize, "ZB", "", -1), 64) - if err != nil { - return 0 - } - size = float * float64(1<<60) - } else { - float, err := strconv.ParseFloat(strings.Replace(fileSize, "B", "", -1), 64) - if err != nil { - return 0 - } - size = float * float64(1) } return size / float64(1<<20) } + +// ReversalFileSize 字节的单位转换 保留两位小数 +//func ReversalFileSize(fileSize string) (size float64) { +// if strings.HasSuffix(fileSize, "KB") { +// float, err := strconv.ParseFloat(strings.Replace(fileSize, "KB", "", -1), 64) +// if err != nil { +// return 0 +// } +// size = float * float64(1<<10) +// } else if strings.HasSuffix(fileSize, "MB") { +// float, err := strconv.ParseFloat(strings.Replace(fileSize, "MB", "", -1), 64) +// if err != nil { +// return 0 +// } +// size = float * float64(1<<20) +// } else if strings.HasSuffix(fileSize, "GB") { +// float, err := strconv.ParseFloat(strings.Replace(fileSize, "GB", "", -1), 64) +// if err != nil { +// return 0 +// } +// size = float * float64(1<<30) +// } else if strings.HasSuffix(fileSize, "TB") { +// float, err := strconv.ParseFloat(strings.Replace(fileSize, "TB", "", -1), 64) +// if err != nil { +// return 0 +// } +// size = float * float64(1<<40) +// } else if strings.HasSuffix(fileSize, "EB") { +// float, err := strconv.ParseFloat(strings.Replace(fileSize, "EB", "", -1), 64) +// if err != nil { +// return 0 +// } +// size = float * float64(1<<50) +// } else if strings.HasSuffix(fileSize, "ZB") { +// float, err := strconv.ParseFloat(strings.Replace(fileSize, "ZB", "", -1), 64) +// if err != nil { +// return 0 +// } +// size = float * float64(1<<60) +// } else { +// float, err := strconv.ParseFloat(strings.Replace(fileSize, "B", "", -1), 64) +// if err != nil { +// return 0 +// } +// size = float * float64(1) +// } +// return size / float64(1<<20) +//} + +const ( + UnitWan = "万" + UnitQianWan = "千万" + UnitYi = "亿" + UnitBaiYi = "百亿" + UnitQianYi = "千亿" + UnitWanYi = "万亿" +) + +func SimplifyNum(num float64, suffix string) string { + units := []struct { + threshold float64 + unit string + }{ + {1e12, UnitWanYi}, + {1e11, UnitQianYi}, + {1e10, UnitBaiYi}, + {1e8, UnitYi}, + {1e7, UnitQianWan}, + {1e4, UnitWan}, + } + + num = math.Round(num*100) / 100 + if num == 0 { + return "0" + } + + for _, u := range units { + if num >= u.threshold { + return strings.ReplaceAll(fmt.Sprintf("%.3f %s%s", num/u.threshold, u.unit, suffix), ".000", "") + } + } + + return strings.ReplaceAll(fmt.Sprintf("%.3f %s", num, suffix), ".000", "") +} + +//func SimplifyNum(num float64, suffix string) string { +// // 保留两位小数 +// num = math.Round(num*100) / 100 +// if num <= 0 { +// return "0" +// } else if num >= 1000 && num < 1000000 { +// return fmt.Sprintf("%.3f 万%s", num/10000, suffix) +// } else if num >= 10000000 && num < 100000000 { +// return fmt.Sprintf("%.3f 千万%s", num/10000000, suffix) +// } else if num >= 100000000 && num < 10000000000 { +// return fmt.Sprintf("%.3f 亿%s", num/100000000, suffix) +// } else if num >= 10000000000 && num < 100000000000 { +// return fmt.Sprintf("%.3f 百亿%s", num/10000000000, suffix) +// } else if num >= 100000000000 && num < 1000000000000 { +// return fmt.Sprintf("%.3f 千亿%s", num/100000000000, suffix) +// } else if num >= 1000000000000 && num < 10000000000000 { +// return fmt.Sprintf("%.3f 万亿%s", num/1000000000000, suffix) +// } else { +// return fmt.Sprintf("%f%s", num, suffix) +// } +//} diff --git a/pkg/currency/currency_test.go b/pkg/currency/currency_test.go new file mode 100644 index 0000000..1602b01 --- /dev/null +++ b/pkg/currency/currency_test.go @@ -0,0 +1,73 @@ +// Package currency +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-09 11:04 +package currency + +import ( + "testing" +) + +func TestSimplifyNum(t *testing.T) { + // 生成一个单元测试 + if num := SimplifyNum(1, "元"); num != "1 元" { + t.Errorf("Expected 1 元, but got %s", num) + } + if num := SimplifyNum(100, "元"); num != "100 元" { + t.Errorf("Expected 100 元, but got %s", num) + } + if num := SimplifyNum(1000, "元"); num != "1000 元" { + t.Errorf("Expected 1000 元, but got %s", num) + } + if num := SimplifyNum(10000, "元"); num != "1 万元" { + t.Errorf("Expected 1 万元, but got %s", num) + } + if num := SimplifyNum(100000, "元"); num != "10 万元" { + t.Errorf("Expected 10 万元, but got %s", num) + } + if num := SimplifyNum(140312310, "元"); num != " 1.403 亿元" { + t.Errorf("Expected 1.403 亿元, but got %s", num) + } + if num := SimplifyNum(10000000, "元"); num != "1 千万元" { + t.Errorf("Expected 1 千万元, but got %s", num) + } +} + +func TestFormatFileSize(t *testing.T) { + result := FormatFileSize(1) + if result != "1 B" { + t.Errorf("Expected 1B, but got %s", result) + } + + result = FormatFileSize(1 << 10) + if result != "1 KB" { + t.Errorf("Expected 1KB, but got %s", result) + } + + result = FormatFileSize(1 << 20) + if result != "1 MB" { + t.Errorf("Expected 1MB, but got %s", result) + } + + result = FormatFileSize(1 << 30) + if result != "1 GB" { + t.Errorf("Expected 1GB, but got %s", result) + } + + result = FormatFileSize(1 << 40) + if result != "1 TB" { + t.Errorf("Expected 1TB, but got %s", result) + } + + //result = FormatFileSize(48712831672) + //t.Log(result) +} + +func TestReversalFileSize(t *testing.T) { + result := ReversalFileSize("100 GB") + t.Log(result) + //if result != 5000 { + // t.Errorf("Expected 5000, but got %f", result) + //} + +} diff --git a/pkg/database/database.go b/pkg/database/database.go index 845725d..0928bb0 100644 --- a/pkg/database/database.go +++ b/pkg/database/database.go @@ -1,8 +1,9 @@ // Package database -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:56 -// @description: 数据库 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:56 +// @description: 数据库 package database import ( diff --git a/pkg/file/file.go b/pkg/file/file.go index 41c45e8..1dcb7a1 100644 --- a/pkg/file/file.go +++ b/pkg/file/file.go @@ -1,8 +1,9 @@ // Package file -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:57 -// @description: 文件操作 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:57 +// @description: 文件操作 package file import ( diff --git a/pkg/trace/trace.go b/pkg/trace/trace.go index 03f7d25..7064f72 100644 --- a/pkg/trace/trace.go +++ b/pkg/trace/trace.go @@ -1,8 +1,9 @@ // Package trace -// @program: gin-template -// @author: [lliuhuan](https://github.com/lliuhuan) -// @create: 2024-07-02 21:40 -// @description: 链路追踪 +// +// @program: gin-template +// @author: [lliuhuan](https://github.com/lliuhuan) +// @create: 2024-07-02 21:40 +// @description: 链路追踪 package trace import (