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,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","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,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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/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,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.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,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