Browse Source

Feature: support custom document table header (#60)

* feat: template property jooq generate

* feat: add template property api

* feat: update export logic

* feat: update frontend resources
master
vran 3 years ago
committed by GitHub
parent
commit
38f388c7ab
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 38
      api/src/main/java/com/databasir/api/DocumentTemplateController.java
  2. 4
      api/src/main/java/com/databasir/api/Routes.java
  3. 1
      api/src/main/resources/static/css/101.babc6736.css
  4. 2
      api/src/main/resources/static/css/703.438fd5a5.css
  5. 2
      api/src/main/resources/static/css/app.15b40a89.css
  6. 2
      api/src/main/resources/static/index.html
  7. 2
      api/src/main/resources/static/js/101-legacy.762f538b.js
  8. 1
      api/src/main/resources/static/js/101-legacy.762f538b.js.map
  9. 2
      api/src/main/resources/static/js/101.f397f8a9.js
  10. 1
      api/src/main/resources/static/js/101.f397f8a9.js.map
  11. 2
      api/src/main/resources/static/js/243-legacy.8e2218d7.js
  12. 2
      api/src/main/resources/static/js/243-legacy.8e2218d7.js.map
  13. 2
      api/src/main/resources/static/js/243.d82073b3.js
  14. 2
      api/src/main/resources/static/js/243.d82073b3.js.map
  15. 4
      api/src/main/resources/static/js/269-legacy.c1238700.js
  16. 2
      api/src/main/resources/static/js/269-legacy.c1238700.js.map
  17. 4
      api/src/main/resources/static/js/269.6ea2c50a.js
  18. 2
      api/src/main/resources/static/js/269.6ea2c50a.js.map
  19. 33
      api/src/main/resources/static/js/321-legacy.9c40372e.js
  20. 1
      api/src/main/resources/static/js/321-legacy.9c40372e.js.map
  21. 33
      api/src/main/resources/static/js/321.2b808026.js
  22. 1
      api/src/main/resources/static/js/321.2b808026.js.map
  23. 4
      api/src/main/resources/static/js/414-legacy.360748a4.js
  24. 2
      api/src/main/resources/static/js/414-legacy.360748a4.js.map
  25. 4
      api/src/main/resources/static/js/414.635bff5a.js
  26. 2
      api/src/main/resources/static/js/414.635bff5a.js.map
  27. 33
      api/src/main/resources/static/js/703-legacy.2314ffd2.js
  28. 1
      api/src/main/resources/static/js/703-legacy.2314ffd2.js.map
  29. 33
      api/src/main/resources/static/js/703.1398b838.js
  30. 1
      api/src/main/resources/static/js/703.1398b838.js.map
  31. 2
      api/src/main/resources/static/js/app-legacy.359fd70e.js
  32. 1
      api/src/main/resources/static/js/app-legacy.359fd70e.js.map
  33. 2
      api/src/main/resources/static/js/app-legacy.89421156.js
  34. 1
      api/src/main/resources/static/js/app-legacy.89421156.js.map
  35. 2
      api/src/main/resources/static/js/app.ccfb747d.js
  36. 1
      api/src/main/resources/static/js/app.ccfb747d.js.map
  37. 2
      api/src/main/resources/static/js/app.dcbe0648.js
  38. 1
      api/src/main/resources/static/js/app.dcbe0648.js.map
  39. 4
      api/src/main/resources/static/js/chunk-vendors.c33500d9.js
  40. 2
      api/src/main/resources/static/js/chunk-vendors.c33500d9.js.map
  41. 25
      core/src/main/java/com/databasir/core/domain/document/converter/DocumentTemplatePropertiesUpdateRequestConverter.java
  42. 15
      core/src/main/java/com/databasir/core/domain/document/converter/DocumentTemplatePropertyResponseConverter.java
  43. 41
      core/src/main/java/com/databasir/core/domain/document/data/DocumentTemplatePropertiesResponse.java
  44. 28
      core/src/main/java/com/databasir/core/domain/document/data/DocumentTemplatePropertiesUpdateRequest.java
  45. 115
      core/src/main/java/com/databasir/core/domain/document/generator/MarkdownDocumentFileGenerator.java
  46. 46
      core/src/main/java/com/databasir/core/domain/document/service/DocumentTemplateService.java
  47. 50
      core/src/main/java/com/databasir/core/domain/system/service/SystemService.java
  48. 3
      core/src/main/java/com/databasir/core/infrastructure/event/subscriber/DocumentEventSubscriber.java
  49. 137
      core/src/main/java/com/databasir/core/infrastructure/event/subscriber/SystemStartedEventSubscriber.java
  50. 6
      dao/build.gradle
  51. 7
      dao/generated-src/jooq/main/java/com/databasir/dao/Databasir.java
  52. 4
      dao/generated-src/jooq/main/java/com/databasir/dao/Keys.java
  53. 6
      dao/generated-src/jooq/main/java/com/databasir/dao/Tables.java
  54. 176
      dao/generated-src/jooq/main/java/com/databasir/dao/tables/DocumentTemplateProperty.java
  55. 155
      dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/DocumentTemplatePropertyPojo.java
  56. 314
      dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/DocumentTemplatePropertyRecord.java
  57. 12
      dao/src/main/java/com/databasir/dao/converter/DocumentTemplatePropertyTypeConverter.java
  58. 7
      dao/src/main/java/com/databasir/dao/enums/DocumentTemplatePropertyType.java
  59. 56
      dao/src/main/java/com/databasir/dao/impl/DocumentTemplatePropertyDao.java
  60. 12
      dao/src/main/resources/db/migration/V1__init.sql

38
api/src/main/java/com/databasir/api/DocumentTemplateController.java

@ -0,0 +1,38 @@
package com.databasir.api;
import com.databasir.common.JsonData;
import com.databasir.core.domain.document.data.DocumentTemplatePropertiesResponse;
import com.databasir.core.domain.document.data.DocumentTemplatePropertiesUpdateRequest;
import com.databasir.core.domain.document.service.DocumentTemplateService;
import com.databasir.core.domain.log.annotation.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RequiredArgsConstructor
@Validated
@RestController
public class DocumentTemplateController {
private final DocumentTemplateService documentTemplateService;
@GetMapping(Routes.DocumentTemplateProperty.API)
public JsonData<DocumentTemplatePropertiesResponse> getAllProperties() {
return JsonData.ok(documentTemplateService.getAllProperties());
}
@PatchMapping(Routes.DocumentTemplateProperty.API)
@PreAuthorize("hasAnyAuthority('SYS_OWNER')")
@Operation(module = Operation.Modules.SETTING, name = "更新模板")
public JsonData<Void> updateByType(@RequestBody @Valid DocumentTemplatePropertiesUpdateRequest request) {
documentTemplateService.updateByType(request);
return JsonData.ok();
}
}

4
api/src/main/java/com/databasir/api/Routes.java

@ -105,6 +105,10 @@ public interface Routes {
String SAVE = DISCUSSION_BASE; String SAVE = DISCUSSION_BASE;
} }
interface DocumentTemplateProperty {
String API = BASE + "/document_template/properties";
}
interface Setting { interface Setting {
String GET_SYS_EMAIL = BASE + "/settings/sys_email"; String GET_SYS_EMAIL = BASE + "/settings/sys_email";

1
api/src/main/resources/static/css/101.babc6736.css

@ -0,0 +1 @@
.el-row{margin-bottom:12px}

2
api/src/main/resources/static/css/321.d892cf8e.css → api/src/main/resources/static/css/703.438fd5a5.css

@ -1 +1 @@
@-webkit-keyframes running-line{to{stroke-dashoffset:-1000}}@keyframes running-line{to{stroke-dashoffset:-1000}}.text{font-size:14px;line-height:1.3rem}.item{margin-top:10px;margin-right:40px}.remark-card{margin-bottom:30px}.remark-header{display:flex;justify-content:space-between;align-items:center}.remark-header .remark-user{color:#6d6d6d}.remark-header .remark-time{color:#6d6d6d;font-size:.8rem;margin-left:10px}.remark-content{white-space:pre-wrap;text-align:left}.badge-item{margin-top:18px;margin-bottom:6px}.h2{font-size:24px;color:#606266;margin-top:13px;margin-bottom:13px}.h2,.h3{font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,,Arial,sans-serif}.h3{font-size:20px;color:#909399;margin-top:18px;margin-bottom:18px}.removed-item{background-color:#fef0f0!important;color:#f56c6c}.added-item{background-color:#f0f9eb!important;color:#67c23a}.modified-item{background-color:#fdf6ec!important;color:#e6a23c}.modified-original-item{background-color:#fdf6ec!important;color:#a8abb2}.span-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;display:flex;align-items:left;justify-content:space-between;font-size:14px}.doc-toc-aside{overflow-wrap:break-word;text-overflow:ellipsis;bottom:0;top:100px;position:fixed;overflow-y:hidden;overflow-x:hidden;max-width:var(--el-aside-width);width:var(--el-aside-width);border-width:0 1px 0 0;border-color:#ddd;border-style:solid}.doc-toc-aside:hover{overflow-y:auto;scrollbar-width:thin} @-webkit-keyframes running-line{to{stroke-dashoffset:-1000}}@keyframes running-line{to{stroke-dashoffset:-1000}}.text{font-size:14px;line-height:1.3rem}.item{margin-top:10px;margin-right:40px}.remark-card{margin-bottom:30px}.remark-header{display:flex;justify-content:space-between;align-items:center}.remark-header .remark-user{color:#6d6d6d}.remark-header .remark-time{color:#6d6d6d;font-size:.8rem;margin-left:10px}.remark-content{white-space:pre-wrap;text-align:left}.badge-item{margin-top:18px;margin-bottom:6px}.removed-item{background-color:#fef0f0!important;color:#f56c6c}.added-item{background-color:#f0f9eb!important;color:#67c23a}.modified-item{background-color:#fdf6ec!important;color:#e6a23c}.modified-original-item{background-color:#fdf6ec!important;color:#a8abb2}.span-ellipsis{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;flex:1;display:flex;align-items:left;justify-content:space-between;font-size:14px}.doc-toc-aside{overflow-wrap:break-word;text-overflow:ellipsis;bottom:0;top:100px;position:fixed;overflow-y:hidden;overflow-x:hidden;max-width:var(--el-aside-width);width:var(--el-aside-width);border-width:0 1px 0 0;border-color:#ddd;border-style:solid}.doc-toc-aside:hover{overflow-y:auto;scrollbar-width:thin}

2
api/src/main/resources/static/css/app.757c1ef3.css → api/src/main/resources/static/css/app.15b40a89.css

@ -1 +1 @@
.left-menu:not(.el-menu--collapse){height:100vh}.databasir-nav{left:0;bottom:0}.databasir-main-header,.databasir-nav{position:fixed;transform:scale(1);top:0}.databasir-main-header{display:flex;justify-content:space-between;align-items:center;right:0;left:50px;padding:30px;margin-left:33px;background:#fff;z-index:100;border-color:#eee;border-width:0 0 1px 0;border-style:solid}.databasir{display:block}.databasir-main{position:relative;margin-left:60px;margin-top:80px;--el-main-padding:0px 20px 20px 20px}.databasir-main-expand{margin-left:50px}.databasir-main-content{max-width:95%;--el-main-padding:0px 20px 20px 20px} .left-menu:not(.el-menu--collapse){height:100vh}.databasir-nav{left:0;bottom:0}.databasir-main-header,.databasir-nav{position:fixed;transform:scale(1);top:0}.databasir-main-header{display:flex;justify-content:space-between;align-items:center;right:0;left:50px;padding:30px;margin-left:33px;background:#fff;z-index:100;border-color:#eee;border-width:0 0 1px 0;border-style:solid}.databasir{display:block}.databasir-main{position:relative;margin-left:60px;margin-top:80px;--el-main-padding:0px 20px 20px 20px}.databasir-main-expand{margin-left:50px}.databasir-main-content{max-width:95%;--el-main-padding:0px 20px 20px 20px}.h2{font-size:24px;color:#606266;margin-top:13px;margin-bottom:13px}.h2,.h3{font-family:Helvetica Neue,Helvetica,PingFang SC,Hiragino Sans GB,Microsoft YaHei,,Arial,sans-serif}.h3{font-size:20px;color:#909399;margin-top:18px;margin-bottom:18px}

2
api/src/main/resources/static/index.html

@ -1 +1 @@
<!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>databasir</title><script defer="defer" type="module" src="/js/chunk-vendors.98e14a99.js"></script><script defer="defer" type="module" src="/js/app.ccfb747d.js"></script><link href="/css/chunk-vendors.8e1003a6.css" rel="stylesheet"><link href="/css/app.757c1ef3.css" rel="stylesheet"><script defer="defer" src="/js/chunk-vendors-legacy.2897f987.js" nomodule></script><script defer="defer" src="/js/app-legacy.89421156.js" nomodule></script></head><body><noscript><strong>We're sorry but databasir doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html> <!doctype html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>databasir</title><script defer="defer" type="module" src="/js/chunk-vendors.c33500d9.js"></script><script defer="defer" type="module" src="/js/app.dcbe0648.js"></script><link href="/css/chunk-vendors.8e1003a6.css" rel="stylesheet"><link href="/css/app.15b40a89.css" rel="stylesheet"><script defer="defer" src="/js/chunk-vendors-legacy.2897f987.js" nomodule></script><script defer="defer" src="/js/app-legacy.359fd70e.js" nomodule></script></head><body><noscript><strong>We're sorry but databasir doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>

2
api/src/main/resources/static/js/101-legacy.762f538b.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/101-legacy.762f538b.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/101.f397f8a9.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/101.f397f8a9.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/243-legacy.92016c20.js → api/src/main/resources/static/js/243-legacy.8e2218d7.js

@ -1,2 +1,2 @@
"use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[243],{1243:function(e,t,n){n.r(t),n.d(t,{default:function(){return W}});var r=n(6252),u=(0,r.Uk)(" 系统邮箱设置 "),o=(0,r.Uk)(" : "),l=(0,r.Uk)("保存"),a=(0,r.Uk)("重置");function s(e,t,n,s,i,m){var f=(0,r.up)("box"),d=(0,r.up)("el-icon"),p=(0,r.up)("el-divider"),c=(0,r.up)("el-input"),w=(0,r.up)("el-form-item"),h=(0,r.up)("el-col"),g=(0,r.up)("el-switch"),W=(0,r.up)("el-button"),V=(0,r.up)("el-form"),S=(0,r.up)("el-card"),_=(0,r.up)("el-main"),b=(0,r.up)("el-container");return(0,r.wg)(),(0,r.j4)(b,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(_,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(S,{shadow:"hover",style:{"max-width":"600px"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(p,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(d,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(f)]})),_:1}),u]})),_:1}),(0,r.Wm)(V,{model:i.form,"label-position":"top",rules:i.formRule,ref:"formRef",style:{"max-width":"900px"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(w,{label:"邮箱账号",prop:"username"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.username,"onUpdate:modelValue":t[0]||(t[0]=function(e){return i.form.username=e}),placeholder:"请输入邮箱账号"},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(w,{label:"邮箱密码",prop:"password"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.password,"onUpdate:modelValue":t[1]||(t[1]=function(e){return i.form.password=e}),type:"password",placeholder:"请输入密码","show-password":""},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(w,{label:"SMTP",prop:"smtpHost"},{default:(0,r.w5)((function(){return[(0,r.Wm)(h,{span:12},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.smtpHost,"onUpdate:modelValue":t[2]||(t[2]=function(e){return i.form.smtpHost=e}),placeholder:"SMTP Host"},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(h,{span:1,style:{"text-align":"center"}},{default:(0,r.w5)((function(){return[o]})),_:1}),(0,r.Wm)(h,{span:6},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.smtpPort,"onUpdate:modelValue":t[3]||(t[3]=function(e){return i.form.smtpPort=e}),placeholder:"SMTP Port"},null,8,["modelValue"])]})),_:1})]})),_:1}),(0,r.Wm)(w,{label:"启用 SSL",prop:"useSSL"},{default:(0,r.w5)((function(){return[(0,r.Wm)(g,{modelValue:i.form.useSSL,"onUpdate:modelValue":t[4]||(t[4]=function(e){return i.form.useSSL=e})},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(w,{style:{"margin-top":"38px"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(W,{type:"primary",onClick:t[5]||(t[5]=function(e){return m.onSubmit("formRef")})},{default:(0,r.w5)((function(){return[l]})),_:1}),(0,r.Wm)(W,{type:"danger",onClick:t[6]||(t[6]=function(e){return m.onReset()})},{default:(0,r.w5)((function(){return[a]})),_:1})]})),_:1})]})),_:1},8,["model","rules"])]})),_:1})]})),_:1})]})),_:1})}var i=n(8534),m=(n(5666),n(3872)),f="/api/v1.0/settings",d=function(){return m.Z.get(f+"/sys_email")},p=function(e){return m.Z.post(f+"/sys_email",e)},c=function(){return m.Z["delete"](f+"/sys_email")},w={data:function(){return{form:{smtpHost:null,smtpPort:null,username:null,password:null,useSSL:!1},formRule:{username:[this.requiredInputValidRule("请输入邮箱账号"),{type:"email",message:"邮箱格式不正确",trigger:"blur"}],password:[this.requiredInputValidRule("请输入邮箱密码")],smtpHost:[this.requiredInputValidRule("请输入 SMTP 地址")],smtpPort:[this.requiredInputValidRule("请输入 SMTP 端口"),{min:1,max:65535,message:"端口有效值为 1~65535",trigger:"blur"}]}}},mounted:function(){this.fetchSysMail()},methods:{requiredInputValidRule:function(e){return{required:!0,message:e,trigger:"blur"}},fetchSysMail:function(){var e=this;return(0,i.Z)(regeneratorRuntime.mark((function t(){var n;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,d().then((function(e){return e.data}));case 2:n=t.sent,n&&(e.form=n);case 4:case"end":return t.stop()}}),t)})))()},onSubmit:function(){var e=this;this.$refs.formRef.validate((function(t){return t?(p(e.form).then((function(t){t.errCode||e.$message.success("更新成功")})),!0):(e.$message.error("请完善表单相关信息!"),!1)}))},onReset:function(){var e=this;this.$confirm("确认重置系统邮件吗?删除后数据将无法恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((function(){c().then((function(t){t.errCode||(e.form={},e.$message.success("重置成功"))}))}))}}},h=n(3744);const g=(0,h.Z)(w,[["render",s]]);var W=g}}]); "use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[243],{1243:function(e,t,n){n.r(t),n.d(t,{default:function(){return W}});var r=n(6252),u=(0,r.Uk)(" 系统邮箱设置 "),o=(0,r.Uk)(" : "),l=(0,r.Uk)("保存"),a=(0,r.Uk)("重置");function s(e,t,n,s,i,m){var f=(0,r.up)("box"),d=(0,r.up)("el-icon"),p=(0,r.up)("el-divider"),c=(0,r.up)("el-input"),w=(0,r.up)("el-form-item"),h=(0,r.up)("el-col"),g=(0,r.up)("el-switch"),W=(0,r.up)("el-button"),V=(0,r.up)("el-form"),S=(0,r.up)("el-card"),_=(0,r.up)("el-main"),b=(0,r.up)("el-container");return(0,r.wg)(),(0,r.j4)(b,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(_,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(S,{shadow:"hover",style:{"max-width":"600px"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(p,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(d,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(f)]})),_:1}),u]})),_:1}),(0,r.Wm)(V,{model:i.form,"label-position":"top",rules:i.formRule,ref:"formRef",style:{"max-width":"900px"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(w,{label:"邮箱账号",prop:"username"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.username,"onUpdate:modelValue":t[0]||(t[0]=function(e){return i.form.username=e}),placeholder:"请输入邮箱账号"},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(w,{label:"邮箱密码",prop:"password"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.password,"onUpdate:modelValue":t[1]||(t[1]=function(e){return i.form.password=e}),type:"password",placeholder:"请输入密码","show-password":""},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(w,{label:"SMTP",prop:"smtpHost"},{default:(0,r.w5)((function(){return[(0,r.Wm)(h,{span:12},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.smtpHost,"onUpdate:modelValue":t[2]||(t[2]=function(e){return i.form.smtpHost=e}),placeholder:"SMTP Host"},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(h,{span:1,style:{"text-align":"center"}},{default:(0,r.w5)((function(){return[o]})),_:1}),(0,r.Wm)(h,{span:6},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{modelValue:i.form.smtpPort,"onUpdate:modelValue":t[3]||(t[3]=function(e){return i.form.smtpPort=e}),placeholder:"SMTP Port"},null,8,["modelValue"])]})),_:1})]})),_:1}),(0,r.Wm)(w,{label:"启用 SSL",prop:"useSSL"},{default:(0,r.w5)((function(){return[(0,r.Wm)(g,{modelValue:i.form.useSSL,"onUpdate:modelValue":t[4]||(t[4]=function(e){return i.form.useSSL=e})},null,8,["modelValue"])]})),_:1}),(0,r.Wm)(w,{style:{"margin-top":"38px"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(W,{type:"primary",onClick:t[5]||(t[5]=function(e){return m.onSubmit("formRef")})},{default:(0,r.w5)((function(){return[l]})),_:1}),(0,r.Wm)(W,{type:"danger",onClick:t[6]||(t[6]=function(e){return m.onReset()})},{default:(0,r.w5)((function(){return[a]})),_:1})]})),_:1})]})),_:1},8,["model","rules"])]})),_:1})]})),_:1})]})),_:1})}var i=n(8534),m=(n(5666),n(3872)),f="/api/v1.0/settings",d=function(){return m.Z.get(f+"/sys_email")},p=function(e){return m.Z.post(f+"/sys_email",e)},c=function(){return m.Z["delete"](f+"/sys_email")},w={data:function(){return{form:{smtpHost:null,smtpPort:null,username:null,password:null,useSSL:!1},formRule:{username:[this.requiredInputValidRule("请输入邮箱账号"),{type:"email",message:"邮箱格式不正确",trigger:"blur"}],password:[this.requiredInputValidRule("请输入邮箱密码")],smtpHost:[this.requiredInputValidRule("请输入 SMTP 地址")],smtpPort:[this.requiredInputValidRule("请输入 SMTP 端口"),{min:1,max:65535,message:"端口有效值为 1~65535",trigger:"blur"}]}}},mounted:function(){this.fetchSysMail()},methods:{requiredInputValidRule:function(e){return{required:!0,message:e,trigger:"blur"}},fetchSysMail:function(){var e=this;return(0,i.Z)(regeneratorRuntime.mark((function t(){var n;return regeneratorRuntime.wrap((function(t){while(1)switch(t.prev=t.next){case 0:return t.next=2,d().then((function(e){return e.data}));case 2:n=t.sent,n&&(e.form=n);case 4:case"end":return t.stop()}}),t)})))()},onSubmit:function(){var e=this;this.$refs.formRef.validate((function(t){return t?(p(e.form).then((function(t){t.errCode||e.$message.success("更新成功")})),!0):(e.$message.error("请完善表单相关信息!"),!1)}))},onReset:function(){var e=this;this.$confirm("确认重置系统邮件吗?删除后数据将无法恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((function(){c().then((function(t){t.errCode||(e.form={},e.$message.success("重置成功"))}))}))}}},h=n(3744);const g=(0,h.Z)(w,[["render",s]]);var W=g}}]);
//# sourceMappingURL=243-legacy.92016c20.js.map //# sourceMappingURL=243-legacy.8e2218d7.js.map

2
api/src/main/resources/static/js/243-legacy.92016c20.js.map → api/src/main/resources/static/js/243-legacy.8e2218d7.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/243.e2c9f564.js → api/src/main/resources/static/js/243.d82073b3.js

@ -1,2 +1,2 @@
"use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[243],{1243:function(e,l,t){t.r(l),t.d(l,{default:function(){return W}});var a=t(6252);const s=(0,a.Uk)(" 系统邮箱设置 "),r=(0,a.Uk)(" : "),u=(0,a.Uk)("保存"),o=(0,a.Uk)("重置");function m(e,l,t,m,n,d){const p=(0,a.up)("box"),i=(0,a.up)("el-icon"),f=(0,a.up)("el-divider"),c=(0,a.up)("el-input"),h=(0,a.up)("el-form-item"),w=(0,a.up)("el-col"),W=(0,a.up)("el-switch"),V=(0,a.up)("el-button"),g=(0,a.up)("el-form"),S=(0,a.up)("el-card"),_=(0,a.up)("el-main"),b=(0,a.up)("el-container");return(0,a.wg)(),(0,a.j4)(b,null,{default:(0,a.w5)((()=>[(0,a.Wm)(_,null,{default:(0,a.w5)((()=>[(0,a.Wm)(S,{shadow:"hover",style:{"max-width":"600px"}},{default:(0,a.w5)((()=>[(0,a.Wm)(f,null,{default:(0,a.w5)((()=>[(0,a.Wm)(i,null,{default:(0,a.w5)((()=>[(0,a.Wm)(p)])),_:1}),s])),_:1}),(0,a.Wm)(g,{model:n.form,"label-position":"top",rules:n.formRule,ref:"formRef",style:{"max-width":"900px"}},{default:(0,a.w5)((()=>[(0,a.Wm)(h,{label:"邮箱账号",prop:"username"},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.username,"onUpdate:modelValue":l[0]||(l[0]=e=>n.form.username=e),placeholder:"请输入邮箱账号"},null,8,["modelValue"])])),_:1}),(0,a.Wm)(h,{label:"邮箱密码",prop:"password"},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.password,"onUpdate:modelValue":l[1]||(l[1]=e=>n.form.password=e),type:"password",placeholder:"请输入密码","show-password":""},null,8,["modelValue"])])),_:1}),(0,a.Wm)(h,{label:"SMTP",prop:"smtpHost"},{default:(0,a.w5)((()=>[(0,a.Wm)(w,{span:12},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.smtpHost,"onUpdate:modelValue":l[2]||(l[2]=e=>n.form.smtpHost=e),placeholder:"SMTP Host"},null,8,["modelValue"])])),_:1}),(0,a.Wm)(w,{span:1,style:{"text-align":"center"}},{default:(0,a.w5)((()=>[r])),_:1}),(0,a.Wm)(w,{span:6},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.smtpPort,"onUpdate:modelValue":l[3]||(l[3]=e=>n.form.smtpPort=e),placeholder:"SMTP Port"},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.Wm)(h,{label:"启用 SSL",prop:"useSSL"},{default:(0,a.w5)((()=>[(0,a.Wm)(W,{modelValue:n.form.useSSL,"onUpdate:modelValue":l[4]||(l[4]=e=>n.form.useSSL=e)},null,8,["modelValue"])])),_:1}),(0,a.Wm)(h,{style:{"margin-top":"38px"}},{default:(0,a.w5)((()=>[(0,a.Wm)(V,{type:"primary",onClick:l[5]||(l[5]=e=>d.onSubmit("formRef"))},{default:(0,a.w5)((()=>[u])),_:1}),(0,a.Wm)(V,{type:"danger",onClick:l[6]||(l[6]=e=>d.onReset())},{default:(0,a.w5)((()=>[o])),_:1})])),_:1})])),_:1},8,["model","rules"])])),_:1})])),_:1})])),_:1})}var n=t(3872);const d="/api/v1.0/settings",p=()=>n.Z.get(d+"/sys_email"),i=e=>n.Z.post(d+"/sys_email",e),f=()=>n.Z["delete"](d+"/sys_email");var c={data(){return{form:{smtpHost:null,smtpPort:null,username:null,password:null,useSSL:!1},formRule:{username:[this.requiredInputValidRule("请输入邮箱账号"),{type:"email",message:"邮箱格式不正确",trigger:"blur"}],password:[this.requiredInputValidRule("请输入邮箱密码")],smtpHost:[this.requiredInputValidRule("请输入 SMTP 地址")],smtpPort:[this.requiredInputValidRule("请输入 SMTP 端口"),{min:1,max:65535,message:"端口有效值为 1~65535",trigger:"blur"}]}}},mounted(){this.fetchSysMail()},methods:{requiredInputValidRule(e){return{required:!0,message:e,trigger:"blur"}},async fetchSysMail(){const e=await p().then((e=>e.data));e&&(this.form=e)},onSubmit(){this.$refs.formRef.validate((e=>e?(i(this.form).then((e=>{e.errCode||this.$message.success("更新成功")})),!0):(this.$message.error("请完善表单相关信息!"),!1)))},onReset(){this.$confirm("确认重置系统邮件吗?删除后数据将无法恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{f().then((e=>{e.errCode||(this.form={},this.$message.success("重置成功"))}))}))}}},h=t(3744);const w=(0,h.Z)(c,[["render",m]]);var W=w}}]); "use strict";(self["webpackChunkdatabasir"]=self["webpackChunkdatabasir"]||[]).push([[243],{1243:function(e,l,t){t.r(l),t.d(l,{default:function(){return W}});var a=t(6252);const s=(0,a.Uk)(" 系统邮箱设置 "),r=(0,a.Uk)(" : "),u=(0,a.Uk)("保存"),o=(0,a.Uk)("重置");function m(e,l,t,m,n,d){const p=(0,a.up)("box"),i=(0,a.up)("el-icon"),f=(0,a.up)("el-divider"),c=(0,a.up)("el-input"),h=(0,a.up)("el-form-item"),w=(0,a.up)("el-col"),W=(0,a.up)("el-switch"),V=(0,a.up)("el-button"),g=(0,a.up)("el-form"),S=(0,a.up)("el-card"),_=(0,a.up)("el-main"),b=(0,a.up)("el-container");return(0,a.wg)(),(0,a.j4)(b,null,{default:(0,a.w5)((()=>[(0,a.Wm)(_,null,{default:(0,a.w5)((()=>[(0,a.Wm)(S,{shadow:"hover",style:{"max-width":"600px"}},{default:(0,a.w5)((()=>[(0,a.Wm)(f,null,{default:(0,a.w5)((()=>[(0,a.Wm)(i,null,{default:(0,a.w5)((()=>[(0,a.Wm)(p)])),_:1}),s])),_:1}),(0,a.Wm)(g,{model:n.form,"label-position":"top",rules:n.formRule,ref:"formRef",style:{"max-width":"900px"}},{default:(0,a.w5)((()=>[(0,a.Wm)(h,{label:"邮箱账号",prop:"username"},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.username,"onUpdate:modelValue":l[0]||(l[0]=e=>n.form.username=e),placeholder:"请输入邮箱账号"},null,8,["modelValue"])])),_:1}),(0,a.Wm)(h,{label:"邮箱密码",prop:"password"},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.password,"onUpdate:modelValue":l[1]||(l[1]=e=>n.form.password=e),type:"password",placeholder:"请输入密码","show-password":""},null,8,["modelValue"])])),_:1}),(0,a.Wm)(h,{label:"SMTP",prop:"smtpHost"},{default:(0,a.w5)((()=>[(0,a.Wm)(w,{span:12},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.smtpHost,"onUpdate:modelValue":l[2]||(l[2]=e=>n.form.smtpHost=e),placeholder:"SMTP Host"},null,8,["modelValue"])])),_:1}),(0,a.Wm)(w,{span:1,style:{"text-align":"center"}},{default:(0,a.w5)((()=>[r])),_:1}),(0,a.Wm)(w,{span:6},{default:(0,a.w5)((()=>[(0,a.Wm)(c,{modelValue:n.form.smtpPort,"onUpdate:modelValue":l[3]||(l[3]=e=>n.form.smtpPort=e),placeholder:"SMTP Port"},null,8,["modelValue"])])),_:1})])),_:1}),(0,a.Wm)(h,{label:"启用 SSL",prop:"useSSL"},{default:(0,a.w5)((()=>[(0,a.Wm)(W,{modelValue:n.form.useSSL,"onUpdate:modelValue":l[4]||(l[4]=e=>n.form.useSSL=e)},null,8,["modelValue"])])),_:1}),(0,a.Wm)(h,{style:{"margin-top":"38px"}},{default:(0,a.w5)((()=>[(0,a.Wm)(V,{type:"primary",onClick:l[5]||(l[5]=e=>d.onSubmit("formRef"))},{default:(0,a.w5)((()=>[u])),_:1}),(0,a.Wm)(V,{type:"danger",onClick:l[6]||(l[6]=e=>d.onReset())},{default:(0,a.w5)((()=>[o])),_:1})])),_:1})])),_:1},8,["model","rules"])])),_:1})])),_:1})])),_:1})}var n=t(3872);const d="/api/v1.0/settings",p=()=>n.Z.get(d+"/sys_email"),i=e=>n.Z.post(d+"/sys_email",e),f=()=>n.Z["delete"](d+"/sys_email");var c={data(){return{form:{smtpHost:null,smtpPort:null,username:null,password:null,useSSL:!1},formRule:{username:[this.requiredInputValidRule("请输入邮箱账号"),{type:"email",message:"邮箱格式不正确",trigger:"blur"}],password:[this.requiredInputValidRule("请输入邮箱密码")],smtpHost:[this.requiredInputValidRule("请输入 SMTP 地址")],smtpPort:[this.requiredInputValidRule("请输入 SMTP 端口"),{min:1,max:65535,message:"端口有效值为 1~65535",trigger:"blur"}]}}},mounted(){this.fetchSysMail()},methods:{requiredInputValidRule(e){return{required:!0,message:e,trigger:"blur"}},async fetchSysMail(){const e=await p().then((e=>e.data));e&&(this.form=e)},onSubmit(){this.$refs.formRef.validate((e=>e?(i(this.form).then((e=>{e.errCode||this.$message.success("更新成功")})),!0):(this.$message.error("请完善表单相关信息!"),!1)))},onReset(){this.$confirm("确认重置系统邮件吗?删除后数据将无法恢复","警告",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then((()=>{f().then((e=>{e.errCode||(this.form={},this.$message.success("重置成功"))}))}))}}},h=t(3744);const w=(0,h.Z)(c,[["render",m]]);var W=w}}]);
//# sourceMappingURL=243.e2c9f564.js.map //# sourceMappingURL=243.d82073b3.js.map

2
api/src/main/resources/static/js/243.e2c9f564.js.map → api/src/main/resources/static/js/243.d82073b3.js.map

File diff suppressed because one or more lines are too long

4
api/src/main/resources/static/js/269-legacy.ec81b414.js → api/src/main/resources/static/js/269-legacy.c1238700.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/269-legacy.ec81b414.js.map → api/src/main/resources/static/js/269-legacy.c1238700.js.map

File diff suppressed because one or more lines are too long

4
api/src/main/resources/static/js/269.476aa030.js → api/src/main/resources/static/js/269.6ea2c50a.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/269.476aa030.js.map → api/src/main/resources/static/js/269.6ea2c50a.js.map

File diff suppressed because one or more lines are too long

33
api/src/main/resources/static/js/321-legacy.9c40372e.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/321-legacy.9c40372e.js.map

File diff suppressed because one or more lines are too long

33
api/src/main/resources/static/js/321.2b808026.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/321.2b808026.js.map

File diff suppressed because one or more lines are too long

4
api/src/main/resources/static/js/130-legacy.bed95c34.js → api/src/main/resources/static/js/414-legacy.360748a4.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/130-legacy.bed95c34.js.map → api/src/main/resources/static/js/414-legacy.360748a4.js.map

File diff suppressed because one or more lines are too long

4
api/src/main/resources/static/js/130.539afb3f.js → api/src/main/resources/static/js/414.635bff5a.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/130.539afb3f.js.map → api/src/main/resources/static/js/414.635bff5a.js.map

File diff suppressed because one or more lines are too long

33
api/src/main/resources/static/js/703-legacy.2314ffd2.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/703-legacy.2314ffd2.js.map

File diff suppressed because one or more lines are too long

33
api/src/main/resources/static/js/703.1398b838.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/703.1398b838.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/app-legacy.359fd70e.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/app-legacy.359fd70e.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/app-legacy.89421156.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/app-legacy.89421156.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/app.ccfb747d.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/app.ccfb747d.js.map

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/app.dcbe0648.js

File diff suppressed because one or more lines are too long

1
api/src/main/resources/static/js/app.dcbe0648.js.map

File diff suppressed because one or more lines are too long

4
api/src/main/resources/static/js/chunk-vendors.98e14a99.js → api/src/main/resources/static/js/chunk-vendors.c33500d9.js

File diff suppressed because one or more lines are too long

2
api/src/main/resources/static/js/chunk-vendors.98e14a99.js.map → api/src/main/resources/static/js/chunk-vendors.c33500d9.js.map

File diff suppressed because one or more lines are too long

25
core/src/main/java/com/databasir/core/domain/document/converter/DocumentTemplatePropertiesUpdateRequestConverter.java

@ -0,0 +1,25 @@
package com.databasir.core.domain.document.converter;
import com.databasir.core.domain.document.data.DocumentTemplatePropertiesUpdateRequest;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import com.databasir.dao.tables.pojos.DocumentTemplatePropertyPojo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.util.List;
import java.util.stream.Collectors;
@Mapper(componentModel = "spring")
public interface DocumentTemplatePropertiesUpdateRequestConverter {
@Mapping(target = "defaultValue", constant = "")
DocumentTemplatePropertyPojo toPojo(DocumentTemplatePropertiesUpdateRequest.PropertyRequest property,
DocumentTemplatePropertyType type);
default List<DocumentTemplatePropertyPojo> toPojo(DocumentTemplatePropertiesUpdateRequest request) {
return request.getProperties().stream()
.map(prop -> toPojo(prop, request.getType()))
.collect(Collectors.toList());
}
}

15
core/src/main/java/com/databasir/core/domain/document/converter/DocumentTemplatePropertyResponseConverter.java

@ -0,0 +1,15 @@
package com.databasir.core.domain.document.converter;
import com.databasir.core.domain.document.data.DocumentTemplatePropertiesResponse;
import com.databasir.dao.tables.pojos.DocumentTemplatePropertyPojo;
import org.mapstruct.Mapper;
import java.util.List;
@Mapper(componentModel = "spring")
public interface DocumentTemplatePropertyResponseConverter {
List<DocumentTemplatePropertiesResponse.DocumentTemplatePropertyResponse> of(
List<DocumentTemplatePropertyPojo> pojoList);
}

41
core/src/main/java/com/databasir/core/domain/document/data/DocumentTemplatePropertiesResponse.java

@ -0,0 +1,41 @@
package com.databasir.core.domain.document.data;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DocumentTemplatePropertiesResponse {
private List<DocumentTemplatePropertyResponse> columnFieldNameProperties = Collections.emptyList();
private List<DocumentTemplatePropertyResponse> indexFieldNameProperties = Collections.emptyList();
private List<DocumentTemplatePropertyResponse> triggerFieldNameProperties = Collections.emptyList();
private List<DocumentTemplatePropertyResponse> foreignKeyFieldNameProperties = Collections.emptyList();
@Data
public static class DocumentTemplatePropertyResponse {
private String key;
private String value;
private String defaultValue;
private DocumentTemplatePropertyType type;
private LocalDateTime createAt;
}
}

28
core/src/main/java/com/databasir/core/domain/document/data/DocumentTemplatePropertiesUpdateRequest.java

@ -0,0 +1,28 @@
package com.databasir.core.domain.document.data;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Collections;
import java.util.List;
@Data
public class DocumentTemplatePropertiesUpdateRequest {
@NotNull
private DocumentTemplatePropertyType type;
@NotEmpty
private List<PropertyRequest> properties = Collections.emptyList();
@Data
public static class PropertyRequest {
private String key;
private String value;
}
}

115
core/src/main/java/com/databasir/core/domain/document/generator/MarkdownDocumentFileGenerator.java

@ -2,8 +2,11 @@ package com.databasir.core.domain.document.generator;
import com.databasir.common.SystemException; import com.databasir.common.SystemException;
import com.databasir.core.domain.document.data.DatabaseDocumentResponse; import com.databasir.core.domain.document.data.DatabaseDocumentResponse;
import com.databasir.core.domain.document.data.DocumentTemplatePropertiesResponse;
import com.databasir.core.domain.document.data.TableDocumentResponse; import com.databasir.core.domain.document.data.TableDocumentResponse;
import com.databasir.core.domain.document.service.DocumentTemplateService;
import com.databasir.core.render.markdown.MarkdownBuilder; import com.databasir.core.render.markdown.MarkdownBuilder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -12,16 +15,17 @@ import java.io.OutputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors;
@Component @Component
@Slf4j @Slf4j
@RequiredArgsConstructor
public class MarkdownDocumentFileGenerator implements DocumentFileGenerator { public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
private final DocumentTemplateService documentTemplateService;
@Override @Override
public boolean support(DocumentFileType type) { public boolean support(DocumentFileType type) {
return type == DocumentFileType.MARKDOWN; return type == DocumentFileType.MARKDOWN;
@ -29,8 +33,9 @@ public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
@Override @Override
public void generate(DocumentFileGenerateContext context, OutputStream outputStream) { public void generate(DocumentFileGenerateContext context, OutputStream outputStream) {
DocumentTemplatePropertiesResponse templateProperties = documentTemplateService.getAllProperties();
String fileName = context.getDatabaseDocument().getDatabaseName() + "-" + UUID.randomUUID().toString(); String fileName = context.getDatabaseDocument().getDatabaseName() + "-" + UUID.randomUUID().toString();
String data = markdownData(context); String data = markdownData(context, templateProperties);
Path tempFile = null; Path tempFile = null;
try { try {
tempFile = Files.createTempFile(fileName, ".md"); tempFile = Files.createTempFile(fileName, ".md");
@ -49,14 +54,37 @@ public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
} }
} }
private String markdownData(DocumentFileGenerateContext context) { private String markdownData(DocumentFileGenerateContext context,
DocumentTemplatePropertiesResponse properties) {
DatabaseDocumentResponse doc = context.getDatabaseDocument(); DatabaseDocumentResponse doc = context.getDatabaseDocument();
MarkdownBuilder builder = MarkdownBuilder.builder(); MarkdownBuilder builder = MarkdownBuilder.builder();
builder.primaryTitle(doc.getDatabaseName()); builder.primaryTitle(doc.getDatabaseName());
// overview // overview
overviewBuild(builder, doc); overviewBuild(builder, doc);
// tables // tables
doc.getTables().forEach(table -> tableBuild(builder, table)); Map<String, String> columnTitleMap = properties.getColumnFieldNameProperties()
.stream()
.collect(Collectors.toMap(d -> d.getKey(),
d -> Objects.requireNonNullElse(d.getValue(), d.getDefaultValue())));
Map<String, String> indexTitleMap = properties.getIndexFieldNameProperties()
.stream()
.collect(Collectors.toMap(d -> d.getKey(),
d -> Objects.requireNonNullElse(d.getValue(), d.getDefaultValue())));
Map<String, String> triggerTitleMap = properties.getTriggerFieldNameProperties()
.stream()
.collect(Collectors.toMap(d -> d.getKey(),
d -> Objects.requireNonNullElse(d.getValue(), d.getDefaultValue())));
Map<String, String> foreignKeyTitleMap = properties.getForeignKeyFieldNameProperties()
.stream()
.collect(Collectors.toMap(d -> d.getKey(),
d -> Objects.requireNonNullElse(d.getValue(), d.getDefaultValue())));
doc.getTables().forEach(table -> {
builder.secondTitle(table.getName());
columnBuild(builder, table, columnTitleMap);
indexBuild(builder, table, indexTitleMap);
foreignKeyBuild(builder, table, foreignKeyTitleMap);
triggerBuild(builder, table, triggerTitleMap);
});
return builder.build(); return builder.build();
} }
@ -71,15 +99,9 @@ public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
builder.table(List.of("", "表名", "类型", "备注"), overviewContent); builder.table(List.of("", "表名", "类型", "备注"), overviewContent);
} }
private void tableBuild(MarkdownBuilder builder, TableDocumentResponse table) { private void columnBuild(MarkdownBuilder builder,
builder.secondTitle(table.getName()); TableDocumentResponse table,
columnBuild(builder, table); Map<String, String> titleMap) {
indexBuild(builder, table);
foreignKeyBuild(builder, table);
triggerBuild(builder, table);
}
private void columnBuild(MarkdownBuilder builder, TableDocumentResponse table) {
Function<TableDocumentResponse.ColumnDocumentResponse, String> Function<TableDocumentResponse.ColumnDocumentResponse, String>
columnDefaultValueMapping = column -> { columnDefaultValueMapping = column -> {
if (Objects.equals(column.getNullable(), "YES")) { if (Objects.equals(column.getNullable(), "YES")) {
@ -107,11 +129,24 @@ public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
columnDefaultValueMapping.apply(column), columnDefaultValueMapping.apply(column),
column.getComment())); column.getComment()));
} }
builder.table(List.of("", "名称", "类型", "是否为主键", "可为空", "自增", "默认值", "备注"), builder.table(
columnContent); List.of(
"",
titleMap.getOrDefault("name", "name"),
titleMap.getOrDefault("type", "type"),
titleMap.getOrDefault("isPrimaryKey", "isPrimaryKey"),
titleMap.getOrDefault("nullable", "nullable"),
titleMap.getOrDefault("autoIncrement", "autoIncrement"),
titleMap.getOrDefault("defaultValue", "defaultValue"),
titleMap.getOrDefault("comment", "comment")
),
columnContent
);
} }
private void indexBuild(MarkdownBuilder builder, TableDocumentResponse table) { private void indexBuild(MarkdownBuilder builder,
TableDocumentResponse table,
Map<String, String> titleMap) {
builder.thirdTitle("Indexes"); builder.thirdTitle("Indexes");
List<List<String>> indexContent = new ArrayList<>(); List<List<String>> indexContent = new ArrayList<>();
for (int i = 0; i < table.getIndexes().size(); i++) { for (int i = 0; i < table.getIndexes().size(); i++) {
@ -120,11 +155,20 @@ public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
String isUnique = index.getIsUnique() ? "YES" : "NO"; String isUnique = index.getIsUnique() ? "YES" : "NO";
indexContent.add(List.of((i + 1) + "", index.getName(), isUnique, columnNames)); indexContent.add(List.of((i + 1) + "", index.getName(), isUnique, columnNames));
} }
builder.table(List.of("", "名称", "是否唯一", "关联列"), indexContent); builder.table(
List.of(
"",
titleMap.getOrDefault("name", "name"),
titleMap.getOrDefault("isUnique", "isUnique"),
titleMap.getOrDefault("columnNames", "columnNames")
),
indexContent
);
} }
private void foreignKeyBuild(MarkdownBuilder builder, TableDocumentResponse table) { private void foreignKeyBuild(MarkdownBuilder builder,
TableDocumentResponse table,
Map<String, String> titleMap) {
if (!table.getForeignKeys().isEmpty()) { if (!table.getForeignKeys().isEmpty()) {
List<List<String>> foreignKeys = new ArrayList<>(); List<List<String>> foreignKeys = new ArrayList<>();
builder.thirdTitle("Foreign Keys"); builder.thirdTitle("Foreign Keys");
@ -139,14 +183,24 @@ public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
foreignKeys.add(item); foreignKeys.add(item);
} }
builder.table( builder.table(
List.of("", "FK Name", "FK Column", "PK Name", "PK Table", "PK Column", List.of(
"Update Rule", "Delete Rule"), "",
titleMap.getOrDefault("fkName", "fkName"),
titleMap.getOrDefault("fkColumnName", "fkColumnName"),
titleMap.getOrDefault("pkName", "pkName"),
titleMap.getOrDefault("pkTableName", "pkTableName"),
titleMap.getOrDefault("pkColumnName", "pkColumnName"),
titleMap.getOrDefault("updateRule", "updateRule"),
titleMap.getOrDefault("deleteRule", "deleteRule")
),
foreignKeys foreignKeys
); );
} }
} }
private void triggerBuild(MarkdownBuilder builder, TableDocumentResponse table) { private void triggerBuild(MarkdownBuilder builder,
TableDocumentResponse table,
Map<String, String> titleMap) {
if (!table.getTriggers().isEmpty()) { if (!table.getTriggers().isEmpty()) {
List<List<String>> triggerContent = new ArrayList<>(); List<List<String>> triggerContent = new ArrayList<>();
for (int i = 0; i < table.getTriggers().size(); i++) { for (int i = 0; i < table.getTriggers().size(); i++) {
@ -158,7 +212,16 @@ public class MarkdownDocumentFileGenerator implements DocumentFileGenerator {
trigger.getStatement())); trigger.getStatement()));
} }
builder.thirdTitle("Triggers"); builder.thirdTitle("Triggers");
builder.table(List.of("", "名称", "timing", "manipulation", "statement"), triggerContent); builder.table(
List.of(
"",
titleMap.getOrDefault("name", "name"),
titleMap.getOrDefault("timing", "timing"),
titleMap.getOrDefault("manipulation", "manipulation"),
titleMap.getOrDefault("statement", "statement")
),
triggerContent
);
} }
} }
} }

46
core/src/main/java/com/databasir/core/domain/document/service/DocumentTemplateService.java

@ -0,0 +1,46 @@
package com.databasir.core.domain.document.service;
import com.databasir.core.domain.document.converter.DocumentTemplatePropertiesUpdateRequestConverter;
import com.databasir.core.domain.document.converter.DocumentTemplatePropertyResponseConverter;
import com.databasir.core.domain.document.data.DocumentTemplatePropertiesResponse;
import com.databasir.core.domain.document.data.DocumentTemplatePropertiesUpdateRequest;
import com.databasir.dao.impl.DocumentTemplatePropertyDao;
import com.databasir.dao.tables.pojos.DocumentTemplatePropertyPojo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
import static com.databasir.dao.enums.DocumentTemplatePropertyType.*;
@Service
@RequiredArgsConstructor
@Slf4j
public class DocumentTemplateService {
private final DocumentTemplatePropertyDao documentTemplatePropertyDao;
private final DocumentTemplatePropertyResponseConverter documentTemplatePropertyResponseConverter;
private final DocumentTemplatePropertiesUpdateRequestConverter documentTemplatePropertiesUpdateRequestConverter;
public DocumentTemplatePropertiesResponse getAllProperties() {
List<DocumentTemplatePropertyPojo> properties = documentTemplatePropertyDao.selectAll();
var propertiesGroupByType = documentTemplatePropertyResponseConverter.of(properties)
.stream()
.collect(Collectors.groupingBy(d -> d.getType()));
return DocumentTemplatePropertiesResponse.builder()
.columnFieldNameProperties(propertiesGroupByType.get(COLUMN_FIELD_NAME))
.foreignKeyFieldNameProperties(propertiesGroupByType.get(FOREIGN_KEY_FIELD_NAME))
.indexFieldNameProperties(propertiesGroupByType.get(INDEX_FIELD_NAME))
.triggerFieldNameProperties(propertiesGroupByType.get(TRIGGER_FIELD_NAME))
.build();
}
public void updateByType(DocumentTemplatePropertiesUpdateRequest request) {
List<DocumentTemplatePropertyPojo> pojoList = documentTemplatePropertiesUpdateRequestConverter.toPojo(request);
documentTemplatePropertyDao.batchInsertOnDuplicateKeyUpdate(pojoList);
}
}

50
core/src/main/java/com/databasir/core/domain/system/service/SystemService.java

@ -1,72 +1,22 @@
package com.databasir.core.domain.system.service; package com.databasir.core.domain.system.service;
import com.databasir.common.codec.Aes;
import com.databasir.common.codec.Rsa;
import com.databasir.core.domain.DomainErrors; import com.databasir.core.domain.DomainErrors;
import com.databasir.core.domain.system.data.SystemEmailResponse; import com.databasir.core.domain.system.data.SystemEmailResponse;
import com.databasir.core.domain.system.data.SystemEmailUpdateRequest; import com.databasir.core.domain.system.data.SystemEmailUpdateRequest;
import com.databasir.dao.impl.SysKeyDao;
import com.databasir.dao.impl.SysMailDao; import com.databasir.dao.impl.SysMailDao;
import com.databasir.dao.impl.UserDao;
import com.databasir.dao.impl.UserRoleDao;
import com.databasir.dao.tables.pojos.SysKeyPojo;
import com.databasir.dao.tables.pojos.SysMailPojo; import com.databasir.dao.tables.pojos.SysMailPojo;
import com.databasir.dao.tables.pojos.UserPojo;
import com.databasir.dao.tables.pojos.UserRolePojo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct;
import java.util.Optional; import java.util.Optional;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class SystemService { public class SystemService {
private final SysKeyDao sysKeyDao;
private final SysMailDao sysMailDao; private final SysMailDao sysMailDao;
private final UserDao userDao;
private final UserRoleDao userRoleDao;
@SuppressWarnings("checkstyle:all")
private BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
@PostConstruct
public void postInit() {
sysKeyDao.selectOptionTopOne()
.orElseGet(() -> {
SysKeyPojo pojo = new SysKeyPojo();
pojo.setAesKey(Aes.randomBase64Key());
Rsa.RsaBase64Key key = Rsa.generateBase64Key();
pojo.setRsaPublicKey(key.getPublicBase64Key());
pojo.setRsaPrivateKey(key.getPrivateBase64Key());
sysKeyDao.insertAndReturnId(pojo);
return pojo;
});
String email = "N/A";
String username = "databasir";
Optional<UserPojo> userOpt = userDao.selectByEmailOrUsername(username);
if (!userOpt.isPresent()) {
UserPojo admin = new UserPojo();
admin.setEmail(email);
admin.setUsername(username);
admin.setPassword(bCryptPasswordEncoder.encode(username));
admin.setEnabled(true);
admin.setNickname("Databasir Admin");
Integer userId = userDao.insertAndReturnId(admin);
UserRolePojo role = new UserRolePojo();
role.setUserId(userId);
role.setRole("SYS_OWNER");
userRoleDao.insertAndReturnId(role);
}
}
public void renewKey() { public void renewKey() {
// TODO // TODO
} }

3
core/src/main/java/com/databasir/core/infrastructure/event/subscriber/DocumentEventSubscriber.java

@ -7,7 +7,6 @@ import com.databasir.core.infrastructure.mail.MailSender;
import com.databasir.dao.impl.ProjectDao; import com.databasir.dao.impl.ProjectDao;
import com.databasir.dao.impl.SysMailDao; import com.databasir.dao.impl.SysMailDao;
import com.databasir.dao.impl.UserDao; import com.databasir.dao.impl.UserDao;
import com.databasir.dao.impl.UserRoleDao;
import com.databasir.dao.tables.pojos.ProjectPojo; import com.databasir.dao.tables.pojos.ProjectPojo;
import com.databasir.dao.tables.pojos.UserPojo; import com.databasir.dao.tables.pojos.UserPojo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -27,8 +26,6 @@ public class DocumentEventSubscriber {
private final MailSender mailSender; private final MailSender mailSender;
private final UserRoleDao userRoleDao;
private final UserDao userDao; private final UserDao userDao;
private final SysMailDao sysMailDao; private final SysMailDao sysMailDao;

137
core/src/main/java/com/databasir/core/infrastructure/event/subscriber/SystemStartedEventSubscriber.java

@ -0,0 +1,137 @@
package com.databasir.core.infrastructure.event.subscriber;
import com.databasir.common.codec.Aes;
import com.databasir.common.codec.Rsa;
import com.databasir.core.domain.document.data.TableDocumentResponse;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import com.databasir.dao.impl.DocumentTemplatePropertyDao;
import com.databasir.dao.impl.SysKeyDao;
import com.databasir.dao.impl.UserDao;
import com.databasir.dao.impl.UserRoleDao;
import com.databasir.dao.tables.pojos.DocumentTemplatePropertyPojo;
import com.databasir.dao.tables.pojos.SysKeyPojo;
import com.databasir.dao.tables.pojos.UserPojo;
import com.databasir.dao.tables.pojos.UserRolePojo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
@Component
@Slf4j
@RequiredArgsConstructor
public class SystemStartedEventSubscriber {
private final SysKeyDao sysKeyDao;
private final UserDao userDao;
private final UserRoleDao userRoleDao;
private final DocumentTemplatePropertyDao documentTemplatePropertyDao;
@SuppressWarnings("checkstyle:all")
private BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
@EventListener(classes = ContextRefreshedEvent.class)
public void onStarted(ContextRefreshedEvent event) {
log.info("begin to init system data");
initSysOwnerIfNecessary();
initDatabaseTypesIfNecessary();
initTemplatePropertiesIfNecessary();
log.info("system data init finished");
}
private void initTemplatePropertiesIfNecessary() {
List<String> ignoreFields = List.of("createAt", "discussionCount", "id");
BiFunction<Field, DocumentTemplatePropertyType, DocumentTemplatePropertyPojo> mapping = (field, type) -> {
String key = field.getName();
String def = field.getName();
DocumentTemplatePropertyPojo pojo = new DocumentTemplatePropertyPojo();
pojo.setType(type);
pojo.setKey(key);
pojo.setDefaultValue(def);
return pojo;
};
// column field name;
Field[] columnFields = TableDocumentResponse.ColumnDocumentResponse.class.getDeclaredFields();
List<DocumentTemplatePropertyPojo> columnProperties = Arrays.stream(columnFields)
.filter(f -> !ignoreFields.contains(f.getName()))
.map(field -> mapping.apply(field, DocumentTemplatePropertyType.COLUMN_FIELD_NAME))
.collect(Collectors.toList());
// index field name;
Field[] indexFields = TableDocumentResponse.IndexDocumentResponse.class.getDeclaredFields();
List<DocumentTemplatePropertyPojo> indexProperties = Arrays.stream(indexFields)
.filter(f -> !ignoreFields.contains(f.getName()))
.map(field -> mapping.apply(field, DocumentTemplatePropertyType.INDEX_FIELD_NAME))
.collect(Collectors.toList());
// foreign key field name;
Field[] fkFields = TableDocumentResponse.ForeignKeyDocumentResponse.class.getDeclaredFields();
List<DocumentTemplatePropertyPojo> fkProperties = Arrays.stream(fkFields)
.filter(f -> !ignoreFields.contains(f.getName()))
.map(field -> mapping.apply(field, DocumentTemplatePropertyType.FOREIGN_KEY_FIELD_NAME))
.collect(Collectors.toList());
// trigger field name;
Field[] triggerFields = TableDocumentResponse.TriggerDocumentResponse.class.getDeclaredFields();
List<DocumentTemplatePropertyPojo> triggerProperties = Arrays.stream(triggerFields)
.filter(f -> !ignoreFields.contains(f.getName()))
.map(field -> mapping.apply(field, DocumentTemplatePropertyType.TRIGGER_FIELD_NAME))
.collect(Collectors.toList());
List<DocumentTemplatePropertyPojo> properties = new ArrayList<>();
properties.addAll(columnProperties);
properties.addAll(indexProperties);
properties.addAll(fkProperties);
properties.addAll(triggerProperties);
documentTemplatePropertyDao.batchInsertOnDuplicateIgnore(properties);
}
private void initDatabaseTypesIfNecessary() {
// TODO
}
private void initSysOwnerIfNecessary() {
sysKeyDao.selectOptionTopOne()
.orElseGet(() -> {
SysKeyPojo pojo = new SysKeyPojo();
pojo.setAesKey(Aes.randomBase64Key());
Rsa.RsaBase64Key key = Rsa.generateBase64Key();
pojo.setRsaPublicKey(key.getPublicBase64Key());
pojo.setRsaPrivateKey(key.getPrivateBase64Key());
sysKeyDao.insertAndReturnId(pojo);
return pojo;
});
String email = "N/A";
String username = "databasir";
Optional<UserPojo> userOpt = userDao.selectByEmailOrUsername(username);
if (!userOpt.isPresent()) {
UserPojo admin = new UserPojo();
admin.setEmail(email);
admin.setUsername(username);
admin.setPassword(bCryptPasswordEncoder.encode(username));
admin.setEnabled(true);
admin.setNickname("Databasir Admin");
Integer userId = userDao.insertAndReturnId(admin);
UserRolePojo role = new UserRolePojo();
role.setUserId(userId);
role.setRole("SYS_OWNER");
userRoleDao.insertAndReturnId(role);
}
}
}

6
dao/build.gradle

@ -66,6 +66,12 @@ jooq {
includeExpression = 'app_type' includeExpression = 'app_type'
includeTypes = '.*' includeTypes = '.*'
} }
forcedType {
userType = 'com.databasir.dao.enums.DocumentTemplatePropertyType'
converter = 'com.databasir.dao.converter.DocumentTemplatePropertyTypeConverter'
includeExpression = 'document_template_property.type'
includeTypes = '.*'
}
} }
} }
generate { generate {

7
dao/generated-src/jooq/main/java/com/databasir/dao/Databasir.java

@ -10,6 +10,7 @@ import com.databasir.dao.tables.DatabaseDocument;
import com.databasir.dao.tables.DatabaseType; import com.databasir.dao.tables.DatabaseType;
import com.databasir.dao.tables.DocumentDescription; import com.databasir.dao.tables.DocumentDescription;
import com.databasir.dao.tables.DocumentDiscussion; import com.databasir.dao.tables.DocumentDiscussion;
import com.databasir.dao.tables.DocumentTemplateProperty;
import com.databasir.dao.tables.Group; import com.databasir.dao.tables.Group;
import com.databasir.dao.tables.Login; import com.databasir.dao.tables.Login;
import com.databasir.dao.tables.OauthApp; import com.databasir.dao.tables.OauthApp;
@ -78,6 +79,11 @@ public class Databasir extends SchemaImpl {
*/ */
public final DocumentDiscussion DOCUMENT_DISCUSSION = DocumentDiscussion.DOCUMENT_DISCUSSION; public final DocumentDiscussion DOCUMENT_DISCUSSION = DocumentDiscussion.DOCUMENT_DISCUSSION;
/**
* template property
*/
public final DocumentTemplateProperty DOCUMENT_TEMPLATE_PROPERTY = DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY;
/** /**
* The table <code>databasir.group</code>. * The table <code>databasir.group</code>.
*/ */
@ -180,6 +186,7 @@ public class Databasir extends SchemaImpl {
DatabaseType.DATABASE_TYPE, DatabaseType.DATABASE_TYPE,
DocumentDescription.DOCUMENT_DESCRIPTION, DocumentDescription.DOCUMENT_DESCRIPTION,
DocumentDiscussion.DOCUMENT_DISCUSSION, DocumentDiscussion.DOCUMENT_DISCUSSION,
DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY,
Group.GROUP, Group.GROUP,
Login.LOGIN, Login.LOGIN,
OauthApp.OAUTH_APP, OauthApp.OAUTH_APP,

4
dao/generated-src/jooq/main/java/com/databasir/dao/Keys.java

@ -10,6 +10,7 @@ import com.databasir.dao.tables.DatabaseDocument;
import com.databasir.dao.tables.DatabaseType; import com.databasir.dao.tables.DatabaseType;
import com.databasir.dao.tables.DocumentDescription; import com.databasir.dao.tables.DocumentDescription;
import com.databasir.dao.tables.DocumentDiscussion; import com.databasir.dao.tables.DocumentDiscussion;
import com.databasir.dao.tables.DocumentTemplateProperty;
import com.databasir.dao.tables.Group; import com.databasir.dao.tables.Group;
import com.databasir.dao.tables.Login; import com.databasir.dao.tables.Login;
import com.databasir.dao.tables.OauthApp; import com.databasir.dao.tables.OauthApp;
@ -32,6 +33,7 @@ import com.databasir.dao.tables.records.DatabaseDocumentRecord;
import com.databasir.dao.tables.records.DatabaseTypeRecord; import com.databasir.dao.tables.records.DatabaseTypeRecord;
import com.databasir.dao.tables.records.DocumentDescriptionRecord; import com.databasir.dao.tables.records.DocumentDescriptionRecord;
import com.databasir.dao.tables.records.DocumentDiscussionRecord; import com.databasir.dao.tables.records.DocumentDiscussionRecord;
import com.databasir.dao.tables.records.DocumentTemplatePropertyRecord;
import com.databasir.dao.tables.records.GroupRecord; import com.databasir.dao.tables.records.GroupRecord;
import com.databasir.dao.tables.records.LoginRecord; import com.databasir.dao.tables.records.LoginRecord;
import com.databasir.dao.tables.records.OauthAppRecord; import com.databasir.dao.tables.records.OauthAppRecord;
@ -75,6 +77,8 @@ public class Keys {
public static final UniqueKey<DocumentDescriptionRecord> KEY_DOCUMENT_DESCRIPTION_PRIMARY = Internal.createUniqueKey(DocumentDescription.DOCUMENT_DESCRIPTION, DSL.name("KEY_document_description_PRIMARY"), new TableField[] { DocumentDescription.DOCUMENT_DESCRIPTION.ID }, true); public static final UniqueKey<DocumentDescriptionRecord> KEY_DOCUMENT_DESCRIPTION_PRIMARY = Internal.createUniqueKey(DocumentDescription.DOCUMENT_DESCRIPTION, DSL.name("KEY_document_description_PRIMARY"), new TableField[] { DocumentDescription.DOCUMENT_DESCRIPTION.ID }, true);
public static final UniqueKey<DocumentDescriptionRecord> KEY_DOCUMENT_DESCRIPTION_UK_PROJECT_ID_TABLE_NAME_COLUMN_NAME = Internal.createUniqueKey(DocumentDescription.DOCUMENT_DESCRIPTION, DSL.name("KEY_document_description_uk_project_id_table_name_column_name"), new TableField[] { DocumentDescription.DOCUMENT_DESCRIPTION.PROJECT_ID, DocumentDescription.DOCUMENT_DESCRIPTION.TABLE_NAME, DocumentDescription.DOCUMENT_DESCRIPTION.COLUMN_NAME }, true); public static final UniqueKey<DocumentDescriptionRecord> KEY_DOCUMENT_DESCRIPTION_UK_PROJECT_ID_TABLE_NAME_COLUMN_NAME = Internal.createUniqueKey(DocumentDescription.DOCUMENT_DESCRIPTION, DSL.name("KEY_document_description_uk_project_id_table_name_column_name"), new TableField[] { DocumentDescription.DOCUMENT_DESCRIPTION.PROJECT_ID, DocumentDescription.DOCUMENT_DESCRIPTION.TABLE_NAME, DocumentDescription.DOCUMENT_DESCRIPTION.COLUMN_NAME }, true);
public static final UniqueKey<DocumentDiscussionRecord> KEY_DOCUMENT_DISCUSSION_PRIMARY = Internal.createUniqueKey(DocumentDiscussion.DOCUMENT_DISCUSSION, DSL.name("KEY_document_discussion_PRIMARY"), new TableField[] { DocumentDiscussion.DOCUMENT_DISCUSSION.ID }, true); public static final UniqueKey<DocumentDiscussionRecord> KEY_DOCUMENT_DISCUSSION_PRIMARY = Internal.createUniqueKey(DocumentDiscussion.DOCUMENT_DISCUSSION, DSL.name("KEY_document_discussion_PRIMARY"), new TableField[] { DocumentDiscussion.DOCUMENT_DISCUSSION.ID }, true);
public static final UniqueKey<DocumentTemplatePropertyRecord> KEY_DOCUMENT_TEMPLATE_PROPERTY_PRIMARY = Internal.createUniqueKey(DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY, DSL.name("KEY_document_template_property_PRIMARY"), new TableField[] { DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.ID }, true);
public static final UniqueKey<DocumentTemplatePropertyRecord> KEY_DOCUMENT_TEMPLATE_PROPERTY_UK_TYPE_KEY = Internal.createUniqueKey(DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY, DSL.name("KEY_document_template_property_uk_type_key"), new TableField[] { DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.TYPE, DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.KEY }, true);
public static final UniqueKey<GroupRecord> KEY_GROUP_PRIMARY = Internal.createUniqueKey(Group.GROUP, DSL.name("KEY_group_PRIMARY"), new TableField[] { Group.GROUP.ID }, true); public static final UniqueKey<GroupRecord> KEY_GROUP_PRIMARY = Internal.createUniqueKey(Group.GROUP, DSL.name("KEY_group_PRIMARY"), new TableField[] { Group.GROUP.ID }, true);
public static final UniqueKey<LoginRecord> KEY_LOGIN_PRIMARY = Internal.createUniqueKey(Login.LOGIN, DSL.name("KEY_login_PRIMARY"), new TableField[] { Login.LOGIN.ID }, true); public static final UniqueKey<LoginRecord> KEY_LOGIN_PRIMARY = Internal.createUniqueKey(Login.LOGIN, DSL.name("KEY_login_PRIMARY"), new TableField[] { Login.LOGIN.ID }, true);
public static final UniqueKey<LoginRecord> KEY_LOGIN_UK_USER_ID = Internal.createUniqueKey(Login.LOGIN, DSL.name("KEY_login_uk_user_id"), new TableField[] { Login.LOGIN.USER_ID }, true); public static final UniqueKey<LoginRecord> KEY_LOGIN_UK_USER_ID = Internal.createUniqueKey(Login.LOGIN, DSL.name("KEY_login_uk_user_id"), new TableField[] { Login.LOGIN.USER_ID }, true);

6
dao/generated-src/jooq/main/java/com/databasir/dao/Tables.java

@ -10,6 +10,7 @@ import com.databasir.dao.tables.DatabaseDocument;
import com.databasir.dao.tables.DatabaseType; import com.databasir.dao.tables.DatabaseType;
import com.databasir.dao.tables.DocumentDescription; import com.databasir.dao.tables.DocumentDescription;
import com.databasir.dao.tables.DocumentDiscussion; import com.databasir.dao.tables.DocumentDiscussion;
import com.databasir.dao.tables.DocumentTemplateProperty;
import com.databasir.dao.tables.Group; import com.databasir.dao.tables.Group;
import com.databasir.dao.tables.Login; import com.databasir.dao.tables.Login;
import com.databasir.dao.tables.OauthApp; import com.databasir.dao.tables.OauthApp;
@ -64,6 +65,11 @@ public class Tables {
*/ */
public static final DocumentDiscussion DOCUMENT_DISCUSSION = DocumentDiscussion.DOCUMENT_DISCUSSION; public static final DocumentDiscussion DOCUMENT_DISCUSSION = DocumentDiscussion.DOCUMENT_DISCUSSION;
/**
* template property
*/
public static final DocumentTemplateProperty DOCUMENT_TEMPLATE_PROPERTY = DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY;
/** /**
* The table <code>databasir.group</code>. * The table <code>databasir.group</code>.
*/ */

176
dao/generated-src/jooq/main/java/com/databasir/dao/tables/DocumentTemplateProperty.java

@ -0,0 +1,176 @@
/*
* This file is generated by jOOQ.
*/
package com.databasir.dao.tables;
import com.databasir.dao.Databasir;
import com.databasir.dao.Keys;
import com.databasir.dao.converter.DocumentTemplatePropertyTypeConverter;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import com.databasir.dao.tables.records.DocumentTemplatePropertyRecord;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import org.jooq.Field;
import org.jooq.ForeignKey;
import org.jooq.Identity;
import org.jooq.Name;
import org.jooq.Record;
import org.jooq.Row6;
import org.jooq.Schema;
import org.jooq.Table;
import org.jooq.TableField;
import org.jooq.TableOptions;
import org.jooq.UniqueKey;
import org.jooq.impl.DSL;
import org.jooq.impl.SQLDataType;
import org.jooq.impl.TableImpl;
/**
* template property
*/
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class DocumentTemplateProperty extends TableImpl<DocumentTemplatePropertyRecord> {
private static final long serialVersionUID = 1L;
/**
* The reference instance of
* <code>databasir.document_template_property</code>
*/
public static final DocumentTemplateProperty DOCUMENT_TEMPLATE_PROPERTY = new DocumentTemplateProperty();
/**
* The class holding records for this type
*/
@Override
public Class<DocumentTemplatePropertyRecord> getRecordType() {
return DocumentTemplatePropertyRecord.class;
}
/**
* The column <code>databasir.document_template_property.id</code>.
*/
public final TableField<DocumentTemplatePropertyRecord, Integer> ID = createField(DSL.name("id"), SQLDataType.INTEGER.nullable(false).identity(true), this, "");
/**
* The column <code>databasir.document_template_property.key</code>.
*/
public final TableField<DocumentTemplatePropertyRecord, String> KEY = createField(DSL.name("key"), SQLDataType.VARCHAR(255).nullable(false), this, "");
/**
* The column <code>databasir.document_template_property.value</code>.
*/
public final TableField<DocumentTemplatePropertyRecord, String> VALUE = createField(DSL.name("value"), SQLDataType.VARCHAR(255), this, "");
/**
* The column
* <code>databasir.document_template_property.default_value</code>.
*/
public final TableField<DocumentTemplatePropertyRecord, String> DEFAULT_VALUE = createField(DSL.name("default_value"), SQLDataType.VARCHAR(255).nullable(false), this, "");
/**
* The column <code>databasir.document_template_property.type</code>.
*/
public final TableField<DocumentTemplatePropertyRecord, DocumentTemplatePropertyType> TYPE = createField(DSL.name("type"), SQLDataType.VARCHAR(64).nullable(false), this, "", new DocumentTemplatePropertyTypeConverter());
/**
* The column <code>databasir.document_template_property.create_at</code>.
*/
public final TableField<DocumentTemplatePropertyRecord, LocalDateTime> CREATE_AT = createField(DSL.name("create_at"), SQLDataType.LOCALDATETIME(0).nullable(false).defaultValue(DSL.field("CURRENT_TIMESTAMP", SQLDataType.LOCALDATETIME)), this, "");
private DocumentTemplateProperty(Name alias, Table<DocumentTemplatePropertyRecord> aliased) {
this(alias, aliased, null);
}
private DocumentTemplateProperty(Name alias, Table<DocumentTemplatePropertyRecord> aliased, Field<?>[] parameters) {
super(alias, null, aliased, parameters, DSL.comment("template property"), TableOptions.table());
}
/**
* Create an aliased <code>databasir.document_template_property</code> table
* reference
*/
public DocumentTemplateProperty(String alias) {
this(DSL.name(alias), DOCUMENT_TEMPLATE_PROPERTY);
}
/**
* Create an aliased <code>databasir.document_template_property</code> table
* reference
*/
public DocumentTemplateProperty(Name alias) {
this(alias, DOCUMENT_TEMPLATE_PROPERTY);
}
/**
* Create a <code>databasir.document_template_property</code> table
* reference
*/
public DocumentTemplateProperty() {
this(DSL.name("document_template_property"), null);
}
public <O extends Record> DocumentTemplateProperty(Table<O> child, ForeignKey<O, DocumentTemplatePropertyRecord> key) {
super(child, key, DOCUMENT_TEMPLATE_PROPERTY);
}
@Override
public Schema getSchema() {
return aliased() ? null : Databasir.DATABASIR;
}
@Override
public Identity<DocumentTemplatePropertyRecord, Integer> getIdentity() {
return (Identity<DocumentTemplatePropertyRecord, Integer>) super.getIdentity();
}
@Override
public UniqueKey<DocumentTemplatePropertyRecord> getPrimaryKey() {
return Keys.KEY_DOCUMENT_TEMPLATE_PROPERTY_PRIMARY;
}
@Override
public List<UniqueKey<DocumentTemplatePropertyRecord>> getUniqueKeys() {
return Arrays.asList(Keys.KEY_DOCUMENT_TEMPLATE_PROPERTY_UK_TYPE_KEY);
}
@Override
public DocumentTemplateProperty as(String alias) {
return new DocumentTemplateProperty(DSL.name(alias), this);
}
@Override
public DocumentTemplateProperty as(Name alias) {
return new DocumentTemplateProperty(alias, this);
}
/**
* Rename this table
*/
@Override
public DocumentTemplateProperty rename(String name) {
return new DocumentTemplateProperty(DSL.name(name), null);
}
/**
* Rename this table
*/
@Override
public DocumentTemplateProperty rename(Name name) {
return new DocumentTemplateProperty(name, null);
}
// -------------------------------------------------------------------------
// Row6 type methods
// -------------------------------------------------------------------------
@Override
public Row6<Integer, String, String, String, DocumentTemplatePropertyType, LocalDateTime> fieldsRow() {
return (Row6) super.fieldsRow();
}
}

155
dao/generated-src/jooq/main/java/com/databasir/dao/tables/pojos/DocumentTemplatePropertyPojo.java

@ -0,0 +1,155 @@
/*
* This file is generated by jOOQ.
*/
package com.databasir.dao.tables.pojos;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* template property
*/
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class DocumentTemplatePropertyPojo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String key;
private String value;
private String defaultValue;
private DocumentTemplatePropertyType type;
private LocalDateTime createAt;
public DocumentTemplatePropertyPojo() {}
public DocumentTemplatePropertyPojo(DocumentTemplatePropertyPojo value) {
this.id = value.id;
this.key = value.key;
this.value = value.value;
this.defaultValue = value.defaultValue;
this.type = value.type;
this.createAt = value.createAt;
}
public DocumentTemplatePropertyPojo(
Integer id,
String key,
String value,
String defaultValue,
DocumentTemplatePropertyType type,
LocalDateTime createAt
) {
this.id = id;
this.key = key;
this.value = value;
this.defaultValue = defaultValue;
this.type = type;
this.createAt = createAt;
}
/**
* Getter for <code>databasir.document_template_property.id</code>.
*/
public Integer getId() {
return this.id;
}
/**
* Setter for <code>databasir.document_template_property.id</code>.
*/
public void setId(Integer id) {
this.id = id;
}
/**
* Getter for <code>databasir.document_template_property.key</code>.
*/
public String getKey() {
return this.key;
}
/**
* Setter for <code>databasir.document_template_property.key</code>.
*/
public void setKey(String key) {
this.key = key;
}
/**
* Getter for <code>databasir.document_template_property.value</code>.
*/
public String getValue() {
return this.value;
}
/**
* Setter for <code>databasir.document_template_property.value</code>.
*/
public void setValue(String value) {
this.value = value;
}
/**
* Getter for
* <code>databasir.document_template_property.default_value</code>.
*/
public String getDefaultValue() {
return this.defaultValue;
}
/**
* Setter for
* <code>databasir.document_template_property.default_value</code>.
*/
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
}
/**
* Getter for <code>databasir.document_template_property.type</code>.
*/
public DocumentTemplatePropertyType getType() {
return this.type;
}
/**
* Setter for <code>databasir.document_template_property.type</code>.
*/
public void setType(DocumentTemplatePropertyType type) {
this.type = type;
}
/**
* Getter for <code>databasir.document_template_property.create_at</code>.
*/
public LocalDateTime getCreateAt() {
return this.createAt;
}
/**
* Setter for <code>databasir.document_template_property.create_at</code>.
*/
public void setCreateAt(LocalDateTime createAt) {
this.createAt = createAt;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("DocumentTemplatePropertyPojo (");
sb.append(id);
sb.append(", ").append(key);
sb.append(", ").append(value);
sb.append(", ").append(defaultValue);
sb.append(", ").append(type);
sb.append(", ").append(createAt);
sb.append(")");
return sb.toString();
}
}

314
dao/generated-src/jooq/main/java/com/databasir/dao/tables/records/DocumentTemplatePropertyRecord.java

@ -0,0 +1,314 @@
/*
* This file is generated by jOOQ.
*/
package com.databasir.dao.tables.records;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import com.databasir.dao.tables.DocumentTemplateProperty;
import com.databasir.dao.tables.pojos.DocumentTemplatePropertyPojo;
import java.time.LocalDateTime;
import org.jooq.Field;
import org.jooq.Record1;
import org.jooq.Record6;
import org.jooq.Row6;
import org.jooq.impl.UpdatableRecordImpl;
/**
* template property
*/
@SuppressWarnings({ "all", "unchecked", "rawtypes" })
public class DocumentTemplatePropertyRecord extends UpdatableRecordImpl<DocumentTemplatePropertyRecord> implements Record6<Integer, String, String, String, DocumentTemplatePropertyType, LocalDateTime> {
private static final long serialVersionUID = 1L;
/**
* Setter for <code>databasir.document_template_property.id</code>.
*/
public void setId(Integer value) {
set(0, value);
}
/**
* Getter for <code>databasir.document_template_property.id</code>.
*/
public Integer getId() {
return (Integer) get(0);
}
/**
* Setter for <code>databasir.document_template_property.key</code>.
*/
public void setKey(String value) {
set(1, value);
}
/**
* Getter for <code>databasir.document_template_property.key</code>.
*/
public String getKey() {
return (String) get(1);
}
/**
* Setter for <code>databasir.document_template_property.value</code>.
*/
public void setValue(String value) {
set(2, value);
}
/**
* Getter for <code>databasir.document_template_property.value</code>.
*/
public String getValue() {
return (String) get(2);
}
/**
* Setter for
* <code>databasir.document_template_property.default_value</code>.
*/
public void setDefaultValue(String value) {
set(3, value);
}
/**
* Getter for
* <code>databasir.document_template_property.default_value</code>.
*/
public String getDefaultValue() {
return (String) get(3);
}
/**
* Setter for <code>databasir.document_template_property.type</code>.
*/
public void setType(DocumentTemplatePropertyType value) {
set(4, value);
}
/**
* Getter for <code>databasir.document_template_property.type</code>.
*/
public DocumentTemplatePropertyType getType() {
return (DocumentTemplatePropertyType) get(4);
}
/**
* Setter for <code>databasir.document_template_property.create_at</code>.
*/
public void setCreateAt(LocalDateTime value) {
set(5, value);
}
/**
* Getter for <code>databasir.document_template_property.create_at</code>.
*/
public LocalDateTime getCreateAt() {
return (LocalDateTime) get(5);
}
// -------------------------------------------------------------------------
// Primary key information
// -------------------------------------------------------------------------
@Override
public Record1<Integer> key() {
return (Record1) super.key();
}
// -------------------------------------------------------------------------
// Record6 type implementation
// -------------------------------------------------------------------------
@Override
public Row6<Integer, String, String, String, DocumentTemplatePropertyType, LocalDateTime> fieldsRow() {
return (Row6) super.fieldsRow();
}
@Override
public Row6<Integer, String, String, String, DocumentTemplatePropertyType, LocalDateTime> valuesRow() {
return (Row6) super.valuesRow();
}
@Override
public Field<Integer> field1() {
return DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.ID;
}
@Override
public Field<String> field2() {
return DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.KEY;
}
@Override
public Field<String> field3() {
return DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.VALUE;
}
@Override
public Field<String> field4() {
return DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.DEFAULT_VALUE;
}
@Override
public Field<DocumentTemplatePropertyType> field5() {
return DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.TYPE;
}
@Override
public Field<LocalDateTime> field6() {
return DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY.CREATE_AT;
}
@Override
public Integer component1() {
return getId();
}
@Override
public String component2() {
return getKey();
}
@Override
public String component3() {
return getValue();
}
@Override
public String component4() {
return getDefaultValue();
}
@Override
public DocumentTemplatePropertyType component5() {
return getType();
}
@Override
public LocalDateTime component6() {
return getCreateAt();
}
@Override
public Integer value1() {
return getId();
}
@Override
public String value2() {
return getKey();
}
@Override
public String value3() {
return getValue();
}
@Override
public String value4() {
return getDefaultValue();
}
@Override
public DocumentTemplatePropertyType value5() {
return getType();
}
@Override
public LocalDateTime value6() {
return getCreateAt();
}
@Override
public DocumentTemplatePropertyRecord value1(Integer value) {
setId(value);
return this;
}
@Override
public DocumentTemplatePropertyRecord value2(String value) {
setKey(value);
return this;
}
@Override
public DocumentTemplatePropertyRecord value3(String value) {
setValue(value);
return this;
}
@Override
public DocumentTemplatePropertyRecord value4(String value) {
setDefaultValue(value);
return this;
}
@Override
public DocumentTemplatePropertyRecord value5(DocumentTemplatePropertyType value) {
setType(value);
return this;
}
@Override
public DocumentTemplatePropertyRecord value6(LocalDateTime value) {
setCreateAt(value);
return this;
}
@Override
public DocumentTemplatePropertyRecord values(Integer value1, String value2, String value3, String value4, DocumentTemplatePropertyType value5, LocalDateTime value6) {
value1(value1);
value2(value2);
value3(value3);
value4(value4);
value5(value5);
value6(value6);
return this;
}
// -------------------------------------------------------------------------
// Constructors
// -------------------------------------------------------------------------
/**
* Create a detached DocumentTemplatePropertyRecord
*/
public DocumentTemplatePropertyRecord() {
super(DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY);
}
/**
* Create a detached, initialised DocumentTemplatePropertyRecord
*/
public DocumentTemplatePropertyRecord(Integer id, String key, String value, String defaultValue, DocumentTemplatePropertyType type, LocalDateTime createAt) {
super(DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY);
setId(id);
setKey(key);
setValue(value);
setDefaultValue(defaultValue);
setType(type);
setCreateAt(createAt);
}
/**
* Create a detached, initialised DocumentTemplatePropertyRecord
*/
public DocumentTemplatePropertyRecord(DocumentTemplatePropertyPojo value) {
super(DocumentTemplateProperty.DOCUMENT_TEMPLATE_PROPERTY);
if (value != null) {
setId(value.getId());
setKey(value.getKey());
setValue(value.getValue());
setDefaultValue(value.getDefaultValue());
setType(value.getType());
setCreateAt(value.getCreateAt());
}
}
}

12
dao/src/main/java/com/databasir/dao/converter/DocumentTemplatePropertyTypeConverter.java

@ -0,0 +1,12 @@
package com.databasir.dao.converter;
import com.databasir.dao.enums.DocumentTemplatePropertyType;
import org.jooq.impl.EnumConverter;
public class DocumentTemplatePropertyTypeConverter extends EnumConverter<String, DocumentTemplatePropertyType> {
public DocumentTemplatePropertyTypeConverter() {
super(String.class, DocumentTemplatePropertyType.class);
}
}

7
dao/src/main/java/com/databasir/dao/enums/DocumentTemplatePropertyType.java

@ -0,0 +1,7 @@
package com.databasir.dao.enums;
public enum DocumentTemplatePropertyType {
INDEX_FIELD_NAME, COLUMN_FIELD_NAME, TRIGGER_FIELD_NAME, FOREIGN_KEY_FIELD_NAME;
}

56
dao/src/main/java/com/databasir/dao/impl/DocumentTemplatePropertyDao.java

@ -0,0 +1,56 @@
package com.databasir.dao.impl;
import com.databasir.dao.tables.pojos.DocumentTemplatePropertyPojo;
import com.databasir.dao.tables.records.DocumentTemplatePropertyRecord;
import lombok.Getter;
import org.jooq.DSLContext;
import org.jooq.InsertReturningStep;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import static com.databasir.dao.Tables.DOCUMENT_TEMPLATE_PROPERTY;
@Repository
public class DocumentTemplatePropertyDao extends BaseDao<DocumentTemplatePropertyPojo> {
@Autowired
@Getter
private DSLContext dslContext;
public DocumentTemplatePropertyDao() {
super(DOCUMENT_TEMPLATE_PROPERTY, DocumentTemplatePropertyPojo.class);
}
public void batchInsertOnDuplicateIgnore(Collection<DocumentTemplatePropertyPojo> data) {
if (data == null || data.isEmpty()) {
return;
}
List<InsertReturningStep<DocumentTemplatePropertyRecord>> query = data.stream()
.map(pojo ->
getDslContext()
.insertInto(DOCUMENT_TEMPLATE_PROPERTY)
.set(getDslContext().newRecord(DOCUMENT_TEMPLATE_PROPERTY, pojo))
.onDuplicateKeyIgnore())
.collect(Collectors.toList());
getDslContext().batch(query).execute();
}
public void batchInsertOnDuplicateKeyUpdate(Collection<DocumentTemplatePropertyPojo> data) {
if (data == null || data.isEmpty()) {
return;
}
List<InsertReturningStep<DocumentTemplatePropertyRecord>> query = data.stream()
.map(pojo -> getDslContext()
.insertInto(DOCUMENT_TEMPLATE_PROPERTY)
.set(getDslContext().newRecord(DOCUMENT_TEMPLATE_PROPERTY, pojo))
.onDuplicateKeyUpdate()
.set(DOCUMENT_TEMPLATE_PROPERTY.VALUE, pojo.getValue()))
.collect(Collectors.toList());
getDslContext().batch(query).execute();
}
}

12
dao/src/main/resources/db/migration/V1__init.sql

@ -331,3 +331,15 @@ CREATE TABLE IF NOT EXISTS document_description
CONSTRAINT UNIQUE uk_project_id_table_name_column_name (project_id, table_name, column_name) CONSTRAINT UNIQUE uk_project_id_table_name_column_name (project_id, table_name, column_name)
) CHARSET utf8mb4 ) CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci COMMENT 'custom document description'; COLLATE utf8mb4_unicode_ci COMMENT 'custom document description';
CREATE TABLE IF NOT EXISTS document_template_property
(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`key` VARCHAR(255) NOT NULL,
`value` VARCHAR(255) DEFAULT NULL,
`default_value` VARCHAR(255) NOT NULL,
`type` VARCHAR(64) NOT NULL,
`create_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT UNIQUE uk_type_key (`type`, `key`)
) CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci COMMENT 'template property';
Loading…
Cancel
Save